1 /* Kernel-side additional module for the VxWorks threading support 2 logic for GCC. Written 2002 by Zack Weinberg. 3 4 This file is distributed with GCC, but it is not part of GCC. 5 The contents of this file are in the public domain. */ 6 7 /* If you are using the Tornado IDE, copy this file to 8 $WIND_BASE/target/config/comps/src/gthread_supp.c. Then create a 9 file named 10comp_gthread_supp.cdf in target/config/comps/vxWorks 10 with the following contents: 11 12 Component INCLUDE_GCC_GTHREAD { 13 NAME GCC 3.x gthread support (required by C++) 14 CONFIGLETTES gthread_supp.c 15 REQUIRES INCLUDE_CPLUS 16 INCLUDE_WHEN INCLUDE_CPLUS 17 _FOLDER FOLDER_CPLUS 18 } 19 20 If you are using command line builds, instead copy this file to 21 $WIND_BASE/target/src/config/gthread_supp.c, and add the following 22 block to target/src/config/usrExtra.c: 23 24 #ifdef INCLUDE_CPLUS 25 #include "../../src/config/gthread_supp.c" 26 #endif 27 28 You should now be able to rebuild your application using GCC 3.x. */ 29 30 #include <vxWorks.h> 31 #include <taskLib.h> 32 33 /* This file provides these routines: */ 34 extern void *__gthread_get_tsd_data (WIND_TCB *tcb); 35 extern void __gthread_set_tsd_data (WIND_TCB *tcb, void *data); 36 37 extern void __gthread_enter_tsd_dtor_context (WIND_TCB *tcb); 38 extern void __gthread_leave_tsd_dtor_context (WIND_TCB *tcb); 39 40 /* Set and retrieve the TSD data block for the task TCB. 41 42 Possible choices for TSD_SLOT are: 43 reserved1 44 reserved2 45 spare1 46 spare2 47 spare3 48 spare4 49 (these are all fields of the TCB structure; all have type 'int'). 50 51 If you find that the slot chosen by default is already used for 52 something else, simply change the #define below and recompile this 53 file. No other file should reference TSD_SLOT directly. */ 54 55 /* WARNING: This code is not 64-bit clean (it assumes that a pointer 56 can be held in an 'int' without truncation). As much of the rest 57 of VxWorks also makes this assumption, we can't really avoid it. */ 58 59 #define TSD_SLOT reserved1 60 61 void * 62 __gthread_get_tsd_data (WIND_TCB *tcb) 63 { 64 return (void *) (tcb->TSD_SLOT); 65 } 66 67 void 68 __gthread_set_tsd_data (WIND_TCB *tcb, void *data) 69 { 70 tcb->TSD_SLOT = (int) data; 71 } 72 73 /* Enter and leave "TSD destructor context". This is defined as a 74 state in which it is safe to call free() from a task delete hook 75 on a memory block allocated by the task being deleted. 76 For VxWorks 5.x, nothing needs to be done. */ 77 78 #if __GNUC__ >= 2 79 #define UNUSED __attribute__((unused)) 80 #else 81 #define UNUSED 82 #endif 83 84 void 85 __gthread_enter_tsd_dtor_context (WIND_TCB *tcb UNUSED) 86 { 87 } 88 89 void 90 __gthread_leave_tsd_dtor_context (WIND_TCB *tcb UNUSED) 91 { 92 } 93