00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "JackPosixSemaphore.h"
00021 #include "JackChannel.h"
00022 #include "JackError.h"
00023 #include <fcntl.h>
00024 #include <sys/time.h>
00025
00026 namespace Jack
00027 {
00028
00029 void JackPosixSemaphore::BuildName(const char* name, char* res)
00030 {
00031 sprintf(res, "%s/jack_sem.%s", jack_client_dir, name);
00032 }
00033
00034 bool JackPosixSemaphore::Signal()
00035 {
00036 int res;
00037 assert(fSemaphore);
00038
00039 if (fFlush)
00040 return true;
00041
00042 if ((res = sem_post(fSemaphore)) != 0) {
00043 jack_error("JackPosixSemaphore::Signal name = %s err = %s", fName, strerror(errno));
00044 }
00045 return (res == 0);
00046 }
00047
00048 bool JackPosixSemaphore::SignalAll()
00049 {
00050 int res;
00051 assert(fSemaphore);
00052
00053 if (fFlush)
00054 return true;
00055
00056 if ((res = sem_post(fSemaphore)) != 0) {
00057 jack_error("JackPosixSemaphore::SignalAll name = %s err = %s", fName, strerror(errno));
00058 }
00059 return (res == 0);
00060 }
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074 bool JackPosixSemaphore::Wait()
00075 {
00076 int res;
00077
00078 while ((res = sem_wait(fSemaphore) < 0)) {
00079 jack_error("JackPosixSemaphore::Wait name = %s err = %s", fName, strerror(errno));
00080 if (errno != EINTR)
00081 break;
00082 }
00083 return (res == 0);
00084 }
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118 #warning JackPosixSemaphore::TimedWait not available : synchronous mode may not work correctly if POSIX semaphore are used
00119
00120 bool JackPosixSemaphore::TimedWait(long usec)
00121 {
00122 return Wait();
00123 }
00124
00125
00126 bool JackPosixSemaphore::Allocate(const char* name, int value)
00127 {
00128 BuildName(name, fName);
00129 JackLog("JackPosixSemaphore::Allocate name = %s val = %ld\n", fName, value);
00130
00131 if ((fSemaphore = sem_open(fName, O_CREAT, 0777, value)) == (sem_t*)SEM_FAILED) {
00132 jack_error("Allocate: can't check in named semaphore name = %s err = %s", fName, strerror(errno));
00133 return false;
00134 } else {
00135 return true;
00136 }
00137 }
00138
00139
00140 bool JackPosixSemaphore::ConnectInput(const char* name)
00141 {
00142 BuildName(name, fName);
00143 JackLog("JackPosixSemaphore::Connect %s\n", fName);
00144
00145
00146 if (fSemaphore) {
00147 JackLog("Already connected name = %s\n", name);
00148 return true;
00149 }
00150
00151 if ((fSemaphore = sem_open(fName, O_CREAT)) == (sem_t*)SEM_FAILED) {
00152 jack_error("Connect: can't connect named semaphore name = %s err = %s", fName, strerror(errno));
00153 return false;
00154 } else {
00155 int val = 0;
00156 sem_getvalue(fSemaphore, &val);
00157 JackLog("JackPosixSemaphore::Connect sem_getvalue %ld\n", val);
00158 return true;
00159 }
00160 }
00161
00162 bool JackPosixSemaphore::Connect(const char* name)
00163 {
00164 return ConnectInput(name);
00165 }
00166
00167 bool JackPosixSemaphore::ConnectOutput(const char* name)
00168 {
00169 return ConnectInput(name);
00170 }
00171
00172 bool JackPosixSemaphore::Disconnect()
00173 {
00174 JackLog("JackPosixSemaphore::Disconnect %s\n", fName);
00175
00176 if (fSemaphore) {
00177 if (sem_close(fSemaphore) != 0) {
00178 jack_error("Disconnect: can't disconnect named semaphore name = %s err = %s", fName, strerror(errno));
00179 return false;
00180 } else {
00181 fSemaphore = NULL;
00182 return true;
00183 }
00184 } else {
00185 return true;
00186 }
00187 }
00188
00189
00190 void JackPosixSemaphore::Destroy()
00191 {
00192 if (fSemaphore != NULL) {
00193 JackLog("JackPosixSemaphore::Destroy\n");
00194 sem_unlink(fName);
00195 if (sem_close(fSemaphore) != 0) {
00196 jack_error("Destroy: can't destroy semaphore name = %s err = %s", fName, strerror(errno));
00197 }
00198 fSemaphore = NULL;
00199 } else {
00200 jack_error("JackPosixSemaphore::Destroy semaphore == NULL");
00201 }
00202 }
00203
00204 }
00205