示例#1
0
文件: VSpace.cs 项目: ivvinokurov/VSX
        /////////////////////////////////////////////////////////////////////////////////////////
        ////////////////////////// PRIVATE METHODS //////////////////////////////////////////////
        /////////////////////////////////////////////////////////////////////////////////////////

        /////////////////////////////////////////////////////////////////////////////////////////
        ////////////////////////// ADMIN METHODS ////////////////////////////////////////////////
        /////////////////////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// Get FBQE Header
        /// </summary>
        /// <returns></returns>
        internal string[] GetFreeSpaceInfo()
        {
            List <string> info = new List <string>();

            long fsp = 0;

            info.Add("Free space allocation for '" + this.Name + "':");
            info.Add(" ");
            info.Add("    #   Start address     End address          Length");
            int fn = FreeSpaceMgr.FIRST;
            int i  = 0;

            while (fn >= 0)
            {
                i++;
                VSFreeSpaceManager.FBQE f = FreeSpaceMgr.GetFBQE(fn);
                string spf  = "#,#;(#,#)";
                int    padf = 15;
                info.Add(i.ToString().PadLeft(5) + " " + f.ADDRESS_START.ToString(spf).PadLeft(padf) + " " + f.ADDRESS_END.ToString(spf).PadLeft(padf) + " " + f.LENGTH.ToString(spf).PadLeft(padf));
                fsp += f.LENGTH;
                fn   = f.NEXT;
            }
            info.Add(" ");
            info.Add("TOTAL FREE SPACE: " + fsp.ToString("#,0;(#,0)"));
            info.Add("DESCRIPTORS FREE: " + FreeSpaceMgr.FREE.ToString() + " of " + FreeSpaceMgr.MAX.ToString());

            return(info.ToArray());
        }
示例#2
0
文件: VSpace.cs 项目: ivvinokurov/VSX
        /// <summary>
        /// Roll Changes (create FBQE for new space, process new allocation)
        /// Call from VSEngine when 'Open' or after extesion
        /// </summary>
        internal void VerifySpaceChanges()
        {
            FreeSpaceMgr = new VSFreeSpaceManager(this);

            // Process new allocations if exists
            short n_new = vm.ReadShort(DEFS.SYSTEM_ALLOCATION_ADDRESS);

            if (n_new > 0)
            {
                long e_address = DEFS.SYSTEM_ALLOCATION_ADDRESS + 2;
                for (int i = 0; i < n_new; i++)
                {
                    long fstart = vm.ReadLong(e_address);
                    long fend   = vm.ReadLong(e_address + 8);
                    if (FreeSpaceMgr.LAST < 0)
                    {
                        FreeSpaceMgr.AddFBQE(fstart, fend - fstart, FreeSpaceMgr.LAST, -1);
                    }
                    else
                    {
                        VSFreeSpaceManager.FBQE fp = FreeSpaceMgr.GetFBQE(FreeSpaceMgr.LAST);
                        if (fp.ADDRESS_END == fstart)      //Extend last FBQE
                        {
                            FreeSpaceMgr.UpdateFBQE(FreeSpaceMgr.LAST, fp.ADDRESS_START, fp.LENGTH + fend - fstart);
                        }
                        else
                        {
                            FreeSpaceMgr.AddFBQE(fstart, fend - fstart, FreeSpaceMgr.LAST, -1);
                        }
                    }
                    e_address += 16;
                }
                // Cleanup allocation table
                vm.Write(DEFS.SYSTEM_ALLOCATION_ADDRESS, (short)0);

                // Expand FBQE block if needed
                FreeSpaceMgr.CheckFreeQueueSize();
            }

            //Initialize KeyHelper
            key_manager = new VSKeyManager(this);

            //Check pool areas descriptors, create if nulls
            A_POOL_USER_DEFINED = GetRootAllocation(DEFS.POOL_USER_DEFINED);
            if (A_POOL_USER_DEFINED == null)
            {
                A_POOL_USER_DEFINED = AllocateSpace(DEFS.ALLOCATION_USER_DEFINED, DEFS.POOL_USER_DEFINED, false, 0);
            }

            A_POOL_DYNAMIC = GetRootAllocation(DEFS.POOL_DYNAMIC);
            if (A_POOL_DYNAMIC == null)
            {
                A_POOL_DYNAMIC = AllocateSpace(DEFS.ALLOCATION_DYNAMIC, DEFS.POOL_DYNAMIC, false, 0);
            }
        }