summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRandall Stewart <rrs@FreeBSD.org>2007-12-14 13:41:09 +0000
committerRandall Stewart <rrs@FreeBSD.org>2007-12-14 13:41:09 +0000
commitdf328b80a4df8b5663d082e4f6ff06816a57f1de (patch)
treebf2587c3a1aa03006b98fcefc28768410fd066dc
parent8a127db5fb3666dedb09b26588533b32a5f02c38 (diff)
Notes
-rw-r--r--sys/kern/init_main.c9
-rw-r--r--sys/kern/kern_proc.c7
-rw-r--r--sys/kern/kern_thread.c6
-rw-r--r--sys/sys/eventhandler.h19
4 files changed, 38 insertions, 3 deletions
diff --git a/sys/kern/init_main.c b/sys/kern/init_main.c
index 8b86f8983e9e5..50737539e83d8 100644
--- a/sys/kern/init_main.c
+++ b/sys/kern/init_main.c
@@ -487,6 +487,15 @@ proc0_init(void *dummy __unused)
vm_map_init(&vmspace0.vm_map, p->p_sysent->sv_minuser,
p->p_sysent->sv_maxuser);
vmspace0.vm_map.pmap = vmspace_pmap(&vmspace0);
+ /*-
+ * call the init and ctor for the new thread and proc
+ * we wait to do this until all other structures
+ * are fairly sane.
+ */
+ EVENTHANDLER_INVOKE(process_init, p);
+ EVENTHANDLER_INVOKE(thread_init, td);
+ EVENTHANDLER_INVOKE(process_ctor, p);
+ EVENTHANDLER_INVOKE(thread_ctor, td);
/*
* Charge root for one process.
diff --git a/sys/kern/kern_proc.c b/sys/kern/kern_proc.c
index 2ce15830d19ee..ad150922ea42b 100644
--- a/sys/kern/kern_proc.c
+++ b/sys/kern/kern_proc.c
@@ -54,6 +54,7 @@ __FBSDID("$FreeBSD$");
#include <sys/user.h>
#include <sys/jail.h>
#include <sys/vnode.h>
+#include <sys/eventhandler.h>
#ifdef KTRACE
#include <sys/uio.h>
#include <sys/ktrace.h>
@@ -130,6 +131,7 @@ proc_ctor(void *mem, int size, void *arg, int flags)
struct proc *p;
p = (struct proc *)mem;
+ EVENTHANDLER_INVOKE(process_ctor, p);
return (0);
}
@@ -158,7 +160,8 @@ proc_dtor(void *mem, int size, void *arg)
* freed, so you gotta do this here.
*/
if (((p->p_flag & P_KTHREAD) != 0) && (td->td_altkstack != 0))
- vm_thread_dispose_altkstack(td);
+ vm_thread_dispose_altkstack(td);
+ EVENTHANDLER_INVOKE(process_dtor, p);
if (p->p_ksi != NULL)
KASSERT(! KSI_ONQ(p->p_ksi), ("SIGCHLD queue"));
}
@@ -178,6 +181,7 @@ proc_init(void *mem, int size, int flags)
bzero(&p->p_mtx, sizeof(struct mtx));
mtx_init(&p->p_mtx, "process lock", NULL, MTX_DEF | MTX_DUPOK);
mtx_init(&p->p_slock, "process slock", NULL, MTX_SPIN | MTX_RECURSE);
+ EVENTHANDLER_INVOKE(process_init, p);
p->p_stats = pstats_alloc();
proc_linkup(p, td);
sched_newproc(p, td);
@@ -195,6 +199,7 @@ proc_fini(void *mem, int size)
struct proc *p;
p = (struct proc *)mem;
+ EVENTHANDLER_INVOKE(process_fini, p);
pstats_free(p->p_stats);
thread_free(FIRST_THREAD_IN_PROC(p));
mtx_destroy(&p->p_mtx);
diff --git a/sys/kern/kern_thread.c b/sys/kern/kern_thread.c
index 97c56a4f45950..7d8f96b6275e3 100644
--- a/sys/kern/kern_thread.c
+++ b/sys/kern/kern_thread.c
@@ -49,6 +49,7 @@ __FBSDID("$FreeBSD$");
#include <vm/vm.h>
#include <vm/vm_extern.h>
#include <vm/uma.h>
+#include <sys/eventhandler.h>
/*
* thread related storage.
@@ -126,7 +127,7 @@ thread_ctor(void *mem, int size, void *arg, int flags)
* end of a context switch.
*/
td->td_critnest = 1;
-
+ EVENTHANDLER_INVOKE(thread_ctor, td);
#ifdef AUDIT
audit_thread_alloc(td);
#endif
@@ -167,6 +168,7 @@ thread_dtor(void *mem, int size, void *arg)
#ifdef AUDIT
audit_thread_free(td);
#endif
+ EVENTHANDLER_INVOKE(thread_dtor, td);
free_unr(tid_unrhdr, td->td_tid);
sched_newthread(td);
}
@@ -185,6 +187,7 @@ thread_init(void *mem, int size, int flags)
cpu_thread_setup(td);
td->td_sleepqueue = sleepq_alloc();
td->td_turnstile = turnstile_alloc();
+ EVENTHANDLER_INVOKE(thread_init, td);
td->td_sched = (struct td_sched *)&td[1];
sched_newthread(td);
umtx_thread_init(td);
@@ -200,6 +203,7 @@ thread_fini(void *mem, int size)
struct thread *td;
td = (struct thread *)mem;
+ EVENTHANDLER_INVOKE(thread_fini, td);
turnstile_free(td->td_turnstile);
sleepq_free(td->td_sleepqueue);
umtx_thread_fini(td);
diff --git a/sys/sys/eventhandler.h b/sys/sys/eventhandler.h
index 5c7f1d63dde59..00d124d91e0f8 100644
--- a/sys/sys/eventhandler.h
+++ b/sys/sys/eventhandler.h
@@ -182,11 +182,28 @@ struct image_params;
typedef void (*exitlist_fn)(void *, struct proc *);
typedef void (*forklist_fn)(void *, struct proc *, struct proc *, int);
typedef void (*execlist_fn)(void *, struct proc *, struct image_params *);
-
+typedef void (*proc_ctor_fn)(void *, struct proc *);
+typedef void (*proc_dtor_fn)(void *, struct proc *);
+typedef void (*proc_init_fn)(void *, struct proc *);
+typedef void (*proc_fini_fn)(void *, struct proc *);
+EVENTHANDLER_DECLARE(process_ctor, proc_ctor_fn);
+EVENTHANDLER_DECLARE(process_dtor, proc_dtor_fn);
+EVENTHANDLER_DECLARE(process_init, proc_init_fn);
+EVENTHANDLER_DECLARE(process_fini, proc_fini_fn);
EVENTHANDLER_DECLARE(process_exit, exitlist_fn);
EVENTHANDLER_DECLARE(process_fork, forklist_fn);
EVENTHANDLER_DECLARE(process_exec, execlist_fn);
+struct thread;
+typedef void (*thread_ctor_fn)(void *, struct thread *);
+typedef void (*thread_dtor_fn)(void *, struct thread *);
+typedef void (*thread_fini_fn)(void *, struct thread *);
+typedef void (*thread_init_fn)(void *, struct thread *);
+EVENTHANDLER_DECLARE(thread_ctor, thread_ctor_fn);
+EVENTHANDLER_DECLARE(thread_dtor, thread_dtor_fn);
+EVENTHANDLER_DECLARE(thread_init, thread_init_fn);
+EVENTHANDLER_DECLARE(thread_fini, thread_fini_fn);
+
typedef void (*uma_zone_chfn)(void *);
EVENTHANDLER_DECLARE(nmbclusters_change, uma_zone_chfn);
EVENTHANDLER_DECLARE(maxsockets_change, uma_zone_chfn);