Beispiel #1
0
        public void ReleaseLock(uint lockNo)
        {
            if (lockNo == 0 || lockNo > LockCount)
            {
                return;
            }

            var @lock = Locks[lockNo - 1];

            if (@lock.Owner != CurrentProcess.Id)
            {
                return;
            }

            @lock.RefCount--;
            if (@lock.RefCount != 0)
            {
                return;
            }

            @lock.Owner    = 0;
            @lock.RefCount = 0;

            var blockingProcess = DeviceReadQueue.Dequeue(@lock.Handle);

            if (blockingProcess == null)
            {
                return;
            }

            var pcb = blockingProcess.Process;

            AcquireLock(pcb, @lock);
            ReadyQueue.Enqueue(pcb);
        }
Beispiel #2
0
        public void Sleep(uint sleep)
        {
            var handle = SleepTimer.Register(sleep);

            DeviceReadQueue.Enqueue(handle, CurrentProcess);
            CurrentProcess = null;
        }
Beispiel #3
0
 public void Input(DeviceId deviceId, OpCodeFlag flag, uint rX)
 {
     if (Enum.IsDefined(typeof(DeviceId), deviceId))
     {
         DeviceReadQueue.Enqueue(deviceId, CurrentProcess, flag, rX);
         CurrentProcess = null;
     }
     else
     {
         CurrentProcess.Zf = true;
     }
 }
Beispiel #4
0
        public void WaitEvent(uint eventNo)
        {
            if (eventNo == 0 || eventNo > EventCount)
            {
                return;
            }

            var ev = Events[eventNo - 1];

            DeviceReadQueue.Enqueue(ev.Handle, CurrentProcess);
            CurrentProcess = null;
        }
Beispiel #5
0
        public void SignalEvent(uint eventNo)
        {
            if (eventNo == 0 || eventNo > EventCount)
            {
                return;
            }

            var ev = Events[eventNo - 1];

            BlockingProcess blockingProcess;

            while ((blockingProcess = DeviceReadQueue.Dequeue(ev.Handle)) != null)
            {
                ReadyQueue.Enqueue(blockingProcess.Process);
            }
        }
Beispiel #6
0
        private void TickSleepTimer()
        {
            DeviceId sleepTimer;

            if (!SleepTimer.Tick(out sleepTimer))
            {
                return;
            }

            BlockingProcess wakingProcess;

            while ((wakingProcess = DeviceReadQueue.Dequeue(sleepTimer)) != null)
            {
                ReadyQueue.Enqueue(wakingProcess.Process);
            }
        }
Beispiel #7
0
        public void AcquireLock(uint lockNo)
        {
            if (lockNo == 0 || lockNo > LockCount)
            {
                return;
            }

            var @lock = Locks[lockNo - 1];

            if (@lock.Owner == CurrentProcess.Id || @lock.Owner == 0)
            {
                AcquireLock(CurrentProcess, @lock);
                return;
            }

            DeviceReadQueue.Enqueue(@lock.Handle, CurrentProcess);
            CurrentProcess = null;
        }
Beispiel #8
0
        private void ReadTerminal()
        {
            uint value;

            if (!InputDevice.Get(out value))
            {
                return;
            }

            BlockingProcess wakingProcess;

            while ((wakingProcess = DeviceReadQueue.Dequeue(DeviceId.Terminal)) != null)
            {
                var process = wakingProcess.Process;
                process.Registers[wakingProcess.Argument] = value;

                ReadyQueue.Enqueue(process);
            }
        }