diff options
| author | Michael Sevakis <jethead71@rockbox.org> | 2006-12-21 02:33:01 +0000 |
|---|---|---|
| committer | Michael Sevakis <jethead71@rockbox.org> | 2006-12-21 02:33:01 +0000 |
| commit | d19ca324fcd8df0d62d1f7e8ee2b16c9bdbef0e8 (patch) | |
| tree | 67c5394f5e63303ed3190607e4bb581958ce4681 /apps/plugins | |
| parent | bb0358647d68e989d065ea70d95746fd2b6f4cad (diff) | |
| download | rockbox-d19ca324fcd8df0d62d1f7e8ee2b16c9bdbef0e8.zip rockbox-d19ca324fcd8df0d62d1f7e8ee2b16c9bdbef0e8.tar.gz rockbox-d19ca324fcd8df0d62d1f7e8ee2b16c9bdbef0e8.tar.bz2 rockbox-d19ca324fcd8df0d62d1f7e8ee2b16c9bdbef0e8.tar.xz | |
Lil' tweak to plugins using remove_thread. Just use remove_thread(NULL) to have a thread remove itself. No subsequent yield() is needed either. Small Note: in current scheduler implementation it safe to call remove_thread IFF 1) thread removes itself 2) its state is known to be running (1 implies 2) as any objects with the waiting removed thread will be corrupted (m->thread, q->thread no longer valid or no longer same object if recycled, etc.).
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@11826 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/plugins')
| -rw-r--r-- | apps/plugins/alpine_cdc.c | 8 | ||||
| -rw-r--r-- | apps/plugins/battery_bench.c | 18 |
2 files changed, 9 insertions, 17 deletions
diff --git a/apps/plugins/alpine_cdc.c b/apps/plugins/alpine_cdc.c index 6510868..9c1bc8b 100644 --- a/apps/plugins/alpine_cdc.c +++ b/apps/plugins/alpine_cdc.c @@ -202,7 +202,6 @@ struct /* communication to the worker thread */ struct { - struct thread_entry *id; /* Pointer of the thread */ bool foreground; /* set as long as we're owning the UI */ bool exiting; /* signal to the thread that we want to exit */ bool ended; /* response from the thread, that is has exited */ @@ -1117,8 +1116,7 @@ void thread(void) } while (!gTread.exiting); gTread.ended = true; /* acknowledge the exit */ - rb->remove_thread(gTread.id); /* commit suicide */ - rb->yield(); /* pass control to other threads, we won't return */ + rb->remove_thread(NULL); /* commit suicide */ } /* callback to end the TSR plugin, called before a new one gets loaded */ @@ -1172,8 +1170,8 @@ int main(void* parameter) rb->memset(&gTread, 0, sizeof(gTread)); gTread.foreground = true; - gTread.id = rb->create_thread(thread, stack, stacksize, "CDC" - IF_PRIO(, PRIORITY_BACKGROUND)); + rb->create_thread(thread, stack, stacksize, "CDC" + IF_PRIO(, PRIORITY_BACKGROUND)); #ifdef DEBUG do diff --git a/apps/plugins/battery_bench.c b/apps/plugins/battery_bench.c index bf0c2f3..4f1016b 100644 --- a/apps/plugins/battery_bench.c +++ b/apps/plugins/battery_bench.c @@ -111,11 +111,7 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) return main(); } -struct -{ - struct thread_entry *id; - bool ended; -} s_thread; +bool thread_stopped = false; /* Struct for battery information */ struct batt_info @@ -142,7 +138,7 @@ bool exit_tsr(bool reenter) if (exit) { rb->queue_post(&thread_q, EV_EXIT, 0); - while (!s_thread.ended) + while (!thread_stopped) rb->yield(); /* remove the thread's queue from the broadcast list */ rb->queue_delete(&thread_q); @@ -330,9 +326,8 @@ void thread(void) #else "bench exit"); #endif - s_thread.ended = true; - rb->remove_thread(s_thread.id); - rb->yield(); /* exit the thread, this yield() won't return */ + thread_stopped = true; + rb->remove_thread(NULL); /* Suicide. Never returns. */ } rb->queue_wait_w_tmo(&thread_q, &ev, sleep_time); @@ -482,10 +477,9 @@ int main(void) } rb->queue_init(&thread_q, true); /* put the thread's queue in the bcast list */ - rb->memset(&s_thread, 0, sizeof(s_thread)); /* zero the struct */ - if((s_thread.id = rb->create_thread(thread, thread_stack, + if(rb->create_thread(thread, thread_stack, sizeof(thread_stack), "Battery Benchmark" - IF_PRIO(, PRIORITY_BACKGROUND))) == NULL) + IF_PRIO(, PRIORITY_BACKGROUND)) == NULL) { rb->splash(HZ,true,"Cannot create thread!"); return PLUGIN_ERROR; |