Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #include "libts.h"
00032
00033
00034
00035
00036
00037
00038
00039 ink_mutex ink_mutex_initializer = INK_MUTEX_INIT;
00040
00041 #if TS_EMULATE_ANON_SEMAPHORES
00042 static int64_t ink_semaphore_count = 0;
00043 #endif
00044
00045 void
00046 ink_sem_init(ink_semaphore * sp, unsigned int count)
00047 {
00048
00049 #if TS_EMULATE_ANON_SEMAPHORES
00050 char sname[NAME_MAX];
00051
00052 sp->semid = ink_atomic_increment(&ink_semaphore_count, 1);
00053 snprintf(sname, sizeof(sname), "/trafficserver/anon/%" PRId64, sp->semid);
00054
00055 ink_assert((sp->sema = sem_open(sname, O_CREAT | O_EXCL, 0770, count)) != SEM_FAILED);
00056
00057
00058
00059 ink_assert(sem_unlink(sname) != -1);
00060 #else
00061 ink_assert(sem_init(sp->get(), 0 , count) != -1);
00062 #endif
00063 }
00064
00065 void
00066 ink_sem_destroy(ink_semaphore * sp)
00067 {
00068 #if TS_EMULATE_ANON_SEMAPHORES
00069 ink_assert(sem_close(sp->get()) != -1);
00070 #else
00071 ink_assert(sem_destroy(sp->get()) != -1);
00072 #endif
00073 }
00074
00075 void
00076 ink_sem_wait(ink_semaphore * sp)
00077 {
00078 int r;
00079 while (EINTR == (r = sem_wait(sp->get())));
00080 ink_assert(!r);
00081 }
00082
00083 bool
00084 ink_sem_trywait(ink_semaphore * sp)
00085 {
00086 int r;
00087 while (EINTR == (r = sem_trywait(sp->get())));
00088 ink_assert(r == 0 || (errno == EAGAIN));
00089 return r == 0;
00090 }
00091
00092 void
00093 ink_sem_post(ink_semaphore * sp)
00094 {
00095 ink_assert(sem_post(sp->get()) != -1);
00096 }