Introduction   API Reference   Examples   Index  

thread.h

00001 /* $Id: thread.h 31603 2008-05-12 06:54:17Z adam $ */
00002 /*****************************************************************************/
00010 /*****************************************************************************/
00011 
00012 /* (c) 2003 Technische Universitaet Dresden
00013  * This file is part of DROPS, which is distributed under the terms of the
00014  * GNU General Public License 2. Please see the COPYING file for details.
00015  */
00016 
00017 #ifndef _THREAD_THREAD_H
00018 #define _THREAD_THREAD_H
00019 
00020 /* L4 includes */
00021 #include <l4/sys/types.h>
00022 #include <l4/sys/l4int.h>
00023 #include <l4/env/cdefs.h>
00024 
00025 /*****************************************************************************
00026  *** data types                                                                
00027  *****************************************************************************/
00028 
00033 typedef l4_int32_t l4thread_t;
00034 
00041 typedef l4_int32_t l4_prio_t;
00042 
00051 typedef L4_CV void (* l4thread_fn_t) (void * data);
00052 
00060 typedef L4_CV void (* l4thread_exit_fn_t) (l4thread_t thread, void * data);
00061 
00066 typedef struct l4thread_exit_desc
00067 {
00068   l4thread_exit_fn_t          fn;    
00069   void *                      data;  
00070   struct l4thread_exit_desc * next;  
00071 } l4thread_exit_desc_t;
00072 
00073 /*****************************************************************************
00074  *** defines                                                                   
00075  *****************************************************************************/
00076 
00077 /* thread id */
00078 #define L4THREAD_INVALID_ID    (-1)           
00082 /* priorities */
00083 #define L4THREAD_DEFAULT_PRIO  (-1)           
00086 /* stack */
00087 #define L4THREAD_INVALID_SP (l4_addr_t)(-1)   
00090 #define L4THREAD_DEFAULT_SIZE (l4_size_t)(-1) 
00094 /* flags thread creation */
00095 #define L4THREAD_CREATE_SYNC   0x00000001     
00098 #define L4THREAD_CREATE_ASYNC  0x00000002     
00102 #define L4THREAD_CREATE_PINNED 0x20000000     
00105 #define L4THREAD_CREATE_MAP    0x40000000     
00108 #define L4THREAD_CREATE_SETUP  0x80000000     
00109 
00110 #define L4THREAD_NAME_LEN      16             
00115 /*****************************************************************************
00116  *** macros
00117  *****************************************************************************/
00118 
00127 #define L4THREAD_EXIT_FN_(vis, name, fn) \
00128   vis l4thread_exit_desc_t name = { fn, NULL, NULL}
00129 
00137 #define L4THREAD_EXIT_FN(name, fn)         L4THREAD_EXIT_FN_(,name,fn)
00138 
00146 #define L4THREAD_EXIT_FN_STATIC(name, fn)  L4THREAD_EXIT_FN_(static,name,fn)
00147 
00148 /*****************************************************************************
00149  *** global configuration data
00150  *****************************************************************************/
00151 
00156 extern const int l4thread_max_threads;
00157 
00162 extern const l4_size_t l4thread_stack_size;
00163 
00168 extern const l4_size_t l4thread_max_stack;
00169 
00174 extern l4_prio_t l4thread_default_prio;
00175 
00180 extern const l4_addr_t l4thread_stack_area_addr;
00181 
00186 extern const l4_addr_t l4thread_tcb_table_addr;
00187 
00191 extern const char *l4thread_basename;
00192 
00193 extern unsigned l4thread_target_cpu;
00194 
00195 /*****************************************************************************
00196  *** prototypes
00197  *****************************************************************************/
00198 
00199 __BEGIN_DECLS;
00200 
00201 /*****************************************************************************
00202  *** create
00203  *****************************************************************************/
00204 
00205 /*****************************************************************************/
00238 /*****************************************************************************/ 
00239 L4_CV l4thread_t 
00240 l4thread_create(l4thread_fn_t func, void * data, l4_uint32_t flags);
00241 
00242 /*****************************************************************************/
00274 /*****************************************************************************/ 
00275 L4_CV l4thread_t 
00276 l4thread_create_named(l4thread_fn_t func, const char*name,
00277                       void * data, l4_uint32_t flags);
00278 
00279 /*****************************************************************************/
00333 /*****************************************************************************/ 
00334 L4_CV l4thread_t 
00335 l4thread_create_long(l4thread_t thread, l4thread_fn_t func,
00336                      const char * name,
00337                      l4_addr_t stack_pointer, l4_size_t stack_size,
00338                      l4_prio_t prio, void * data, l4_uint32_t flags);
00339 
00340 /*****************************************************************************/
00356 /*****************************************************************************/ 
00357 L4_CV int
00358 l4thread_started(void * data);
00359 
00360 /*****************************************************************************/
00370 /*****************************************************************************/ 
00371 L4_CV void *
00372 l4thread_startup_return(l4thread_t thread);
00373 
00374 /*****************************************************************************/
00395 /*****************************************************************************/ 
00396 L4_CV l4thread_t
00397 l4thread_setup(l4_threadid_t l4_id,  const char * name, l4_addr_t stack_low,
00398                l4_addr_t stack_high);
00399 
00400 /*****************************************************************************
00401  *** shutdown / exit
00402  *****************************************************************************/
00403 
00404 /*****************************************************************************/
00417 /*****************************************************************************/ 
00418 int
00419 l4thread_shutdown(l4thread_t thread);
00420 
00421 /*****************************************************************************/
00430 /*****************************************************************************/ 
00431 L4_CV void
00432 l4thread_exit(void) __attribute__((noreturn));
00433 
00434 /*****************************************************************************/
00453 /*****************************************************************************/ 
00454 L4_CV int
00455 l4thread_on_exit(l4thread_exit_desc_t * name, void * data);
00456 
00457 /*****************************************************************************
00458  *** suspend / sleep
00459  *****************************************************************************/
00460 
00461 /*****************************************************************************/
00470 /*****************************************************************************/ 
00471 L4_CV void
00472 l4thread_sleep(l4_uint32_t t);
00473 
00474 /*****************************************************************************/
00484 /*****************************************************************************/ 
00485 L4_CV void 
00486 l4thread_usleep(l4_uint32_t t);
00487 
00488 /*****************************************************************************/
00495 /*****************************************************************************/ 
00496 L4_CV void
00497 l4thread_sleep_forever(void);
00498 
00499 /*****************************************************************************
00500  *** priorities 
00501  *****************************************************************************/
00502 
00503 /*****************************************************************************/
00515 /*****************************************************************************/ 
00516 L4_CV l4_prio_t 
00517 l4thread_get_prio(l4thread_t thread);
00518 
00519 /*****************************************************************************/
00532 /*****************************************************************************/ 
00533 L4_CV int 
00534 l4thread_set_prio(l4thread_t thread, l4_prio_t prio);
00535 
00536 /*****************************************************************************
00537  *** thread data
00538  *****************************************************************************/
00539 
00540 /*****************************************************************************/
00547 /*****************************************************************************/ 
00548 L4_CV int 
00549 l4thread_data_allocate_key(void);
00550 
00551 /*****************************************************************************/
00558 /*****************************************************************************/ 
00559 L4_CV void 
00560 l4thread_data_release_key(int key);
00561 
00562 /*****************************************************************************/
00572 /*****************************************************************************/ 
00573 L4_CV int 
00574 l4thread_data_set_current(int key, void * data);
00575 
00576 /*****************************************************************************/
00585 /*****************************************************************************/ 
00586 L4_CV void *
00587 l4thread_data_get_current(int key);
00588 
00589 /*****************************************************************************/
00600 /*****************************************************************************/ 
00601 L4_CV int
00602 l4thread_data_set(l4thread_t thread, int key, void * data);
00603 
00604 /*****************************************************************************/
00614 /*****************************************************************************/ 
00615 L4_CV void *
00616 l4thread_data_get(l4thread_t thread, int key);
00617 
00618 /*****************************************************************************
00619  *** miscellaneous
00620  *****************************************************************************/
00621 
00622 /*****************************************************************************/
00634 /*****************************************************************************/ 
00635 L4_CV L4_INLINE int
00636 l4thread_equal(l4thread_t t1, l4thread_t t2);
00637 
00638 /*****************************************************************************/
00647 /*****************************************************************************/ 
00648 L4_CV l4thread_t 
00649 l4thread_myself(void);
00650 
00651 /*****************************************************************************/
00663 /*****************************************************************************/ 
00664 L4_CV l4_threadid_t 
00665 l4thread_l4_id(l4thread_t thread);
00666 
00667 /*****************************************************************************/
00676 /*****************************************************************************/ 
00677 L4_INLINE l4thread_t
00678 l4thread_id(l4_threadid_t id);
00679 
00680 /*****************************************************************************/
00688 /*****************************************************************************/ 
00689 L4_CV l4thread_t 
00690 l4thread_get_parent(void);
00691 
00692 /*****************************************************************************
00693  *** lock threads
00694  *****************************************************************************/
00695 
00696 /*****************************************************************************/
00707 /*****************************************************************************/ 
00708 L4_CV int
00709 l4thread_lock(l4thread_t thread);
00710 
00711 /*****************************************************************************/
00721 /*****************************************************************************/ 
00722 L4_CV int
00723 l4thread_unlock(l4thread_t thread);
00724 
00725 /*****************************************************************************/
00734 /*****************************************************************************/ 
00735 L4_CV int
00736 l4thread_lock_myself(void);
00737 
00738 /*****************************************************************************/
00746 /*****************************************************************************/ 
00747 L4_CV int
00748 l4thread_unlock_myself(void);
00749 
00750 /*****************************************************************************
00751  *** thread stacks
00752  *****************************************************************************/
00753 
00754 /*****************************************************************************/
00766 /*****************************************************************************/ 
00767 L4_CV int
00768 l4thread_get_stack(l4thread_t thread, l4_addr_t * low, l4_addr_t * high);
00769 
00770 /*****************************************************************************/
00781 /*****************************************************************************/ 
00782 L4_CV int
00783 l4thread_get_stack_current(l4_addr_t * low, l4_addr_t * high);
00784 
00785 /*****************************************************************************/
00790 /*****************************************************************************/ 
00791 L4_CV void
00792 l4thread_dump_threads(void);
00793 
00794 /*****************************************************************************
00795  *** library setup                                                         
00796  *****************************************************************************/
00797 
00798 /*****************************************************************************/
00806 /*****************************************************************************/ 
00807 L4_CV int
00808 l4thread_init(void);
00809 
00810 __END_DECLS;
00811 
00812 /*****************************************************************************
00813  *** implementation
00814  *****************************************************************************/
00815 
00816 /*****************************************************************************
00817  *** l4thread_id
00818  *****************************************************************************/
00819 L4_INLINE l4thread_t
00820 l4thread_id(l4_threadid_t id)
00821 {
00822   return id.id.lthread;
00823 }
00824 
00825 /*****************************************************************************
00826  *** l4thread_equal
00827  *****************************************************************************/
00828 L4_CV L4_INLINE int
00829 l4thread_equal(l4thread_t t1, l4thread_t t2)
00830 {
00831   return (t1 == t2) ? 1 : 0;
00832 }
00833 
00834 #endif /* !_THREAD_THREAD_H */

L4 Thread Library Reference Manual, written by Lars Reuther  © 2000-2003