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: */ 34extern void *__gthread_get_tsd_data (WIND_TCB *tcb); 35extern void __gthread_set_tsd_data (WIND_TCB *tcb, void *data); 36 37extern void __gthread_enter_tsd_dtor_context (WIND_TCB *tcb); 38extern 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 61void * 62__gthread_get_tsd_data (WIND_TCB *tcb) 63{ 64 return (void *) (tcb->TSD_SLOT); 65} 66 67void 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 84void 85__gthread_enter_tsd_dtor_context (WIND_TCB *tcb UNUSED) 86{ 87} 88 89void 90__gthread_leave_tsd_dtor_context (WIND_TCB *tcb UNUSED) 91{ 92} 93