Added mt_stop() calling mtarch_stop() to allow for thread resource cleanup.

This commit is contained in:
oliverschmidt 2007-04-03 18:47:21 +00:00
parent d41c0671d9
commit 1d63347cfc
2 changed files with 68 additions and 29 deletions

View File

@ -30,7 +30,7 @@
* *
* Author: Adam Dunkels <adam@sics.se> * Author: Adam Dunkels <adam@sics.se>
* *
* $Id: mt.c,v 1.4 2007/03/15 21:46:07 adamdunkels Exp $ * $Id: mt.c,v 1.5 2007/04/03 18:47:21 oliverschmidt Exp $
*/ */
/** /**
@ -92,14 +92,6 @@ mt_exec(struct mt_thread *thread)
} }
} }
/*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/
void
mt_exit(void)
{
current->state = MT_STATE_EXITED;
current = NULL;
mtarch_yield();
}
/*--------------------------------------------------------------------------*/
#if 0 #if 0
void void
mt_exec_event(struct mt_thread *thread, process_event_t ev, mt_exec_event(struct mt_thread *thread, process_event_t ev,
@ -132,6 +124,20 @@ mt_yield(void)
} }
/*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/
void
mt_exit(void)
{
current->state = MT_STATE_EXITED;
current = NULL;
mtarch_yield();
}
/*--------------------------------------------------------------------------*/
void
mt_stop(struct mt_thread *thread)
{
mtarch_stop(&thread->thread);
}
/*--------------------------------------------------------------------------*/
#if 0 #if 0
void void
mt_post(struct process *p, process_event_t ev, mt_post(struct process *p, process_event_t ev,

View File

@ -30,7 +30,7 @@
* *
* Author: Adam Dunkels <adam@sics.se> * Author: Adam Dunkels <adam@sics.se>
* *
* $Id: mt.h,v 1.3 2006/09/26 20:59:51 adamdunkels Exp $ * $Id: mt.h,v 1.4 2007/04/03 18:47:21 oliverschmidt Exp $
*/ */
/** \addtogroup sys /** \addtogroup sys
@ -57,17 +57,19 @@
* *
* The Contiki multi-threading library requires some architecture * The Contiki multi-threading library requires some architecture
* specific support for seting up and switching stacks. This support * specific support for seting up and switching stacks. This support
* requires three stack manipulation functions to be implemented: * requires four stack manipulation functions to be implemented:
* mtarch_start(), which sets up the stack frame for a new thread, * mtarch_start(), which sets up the stack frame for a new thread,
* mtarch_exec(), which switches in the stack of a thread, and * mtarch_exec(), which switches in the stack of a thread,
* mtarch_yield(), which restores the kernel stack from a thread's * mtarch_yield(), which restores the kernel stack from a thread's
* stack. Additionally, two functions for controlling the preemption * stack and mtarch_stop(), which cleans up the stack of a thread.
* (if any) must be implemented: mtarch_preemption_start() and * Additionally, two functions for controlling the preemption
* mtarch_preemption_stop(). If no preemption is used, these functions * (if any) must be implemented: mtarch_pstart() and mtarch_pstop().
* can be implemented as empty functions. Finally, the function * If no preemption is used, these functions can be implemented as
* mtarch_init() is called by mt_init(), and can be used for * empty functions. Finally, the function mtarch_init() is called by
* initalization of timer interrupts, or any other mechanisms required * mt_init(), and can be used for initalization of timer interrupts,
* for correct operation of the architecture specific support funcions. * or any other mechanisms required for correct operation of the
* architecture specific support funcions while mtarch_remove() is
* called by mt_remove() to clean up those resources.
* *
*/ */
@ -130,6 +132,21 @@ void mtarch_start(struct mtarch_thread *thread,
void (* function)(void *data), void (* function)(void *data),
void *data); void *data);
/**
* Start executing a thread.
*
* This function is called from mt_exec() and the purpose of the
* function is to start execution of the thread. The function should
* switch in the stack of the thread, and does not return until the
* thread has explicitly yielded (using mt_yield()) or until it is
* preempted.
*
* \param thread A pointer to a struct mtarch_thread for the thread to
* be executed.
*
*/
void mtarch_exec(struct mtarch_thread *thread);
/** /**
* Yield the processor. * Yield the processor.
* *
@ -140,17 +157,19 @@ void mtarch_start(struct mtarch_thread *thread,
void mtarch_yield(void); void mtarch_yield(void);
/** /**
* Start executing a thread. * Clean up the stack of a thread.
* *
* This function is called from mt_exec() and the purpose of the * This function is called by the mt_stop() function in order to clean
* function is to start execution of the thread. The function should * up the architecture specific stack of the thread to be stopped.
* switch in the stack of the thread, and does not return until the *
* thread has explicitly yielded (using mt_yield()) or until it is * \note If the stack is wholly contained in struct mtarch_thread this
* preempted. * function may very well be empty.
*
* \param thread A pointer to a struct mtarch_thread for the thread to
* be stopped.
* *
*/ */
void mtarch_exec(struct mtarch_thread *thread); void mtarch_stop(struct mtarch_thread *thread);
void mtarch_pstart(void); void mtarch_pstart(void);
void mtarch_pstop(void); void mtarch_pstop(void);
@ -208,7 +227,8 @@ void mt_start(struct mt_thread *thread, void (* function)(void *), void *data);
* thread. The function does not return until the thread has yielded, * thread. The function does not return until the thread has yielded,
* or is preempted. * or is preempted.
* *
* \note The thread must first be initialized with the mt_init() function. * \note The thread library must first be initialized with the mt_init()
* function.
* *
* \param thread A pointer to a struct mt_thread block that must be * \param thread A pointer to a struct mt_thread block that must be
* allocated by the caller. * allocated by the caller.
@ -224,7 +244,8 @@ void mt_exec(struct mt_thread *thread);
* number. If the thread is not waiting for the event, this function * number. If the thread is not waiting for the event, this function
* does nothing. * does nothing.
* *
* \note The thread must first be initialized with the mt_init() function. * \note The thread library must first be initialized with the mt_init()
* function.
* *
* \param thread A pointer to a struct mt_thread block that must be * \param thread A pointer to a struct mt_thread block that must be
* allocated by the caller. * allocated by the caller.
@ -292,6 +313,18 @@ void mt_yield(void);
*/ */
void mt_exit(void); void mt_exit(void);
/**
* Stop a thread.
*
* This function is called by a Contiki process in order to clean up a
* thread. The struct mt_thread block may then be discarded by the caller.
*
* \param thread A pointer to a struct mt_thread block that must be
* allocated by the caller.
*
*/
void mt_stop(struct mt_thread *thread);
#if 0 #if 0
/** /**
* \defgroup mtp Multi-threading library convenience functions * \defgroup mtp Multi-threading library convenience functions