Module Name: src Committed By: lukem Date: Tue May 23 18:54:58 UTC 2023
Modified Files: src/external/cddl/osnet/dist/tools/ctf/cvt: barrier.c ctfmerge.c tdata.c Log Message: ctfmerge: error check sem_*() and pthread_*() APIs terminate() if sem_*() returns -1 or pthread_*() returns != 0. (Set errno from pthread_*() so terminate() prints the strerror message). Note: Failing on errors instead of ignoring them helps identify reasons for intermittent failures, such as those on macOS host builds: ERROR: nbctfmerge: barrier_init: sem_init(bar_sem): Function not implemented To generate a diff of this commit: cvs rdiff -u -r1.5 -r1.6 src/external/cddl/osnet/dist/tools/ctf/cvt/barrier.c cvs rdiff -u -r1.17 -r1.18 \ src/external/cddl/osnet/dist/tools/ctf/cvt/ctfmerge.c cvs rdiff -u -r1.9 -r1.10 src/external/cddl/osnet/dist/tools/ctf/cvt/tdata.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/external/cddl/osnet/dist/tools/ctf/cvt/barrier.c diff -u src/external/cddl/osnet/dist/tools/ctf/cvt/barrier.c:1.5 src/external/cddl/osnet/dist/tools/ctf/cvt/barrier.c:1.6 --- src/external/cddl/osnet/dist/tools/ctf/cvt/barrier.c:1.5 Thu Jun 20 14:33:04 2019 +++ src/external/cddl/osnet/dist/tools/ctf/cvt/barrier.c Tue May 23 18:54:58 2023 @@ -42,6 +42,7 @@ * get a return code of 0. */ +#include <errno.h> #include <pthread.h> #ifdef illumos #include <synch.h> @@ -49,15 +50,19 @@ #include <stdio.h> #include "barrier.h" +#include "ctftools.h" void barrier_init(barrier_t *bar, int nthreads) { - pthread_mutex_init(&bar->bar_lock, NULL); + if ((errno = pthread_mutex_init(&bar->bar_lock, NULL)) != 0) + terminate("%s: pthread_mutex_init(bar_lock)", __func__); #ifdef illumos - sema_init(&bar->bar_sem, 0, USYNC_THREAD, NULL); + if ((errno = sema_init(&bar->bar_sem, 0, USYNC_THREAD, NULL)) != 0) + terminate("%s: sema_init(bar_sem)", __func__); #else - sem_init(&bar->bar_sem, 0, 0); + if (sem_init(&bar->bar_sem, 0, 0) == -1) + terminate("%s: sem_init(bar_sem)", __func__); #endif bar->bar_numin = 0; @@ -67,14 +72,19 @@ barrier_init(barrier_t *bar, int nthread int barrier_wait(barrier_t *bar) { - pthread_mutex_lock(&bar->bar_lock); + if ((errno = pthread_mutex_lock(&bar->bar_lock)) != 0) + terminate("%s: pthread_mutex_lock(bar_lock)", __func__); if (++bar->bar_numin < bar->bar_nthr) { - pthread_mutex_unlock(&bar->bar_lock); + if ((errno = pthread_mutex_unlock(&bar->bar_lock)) != 0) + terminate("%s: pthread_mutex_unlock(bar_lock)", + __func__); #ifdef illumos - sema_wait(&bar->bar_sem); + if ((errno = sema_wait(&bar->bar_sem)) != 0) + terminate("%s: sema_wait(bar_sem)", __func__); #else - sem_wait(&bar->bar_sem); + if (sem_wait(&bar->bar_sem) == -1) + terminate("%s: sem_wait(bar_sem)", __func__); #endif return (0); @@ -86,11 +96,15 @@ barrier_wait(barrier_t *bar) bar->bar_numin = 0; for (i = 1; i < bar->bar_nthr; i++) #ifdef illumos - sema_post(&bar->bar_sem); + if ((errno = sema_post(&bar->bar_sem)) != 0) + terminate("%s: sema_post(bar_sem)", __func__); #else - sem_post(&bar->bar_sem); + if (sem_post(&bar->bar_sem) == -1) + terminate("%s: sem_post(bar_sem)", __func__); #endif - pthread_mutex_unlock(&bar->bar_lock); + if ((errno = pthread_mutex_unlock(&bar->bar_lock)) != 0) + terminate("%s: pthread_mutex_unlock(bar_lock)", + __func__); return (1); } Index: src/external/cddl/osnet/dist/tools/ctf/cvt/ctfmerge.c diff -u src/external/cddl/osnet/dist/tools/ctf/cvt/ctfmerge.c:1.17 src/external/cddl/osnet/dist/tools/ctf/cvt/ctfmerge.c:1.18 --- src/external/cddl/osnet/dist/tools/ctf/cvt/ctfmerge.c:1.17 Sun Oct 13 21:32:07 2019 +++ src/external/cddl/osnet/dist/tools/ctf/cvt/ctfmerge.c Tue May 23 18:54:58 2023 @@ -373,22 +373,31 @@ init_phase_two(workqueue_t *wq) static void wip_save_work(workqueue_t *wq, wip_t *slot, int slotnum) { - pthread_mutex_lock(&wq->wq_donequeue_lock); - - while (wq->wq_lastdonebatch + 1 < slot->wip_batchid) - pthread_cond_wait(&slot->wip_cv, &wq->wq_donequeue_lock); + if ((errno = pthread_mutex_lock(&wq->wq_donequeue_lock)) != 0) + terminate("%s: pthread_mutex_lock(wq_donequeue_lock)", + __func__); + + while (wq->wq_lastdonebatch + 1 < slot->wip_batchid) { + if ((errno = pthread_cond_wait(&slot->wip_cv, &wq->wq_donequeue_lock)) != 0) + terminate("%s: pthread_cond_wait(wip_cv,wq_donequeue_lock)", + __func__); + } assert(wq->wq_lastdonebatch + 1 == slot->wip_batchid); fifo_add(wq->wq_donequeue, slot->wip_td); wq->wq_lastdonebatch++; - pthread_cond_signal(&wq->wq_wip[(slotnum + 1) % - wq->wq_nwipslots].wip_cv); + const int nextslot = (slotnum + 1) % wq->wq_nwipslots; + if ((errno = pthread_cond_signal(&wq->wq_wip[nextslot].wip_cv)) != 0) + terminate("%s: pthread_cond_signal(wq_wip[%d].wip_cv)", + __func__, nextslot); /* reset the slot for next use */ slot->wip_td = NULL; slot->wip_batchid = wq->wq_next_batchid++; - pthread_mutex_unlock(&wq->wq_donequeue_lock); + if ((errno = pthread_mutex_unlock(&wq->wq_donequeue_lock)) != 0) + terminate("%s: pthread_mutex_unlock(wq_donequeue_lock)", + __func__); } static void @@ -417,25 +426,35 @@ worker_runphase1(workqueue_t *wq) int wipslotnum, pownum; for (;;) { - pthread_mutex_lock(&wq->wq_queue_lock); + if ((errno = pthread_mutex_lock(&wq->wq_queue_lock)) != 0) + terminate("%s: pthread_mutex_lock(wq_queue_lock)", + __func__); while (fifo_empty(wq->wq_queue)) { if (wq->wq_nomorefiles == 1) { - pthread_cond_broadcast(&wq->wq_work_avail); - pthread_mutex_unlock(&wq->wq_queue_lock); + if ((errno = pthread_cond_broadcast(&wq->wq_work_avail)) != 0) + terminate("%s: pthread_cond_broadcast(wq_work_avail)", + __func__); + if ((errno = pthread_mutex_unlock(&wq->wq_queue_lock)) != 0) + terminate("%s: pthread_mutex_unlock(wq_queue_lock)", + __func__); /* on to phase 2 ... */ return; } - pthread_cond_wait(&wq->wq_work_avail, - &wq->wq_queue_lock); + if ((errno = pthread_cond_wait(&wq->wq_work_avail, + &wq->wq_queue_lock)) != 0) + terminate("%s: pthread_cond_wait(wq_work_avail,wq_queue_lock)", + __func__); } /* there's work to be done! */ pow = fifo_remove(wq->wq_queue); pownum = wq->wq_nextpownum++; - pthread_cond_broadcast(&wq->wq_work_removed); + if ((errno = pthread_cond_broadcast(&wq->wq_work_removed)) != 0) + terminate("%s: pthread_cond_broadcast(wq_work_removed)", + __func__); assert(pow != NULL); @@ -443,16 +462,21 @@ worker_runphase1(workqueue_t *wq) wipslotnum = pownum % wq->wq_nwipslots; wipslot = &wq->wq_wip[wipslotnum]; - pthread_mutex_lock(&wipslot->wip_lock); + if ((errno = pthread_mutex_lock(&wipslot->wip_lock)) != 0) + terminate("%s: pthread_mutex_lock(wip_lock)", __func__); - pthread_mutex_unlock(&wq->wq_queue_lock); + if ((errno = pthread_mutex_unlock(&wq->wq_queue_lock)) != 0) + terminate("%s: pthread_mutex_unlock(wq_queue_lock)", + __func__); wip_add_work(wipslot, pow); if (wipslot->wip_nmerged == wq->wq_maxbatchsz) wip_save_work(wq, wipslot, wipslotnum); - pthread_mutex_unlock(&wipslot->wip_lock); + if ((errno = pthread_mutex_unlock(&wipslot->wip_lock)) != 0) + terminate("%s: pthread_mutex_unlock(wip_lock)", + __func__); } } @@ -463,28 +487,44 @@ worker_runphase2(workqueue_t *wq) int batchid; for (;;) { - pthread_mutex_lock(&wq->wq_queue_lock); + if ((errno = pthread_mutex_lock(&wq->wq_queue_lock)) != 0) + terminate("%s: pthread_mutex_lock(wq_queue_lock)", + __func__); if (wq->wq_ninqueue == 1) { - pthread_cond_broadcast(&wq->wq_work_avail); - pthread_mutex_unlock(&wq->wq_queue_lock); + if ((errno = pthread_cond_broadcast(&wq->wq_work_avail)) != 0) + terminate("%s: pthread_cond_broadcast(wq_work_avail)", + __func__); + if ((errno = pthread_mutex_unlock(&wq->wq_queue_lock)) != 0) + terminate("%s: pthread_mutex_unlock(wq_queue_lock)", + __func__); debug(2, "0x%jx: entering p2 completion barrier\n", (uintmax_t)(uintptr_t)pthread_self()); if (barrier_wait(&wq->wq_bar1)) { - pthread_mutex_lock(&wq->wq_queue_lock); + if ((errno = pthread_mutex_lock(&wq->wq_queue_lock)) != 0) + terminate("%s: pthread_mutex_lock(wq_queue_lock)", + __func__); wq->wq_alldone = 1; - pthread_cond_signal(&wq->wq_alldone_cv); - pthread_mutex_unlock(&wq->wq_queue_lock); + if ((errno = pthread_cond_signal(&wq->wq_alldone_cv)) != 0) + terminate("%s: pthread_cond_signal(wq_alldone_cv)", + __func__); + if ((errno = pthread_mutex_unlock(&wq->wq_queue_lock)) != 0) + terminate("%s: pthread_mutex_unlock(wq_queue_lock)", + __func__); } return; } if (fifo_len(wq->wq_queue) < 2) { - pthread_cond_wait(&wq->wq_work_avail, - &wq->wq_queue_lock); - pthread_mutex_unlock(&wq->wq_queue_lock); + if ((errno = pthread_cond_wait(&wq->wq_work_avail, + &wq->wq_queue_lock)) != 0) + terminate("%s: pthread_cond_wait(wq_work_avail,wq_queue_lock)", + __func__); + if ((errno = pthread_mutex_unlock(&wq->wq_queue_lock)) != 0) + terminate("%s: pthread_mutex_unlock(wq_queue_lock)", + __func__); continue; } @@ -495,7 +535,9 @@ worker_runphase2(workqueue_t *wq) batchid = wq->wq_next_batchid++; - pthread_mutex_unlock(&wq->wq_queue_lock); + if ((errno = pthread_mutex_unlock(&wq->wq_queue_lock)) != 0) + terminate("%s: pthread_mutex_unlock(wq_queue_lock)", + __func__); debug(2, "0x%jx: merging %p into %p\n", (uintmax_t)(uintptr_t)pthread_self(), @@ -507,10 +549,14 @@ worker_runphase2(workqueue_t *wq) * merging is complete. place at the tail of the queue in * proper order. */ - pthread_mutex_lock(&wq->wq_queue_lock); + if ((errno = pthread_mutex_lock(&wq->wq_queue_lock)) != 0) + terminate("%s: pthread_mutex_lock(wq_queue_lock)", + __func__); while (wq->wq_lastdonebatch + 1 != batchid) { - pthread_cond_wait(&wq->wq_done_cv, - &wq->wq_queue_lock); + if ((errno = pthread_cond_wait(&wq->wq_done_cv, + &wq->wq_queue_lock)) != 0) + terminate("%s: pthread_cond_wait(wq_done_cv,wq_queue_lock)", + __func__); } wq->wq_lastdonebatch = batchid; @@ -519,9 +565,15 @@ worker_runphase2(workqueue_t *wq) debug(2, "0x%jx: added %p to queue, len now %d, ninqueue %d\n", (uintmax_t)(uintptr_t)pthread_self(), (void *)pow2, fifo_len(wq->wq_queue), wq->wq_ninqueue); - pthread_cond_broadcast(&wq->wq_done_cv); - pthread_cond_signal(&wq->wq_work_avail); - pthread_mutex_unlock(&wq->wq_queue_lock); + if ((errno = pthread_cond_broadcast(&wq->wq_done_cv)) != 0) + terminate("%s: pthread_cond_broadcast(wq_done_cv)", + __func__); + if ((errno = pthread_cond_signal(&wq->wq_work_avail)) != 0) + terminate("%s: pthread_cond_signal(wq_work_avail)", + __func__); + if ((errno = pthread_mutex_unlock(&wq->wq_queue_lock)) != 0) + terminate("%s: pthread_mutex_unlock(wq_queue_lock)", + __func__); } } @@ -574,18 +626,23 @@ merge_ctf_cb(tdata_t *td, char *name, vo debug(3, "Adding tdata %p for processing\n", (void *)td); - pthread_mutex_lock(&wq->wq_queue_lock); + if ((errno = pthread_mutex_lock(&wq->wq_queue_lock)) != 0) + terminate("%s: pthread_mutex_lock(wq_queue_lock)", __func__); while (fifo_len(wq->wq_queue) > wq->wq_ithrottle) { debug(2, "Throttling input (len = %d, throttle = %d)\n", fifo_len(wq->wq_queue), wq->wq_ithrottle); - pthread_cond_wait(&wq->wq_work_removed, &wq->wq_queue_lock); + if ((errno = pthread_cond_wait(&wq->wq_work_removed, &wq->wq_queue_lock)) != 0) + terminate("%s: pthread_cond_wait(wq_work_removed,wq_queue_lock)", + __func__); } fifo_add(wq->wq_queue, td); debug(1, "Thread 0x%jx announcing %s\n", (uintmax_t)(uintptr_t)pthread_self(), name); - pthread_cond_broadcast(&wq->wq_work_avail); - pthread_mutex_unlock(&wq->wq_queue_lock); + if ((errno = pthread_cond_broadcast(&wq->wq_work_avail)) != 0) + terminate("%s: pthread_cond_broadcast(wq_work_avail)", __func__); + if ((errno = pthread_mutex_unlock(&wq->wq_queue_lock)) != 0) + terminate("%s: pthread_mutex_unlock(wq_queue_lock)", __func__); return (1); } @@ -690,25 +747,35 @@ wq_init(workqueue_t *wq, int nfiles) wq->wq_next_batchid = 0; for (i = 0; i < nslots; i++) { - pthread_mutex_init(&wq->wq_wip[i].wip_lock, NULL); - pthread_cond_init(&wq->wq_wip[i].wip_cv, NULL); + if ((errno = pthread_mutex_init(&wq->wq_wip[i].wip_lock, NULL)) != 0) + terminate("%s: pthread_mutex_init(wip[%d].wip_lock", + __func__, i); + if ((errno = pthread_cond_init(&wq->wq_wip[i].wip_cv, NULL)) != 0) + terminate("%s: pthread_cond_init(wip[%d].wip_cv", + __func__, i); wq->wq_wip[i].wip_batchid = wq->wq_next_batchid++; } - pthread_mutex_init(&wq->wq_queue_lock, NULL); + if ((errno = pthread_mutex_init(&wq->wq_queue_lock, NULL)) != 0) + terminate("%s: pthread_mutex_init(wq_queue_lock)", __func__); wq->wq_queue = fifo_new(); - pthread_cond_init(&wq->wq_work_avail, NULL); - pthread_cond_init(&wq->wq_work_removed, NULL); + if ((errno = pthread_cond_init(&wq->wq_work_avail, NULL)) != 0) + terminate("%s: pthread_cond_init(wq_work_avail)", __func__); + if ((errno = pthread_cond_init(&wq->wq_work_removed, NULL)) != 0) + terminate("%s: pthread_cond_init(wq_work_removed", __func__); wq->wq_ninqueue = nfiles; wq->wq_nextpownum = 0; - pthread_mutex_init(&wq->wq_donequeue_lock, NULL); + if ((errno = pthread_mutex_init(&wq->wq_donequeue_lock, NULL)) != 0) + terminate("%s: pthread_mutex_init(wq_donequeue_lock)", __func__); wq->wq_donequeue = fifo_new(); wq->wq_lastdonebatch = -1; - pthread_cond_init(&wq->wq_done_cv, NULL); + if ((errno = pthread_cond_init(&wq->wq_done_cv, NULL)) != 0) + terminate("%s: pthread_cond_init(wq_done_cv)", __func__); - pthread_cond_init(&wq->wq_alldone_cv, NULL); + if ((errno = pthread_cond_init(&wq->wq_alldone_cv, NULL)) != 0) + terminate("%s: pthread_cond_init(wq_alldone_cv)", __func__); wq->wq_alldone = 0; barrier_init(&wq->wq_bar1, wq->wq_nthreads); @@ -727,10 +794,13 @@ start_threads(workqueue_t *wq) sigaddset(&sets, SIGINT); sigaddset(&sets, SIGQUIT); sigaddset(&sets, SIGTERM); - pthread_sigmask(SIG_BLOCK, &sets, NULL); + if ((errno = pthread_sigmask(SIG_BLOCK, &sets, NULL)) != 0) + terminate("%s: pthread_sigmask(SIG_BLOCK)", __func__); for (i = 0; i < wq->wq_nthreads; i++) { - pthread_create(&wq->wq_thread[i], NULL, worker_thread, wq); + if ((errno = pthread_create(&wq->wq_thread[i], NULL, worker_thread, wq)) != 0) + terminate("%s: pthread_create(wq_thread[%d]", + __func__, i); } #ifdef illumos @@ -742,7 +812,8 @@ start_threads(workqueue_t *wq) signal(SIGQUIT, handle_sig); signal(SIGTERM, handle_sig); #endif - pthread_sigmask(SIG_UNBLOCK, &sets, NULL); + if ((errno = pthread_sigmask(SIG_UNBLOCK, &sets, NULL)) != 0) + terminate("%s: pthread_sigmask(SIG_UNBLOCK)", __func__); } static void @@ -751,7 +822,9 @@ join_threads(workqueue_t *wq) int i; for (i = 0; i < wq->wq_nthreads; i++) { - pthread_join(wq->wq_thread[i], NULL); + if ((errno = pthread_join(wq->wq_thread[i], NULL)) != 0) + terminate("%s: pthread_join(wq_thread[%d]", + __func__, i); } } @@ -947,15 +1020,23 @@ main(int argc, char **argv) terminate("No ctf sections found to merge\n"); } - pthread_mutex_lock(&wq.wq_queue_lock); + if ((errno = pthread_mutex_lock(&wq.wq_queue_lock)) != 0) + terminate("%s: pthread_mutex_lock(wq_queue_lock)", __func__); wq.wq_nomorefiles = 1; - pthread_cond_broadcast(&wq.wq_work_avail); - pthread_mutex_unlock(&wq.wq_queue_lock); - - pthread_mutex_lock(&wq.wq_queue_lock); - while (wq.wq_alldone == 0) - pthread_cond_wait(&wq.wq_alldone_cv, &wq.wq_queue_lock); - pthread_mutex_unlock(&wq.wq_queue_lock); + if ((errno = pthread_cond_broadcast(&wq.wq_work_avail)) != 0) + terminate("%s: pthread_cond_broadcast(wq_work_avail)", __func__); + if ((errno = pthread_mutex_unlock(&wq.wq_queue_lock)) != 0) + terminate("%s: pthread_mutex_unlock(wq_queue_lock)", __func__); + + if ((errno = pthread_mutex_lock(&wq.wq_queue_lock)) != 0) + terminate("%s: pthread_mutex_lock(wq_queue_lock)", __func__); + while (wq.wq_alldone == 0) { + if ((errno = pthread_cond_wait(&wq.wq_alldone_cv, &wq.wq_queue_lock)) != 0) + terminate("%s: pthread_cond_wait(wq_alldone_cv,wq_queue_lock)", + __func__); + } + if ((errno = pthread_mutex_unlock(&wq.wq_queue_lock)) != 0) + terminate("%s: pthread_mutex_unlock(wq_queue_lock)", __func__); join_threads(&wq); Index: src/external/cddl/osnet/dist/tools/ctf/cvt/tdata.c diff -u src/external/cddl/osnet/dist/tools/ctf/cvt/tdata.c:1.9 src/external/cddl/osnet/dist/tools/ctf/cvt/tdata.c:1.10 --- src/external/cddl/osnet/dist/tools/ctf/cvt/tdata.c:1.9 Mon May 28 21:05:06 2018 +++ src/external/cddl/osnet/dist/tools/ctf/cvt/tdata.c Tue May 23 18:54:58 2023 @@ -31,6 +31,7 @@ # include "nbtool_config.h" #endif +#include <errno.h> #include <stdio.h> #include <stdlib.h> #include <strings.h> @@ -396,7 +397,8 @@ tdata_new(void) new->td_nextid = 1; new->td_curvgen = 1; - pthread_mutex_init(&new->td_mergelock, NULL); + if ((errno = pthread_mutex_init(&new->td_mergelock, NULL)) != 0) + terminate("%s: pthread_mutex_init(td_mergelock)", __func__); return (new); } @@ -414,7 +416,8 @@ tdata_free(tdata_t *td) free(td->td_parlabel); free(td->td_parname); - pthread_mutex_destroy(&td->td_mergelock); + if ((errno = pthread_mutex_destroy(&td->td_mergelock)) != 0) + terminate("%s: pthread_mutex_destroy(td_mergelock)", __func__); free(td); }