forked from len0rd/rockbox
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
This commit is contained in:
parent
a542aa6764
commit
7bd007a597
2 changed files with 35 additions and 13 deletions
|
|
@ -25,6 +25,7 @@
|
||||||
#define DEFAULT_STACK_SIZE 0x400 /* Bytes */
|
#define DEFAULT_STACK_SIZE 0x400 /* Bytes */
|
||||||
|
|
||||||
int create_thread(void* function, void* stack, int stack_size, char *name);
|
int create_thread(void* function, void* stack, int stack_size, char *name);
|
||||||
|
void remove_thread(int threadnum);
|
||||||
void switch_thread(void);
|
void switch_thread(void);
|
||||||
void sleep_thread(void);
|
void sleep_thread(void);
|
||||||
void wake_up_thread(void);
|
void wake_up_thread(void);
|
||||||
|
|
|
||||||
|
|
@ -137,7 +137,7 @@ void wake_up_thread(void)
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------
|
/*---------------------------------------------------------------------------
|
||||||
* Create thread.
|
* Create thread.
|
||||||
* Return 0 if context area could be allocated, else -1.
|
* Return ID if context area could be allocated, else -1.
|
||||||
*---------------------------------------------------------------------------
|
*---------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
int create_thread(void* function, void* stack, int stack_size, char *name)
|
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)
|
||||||
|
|
||||||
if (num_threads >= MAXTHREADS)
|
if (num_threads >= MAXTHREADS)
|
||||||
return -1;
|
return -1;
|
||||||
else
|
|
||||||
{
|
/* Munge the stack to make it easy to spot stack overflows */
|
||||||
/* Munge the stack to make it easy to spot stack overflows */
|
|
||||||
stacklen = stack_size / 4;
|
stacklen = stack_size / 4;
|
||||||
stackptr = stack;
|
stackptr = stack;
|
||||||
for(i = 0;i < stacklen;i++)
|
for(i = 0;i < stacklen;i++)
|
||||||
|
|
@ -163,16 +162,38 @@ int create_thread(void* function, void* stack, int stack_size, char *name)
|
||||||
thread_name[num_threads] = name;
|
thread_name[num_threads] = name;
|
||||||
thread_stack[num_threads] = stack;
|
thread_stack[num_threads] = stack;
|
||||||
thread_stack_size[num_threads] = stack_size;
|
thread_stack_size[num_threads] = stack_size;
|
||||||
regs = &thread_contexts[num_threads++];
|
regs = &thread_contexts[num_threads];
|
||||||
store_context(regs);
|
store_context(regs);
|
||||||
/* Subtract 4 to leave room for the PR push in load_context()
|
/* Subtract 4 to leave room for the PR push in load_context()
|
||||||
Align it on an even 32 bit boundary */
|
Align it on an even 32 bit boundary */
|
||||||
regs->sp = (void*)(((unsigned int)stack + stack_size - 4) & ~3);
|
regs->sp = (void*)(((unsigned int)stack + stack_size - 4) & ~3);
|
||||||
regs->sr = 0;
|
regs->sr = 0;
|
||||||
regs->pr = function;
|
regs->pr = function;
|
||||||
}
|
|
||||||
wake_up_thread();
|
wake_up_thread();
|
||||||
return 0;
|
return num_threads++; /* return the current ID, e.g for remove_tread() */
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
* Remove a thread from the scheduler.
|
||||||
|
* Parameter is the ID as returned from create_thread().
|
||||||
|
*---------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
void remove_thread(int threadnum)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if(threadnum >= num_threads)
|
||||||
|
return;
|
||||||
|
|
||||||
|
num_threads--;
|
||||||
|
for (i=threadnum; i<num_threads-1; i++)
|
||||||
|
{ /* move all entries which are behind */
|
||||||
|
thread_name[i] = thread_name[i+1];
|
||||||
|
thread_stack[i] = thread_stack[i+1];
|
||||||
|
thread_stack_size[i] = thread_stack_size[i+1];
|
||||||
|
thread_contexts[i] = thread_contexts[i+1];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void init_threads(void)
|
void init_threads(void)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue