00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef _XENO_NUCLEUS_SYNCH_H
00021 #define _XENO_NUCLEUS_SYNCH_H
00022
00023 #include <nucleus/queue.h>
00024
00025
00026 #define XNSYNCH_FIFO 0x0
00027 #define XNSYNCH_PRIO 0x1
00028 #define XNSYNCH_NOPIP 0x0
00029 #define XNSYNCH_PIP 0x2
00030 #define XNSYNCH_DREORD 0x4
00031
00032 #if defined(__KERNEL__) || defined(__XENO_SIM__)
00033
00034 #define XNSYNCH_CLAIMED 0x8
00035
00036
00037 #define XNSYNCH_SPARE0 0x01000000
00038 #define XNSYNCH_SPARE1 0x02000000
00039 #define XNSYNCH_SPARE2 0x04000000
00040 #define XNSYNCH_SPARE3 0x08000000
00041 #define XNSYNCH_SPARE4 0x10000000
00042 #define XNSYNCH_SPARE5 0x20000000
00043 #define XNSYNCH_SPARE6 0x40000000
00044 #define XNSYNCH_SPARE7 0x80000000
00045
00046
00047 #define XNSYNCH_DONE 0
00048 #define XNSYNCH_WAIT 1
00049 #define XNSYNCH_RESCHED 2
00050
00051 struct xnthread;
00052 struct xnsynch;
00053 struct xnmutex;
00054
00055 typedef struct xnsynch {
00056
00057 xnpholder_t link;
00058
00059 #define link2synch(laddr) \
00060 ((xnsynch_t *)(((char *)laddr) - (int)(&((xnsynch_t *)0)->link)))
00061
00062 xnflags_t status;
00063
00064 xnpqueue_t pendq;
00065
00066 struct xnthread *owner;
00067
00068 void (*cleanup)(struct xnsynch *synch);
00069
00070 XNARCH_DECL_DISPLAY_CONTEXT();
00071
00072 } xnsynch_t;
00073
00074 #define xnsynch_test_flags(synch,flags) testbits((synch)->status,flags)
00075 #define xnsynch_set_flags(synch,flags) setbits((synch)->status,flags)
00076 #define xnsynch_clear_flags(synch,flags) clrbits((synch)->status,flags)
00077 #define xnsynch_wait_queue(synch) (&((synch)->pendq))
00078 #define xnsynch_nsleepers(synch) countpq(&((synch)->pendq))
00079 #define xnsynch_owner(synch) ((synch)->owner)
00080
00081 #ifdef __cplusplus
00082 extern "C" {
00083 #endif
00084
00085 void xnsynch_init(xnsynch_t *synch,
00086 xnflags_t flags);
00087
00088 #define xnsynch_destroy(synch) xnsynch_flush(synch,XNRMID)
00089
00090 static inline void xnsynch_set_owner (xnsynch_t *synch, struct xnthread *thread)
00091 {
00092 synch->owner = thread;
00093 }
00094
00095 static inline void xnsynch_register_cleanup (xnsynch_t *synch, void (*handler)(xnsynch_t *))
00096 {
00097 synch->cleanup = handler;
00098 }
00099
00100 void xnsynch_sleep_on(xnsynch_t *synch,
00101 xnticks_t timeout);
00102
00103 struct xnthread *xnsynch_wakeup_one_sleeper(xnsynch_t *synch);
00104
00105 xnpholder_t *xnsynch_wakeup_this_sleeper(xnsynch_t *synch,
00106 xnpholder_t *holder);
00107
00108 int xnsynch_flush(xnsynch_t *synch,
00109 xnflags_t reason);
00110
00111 void xnsynch_release_all_ownerships(struct xnthread *thread);
00112
00113 void xnsynch_renice_sleeper(struct xnthread *thread);
00114
00115 void xnsynch_forget_sleeper(struct xnthread *thread);
00116
00117 struct xnthread *xnsynch_forget_one_sleeper(xnsynch_t *synch);
00118
00119 #ifdef __cplusplus
00120 }
00121 #endif
00122
00123 #endif
00124
00125 #endif