diff options
author | Jörg Hohensohn <hohensoh@rockbox.org> | 2004-04-30 20:23:04 +0000 |
---|---|---|
committer | Jörg Hohensohn <hohensoh@rockbox.org> | 2004-04-30 20:23:04 +0000 |
commit | 7bd007a597a15cd5fcb4f9c7d20f4309e2cbe1e3 (patch) | |
tree | e51c989b9b87e35336ce1896ddd44f658b199c38 /firmware | |
parent | a542aa6764d6a5dadf83882fa88ec5f9a3435a5c (diff) | |
download | rockbox-7bd007a597a15cd5fcb4f9c7d20f4309e2cbe1e3.tar.gz rockbox-7bd007a597a15cd5fcb4f9c7d20f4309e2cbe1e3.zip |
remove_thread() function added, for future dynamic thread creation by plugins
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@4562 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware')
-rw-r--r-- | firmware/export/thread.h | 1 | ||||
-rw-r--r-- | firmware/thread.c | 47 |
2 files changed, 35 insertions, 13 deletions
diff --git a/firmware/export/thread.h b/firmware/export/thread.h index c6b3c8e4e3..77209726f7 100644 --- a/firmware/export/thread.h +++ b/firmware/export/thread.h | |||
@@ -25,6 +25,7 @@ | |||
25 | #define DEFAULT_STACK_SIZE 0x400 /* Bytes */ | 25 | #define DEFAULT_STACK_SIZE 0x400 /* Bytes */ |
26 | 26 | ||
27 | int create_thread(void* function, void* stack, int stack_size, char *name); | 27 | int create_thread(void* function, void* stack, int stack_size, char *name); |
28 | void remove_thread(int threadnum); | ||
28 | void switch_thread(void); | 29 | void switch_thread(void); |
29 | void sleep_thread(void); | 30 | void sleep_thread(void); |
30 | void wake_up_thread(void); | 31 | void wake_up_thread(void); |
diff --git a/firmware/thread.c b/firmware/thread.c index aedd665d2e..25141d6f80 100644 --- a/firmware/thread.c +++ b/firmware/thread.c | |||
@@ -137,7 +137,7 @@ void wake_up_thread(void) | |||
137 | 137 | ||
138 | /*--------------------------------------------------------------------------- | 138 | /*--------------------------------------------------------------------------- |
139 | * Create thread. | 139 | * Create thread. |
140 | * Return 0 if context area could be allocated, else -1. | 140 | * Return ID if context area could be allocated, else -1. |
141 | *--------------------------------------------------------------------------- | 141 | *--------------------------------------------------------------------------- |
142 | */ | 142 | */ |
143 | int create_thread(void* function, void* stack, int stack_size, char *name) | 143 | int create_thread(void* function, void* stack, int stack_size, char *name) |
@@ -149,9 +149,8 @@ int create_thread(void* function, void* stack, int stack_size, char *name) | |||
149 | 149 | ||
150 | if (num_threads >= MAXTHREADS) | 150 | if (num_threads >= MAXTHREADS) |
151 | return -1; | 151 | return -1; |
152 | else | 152 | |
153 | { | 153 | /* Munge the stack to make it easy to spot stack overflows */ |
154 | /* Munge the stack to make it easy to spot stack overflows */ | ||
155 | stacklen = stack_size / 4; | 154 | stacklen = stack_size / 4; |
156 | stackptr = stack; | 155 | stackptr = stack; |
157 | for(i = 0;i < stacklen;i++) | 156 | for(i = 0;i < stacklen;i++) |
@@ -163,16 +162,38 @@ int create_thread(void* function, void* stack, int stack_size, char *name) | |||
163 | thread_name[num_threads] = name; | 162 | thread_name[num_threads] = name; |
164 | thread_stack[num_threads] = stack; | 163 | thread_stack[num_threads] = stack; |
165 | thread_stack_size[num_threads] = stack_size; | 164 | thread_stack_size[num_threads] = stack_size; |
166 | regs = &thread_contexts[num_threads++]; | 165 | regs = &thread_contexts[num_threads]; |
167 | store_context(regs); | 166 | store_context(regs); |
168 | /* Subtract 4 to leave room for the PR push in load_context() | 167 | /* Subtract 4 to leave room for the PR push in load_context() |
169 | Align it on an even 32 bit boundary */ | 168 | Align it on an even 32 bit boundary */ |
170 | regs->sp = (void*)(((unsigned int)stack + stack_size - 4) & ~3); | 169 | regs->sp = (void*)(((unsigned int)stack + stack_size - 4) & ~3); |
171 | regs->sr = 0; | 170 | regs->sr = 0; |
172 | regs->pr = function; | 171 | regs->pr = function; |
173 | } | 172 | |
174 | wake_up_thread(); | 173 | wake_up_thread(); |
175 | return 0; | 174 | return num_threads++; /* return the current ID, e.g for remove_tread() */ |
175 | } | ||
176 | |||
177 | /*--------------------------------------------------------------------------- | ||
178 | * Remove a thread from the scheduler. | ||
179 | * Parameter is the ID as returned from create_thread(). | ||
180 | *--------------------------------------------------------------------------- | ||
181 | */ | ||
182 | void remove_thread(int threadnum) | ||
183 | { | ||
184 | int i; | ||
185 | |||
186 | if(threadnum >= num_threads) | ||
187 | return; | ||
188 | |||
189 | num_threads--; | ||
190 | for (i=threadnum; i<num_threads-1; i++) | ||
191 | { /* move all entries which are behind */ | ||
192 | thread_name[i] = thread_name[i+1]; | ||
193 | thread_stack[i] = thread_stack[i+1]; | ||
194 | thread_stack_size[i] = thread_stack_size[i+1]; | ||
195 | thread_contexts[i] = thread_contexts[i+1]; | ||
196 | } | ||
176 | } | 197 | } |
177 | 198 | ||
178 | void init_threads(void) | 199 | void init_threads(void) |