00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "JackProcessSync.h"
00021 #include "JackError.h"
00022
00023 namespace Jack
00024 {
00025
00026 void JackProcessSync::Signal()
00027 {
00028 int res = pthread_cond_signal(&fCond);
00029 if (res != 0)
00030 jack_error("JackProcessSync::Signal error err = %s", strerror(res));
00031 }
00032
00033 void JackProcessSync::LockedSignal()
00034 {
00035 int res = pthread_mutex_lock(&fMutex);
00036 if (res != 0)
00037 jack_error("JackProcessSync::LockedSignal error err = %s", strerror(res));
00038 res = pthread_cond_signal(&fCond);
00039 if (res != 0)
00040 jack_error("JackProcessSync::LockedSignal error err = %s", strerror(res));
00041 res = pthread_mutex_unlock(&fMutex);
00042 if (res != 0)
00043 jack_error("JackProcessSync::LockedSignal error err = %s", strerror(res));
00044 }
00045
00046 void JackProcessSync::SignalAll()
00047 {
00048 int res = pthread_cond_broadcast(&fCond);
00049 if (res != 0)
00050 jack_error("JackProcessSync::SignalAll error err = %s", strerror(res));
00051 }
00052
00053 void JackProcessSync::LockedSignalAll()
00054 {
00055 int res = pthread_mutex_lock(&fMutex);
00056 if (res != 0)
00057 jack_error("JackProcessSync::LockedSignalAll error err = %s", strerror(res));
00058 res = pthread_cond_broadcast(&fCond);
00059 if (res != 0)
00060 jack_error("JackProcessSync::LockedSignalAll error err = %s", strerror(res));
00061 res = pthread_mutex_unlock(&fMutex);
00062 if (res != 0)
00063 jack_error("JackProcessSync::LockedSignalAll error err = %s", strerror(res));
00064 }
00065
00066 void JackProcessSync::Wait()
00067 {
00068 int res;
00069 if ((res = pthread_cond_wait(&fCond, &fMutex)) != 0)
00070 jack_error("JackProcessSync::Wait error err = %s", strerror(res));
00071 }
00072
00073 void JackProcessSync::LockedWait()
00074 {
00075 int res;
00076 res = pthread_mutex_lock(&fMutex);
00077 if (res != 0)
00078 jack_error("JackProcessSync::LockedWait error err = %s", strerror(res));
00079 if ((res = pthread_cond_wait(&fCond, &fMutex)) != 0)
00080 jack_error("JackProcessSync::LockedWait error err = %s", strerror(res));
00081 res = pthread_mutex_unlock(&fMutex);
00082 if (res != 0)
00083 jack_error("JackProcessSync::LockedWait error err = %s", strerror(res));
00084 }
00085
00086 bool JackProcessSync::TimedWait(long usec)
00087 {
00088 struct timeval T0, T1;
00089 timespec time;
00090 struct timeval now;
00091 int res;
00092
00093 jack_log("JackProcessSync::TimedWait time out = %ld", usec);
00094 gettimeofday(&T0, 0);
00095
00096 gettimeofday(&now, 0);
00097 unsigned int next_date_usec = now.tv_usec + usec;
00098 time.tv_sec = now.tv_sec + (next_date_usec / 1000000);
00099 time.tv_nsec = (next_date_usec % 1000000) * 1000;
00100 res = pthread_cond_timedwait(&fCond, &fMutex, &time);
00101 if (res != 0)
00102 jack_error("JackProcessSync::TimedWait error usec = %ld err = %s", usec, strerror(res));
00103
00104 gettimeofday(&T1, 0);
00105 jack_log("JackProcessSync::TimedWait finished delta = %5.1lf",
00106 (1e6 * T1.tv_sec - 1e6 * T0.tv_sec + T1.tv_usec - T0.tv_usec));
00107 return (res == 0);
00108 }
00109
00110 bool JackProcessSync::LockedTimedWait(long usec)
00111 {
00112 struct timeval T0, T1;
00113 timespec time;
00114 struct timeval now;
00115 int res;
00116
00117 res = pthread_mutex_lock(&fMutex);
00118 if (res != 0)
00119 jack_error("JackProcessSync::LockedTimedWait error err = %s", usec, strerror(res));
00120
00121 jack_log("JackProcessSync::TimedWait time out = %ld", usec);
00122 gettimeofday(&T0, 0);
00123
00124 gettimeofday(&now, 0);
00125 unsigned int next_date_usec = now.tv_usec + usec;
00126 time.tv_sec = now.tv_sec + (next_date_usec / 1000000);
00127 time.tv_nsec = (next_date_usec % 1000000) * 1000;
00128 res = pthread_cond_timedwait(&fCond, &fMutex, &time);
00129 if (res != 0)
00130 jack_error("JackProcessSync::LockedTimedWait error usec = %ld err = %s", usec, strerror(res));
00131
00132 gettimeofday(&T1, 0);
00133
00134 res = pthread_mutex_unlock(&fMutex);
00135 if (res != 0)
00136 jack_error("JackProcessSync::LockedTimedWait error err = %s", usec, strerror(res));
00137
00138 jack_log("JackProcessSync::TimedWait finished delta = %5.1lf",
00139 (1e6 * T1.tv_sec - 1e6 * T0.tv_sec + T1.tv_usec - T0.tv_usec));
00140 return (res == 0);
00141 }
00142
00143
00144 }
00145