| 213 | */ |
| 214 | static struct timespec ts_100ms = { 0, 100 * 1000 * 1000 }; |
| 215 | extern "C" int |
| 216 | pthread_join(pthread_t thread, void **retval) |
| 217 | { |
| 218 | int ret; |
| 219 | struct timespec ts; |
| 220 | |
| 221 | if (!ProcessInfo::instance().beginPthreadJoin(thread)) { |
| 222 | return EINVAL; |
| 223 | } |
| 224 | |
| 225 | while (1) { |
| 226 | WrapperLock wrapperLock; |
| 227 | JASSERT(clock_gettime(CLOCK_REALTIME, &ts) != -1); |
| 228 | TIMESPEC_ADD(&ts, &ts_100ms, &ts); |
| 229 | ret = _real_pthread_timedjoin_np(thread, retval, &ts); |
| 230 | if (ret != ETIMEDOUT) { |
| 231 | break; |
| 232 | } |
| 233 | } |
| 234 | |
| 235 | ProcessInfo::instance().endPthreadJoin(thread); |
| 236 | return ret; |
| 237 | } |
| 238 | |
| 239 | extern "C" int |
| 240 | pthread_tryjoin_np(pthread_t thread, void **retval) |
no test coverage detected