Пример #1
0
        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();
        }
Пример #2
0
        /// <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);
        }
Пример #3
0
        // 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;
        }