Очень редко зацикливается программа на ожидании состояния.
Судя по всему, pthread_cond_timedwait ругается (EINVAL) на один из трёх параметров.
Вот что кажет отладчик.
Время ts - вроде нормальное, остаются два:
1) кондишн переменная notempty
и
2) мьютекс cond_lock
Что с ними может быть не так? if (0 != pthread_mutex_lock(&remote_host->cond_lock))
syslog(LOG_ERR, "webcam httpd for %s pthread_mutex_lock(cond_lock) failed -> %m", remote_host->ip_str);
err = 0;
if (-1 == gettimeofday(&wc_now, NULL))
LOGPERR("gettimeofday()");
646 ts.tv_sec = wc_now.tv_sec;
647 ts.tv_nsec = wc_now.tv_usec * 1000 + 10000 /* 10 ms */ ;
648 while ((remote_host->ja_wr_pos == remote_host->ja_rd_pos) && (err != ETIMEDOUT))
649 {
650 err = pthread_cond_timedwait(&remote_host->notempty, &remote_host->cond_lock, &ts);
651 }
652
(gdb) next
650 err = pthread_cond_timedwait(&remote_host->notempty, &remote_host->cond_lock, &ts);
(gdb) next
648 while ((remote_host->ja_wr_pos == remote_host->ja_rd_pos) && (err != ETIMEDOUT))
(gdb) print remote_host->ja_wr_pos
$2 = 1
(gdb) print remote_host->ja_rd_pos
$3 = 1
(gdb) print err
$4 = 22
(gdb) print remote_host->notempty
$5 = {__data = {__lock = 0, __futex = 82530, __total_seq = 41265, __wakeup_seq = 41265, __woken_seq = 41265, __mutex = 0xb5d15b58,
__nwaiters = 0, __broadcast_seq = 0},
__size = "\000\000\000\000bB\001\0001�\000\000\000\000\000\0001�\000\000\000\000\000\0001�\000\000\000\000\000\000X[ѵ", '\0' <repeats 11 times>, __align = 354463650938880}
(gdb) print remote_host->cond_lock
$6 = {__data = {__lock = 2, __count = 0, __owner = 14221, __kind = 0, __nusers = 1, __spins = 0},
__size = "\002\000\000\000\000\000\000\000\2157\000\000\000\000\000\000\001\000\000\000\000\000\000", __align = 2}
(gdb) print ts
$7 = {tv_sec = 1186654727, tv_nsec = 1000007000}