Provide ABI modules hooks for process exec/exit and thread exit.
Exec and exit are same as corresponding eventhandler hooks. Thread exit hook is called somewhat earlier, while thread is still owned by the process and enough context is available. Note that the process lock is owned when the hook is called. Reviewed by: markj Sponsored by: The FreeBSD Foundation Differential revision: https://reviews.freebsd.org/D27309
This commit is contained in:
parent
2654ad033a
commit
b2d30a77c1
@ -1051,6 +1051,8 @@ exec_new_vmspace(struct image_params *imgp, struct sysentvec *sv)
|
||||
sigfastblock_clear(td);
|
||||
umtx_exec(p);
|
||||
itimers_exec(p);
|
||||
if (sv->sv_onexec != NULL)
|
||||
sv->sv_onexec(p, imgp);
|
||||
|
||||
EVENTHANDLER_DIRECT_INVOKE(process_exec, p, imgp);
|
||||
|
||||
|
@ -72,6 +72,7 @@ __FBSDID("$FreeBSD$");
|
||||
#include <sys/sdt.h>
|
||||
#include <sys/shm.h>
|
||||
#include <sys/sem.h>
|
||||
#include <sys/sysent.h>
|
||||
#include <sys/timers.h>
|
||||
#include <sys/umtx.h>
|
||||
#ifdef KTRACE
|
||||
@ -327,6 +328,9 @@ exit1(struct thread *td, int rval, int signo)
|
||||
|
||||
itimers_exit(p);
|
||||
|
||||
if (p->p_sysent->sv_onexit != NULL)
|
||||
p->p_sysent->sv_onexit(p);
|
||||
|
||||
/*
|
||||
* Check if any loadable modules need anything done at process exit.
|
||||
* E.g. SYSV IPC stuff.
|
||||
@ -561,6 +565,9 @@ exit1(struct thread *td, int rval, int signo)
|
||||
PROC_LOCK(p);
|
||||
p->p_xthread = td;
|
||||
|
||||
if (p->p_sysent->sv_ontdexit != NULL)
|
||||
p->p_sysent->sv_ontdexit(td);
|
||||
|
||||
#ifdef KDTRACE_HOOKS
|
||||
/*
|
||||
* Tell the DTrace fasttrap provider about the exit if it
|
||||
|
@ -39,6 +39,7 @@ __FBSDID("$FreeBSD$");
|
||||
#include <sys/resourcevar.h>
|
||||
#include <sys/rwlock.h>
|
||||
#include <sys/signalvar.h>
|
||||
#include <sys/sysent.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/umtx.h>
|
||||
#include <sys/unistd.h>
|
||||
@ -355,6 +356,10 @@ kthread_exit(void)
|
||||
PROC_UNLOCK(p);
|
||||
kproc_exit(0);
|
||||
}
|
||||
|
||||
if (p->p_sysent->sv_ontdexit != NULL)
|
||||
p->p_sysent->sv_ontdexit(td);
|
||||
|
||||
tidhash_remove(td);
|
||||
umtx_thread_exit(td);
|
||||
tdsigcleanup(td);
|
||||
|
@ -353,6 +353,9 @@ kern_thr_exit(struct thread *td)
|
||||
return (0);
|
||||
}
|
||||
|
||||
if (p->p_sysent->sv_ontdexit != NULL)
|
||||
p->p_sysent->sv_ontdexit(td);
|
||||
|
||||
td->td_dbgflags |= TDB_EXIT;
|
||||
if (p->p_ptevents & PTRACE_LWP) {
|
||||
p->p_pendingexits++;
|
||||
|
@ -145,6 +145,9 @@ struct sysentvec {
|
||||
u_long *sv_hwcap2; /* Value passed in AT_HWCAP2. */
|
||||
const char *(*sv_machine_arch)(struct proc *);
|
||||
vm_offset_t sv_fxrng_gen_base;
|
||||
void (*sv_onexec)(struct proc *, struct image_params *);
|
||||
void (*sv_onexit)(struct proc *);
|
||||
void (*sv_ontdexit)(struct thread *td);
|
||||
};
|
||||
|
||||
#define SV_ILP32 0x000100 /* 32-bit executable. */
|
||||
|
Loading…
Reference in New Issue
Block a user