Mercurial > hg > CbC > CbC_gcc
diff contrib/gthr_supp_vxw_5x.c @ 0:a06113de4d67
first commit
author | kent <kent@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 17 Jul 2009 14:47:48 +0900 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/contrib/gthr_supp_vxw_5x.c Fri Jul 17 14:47:48 2009 +0900 @@ -0,0 +1,92 @@ +/* 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) +{ +}