93 lines
2.7 KiB
C
93 lines
2.7 KiB
C
|
/* 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)
|
||
|
{
|
||
|
}
|