00001
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include <semaphore.h>
00027
00028 #ifdef CONF_SEMAPHORES
00029
00030 #include <unistd.h>
00031
00033
00034
00035
00037
00039
00041 wakeup_t sem_event_wait(wakeup_t data) {
00042 sem_t *sem=(sem_t*) ((unsigned)data);
00043
00044
00045
00046
00047 if(*sem) {
00048 (*sem)--;
00049 return 1;
00050 }
00051 return 0;
00052 }
00053
00055
00063 int sem_wait(sem_t * sem) {
00064
00065
00066 if(sem_trywait(sem))
00067 if (wait_event(sem_event_wait,(unsigned long) ((unsigned)sem)) == 0)
00068 return -1;
00069
00070 return 0;
00071 }
00072
00073 typedef struct {
00074 sem_t *sem;
00075 time_t abs_timeout;
00076 } timeout_sem_data_t;
00077
00078 static wakeup_t sem_event_timeout_wait(wakeup_t data) {
00079 timeout_sem_data_t *tsem = (timeout_sem_data_t*) ((unsigned)data);
00080
00081
00082
00083
00084 if (*tsem->sem) {
00085 (*tsem->sem)--;
00086 return 1;
00087 }
00088
00089 if (tsem->abs_timeout <= get_system_up_time()) {
00090 return 2;
00091 }
00092
00093 return 0;
00094 }
00095
00096 int sem_timedwait(sem_t *sem,
00097 const time_t abs_timeout) {
00098 timeout_sem_data_t data;
00099 data.sem = sem;
00100 data.abs_timeout = abs_timeout;
00101
00102 if (sem_trywait(sem)) {
00103 if (wait_event(sem_event_timeout_wait,
00104 (wakeup_t) ((unsigned) &data)) != 1) {
00105 return -1;
00106 }
00107 }
00108 return 0;
00109 }
00110
00112
00122 int sem_trywait(sem_t * sem);
00123 #ifndef DOXYGEN_SHOULD_SKIP_THIS
00124 __asm__("\n\
00125 .text\n\
00126 .align 1\n\
00127 .globl _sem_trywait\n\
00128 _sem_trywait:\n\
00129 stc ccr,r1h ; save flags \n\
00130 orc #0x80,ccr ; block all but NMI\n\
00131 mov.b @r0,r1l\n\
00132 beq sem_fail ; !=0 -> decrease, return 0\n\
00133 dec r1l\n\
00134 mov.b r1l,@r0\n\
00135 sub.w r0,r0 ; return 0\n\
00136 bra sem_ok\n\
00137 \n\
00138 sem_fail:\n\
00139 mov #0xffff,r0 ; else return 0xffff\n\
00140 \n\
00141 sem_ok:\n\
00142 ldc r1h,ccr ; restore flags\n\
00143 rts\n\
00144 ");
00145 #endif // DOXYGEN_SHOULD_SKIP_THIS
00146
00147 #endif // CONF_SEMAPHORES