171{
172 int sec, retc, usec;
173 struct timeval tnow;
174 struct timespec tval;
175
176
177
178 if (msec < 1000) sec = 0;
179 else {sec = msec / 1000; msec = msec % 1000;}
180 usec = msec * 1000;
181
182
183
184 gettimeofday(&tnow, 0);
185
186
187
188 tval.tv_sec = tnow.tv_sec + sec;
189 tval.tv_nsec = tnow.tv_usec + usec;
190 if (tval.tv_nsec >= 1000000)
191 {tval.tv_sec += tval.tv_nsec / 1000000;
192 tval.tv_nsec = tval.tv_nsec % 1000000;
193 }
194 tval.tv_nsec *= 1000;
195
196
197
198
199 do {retc = pthread_cond_timedwait(&
cvar,
mtxP, &tval);}
200 while (retc && (retc == EINTR));
201
202
203
204 if (retc && retc != ETIMEDOUT) {throw "cond_timedwait() failed";}
205 return retc == ETIMEDOUT;
206}