]>
Commit | Line | Data |
---|---|---|
4977bab6 ZW |
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 | } |