Date: Fri, 7 Mar 2003 15:02:16 -0800 (PST) From: John Baldwin <jhb@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 26517 for review Message-ID: <200303072302.h27N2GKs094480@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=26517 Change 26517 by jhb@jhb_laptop on 2003/03/07 15:01:33 Really rework this to take into account that some events are broadcast to all threads and some are not. Affected files ... .. //depot/projects/smpng/sys/modules/evtest/evtest.c#5 edit Differences ... ==== //depot/projects/smpng/sys/modules/evtest/evtest.c#5 (text+ko) ==== @@ -52,24 +52,35 @@ #include <sys/sysctl.h> #include <sys/systm.h> -#define MAX_EVENT 7 +#define MAX_EVENT 8 #define NUM_THREADS 2 +#define EVENT_TYPE_BROADCAST 0x1 + static eventhandler_tag first_tag; static struct cv event_cv; static struct mtx event_mtx; static struct sema evtest_sema; static int event; -static struct proc *threads[NUM_THREADS]; -static const char *event_names[] = { - NULL, /* 0 - no event */ - "help", - "invoke handlers on both threads", - "post to semaphore", - "add print foo handler", - "add wait handler", - "add post handler", - "add dump handler" + +struct thread_info { + struct proc *ti_p; + int ti_event; +} threads[NUM_THREADS]; + +struct event_info { + const char *ei_help; + int ei_flags; +} events[MAX_EVENT + 1] = { + { NULL }, /* 0 - no event */ + { "help" }, + { "invoke handlers on both threads", EVENT_TYPE_BROADCAST }, + { "hello world", EVENT_TYPE_BROADCAST }, + { "post to semaphore" }, + { "add print foo handler" }, + { "add wait handler" }, + { "add post handler" }, + { "add dump handler" } }; static int mod_event(struct module *module, int cmd, void *arg); @@ -101,21 +112,39 @@ SYSCTL_NODE(_debug, OID_AUTO, ev, CTLFLAG_RD, 0, "eventhandler tree"); static int +evtest_postevent(int new_event) +{ + struct event_info *ei; + int i; + + if (new_event < 1 && new_event > MAX_EVENT) + return (EINVAL); + + ei = &events[new_event]; + 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; + } + cv_broadcast(&event_cv); + } else { + event = new_event; + cv_signal(&event_cv); + } + mtx_unlock(&event_mtx); + return (0); +} + +static int sysctl_debug_ev_test(SYSCTL_HANDLER_ARGS) { int error, i = 0; error = sysctl_handle_int(oidp, &i, sizeof(i), req); - if (error == 0 && req->newptr != NULL) { - if (i >= 1 && i <= MAX_EVENT) { - mtx_lock(&event_mtx); - KASSERT(event == 0, ("event %d was unhandled", event)); - event = i; - cv_signal(&event_cv); - mtx_unlock(&event_mtx); - } else - error = EINVAL; - } + if (error == 0 && req->newptr != NULL) + error = evtest_postevent(i); return (error); } SYSCTL_PROC(_debug_ev, OID_AUTO, test, CTLTYPE_INT | CTLFLAG_RW, 0, 0, @@ -127,7 +156,7 @@ int i; for (i = 0; i < NUM_THREADS; i++) - if (threads[i] == curthread->td_proc) + if (threads[i].ti_p == curthread->td_proc) return (i); return (-1); } @@ -198,6 +227,7 @@ event_thread(void *arg) { int ev; + int *td_ev = (int *)arg; while (1) { mtx_lock(&event_mtx); @@ -205,47 +235,54 @@ cv_wait(&event_cv, &event_mtx); event = 0; mtx_unlock(&event_mtx); - if (ev < 0) { - ev = -ev; - printf("%s: got thread %d death\n", __func__, ev); - if (ev < NUM_THREADS && - threads[ev] == curthread->td_proc) { - printf("%s: thread %d dying\n", __func__, ev); + if (ev >= 1 && ev <= MAX_EVENT && events[ev].ei_help != NULL) + printf("crash: %s\n", events[ev].ei_help); + switch (ev) { + case 0: + /* Handle broadcast events. */ + switch (*td_ev) { + case -1: + printf("%s: thread %d dying\n", __func__, + evtest_lookupthread()); mtx_lock(&Giant); kthread_exit(0); + break; + case 0: + break; + case 2: + EVENTHANDLER_INVOKE(evtest); + break; + case 3: + printf("thread %d: hello world\n", + evtest_lookupthread()); + break; + default: + printf("Unknown broadcast event %d\n", *td_ev); } - continue; - } - if (ev >= 1 && ev <= MAX_EVENT && event_names[ev] != NULL) - printf("crash: %s\n", event_names[ev]); - switch (ev) { - case 0: + *td_ev = 0; break; case 1: for (ev = 1; ev <= MAX_EVENT; ev++) - if (event_names[ev] != NULL) + if (events[ev].ei_help != NULL) printf("%4d %s\n", ev, - event_names[ev]); + events[ev].ei_help); break; - case 2: - EVENTHANDLER_INVOKE(evtest); - break; - case 3: + case 4: sema_post(&evtest_sema); break; - case 4: + case 5: first_tag = EVENTHANDLER_REGISTER(evtest, evtest_print, "foo", 5); break; - case 5: + case 6: first_tag = EVENTHANDLER_REGISTER(evtest, evtest_wait, NULL, 5); break; - case 6: + case 7: first_tag = EVENTHANDLER_REGISTER(evtest, evtest_post, NULL, 5); break; - case 7: + case 8: first_tag = EVENTHANDLER_REGISTER(evtest, evtest_dumplist, NULL, 5); break; @@ -261,13 +298,13 @@ struct thread *td; int error; - if (i < 0 || i >= NUM_THREADS || threads[i] != NULL) + if (i < 0 || i >= NUM_THREADS || threads[i].ti_p != NULL) return (EINVAL); - error = kthread_create(event_thread, NULL, &threads[i], RFSTOPPED, 0, - name); + error = kthread_create(event_thread, &threads[i].ti_event, + &threads[i].ti_p, RFSTOPPED, 0, name); if (error) return (error); - td = FIRST_THREAD_IN_PROC(threads[i]); + td = FIRST_THREAD_IN_PROC(threads[i].ti_p); mtx_lock_spin(&sched_lock); td->td_priority = PRI_MIN_IDLE; TD_SET_CAN_RUN(td); @@ -280,14 +317,14 @@ thread_destroy(int i) { - if (i < 0 || i >= NUM_THREADS || threads[i] == NULL) + if (i < 0 || i >= NUM_THREADS || threads[i].ti_p == NULL) return; mtx_assert(&event_mtx, MA_OWNED); printf("%s: killing thread %d\n", __func__, i); - event = -i; - cv_signal(&event_cv); - msleep(threads[i], &event_mtx, PWAIT, "evtstun", 0); - threads[i] = NULL; + threads[i].ti_event = -1; + cv_broadcast(&event_cv); + msleep(threads[i].ti_p, &event_mtx, PWAIT, "evtstun", 0); + threads[i].ti_p = NULL; } static void 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?200303072302.h27N2GKs094480>