reap
int reap;
reap = 0;
reap = 1;
return reap;
struct sysreaper *reap;
reap = reaper_exit(p);
reproc = reaper_get(reap);
reproc = reaper_get(reap);
if (reap)
reaper_drop(reap);
reap = kmalloc(sizeof(*reap), M_REAPER, M_WAITOK|M_ZERO);
reaper_init(p, reap);
kfree(reap, M_REAPER);
reap = p->p_reaper;
KKASSERT(reap != NULL);
if (reap->p == p) {
reaper_hold(reap); /* in case of thread race */
lockmgr(&reap->lock, LK_EXCLUSIVE);
if (reap->p != p) {
lockmgr(&reap->lock, LK_RELEASE);
reaper_drop(reap);
reap->p = NULL;
p->p_reaper = reap->parent;
lockmgr(&reap->lock, LK_RELEASE);
reaper_drop(reap); /* our ref */
reaper_drop(reap); /* old p_reaper ref */
if ((reap = p->p_reaper) != NULL && reap->p == p) {
udata.status.flags = reap->flags;
udata.status.refs = reap->refs - 1; /* minus ours */
reap = p->p_reaper;
if (reap->p == p)
error = reaper_kill(reap, &udata.kill);
reaper_hold(struct sysreaper *reap)
KKASSERT(reap->refs > 0);
refcount_acquire(&reap->refs);
struct sysreaper *reap;
while ((reap = next) != NULL) {
if (refcount_release(&reap->refs)) {
next = reap->parent;
KKASSERT(reap->p == NULL);
reap->parent = NULL;
kfree(reap, M_REAPER);
reaper_init(struct proc *p, struct sysreaper *reap)
reap->parent = p->p_reaper;
reap->p = p;
reap->flags = REAPER_STAT_OWNED | REAPER_STAT_REALINIT;
reap->refs = 2;
reap->flags = REAPER_STAT_OWNED;
reap->refs = 1;
lockinit(&reap->lock, "subrp", 0, 0);
p->p_reaper = reap;
struct sysreaper *reap;
if ((reap = p->p_reaper) != NULL && reap->p == p) {
lockmgr(&reap->lock, LK_EXCLUSIVE);
p->p_reaper = reap->parent;
reap->p = NULL;
lockmgr(&reap->lock, LK_RELEASE);
reaper_drop(reap);
if ((reap = p->p_reaper) != NULL) {
return reap;
reaper_get(struct sysreaper *reap)
if (reap == NULL)
reaper_hold(reap);
while (reap) {
lockmgr(&reap->lock, LK_SHARED);
if (reap->p) {
if (reap->p) {
reproc = reap->p;
lockmgr(&reap->lock, LK_RELEASE);
reaper_drop(reap);
lockmgr(&reap->lock, LK_RELEASE);
next = reap->parent;
lockmgr(&reap->lock, LK_RELEASE);
lockmgr(&reap->lock, LK_EXCLUSIVE);
reap->parent == next &&
reap->parent = next->parent;
next = reap->parent;
lockmgr(&reap->lock, LK_RELEASE);
reaper_drop(reap);
reap = next;
struct sysreaper *reap;
for (reap = target->p_reaper; reap; reap = reap->parent) {
if (sreap == reap) {
reaper_kill(struct sysreaper *reap, struct reaper_kill *rk)
reaper_hold(reap);
lockmgr(&reap->lock, LK_EXCLUSIVE);
starting = reap->p;
cur->p_reaper == reap &&
lockmgr(&reap->lock, LK_RELEASE);
reaper_drop(reap);
struct sysreaper *reap;
if ((reap = p1->p_reaper) != NULL) {
reaper_hold(reap);
p2->p_reaper = reap;
pptr = reaper_get(reap);
struct sysreaper *reap;
int reap;
reap = 0;
reap = 1;
if (reap) {
int reap;
reap = 0;
reap = 1;
if (reap) {
boolean_t reap)
if (IPFW_STATE_ISDEAD(s) || (reap && IPFW_STATE_TCPCLOSED(s))) {
boolean_t reap = FALSE;
reap = TRUE;
ipfw_track_state_expire(ctx, t, reap);
if (TIME_LEQ(t->t_expire, time_uptime) || reap) {
void reaper_hold(struct sysreaper *reap);
void reaper_drop(struct sysreaper *reap);
void reaper_init(struct proc *p, struct sysreaper *reap);
struct proc *reaper_get(struct sysreaper *reap);
int reaper_kill(struct sysreaper *reap, struct reaper_kill *rk);
signal(SIGCHLD, reap);
void reap(int);