diff options
| author | Randall Stewart <rrs@FreeBSD.org> | 2007-12-14 13:41:09 +0000 |
|---|---|---|
| committer | Randall Stewart <rrs@FreeBSD.org> | 2007-12-14 13:41:09 +0000 |
| commit | df328b80a4df8b5663d082e4f6ff06816a57f1de (patch) | |
| tree | bf2587c3a1aa03006b98fcefc28768410fd066dc | |
| parent | 8a127db5fb3666dedb09b26588533b32a5f02c38 (diff) | |
Notes
| -rw-r--r-- | sys/kern/init_main.c | 9 | ||||
| -rw-r--r-- | sys/kern/kern_proc.c | 7 | ||||
| -rw-r--r-- | sys/kern/kern_thread.c | 6 | ||||
| -rw-r--r-- | sys/sys/eventhandler.h | 19 |
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); |
