Add ao_wake_task and ao_exit
[fw/altos] / src / ao_task.c
index 12b73943f0c1c73eec79064c4b97e8f0dc1f21ab..136444b0899ef0b6112544f507f7ca9e8b7d80fa 100644 (file)
@@ -93,7 +93,9 @@ ao_yield(void) _naked
                push    _bp
        _endasm;
 
                push    _bp
        _endasm;
 
-       if (ao_cur_task_index != AO_NO_TASK_INDEX)
+       if (ao_cur_task_index == AO_NO_TASK_INDEX)
+               ao_cur_task_index = ao_num_tasks-1;
+       else
        {
                uint8_t stack_len;
                __data uint8_t *stack_ptr;
        {
                uint8_t stack_len;
                __data uint8_t *stack_ptr;
@@ -198,6 +200,24 @@ ao_wakeup(__xdata void *wchan)
                        ao_tasks[i]->wchan = NULL;
 }
 
                        ao_tasks[i]->wchan = NULL;
 }
 
+void
+ao_wake_task(__xdata struct ao_task *task)
+{
+       task->wchan = NULL;
+}
+
+void
+ao_exit(void)
+{
+       uint8_t i;
+       ao_num_tasks--;
+       for (i = ao_cur_task_index; i < ao_num_tasks; i++)
+               ao_tasks[i] = ao_tasks[i+1];
+       ao_cur_task_index = AO_NO_TASK_INDEX;
+       ao_yield();
+       /* we'll never get back here */
+}
+
 void
 ao_task_info(void)
 {
 void
 ao_task_info(void)
 {