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 */