Date: Mon, 10 Mar 2003 15:12:15 -0800 (PST) From: John Baldwin <jhb@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 26645 for review Message-ID: <200303102312.h2ANCFUk057672@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=26645 Change 26645 by jhb@jhb_laptop on 2003/03/10 15:11:29 A semaphore didn't quite do what we need, so use a kind of home-rolled one using a counter and a cv. Affected files ... .. //depot/projects/smpng/sys/modules/evtest/evtest.c#7 edit Differences ... ==== //depot/projects/smpng/sys/modules/evtest/evtest.c#7 (text+ko) ==== @@ -58,10 +58,10 @@ #define EVENT_TYPE_BROADCAST 0x1 static eventhandler_tag first_tag; -static struct cv event_cv; +static struct cv event_cv, broadcast_cv; static struct mtx event_mtx; -static struct sema evtest_sema, broadcast_sema; -static int event; +static struct sema evtest_sema; +static int event, broadcast_count; struct thread_info { struct proc *ti_p; @@ -129,7 +129,7 @@ for (i = 0; i < NUM_THREADS; i++) { if (threads[i].ti_p != NULL) threads[i].ti_event = new_event; - sema_post(&broadcast_sema); + broadcast_count++; } event = -1; cv_broadcast(&event_cv); @@ -235,9 +235,18 @@ while (1) { mtx_lock(&event_mtx); + if (event == -1) { + broadcast_count--; + if (broadcast_count == 0) + cv_broadcast(&broadcast_cv); + else { + cv_wait(&broadcast_cv, &event_mtx); + MPASS(broadcast_count == 0); + } + } + event = 0; while ((ev = event) == 0) cv_wait(&event_cv, &event_mtx); - event = 0; mtx_unlock(&event_mtx); if (ev >= 1 && ev <= MAX_EVENT && events[ev].ei_help != NULL) printf("crash: %s\n", events[ev].ei_help); @@ -264,7 +273,6 @@ printf("Unknown broadcast event %d\n", *td_ev); } *td_ev = 0; - sema_wait(&broadcast_sema); break; case 1: for (ev = 1; ev <= MAX_EVENT; ev++) @@ -349,7 +357,7 @@ mtx_lock(&event_mtx); for (i = 0; i < NUM_THREADS; i++) thread_destroy(i); - sema_destroy(&broadcast_sema); + cv_destroy(&broadcast_cv); sema_destroy(&evtest_sema); mtx_destroy(&event_mtx); cv_destroy(&event_cv); @@ -361,10 +369,11 @@ int error; event = 0; + broadcast_count = 0; mtx_init(&event_mtx, "evtest event", NULL, MTX_DEF); cv_init(&event_cv, "evtest"); sema_init(&evtest_sema, 1, "evtest semaphore"); - sema_init(&broadcast_sema, 0, "broadcast semaphore"); + cv_init(&broadcast_cv, "evbcast"); error = thread_create(0, "event thread 0"); if (error) { cleanup(); To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe p4-projects" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200303102312.h2ANCFUk057672>