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 }