Пример #1
0
 internal Thread(ThreadStart threadStart, ThreadPriority priority, SIP sip, TaskHandle task)
 {
     Task = task;
     _threadStart = threadStart;
     _priority = priority;
     _sip = sip;
 }
Пример #2
0
 public void Acquire()
 {
     TaskHandle currentTask = SystemCalls.GetCurrentTask();
     //Logging.Trace("Task " + currentTask + " acquiring lock " + GetHashCode());
     while (_owner != null && _owner != currentTask)
     {
         //Logging.Trace("Task " + currentTask + " failed to acquire lock " + GetHashCode());
         _waitingOwners.Push(currentTask);
         SystemCalls.BlockTask(currentTask);
         SystemCalls.Yield();
     }
     _owner = currentTask;
     //Logging.Trace("Task " + currentTask + " acquired lock " + GetHashCode());
 }
Пример #3
0
 public bool TryAcquire()
 {
     TaskHandle currentTask = SystemCalls.GetCurrentTask();
     if (_owner == null)
     {
         _owner = currentTask;
         return true;
     }
     else if (_owner == currentTask)
     {
         return true;
     }
     return false;
 }
Пример #4
0
 public void Release()
 {
     TaskHandle currentTask = SystemCalls.GetCurrentTask();
     if (_owner == currentTask)
     {
         _owner = null;
         if (_waitingOwners.Length > 0)
         {
             // here we call ScheduleTask instead of Unblock because we Yielded the task
             SystemCalls.ScheduleTask(_owner = _waitingOwners.Shift());
         }
     }
     else
     {
         throw new Exception("Cannot release lock.  Current thread is not owner");
     }
 }
Пример #5
0
 public extern Thread this[TaskHandle task]
 {
     [XaeiOSMethodImpl(MethodImplOptions.Inline, Implementation = "{this}[{0}]")]
     get;
     [XaeiOSMethodImpl(MethodImplOptions.Inline, Implementation = "{this}[{0}] = {1}")]
     set;
 }
Пример #6
0
 public static extern void InjectException(TaskHandle task, Exception exception);
Пример #7
0
        private void InternalCallback(TaskHandle task, string taskName, var returnValue, TaskExitStatus exitStatus)
        {
            //Logging.Trace("Thread internal callback: " + this + ":" + this.Name);
            _running = false;
            //Logging.Trace("Unregistering thread: " + this + ":" + this.Name);
            ThreadManager.UnregisterThread(this);

            if (exitStatus == TaskExitStatus.UnhandledException)
            {
                _unhandledException = returnValue.Cast<Object>() as Exception;
            }
            else if (exitStatus == TaskExitStatus.CriticalError)
            {
                _unhandledException = new ExecutionEngineException(returnValue.NativeToString());
            }

            if (Callback != null)
            {
                // TODO: Use the SIP thread pool to run this callback
                Callback();
            }
            else
            {
                if (_unhandledException != null)
                {
                    Console.WriteLine("An unhandled exception occurred in thread: " + this + ": " + _unhandledException + "\n" + _unhandledException.StackTrace);
                }
            }
        }
Пример #8
0
 internal static Thread CreateSystemThread(ThreadPriority priority, SIP sip, TaskHandle kernelTask, string name)
 {
     Thread kernelThread = new Thread();
     kernelThread.Task = kernelTask;
     kernelThread._priority = priority;
     kernelThread._sip = sip;
     kernelThread._name = name;
     return kernelThread;
 }
Пример #9
0
 public static void InjectException(TaskHandle task, Exception exception)
 {
     GetTask(task).InjectedException = (XaeiOSException)exception;
 }
Пример #10
0
 public static extern void ScheduleTask(TaskHandle task);
Пример #11
0
 public Lock()
 {
     _owner = null;
     _waitingOwners = new NativeArray<TaskHandle>();
 }
Пример #12
0
 public static void StartTask(TaskHandle task)
 {
     Scheduler.StartTask(GetTask(task));
 }
Пример #13
0
 public static void ScheduleTask(TaskHandle task)
 {
     Scheduler.ScheduleTaskChecked(GetTask(task));
 }
Пример #14
0
 public static void KillTask(TaskHandle task)
 {
     Scheduler.KillTask(GetTask(task));
 }
Пример #15
0
 public MonitorLock()
 {
     _owner = null;
     _waitingOwners = new NativeArray<TaskHandle>();
     _count = 0;
 }
Пример #16
0
 public bool TryAcquire()
 {
     TaskHandle currentTask = SystemCalls.GetCurrentTask();
     if (_owner == null)
     {
         _owner = currentTask;
         _count++;
         //Logging.Trace("Task " + currentTask + " acquired monitor lock " + GetHashCode() + " - count: " + _count);
         return true;
     }
     else if (_owner == currentTask)
     {
         _count++;
         //Logging.Trace("Task " + currentTask + " acquired monitor lock " + GetHashCode() + " - count: " + _count);
         return true;
     }
     return false;
 }
Пример #17
0
 public static extern void StartTask(TaskHandle task);
Пример #18
0
 public extern void Remove(TaskHandle task);
Пример #19
0
 public WaitingTask(TaskHandle task, int resources)
 {
     Task = task;
     Resources = resources;
 }
Пример #20
0
 public static extern void BlockTask(TaskHandle task);
Пример #21
0
 private static Task GetTask(TaskHandle task)
 {
     Task t = Task.GetTaskById(var.Cast<TaskHandle, int>(task));
     if (t == null)
     {
         throw new Exception("Task with " + task + " does not exist.");
     }
     return t;
 }
Пример #22
0
 public static extern void KillTask(TaskHandle task);
Пример #23
0
 public static void BlockTask(TaskHandle task)
 {
     Scheduler.BlockTask(GetTask(task));
 }
Пример #24
0
 public void Cancel()
 {
     Logging.Trace("Unblocker::Cancel()");
     Global.ClearTimeout(TimeoutId);
     TimeoutId = null;
     Task = null;
 }