Skip site navigation (1)Skip section navigation (2)
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>