static Thread_T* Threads;
static struct {
pthread_cond_t cond;
- pthread_cond_t mutex;
+ pthread_mutex_t mutex;
long int value;
} TaskCount;
-extern void Task_Switch(Task_T* prev, Task_T* next);
-asm (
-".global Task_Switch\n"
-"Task_Switch:\n"
-" push %rdi\n"
-" push %rbp\n"
-" push %rbx\n"
-" push %r12\n"
-" push %r13\n"
-" push %r14\n"
-" push %r15\n"
-" mov %rsp,(%rdi)\n"
-" mov (%rsi),%rsp\n"
-" pop %r15\n"
-" pop %r14\n"
-" pop %r13\n"
-" pop %r12\n"
-" pop %rbx\n"
-" pop %rbp\n"
-" pop %rdi\n"
-" ret\n"
- );
+extern void ContextSwitch(Task_T* curr, Task_T* next);
static void Enqueue(int id, Task_T* task)
{
Threads[ThreadID].tail = NULL;
}
- printf("thread %d switching to task\n", ThreadID);
- Task_Switch(curr, Threads[ThreadID].curr);
+ printf("thread %d switching from task %d to task %d\n",
+ ThreadID, curr->id, Threads[ThreadID].curr->id);
+ ContextSwitch(curr, Threads[ThreadID].curr);
}
}
TRY( pthread_mutex_lock(&TaskCount.mutex) );
TaskCount.value--;
- printf("TASK COUNT %d\n", TaskCount.value);
+ printf("TASK COUNT(-) %ld\n", TaskCount.value);
TRY( pthread_cond_signal(&TaskCount.cond) );
TRY( pthread_mutex_unlock(&TaskCount.mutex) );
-
while(true)
{
Task_Yield();
/* let's wait for there to be work to do */
TRY_ELSE( pthread_cond_wait(&Threads[ThreadID].cond, &Threads[ThreadID].mutex) )
{
+ perror("pthread_cond_wait:");
/* ignore error */
}
TRY( pthread_mutex_lock(&TaskCount.mutex) );
Task_T* task = CreateTask(task_fn, arg, stacksize);
TaskCount.value++;
- printf("TASK COUNT %d\n", TaskCount.value);
+ printf("TASK COUNT(+) %ld\n", TaskCount.value);
TRY( pthread_cond_signal(&TaskCount.cond) );
TRY( pthread_mutex_unlock(&TaskCount.mutex) );
TRY_ELSE( pthread_cond_wait(&TaskCount.cond, &TaskCount.mutex) )
{
/* ignore error */
+ perror("pthread_cond_wait:");
}
- TRY( pthread_mutex_lock(&TaskCount.mutex) );
+// TRY( pthread_mutex_lock(&TaskCount.mutex) );
if(TaskCount.value == 0)
{
break;
}
- TRY( pthread_mutex_unlock(&TaskCount.mutex) );
+// TRY( pthread_mutex_unlock(&TaskCount.mutex) );
}
// int count = atoi(argv[1]);