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);
}