00001
00022 #ifndef _XENO_SEM_H
00023 #define _XENO_SEM_H
00024
00025 #include <nucleus/synch.h>
00026 #include <native/types.h>
00027
00028
00029 #define S_PRIO XNSYNCH_PRIO
00030 #define S_FIFO XNSYNCH_FIFO
00031 #define S_PULSE 0x100
00032
00033 typedef struct rt_sem_info {
00034
00035 unsigned long count;
00036
00037 int nwaiters;
00038
00039 char name[XNOBJECT_NAME_LEN];
00040
00041 } RT_SEM_INFO;
00042
00043 typedef struct rt_sem_placeholder {
00044 xnhandle_t opaque;
00045 } RT_SEM_PLACEHOLDER;
00046
00047 #if (defined(__KERNEL__) || defined(__XENO_SIM__)) && !defined(DOXYGEN_CPP)
00048
00049 #include <native/ppd.h>
00050
00051 #define XENO_SEM_MAGIC 0x55550303
00052
00053 typedef struct rt_sem {
00054
00055 unsigned magic;
00056
00057 xnsynch_t synch_base;
00058
00059 unsigned long count;
00060
00061 int mode;
00062
00063 xnhandle_t handle;
00064
00065 char name[XNOBJECT_NAME_LEN];
00066
00067 #ifdef CONFIG_XENO_OPT_PERVASIVE
00068 pid_t cpid;
00069 #endif
00070
00071 xnholder_t rlink;
00072
00073 #define rlink2sem(ln) container_of(ln, RT_SEM, rlink)
00074
00075 xnqueue_t *rqueue;
00076
00077 } RT_SEM;
00078
00079 #ifdef __cplusplus
00080 extern "C" {
00081 #endif
00082
00083 #ifdef CONFIG_XENO_OPT_NATIVE_SEM
00084
00085 int __native_sem_pkg_init(void);
00086
00087 void __native_sem_pkg_cleanup(void);
00088
00089 static inline void __native_sem_flush_rq(xnqueue_t *rq)
00090 {
00091 xeno_flush_rq(RT_SEM, rq, sem);
00092 }
00093
00094 #else
00095
00096 #define __native_sem_pkg_init() ({ 0; })
00097 #define __native_sem_pkg_cleanup() do { } while(0)
00098 #define __native_sem_flush_rq(rq) do { } while(0)
00099
00100 #endif
00101
00102 #ifdef __cplusplus
00103 }
00104 #endif
00105
00106 #else
00107
00108 typedef RT_SEM_PLACEHOLDER RT_SEM;
00109
00110 #ifdef __cplusplus
00111 extern "C" {
00112 #endif
00113
00114 int rt_sem_bind(RT_SEM *sem,
00115 const char *name,
00116 RTIME timeout);
00117
00118 static inline int rt_sem_unbind (RT_SEM *sem)
00119
00120 {
00121 sem->opaque = XN_NO_HANDLE;
00122 return 0;
00123 }
00124
00125 #ifdef __cplusplus
00126 }
00127 #endif
00128
00129 #endif
00130
00131 #ifdef __cplusplus
00132 extern "C" {
00133 #endif
00134
00135
00136
00137 int rt_sem_create(RT_SEM *sem,
00138 const char *name,
00139 unsigned long icount,
00140 int mode);
00141
00142 int rt_sem_delete(RT_SEM *sem);
00143
00144 int rt_sem_p(RT_SEM *sem,
00145 RTIME timeout);
00146
00147 int rt_sem_v(RT_SEM *sem);
00148
00149 int rt_sem_broadcast(RT_SEM *sem);
00150
00151 int rt_sem_inquire(RT_SEM *sem,
00152 RT_SEM_INFO *info);
00153
00154 #ifdef __cplusplus
00155 }
00156 #endif
00157
00158 #endif