static int CpuCount;
/***************************************
- Lock Operations
+ Lock and Condition Operations
***************************************/
static void AcquireLock(void)
{
pthread_cond_timedwait(cond, mutex, &expire_time);
}
+static void WaitForTaskFree(Task_T* prev, Task_T* next)
+{
+ if (prev != next)
+ {
+ while (!next->stack_top)
+ {
+ }
+ }
+}
+
/***************************************
Queue Operations
***************************************/
printf("CPU %d is yielding\n", CpuID);
Task_T* prev = Running[CpuID].task;
Running[CpuID].task = NULL;
+ prev->stack_top = NULL;
Enter(prev);
printf("CPU %d is picking task\n", CpuID);
Running[CpuID].task = Select();
printf("CPU %d switching to task %p\n", CpuID, Running[CpuID].task);
ReleaseLock();
+ WaitForTaskFree(prev, Running[CpuID].task);
SwapTask(prev, Running[CpuID].task);
}
{
puts("exiting");
AcquireLock();
- Enqueue(&DeadQueue, Running[CpuID].task);
+ printf("CPU %d is yielding\n", CpuID);
+ Task_T* prev = Running[CpuID].task;
Running[CpuID].task = NULL;
+ prev->stack_top = NULL;
+ printf("CPU %d is picking task\n", CpuID);
Running[CpuID].task = Select();
- printf("starting task %p\n", Running[CpuID].task);
+ printf("CPU %d switching to task %p\n", CpuID, Running[CpuID].task);
ReleaseLock();
- StartTask(Running[CpuID].task);
+ WaitForTaskFree(prev, Running[CpuID].task);
+ SwapTask(prev, Running[CpuID].task);
}
static Task_T* CreateTask(void (*task_fn)(void*), void* arg, int stacksize)