Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 10 Mar 2003 14:42:38 -0800 (PST)
From:      John Baldwin <jhb@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 26643 for review
Message-ID:  <200303102242.h2AMgcHJ055477@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=26643

Change 26643 by jhb@jhb_blue on 2003/03/10 14:42:03

	Partial fixes for the broadcast event stuff.  It still
	doesn't work but I need to work on this in xemacs, not
	vi.

Affected files ...

.. //depot/projects/smpng/sys/modules/evtest/evtest.c#6 edit

Differences ...

==== //depot/projects/smpng/sys/modules/evtest/evtest.c#6 (text+ko) ====

@@ -60,7 +60,7 @@
 static eventhandler_tag first_tag;
 static struct cv event_cv;
 static struct mtx event_mtx;
-static struct sema evtest_sema;
+static struct sema evtest_sema, broadcast_sema;
 static int event;
 
 struct thread_info {
@@ -121,13 +121,17 @@
 		return (EINVAL);
 
 	ei = &events[new_event];
+printf("%s: posting event %d (%s, %d)\n", __func__, new_event, ei->ei_help,
+    ei->ei_flags);
 	mtx_lock(&event_mtx);
 	KASSERT(event == 0, ("event %d was unhandled", event));
 	if (ei->ei_flags & EVENT_TYPE_BROADCAST) {
 		for (i = 0; i < NUM_THREADS; i++) {
 			if (threads[i].ti_p != NULL)
 				threads[i].ti_event = new_event;
+			sema_post(&broadcast_sema);
 		}
+		event = -1;
 		cv_broadcast(&event_cv);
 	} else {
 		event = new_event;
@@ -238,7 +242,7 @@
 		if (ev >= 1 && ev <= MAX_EVENT && events[ev].ei_help != NULL)
 			printf("crash: %s\n", events[ev].ei_help);
 		switch (ev) {
-		case 0:
+		case -1:
 			/* Handle broadcast events. */
 			switch (*td_ev) {
 			case -1:
@@ -260,6 +264,7 @@
 				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++)
@@ -344,6 +349,7 @@
 	mtx_lock(&event_mtx);
 	for (i = 0; i < NUM_THREADS; i++)
 		thread_destroy(i);
+	sema_destroy(&broadcast_sema);
 	sema_destroy(&evtest_sema);
 	mtx_destroy(&event_mtx);
 	cv_destroy(&event_cv);
@@ -358,6 +364,7 @@
 	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");
 	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?200303102242.h2AMgcHJ055477>