summaryrefslogtreecommitdiffstats
path: root/sys/kern/uipc_sem.c
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2003-03-24 21:15:35 +0000
committerjhb <jhb@FreeBSD.org>2003-03-24 21:15:35 +0000
commit98a481610a9dcb442e9c2e851c6ef2a330027e45 (patch)
tree41fad1aa97bccfd68308cf8a8ff0de8b8f243493 /sys/kern/uipc_sem.c
parent01298a9735ccfad61628107327cfb25e49f8248b (diff)
downloadFreeBSD-src-98a481610a9dcb442e9c2e851c6ef2a330027e45.zip
FreeBSD-src-98a481610a9dcb442e9c2e851c6ef2a330027e45.tar.gz
Replace the at_fork, at_exec, and at_exit functions with the slightly more
flexible process_fork, process_exec, and process_exit eventhandlers. This reduces code duplication and also means that I don't have to go duplicate the eventhandler locking three more times for each of at_fork, at_exec, and at_exit. Reviewed by: phk, jake, almost complete silence on arch@
Diffstat (limited to 'sys/kern/uipc_sem.c')
-rw-r--r--sys/kern/uipc_sem.c18
1 files changed, 12 insertions, 6 deletions
diff --git a/sys/kern/uipc_sem.c b/sys/kern/uipc_sem.c
index 538ff67..9f59626 100644
--- a/sys/kern/uipc_sem.c
+++ b/sys/kern/uipc_sem.c
@@ -31,6 +31,7 @@
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/sysproto.h>
+#include <sys/eventhandler.h>
#include <sys/kernel.h>
#include <sys/proc.h>
#include <sys/lock.h>
@@ -57,7 +58,7 @@ static void sem_free(struct ksem *ksnew);
static int sem_perm(struct thread *td, struct ksem *ks);
static void sem_enter(struct proc *p, struct ksem *ks);
static int sem_leave(struct proc *p, struct ksem *ks);
-static void sem_exithook(struct proc *p);
+static void sem_exithook(void *arg, struct proc *p);
static int sem_hasopen(struct thread *td, struct ksem *ks);
static int kern_sem_close(struct thread *td, semid_t id);
@@ -114,6 +115,8 @@ static int nsems = 0;
SYSCTL_DECL(_p1003_1b);
SYSCTL_INT(_p1003_1b, OID_AUTO, nsems, CTLFLAG_RD, &nsems, 0, "");
+static eventhandler_tag sem_exit_tag, sem_exec_tag;
+
#ifdef SEM_DEBUG
#define DP(x) printf x
#else
@@ -769,7 +772,8 @@ err:
}
static void
-sem_exithook(p)
+sem_exithook(arg, p)
+ void *arg;
struct proc *p;
{
struct ksem *ks, *ksnext;
@@ -800,16 +804,18 @@ sem_modload(struct module *module, int cmd, void *arg)
mtx_init(&sem_lock, "sem", "semaphore", MTX_DEF);
p31b_setcfg(CTL_P1003_1B_SEM_NSEMS_MAX, SEM_MAX);
p31b_setcfg(CTL_P1003_1B_SEM_VALUE_MAX, SEM_VALUE_MAX);
- at_exec(&sem_exithook);
- at_exit(&sem_exithook);
+ sem_exit_tag = EVENTHANDLER_REGISTER(process_exit, sem_exithook,
+ NULL, EVENTHANDLER_PRI_ANY);
+ sem_exec_tag = EVENTHANDLER_REGISTER(process_exec, sem_exithook,
+ NULL, EVENTHANDLER_PRI_ANY);
break;
case MOD_UNLOAD:
if (nsems != 0) {
error = EOPNOTSUPP;
break;
}
- rm_at_exit(&sem_exithook);
- rm_at_exec(&sem_exithook);
+ EVENTHANDLER_DEREGISTER(process_exit, sem_exit_tag);
+ EVENTHANDLER_DEREGISTER(process_exec, sem_exec_tag);
mtx_destroy(&sem_lock);
break;
case MOD_SHUTDOWN:
OpenPOWER on IntegriCloud