internal override void EnableHeap() { interlock = new Object(); MultiUseWord.GetMonitor(interlock); CoCoBarrier.InitLate(); // REVIEW: add some bartok args instead sizeFracLim = EnvInt(10, "COCO_SIZE_FRAC_LIM"); sizeLim = EnvInt(-1, "COCO_SIZE_LIM"); pageFragThres = EnvInt(2, "COCO_PAGE_FRAG_THRES"); pinPenalty = EnvInt(10, "COCO_PIN_PENALTY"); cocoDelay = EnvInt(8, "COCO_COPY_DELAY"); if (EnvInt(0, "COCO_FORCE_SLOW") != 0) { CoCoBarrier.ForceSlow(); } if (EnvInt(0, "COCO_FORCE_NOT_IDLE") != 0) { CoCoBarrier.ForceNotIdle(); } if (EnvInt(0, "COCO_FORCE_FORWARDING") != 0) { CoCoBarrier.ForceForwarding(); } if (EnvInt(0, "COCO_FORCE_PINNING") != 0) { CoCoBarrier.ForcePinning(); } base.EnableHeap(); cocoThread = new Thread(new ThreadStart(CoCoLoop)); cocoThread.Start(); }
/// <summary> /// Look up the Monitor for the specified object in the SyncBlock /// tables. If no Monitor exists for the object then one is created. /// </summary> private static Monitor GetMonitorFromObject(Object obj) { if (obj == null) { DebugStub.Break(); throw new ArgumentNullException("obj"); } Monitor result = MultiUseWord.GetMonitor(obj); return(result); }
// call when the heap is inited internal static void InitLate() { if (fDebug) { VTable.DebugPrint("CoCo: in InitLate\n"); } interlock = new Object(); MultiUseWord.GetMonitor(interlock); MixinThread(Thread.CurrentThread).readyForCoCo = true; // REVIEW: this is just offensive GCFieldOffset = (UIntPtr)Magic.toPointer(ref ThreadHeaderQueue.MixinObject(instance).preHeader.link) - Magic.addressOf(instance); vtableFieldOffset = (UIntPtr)instance.VTableFieldAddr - Magic.addressOf(instance); instance.InitLateStub(); inited = true; }