]> oss.titaniummirror.com Git - msp430-gcc.git/blobdiff - contrib/gthr_supp_vxw_5x.c
Imported gcc-4.4.3
[msp430-gcc.git] / contrib / gthr_supp_vxw_5x.c
diff --git a/contrib/gthr_supp_vxw_5x.c b/contrib/gthr_supp_vxw_5x.c
new file mode 100644 (file)
index 0000000..6ce288f
--- /dev/null
@@ -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)
+{
+}