| /* Kernel-side additional module for the VxWorks threading support |
| logic for GCC. Written 2002 by Zack Weinberg. |
| |
| This file is distributed with GCC, but it is not part of GCC. |
| The contents of this file are in the public domain. */ |
| |
| /* If you are using the Tornado IDE, copy this file to |
| $WIND_BASE/target/config/comps/src/gthread_supp.c. Then create a |
| file named 10comp_gthread_supp.cdf in target/config/comps/vxWorks |
| with the following contents: |
| |
| Component INCLUDE_GCC_GTHREAD { |
| NAME GCC 3.x gthread support (required by C++) |
| CONFIGLETTES gthread_supp.c |
| REQUIRES INCLUDE_CPLUS |
| INCLUDE_WHEN INCLUDE_CPLUS |
| _FOLDER FOLDER_CPLUS |
| } |
| |
| If you are using command line builds, instead copy this file to |
| $WIND_BASE/target/src/config/gthread_supp.c, and add the following |
| block to target/src/config/usrExtra.c: |
| |
| #ifdef INCLUDE_CPLUS |
| #include "../../src/config/gthread_supp.c" |
| #endif |
| |
| You should now be able to rebuild your application using GCC 3.x. */ |
| |
| #include <vxWorks.h> |
| #include <taskLib.h> |
| |
| /* This file provides these routines: */ |
| extern void *__gthread_get_tsd_data (WIND_TCB *tcb); |
| extern void __gthread_set_tsd_data (WIND_TCB *tcb, void *data); |
| |
| extern void __gthread_enter_tsd_dtor_context (WIND_TCB *tcb); |
| extern void __gthread_leave_tsd_dtor_context (WIND_TCB *tcb); |
| |
| /* Set and retrieve the TSD data block for the task TCB. |
| |
| Possible choices for TSD_SLOT are: |
| reserved1 |
| reserved2 |
| spare1 |
| spare2 |
| spare3 |
| spare4 |
| (these are all fields of the TCB structure; all have type 'int'). |
| |
| If you find that the slot chosen by default is already used for |
| something else, simply change the #define below and recompile this |
| file. No other file should reference TSD_SLOT directly. */ |
| |
| /* WARNING: This code is not 64-bit clean (it assumes that a pointer |
| can be held in an 'int' without truncation). As much of the rest |
| of VxWorks also makes this assumption, we can't really avoid it. */ |
| |
| #define TSD_SLOT reserved1 |
| |
| void * |
| __gthread_get_tsd_data (WIND_TCB *tcb) |
| { |
| return (void *) (tcb->TSD_SLOT); |
| } |
| |
| void |
| __gthread_set_tsd_data (WIND_TCB *tcb, void *data) |
| { |
| tcb->TSD_SLOT = (int) data; |
| } |
| |
| /* Enter and leave "TSD destructor context". This is defined as a |
| state in which it is safe to call free() from a task delete hook |
| on a memory block allocated by the task being deleted. |
| For VxWorks 5.x, nothing needs to be done. */ |
| |
| #if __GNUC__ >= 2 |
| #define UNUSED __attribute__((unused)) |
| #else |
| #define UNUSED |
| #endif |
| |
| void |
| __gthread_enter_tsd_dtor_context (WIND_TCB *tcb UNUSED) |
| { |
| } |
| |
| void |
| __gthread_leave_tsd_dtor_context (WIND_TCB *tcb UNUSED) |
| { |
| } |