//Thread queue for keeping track of threads waiting to run
thread_queue_t ready_queue;
-#ifdef TOSTHREADS_TIMER_OPTIMIZATION
- void task timerTask() {
+ void task alarmTask() {
uint8_t temp;
atomic temp = num_runnable_threads;
if(temp <= 1)
call PreemptionAlarm.stop();
- if(temp > 1)
+ else if(temp > 1)
call PreemptionAlarm.startOneShot(TOSTHREAD_PREEMPTION_PERIOD);
}
-#endif
/* switch_threads()
* This routine swaps the stack and allows a thread to run.
while(TRUE) {
bool mt;
atomic mt = (call ThreadQueue.isEmpty(&ready_queue) == TRUE);
- if(!mt || tos_thread->state == TOSTHREAD_STATE_READY) break;
+ if(!mt) break;
call McuSleep.sleep();
}
}
*/
void scheduleNextThread() {
if(tos_thread->state == TOSTHREAD_STATE_READY)
- current_thread = tos_thread;
+ current_thread = call ThreadQueue.remove(&ready_queue, tos_thread);
else
current_thread = call ThreadQueue.dequeue(&ready_queue);
void suspend(thread_t* thread) {
//if there are no active threads, put the MCU to sleep
//Then wakeup the TinyOS thread whenever the MCU wakes up again
- #ifdef TOSTHREADS_TIMER_OPTIMIZATION
+ #ifdef TOSTHREADS_TIMER_OPTIMIZATION
num_runnable_threads--;
- post timerTask();
+ post alarmTask();
#endif
sleepWhileIdle();
interrupt(thread);
void stop(thread_t* t) {
int i;
t->state = TOSTHREAD_STATE_INACTIVE;
- #ifdef TOSTHREADS_TIMER_OPTIMIZATION
- num_runnable_threads--;
- post timerTask();
- #endif
+ num_runnable_threads--;
for(i=0; i<TOSTHREAD_MAX_NUM_THREADS; i++) {
if(call BitArrayUtils.getBit(t->joinedOnMe, i))
call ThreadScheduler.wakeupThread(i);
}
+ #ifdef TOSTHREADS_TIMER_OPTIMIZATION
+ post alarmTask();
+ #else
+ if(num_runnable_threads == 1)
+ call PreemptionAlarm.stop();
+ #endif
signal ThreadCleanup.cleanup[t->id]();
}
atomic {
thread_t* t = (call ThreadInfo.get[id]());
if(t->state == TOSTHREAD_STATE_INACTIVE) {
+ num_runnable_threads++;
+ #ifdef TOSTHREADS_TIMER_OPTIMIZATION
+ post alarmTask();
+ #else
+ if(num_runnable_threads == 2)
+ call PreemptionAlarm.startOneShot(TOSTHREAD_PREEMPTION_PERIOD);
+ #endif
t->state = TOSTHREAD_STATE_READY;
call ThreadQueue.enqueue(&ready_queue, t);
- #ifdef TOSTHREADS_TIMER_OPTIMIZATION
- num_runnable_threads++;
- post timerTask();
- #endif
return SUCCESS;
}
}
thread_t* t = call ThreadInfo.get[id]();
if((t->state) == TOSTHREAD_STATE_SUSPENDED) {
t->state = TOSTHREAD_STATE_READY;
- if(t != tos_thread) {
- call ThreadQueue.enqueue(&ready_queue, call ThreadInfo.get[id]());
- #ifdef TOSTHREADS_TIMER_OPTIMIZATION
- atomic num_runnable_threads++;
- post timerTask();
- #endif
- }
+ call ThreadQueue.enqueue(&ready_queue, call ThreadInfo.get[id]());
+ #ifdef TOSTHREADS_TIMER_OPTIMIZATION
+ atomic num_runnable_threads++;
+ post alarmTask();
+ #endif
return SUCCESS;
}
return FAIL;
return NULL;
}
}
-