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(ln) container_of(ln, xnsynch_t, link)
00060
00061 xnflags_t status;
00062
00063 xnpqueue_t pendq;
00064
00065 struct xnthread *owner;
00066
00067 void (*cleanup)(struct xnsynch *synch);
00068
00069 XNARCH_DECL_DISPLAY_CONTEXT();
00070
00071 } xnsynch_t;
00072
00073 #define xnsynch_test_flags(synch,flags) testbits((synch)->status,flags)
00074 #define xnsynch_set_flags(synch,flags) setbits((synch)->status,flags)
00075 #define xnsynch_clear_flags(synch,flags) clrbits((synch)->status,flags)
00076 #define xnsynch_wait_queue(synch) (&((synch)->pendq))
00077 #define xnsynch_nsleepers(synch) countpq(&((synch)->pendq))
00078 #define xnsynch_owner(synch) ((synch)->owner)
00079
00080 #ifdef __cplusplus
00081 extern "C" {
00082 #endif
00083
00084 void xnsynch_init(xnsynch_t *synch,
00085 xnflags_t flags);
00086
00087 #define xnsynch_destroy(synch) xnsynch_flush(synch,XNRMID)
00088
00089 static inline void xnsynch_set_owner (xnsynch_t *synch, struct xnthread *thread)
00090 {
00091 synch->owner = thread;
00092 }
00093
00094 static inline void xnsynch_register_cleanup (xnsynch_t *synch, void (*handler)(xnsynch_t *))
00095 {
00096 synch->cleanup = handler;
00097 }
00098
00099 void xnsynch_sleep_on(xnsynch_t *synch,
00100 xnticks_t timeout);
00101
00102 struct xnthread *xnsynch_wakeup_one_sleeper(xnsynch_t *synch);
00103
00104 xnpholder_t *xnsynch_wakeup_this_sleeper(xnsynch_t *synch,
00105 xnpholder_t *holder);
00106
00107 int xnsynch_flush(xnsynch_t *synch,
00108 xnflags_t reason);
00109
00110 void xnsynch_release_all_ownerships(struct xnthread *thread);
00111
00112 void xnsynch_renice_sleeper(struct xnthread *thread);
00113
00114 void xnsynch_forget_sleeper(struct xnthread *thread);
00115
00116 struct xnthread *xnsynch_forget_one_sleeper(xnsynch_t *synch);
00117
00118 #ifdef __cplusplus
00119 }
00120 #endif
00121
00122 #endif
00123
00124 #endif