///////////////////////////////////////////////////////////////////////////////////////// ////////////////////////// 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()); }
/// <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); } }