[Glibc-bsd-commits] r4772 - trunk/kfreebsd-9/debian/patches

Petr Salinger ps-guest at alioth.debian.org
Fri Jul 19 19:50:48 UTC 2013


Author: ps-guest
Date: 2013-07-19 19:50:48 +0000 (Fri, 19 Jul 2013)
New Revision: 4772

Removed:
   trunk/kfreebsd-9/debian/patches/000_clock_getcpuclockid2.diff
   trunk/kfreebsd-9/debian/patches/000_zombie.diff
Log:
drop renamed patches


Deleted: trunk/kfreebsd-9/debian/patches/000_clock_getcpuclockid2.diff
===================================================================
--- trunk/kfreebsd-9/debian/patches/000_clock_getcpuclockid2.diff	2013-07-19 19:48:46 UTC (rev 4771)
+++ trunk/kfreebsd-9/debian/patches/000_clock_getcpuclockid2.diff	2013-07-19 19:50:48 UTC (rev 4772)
@@ -1,460 +0,0 @@
-backport clock_getcpuclockid2 syscall into kfreebsd-9
-#716746
-
-To properly provide CLOCK_THREAD_CPUTIME_ID, CLOCK_PROCESS_CPUTIME_ID
-and clock_id's created by clock_getcpuclockid() and 
-pthread_getcpuclockid(), we need this kernel support.
-
-MFC r239347 - http://www.freebsd.org/cgi/query-pr.cgi?pr=168417
-MFC r253325 - http://www.freebsd.org/cgi/query-pr.cgi?pr=180496
-and regenerate files from syscalls.master's
-
-It still remains to solve compat32 problem by upstream,
-see http://www.freebsd.org/cgi/query-pr.cgi?pr=180652
-
-
---- a/sys/compat/freebsd32/syscalls.master
-+++ b/sys/compat/freebsd32/syscalls.master
-@@ -453,7 +453,8 @@
- 244	AUE_NULL	UNIMPL	nosys
- 245	AUE_NULL	UNIMPL	nosys
- 246	AUE_NULL	UNIMPL	nosys
--247	AUE_NULL	UNIMPL	nosys
-+247	AUE_NULL	NOPROTO	{ int clock_getcpuclockid2(id_t id,\
-+					int which, clockid_t *clock_id); }
- 248	AUE_NULL	UNIMPL	ntp_gettime
- 249	AUE_NULL	UNIMPL	nosys
- ; syscall numbers initially used in OpenBSD
---- a/sys/compat/freebsd32/freebsd32_systrace_args.c
-+++ b/sys/compat/freebsd32/freebsd32_systrace_args.c
-@@ -1203,6 +1203,15 @@
- 		*n_args = 2;
- 		break;
- 	}
-+	/* clock_getcpuclockid2 */
-+	case 247: {
-+		struct clock_getcpuclockid2_args *p = params;
-+		iarg[0] = p->id; /* id_t */
-+		iarg[1] = p->which; /* int */
-+		uarg[2] = (intptr_t) p->clock_id; /* clockid_t * */
-+		*n_args = 3;
-+		break;
-+	}
- 	/* minherit */
- 	case 250: {
- 		struct minherit_args *p = params;
-@@ -4938,6 +4947,22 @@
- 			break;
- 		default:
- 			break;
-+		};
-+		break;
-+	/* clock_getcpuclockid2 */
-+	case 247:
-+		switch(ndx) {
-+		case 0:
-+			p = "id_t";
-+			break;
-+		case 1:
-+			p = "int";
-+			break;
-+		case 2:
-+			p = "clockid_t *";
-+			break;
-+		default:
-+			break;
- 		};
- 		break;
- 	/* minherit */
---- a/sys/compat/freebsd32/freebsd32_syscalls.c
-+++ b/sys/compat/freebsd32/freebsd32_syscalls.c
-@@ -257,7 +257,7 @@
- 	"#244",			/* 244 = nosys */
- 	"#245",			/* 245 = nosys */
- 	"#246",			/* 246 = nosys */
--	"#247",			/* 247 = nosys */
-+	"clock_getcpuclockid2",			/* 247 = clock_getcpuclockid2 */
- 	"#248",			/* 248 = ntp_gettime */
- 	"#249",			/* 249 = nosys */
- 	"minherit",			/* 250 = minherit */
---- a/sys/compat/freebsd32/freebsd32_syscall.h
-+++ b/sys/compat/freebsd32/freebsd32_syscall.h
-@@ -207,6 +207,7 @@
- #define	FREEBSD32_SYS_freebsd32_clock_settime	233
- #define	FREEBSD32_SYS_freebsd32_clock_getres	234
- #define	FREEBSD32_SYS_freebsd32_nanosleep	240
-+#define	FREEBSD32_SYS_clock_getcpuclockid2	247
- #define	FREEBSD32_SYS_minherit	250
- #define	FREEBSD32_SYS_rfork	251
- #define	FREEBSD32_SYS_openbsd_poll	252
---- a/sys/compat/freebsd32/freebsd32_sysent.c
-+++ b/sys/compat/freebsd32/freebsd32_sysent.c
-@@ -294,7 +294,7 @@
- 	{ 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0, SY_THR_ABSENT },			/* 244 = nosys */
- 	{ 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0, SY_THR_ABSENT },			/* 245 = nosys */
- 	{ 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0, SY_THR_ABSENT },			/* 246 = nosys */
--	{ 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0, SY_THR_ABSENT },			/* 247 = nosys */
-+	{ AS(clock_getcpuclockid2_args), (sy_call_t *)sys_clock_getcpuclockid2, AUE_NULL, NULL, 0, 0, 0, SY_THR_STATIC },	/* 247 = clock_getcpuclockid2 */
- 	{ 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0, SY_THR_ABSENT },			/* 248 = ntp_gettime */
- 	{ 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0, SY_THR_ABSENT },			/* 249 = nosys */
- 	{ AS(minherit_args), (sy_call_t *)sys_minherit, AUE_MINHERIT, NULL, 0, 0, 0, SY_THR_STATIC },	/* 250 = minherit */
---- a/sys/sys/syscall.mk
-+++ b/sys/sys/syscall.mk
-@@ -168,6 +168,7 @@
- 	ktimer_gettime.o \
- 	ktimer_getoverrun.o \
- 	nanosleep.o \
-+	clock_getcpuclockid2.o \
- 	ntp_gettime.o \
- 	minherit.o \
- 	rfork.o \
---- a/sys/sys/syscall.h
-+++ b/sys/sys/syscall.h
-@@ -216,6 +216,7 @@
- #define	SYS_ktimer_gettime	238
- #define	SYS_ktimer_getoverrun	239
- #define	SYS_nanosleep	240
-+#define	SYS_clock_getcpuclockid2	247
- #define	SYS_ntp_gettime	248
- #define	SYS_minherit	250
- #define	SYS_rfork	251
---- a/sys/sys/time.h
-+++ b/sys/sys/time.h
-@@ -266,6 +266,7 @@
- #define CLOCK_MONOTONIC_FAST	12	/* FreeBSD-specific. */
- #define CLOCK_SECOND	13		/* FreeBSD-specific. */
- #define CLOCK_THREAD_CPUTIME_ID	14
-+#define CLOCK_PROCESS_CPUTIME_ID	15
- #endif
- 
- #ifndef TIMER_ABSTIME
-@@ -273,6 +274,11 @@
- #define TIMER_ABSTIME	0x1	/* absolute timer */
- #endif
- 
-+#if __BSD_VISIBLE
-+#define	CPUCLOCK_WHICH_PID	0
-+#define	CPUCLOCK_WHICH_TID	1
-+#endif
-+
- #ifdef _KERNEL
- 
- /*
-@@ -344,6 +350,7 @@
- 
- #if __BSD_VISIBLE
- int	adjtime(const struct timeval *, struct timeval *);
-+int	clock_getcpuclockid2(id_t, int, clockid_t *);
- int	futimes(int, const struct timeval *);
- int	futimesat(int, const char *, const struct timeval [2]);
- int	lutimes(const char *, const struct timeval *);
---- a/sys/sys/sysproto.h
-+++ b/sys/sys/sysproto.h
-@@ -726,6 +726,11 @@
- 	char rqtp_l_[PADL_(const struct timespec *)]; const struct timespec * rqtp; char rqtp_r_[PADR_(const struct timespec *)];
- 	char rmtp_l_[PADL_(struct timespec *)]; struct timespec * rmtp; char rmtp_r_[PADR_(struct timespec *)];
- };
-+struct clock_getcpuclockid2_args {
-+	char id_l_[PADL_(id_t)]; id_t id; char id_r_[PADR_(id_t)];
-+	char which_l_[PADL_(int)]; int which; char which_r_[PADR_(int)];
-+	char clock_id_l_[PADL_(clockid_t *)]; clockid_t * clock_id; char clock_id_r_[PADR_(clockid_t *)];
-+};
- struct ntp_gettime_args {
- 	char ntvp_l_[PADL_(struct ntptimeval *)]; struct ntptimeval * ntvp; char ntvp_r_[PADR_(struct ntptimeval *)];
- };
-@@ -1894,6 +1899,7 @@
- int	sys_ktimer_gettime(struct thread *, struct ktimer_gettime_args *);
- int	sys_ktimer_getoverrun(struct thread *, struct ktimer_getoverrun_args *);
- int	sys_nanosleep(struct thread *, struct nanosleep_args *);
-+int	sys_clock_getcpuclockid2(struct thread *, struct clock_getcpuclockid2_args *);
- int	sys_ntp_gettime(struct thread *, struct ntp_gettime_args *);
- int	sys_minherit(struct thread *, struct minherit_args *);
- int	sys_rfork(struct thread *, struct rfork_args *);
-@@ -2581,6 +2587,7 @@
- #define	SYS_AUE_ktimer_gettime	AUE_NULL
- #define	SYS_AUE_ktimer_getoverrun	AUE_NULL
- #define	SYS_AUE_nanosleep	AUE_NULL
-+#define	SYS_AUE_clock_getcpuclockid2	AUE_NULL
- #define	SYS_AUE_ntp_gettime	AUE_NULL
- #define	SYS_AUE_minherit	AUE_MINHERIT
- #define	SYS_AUE_rfork	AUE_RFORK
---- a/sys/sys/unistd.h
-+++ b/sys/sys/unistd.h
-@@ -53,7 +53,7 @@
- #define	_POSIX_ASYNCHRONOUS_IO		0
- #define	_POSIX_CHOWN_RESTRICTED		1
- #define	_POSIX_CLOCK_SELECTION		(-1)
--#define	_POSIX_CPUTIME			(-1)
-+#define	_POSIX_CPUTIME			200112L
- #define	_POSIX_FSYNC			200112L
- #define	_POSIX_IPV6			0
- #define	_POSIX_JOB_CONTROL		1
---- a/sys/kern/syscalls.c
-+++ b/sys/kern/syscalls.c
-@@ -254,7 +254,7 @@
- 	"#244",			/* 244 = nosys */
- 	"#245",			/* 245 = nosys */
- 	"#246",			/* 246 = nosys */
--	"#247",			/* 247 = nosys */
-+	"clock_getcpuclockid2",			/* 247 = clock_getcpuclockid2 */
- 	"ntp_gettime",			/* 248 = ntp_gettime */
- 	"#249",			/* 249 = nosys */
- 	"minherit",			/* 250 = minherit */
---- a/sys/kern/kern_time.c
-+++ b/sys/kern/kern_time.c
-@@ -58,6 +58,12 @@
- #include <vm/vm_extern.h>
- 
- #define MAX_CLOCKS 	(CLOCK_MONOTONIC+1)
-+#define CPUCLOCK_BIT		0x80000000
-+#define CPUCLOCK_PROCESS_BIT	0x40000000
-+#define CPUCLOCK_ID_MASK	(~(CPUCLOCK_BIT|CPUCLOCK_PROCESS_BIT))
-+#define MAKE_THREAD_CPUCLOCK(tid)	(CPUCLOCK_BIT|(tid))
-+#define MAKE_PROCESS_CPUCLOCK(pid)	\
-+	(CPUCLOCK_BIT|CPUCLOCK_PROCESS_BIT|(pid))
- 
- static struct kclock	posix_clocks[MAX_CLOCKS];
- static uma_zone_t	itimer_zone = NULL;
-@@ -165,6 +171,52 @@
- }
- 
- #ifndef _SYS_SYSPROTO_H_
-+struct clock_getcpuclockid2_args {
-+	id_t id;
-+	int which,
-+	clockid_t *clock_id;
-+};
-+#endif
-+/* ARGSUSED */
-+int
-+sys_clock_getcpuclockid2(struct thread *td, struct clock_getcpuclockid2_args *uap)
-+{
-+	clockid_t clk_id;
-+	struct proc *p;
-+	pid_t pid;
-+	lwpid_t tid;
-+	int error;
-+
-+	switch(uap->which) {
-+	case CPUCLOCK_WHICH_PID:
-+		if (uap->id != 0) {
-+			p = pfind(uap->id);
-+			if (p == NULL)
-+				return (ESRCH);
-+			error = p_cansee(td, p);
-+			PROC_UNLOCK(p);
-+			if (error)
-+				return (error);
-+			pid = uap->id;
-+		} else {
-+			pid = td->td_proc->p_pid;
-+		}
-+		clk_id = MAKE_PROCESS_CPUCLOCK(pid);
-+		break;
-+	case CPUCLOCK_WHICH_TID:
-+		if (uap->id == 0)
-+			tid = td->td_tid;
-+		else
-+			tid = uap->id;
-+		clk_id = MAKE_THREAD_CPUCLOCK(tid);
-+		break;
-+	default:
-+		return (EINVAL);
-+	}
-+	return (copyout(&clk_id, uap->clock_id, sizeof(clockid_t)));
-+}
-+
-+#ifndef _SYS_SYSPROTO_H_
- struct clock_gettime_args {
- 	clockid_t clock_id;
- 	struct	timespec *tp;
-@@ -184,12 +236,80 @@
- 	return (error);
- }
- 
-+static inline void
-+cputick2timespec(uint64_t runtime, struct timespec *ats)
-+{
-+	runtime = cputick2usec(runtime);
-+	ats->tv_sec = runtime / 1000000;
-+	ats->tv_nsec = runtime % 1000000 * 1000;
-+}
-+
-+static void
-+get_thread_cputime(struct thread *targettd, struct timespec *ats)
-+{
-+	uint64_t runtime, curtime, switchtime;
-+
-+	if (targettd == NULL) { /* current thread */
-+		critical_enter();
-+		switchtime = PCPU_GET(switchtime);
-+		curtime = cpu_ticks();
-+		runtime = curthread->td_runtime;
-+		critical_exit();
-+		runtime += curtime - switchtime;
-+	} else {
-+		thread_lock(targettd);
-+		runtime = targettd->td_runtime;
-+		thread_unlock(targettd);
-+	}
-+	cputick2timespec(runtime, ats);
-+}
-+
-+static void
-+get_process_cputime(struct proc *targetp, struct timespec *ats)
-+{
-+	uint64_t runtime;
-+	struct rusage ru;
-+
-+	PROC_SLOCK(targetp);
-+	rufetch(targetp, &ru);
-+	runtime = targetp->p_rux.rux_runtime;
-+	PROC_SUNLOCK(targetp);
-+	cputick2timespec(runtime, ats);
-+}
-+
-+static int
-+get_cputime(struct thread *td, clockid_t clock_id, struct timespec *ats)
-+{
-+	struct proc *p, *p2;
-+	struct thread *td2;
-+	lwpid_t tid;
-+	pid_t pid;
-+	int error;
-+
-+	p = td->td_proc;
-+	if ((clock_id & CPUCLOCK_PROCESS_BIT) == 0) {
-+		tid = clock_id & CPUCLOCK_ID_MASK;
-+		td2 = tdfind(tid, p->p_pid);
-+		if (td2 == NULL)
-+			return (EINVAL);
-+		get_thread_cputime(td2, ats);
-+		PROC_UNLOCK(td2->td_proc);
-+	} else {
-+		pid = clock_id & CPUCLOCK_ID_MASK;
-+		error = pget(pid, PGET_CANSEE, &p2);
-+		if (error != 0)
-+			return (EINVAL);
-+		get_process_cputime(p2, ats);
-+		PROC_UNLOCK(p2);
-+	}
-+	return (0);
-+}
-+
- int
- kern_clock_gettime(struct thread *td, clockid_t clock_id, struct timespec *ats)
- {
- 	struct timeval sys, user;
- 	struct proc *p;
--	uint64_t runtime, curtime, switchtime;
- 
- 	p = td->td_proc;
- 	switch (clock_id) {
-@@ -232,17 +352,17 @@
- 		ats->tv_nsec = 0;
- 		break;
- 	case CLOCK_THREAD_CPUTIME_ID:
--		critical_enter();
--		switchtime = PCPU_GET(switchtime);
--		curtime = cpu_ticks();
--		runtime = td->td_runtime;
--		critical_exit();
--		runtime = cputick2usec(runtime + curtime - switchtime);
--		ats->tv_sec = runtime / 1000000;
--		ats->tv_nsec = runtime % 1000000 * 1000;
-+		get_thread_cputime(NULL, ats);
-+		break;
-+	case CLOCK_PROCESS_CPUTIME_ID:
-+		PROC_LOCK(p);
-+		get_process_cputime(p, ats);
-+		PROC_UNLOCK(p);
- 		break;
- 	default:
--		return (EINVAL);
-+		if ((int)clock_id >= 0)
-+			return (EINVAL);
-+		return (get_cputime(td, clock_id, ats));
- 	}
- 	return (0);
- }
-@@ -336,12 +456,16 @@
- 		ts->tv_nsec = 0;
- 		break;
- 	case CLOCK_THREAD_CPUTIME_ID:
-+	case CLOCK_PROCESS_CPUTIME_ID:
-+	cputime:
- 		/* sync with cputick2usec */
- 		ts->tv_nsec = 1000000 / cpu_tickrate();
- 		if (ts->tv_nsec == 0)
- 			ts->tv_nsec = 1000;
- 		break;
- 	default:
-+		if ((int)clock_id < 0)
-+			goto cputime;
- 		return (EINVAL);
- 	}
- 	return (0);
---- a/sys/kern/init_sysent.c
-+++ b/sys/kern/init_sysent.c
-@@ -281,7 +281,7 @@
- 	{ 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0, SY_THR_ABSENT },			/* 244 = nosys */
- 	{ 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0, SY_THR_ABSENT },			/* 245 = nosys */
- 	{ 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0, SY_THR_ABSENT },			/* 246 = nosys */
--	{ 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0, SY_THR_ABSENT },			/* 247 = nosys */
-+	{ AS(clock_getcpuclockid2_args), (sy_call_t *)sys_clock_getcpuclockid2, AUE_NULL, NULL, 0, 0, 0, SY_THR_STATIC },	/* 247 = clock_getcpuclockid2 */
- 	{ AS(ntp_gettime_args), (sy_call_t *)sys_ntp_gettime, AUE_NULL, NULL, 0, 0, SYF_CAPENABLED, SY_THR_STATIC },	/* 248 = ntp_gettime */
- 	{ 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0, SY_THR_ABSENT },			/* 249 = nosys */
- 	{ AS(minherit_args), (sy_call_t *)sys_minherit, AUE_MINHERIT, NULL, 0, 0, SYF_CAPENABLED, SY_THR_STATIC },	/* 250 = minherit */
---- a/sys/kern/syscalls.master
-+++ b/sys/kern/syscalls.master
-@@ -462,7 +462,8 @@
- 244	AUE_NULL	UNIMPL	nosys
- 245	AUE_NULL	UNIMPL	nosys
- 246	AUE_NULL	UNIMPL	nosys
--247	AUE_NULL	UNIMPL	nosys
-+247	AUE_NULL	STD	{ int clock_getcpuclockid2(id_t id,\
-+				    int which, clockid_t *clock_id); }
- 248	AUE_NULL	STD	{ int ntp_gettime(struct ntptimeval *ntvp); }
- 249	AUE_NULL	UNIMPL	nosys
- ; syscall numbers initially used in OpenBSD
---- a/sys/kern/systrace_args.c
-+++ b/sys/kern/systrace_args.c
-@@ -1337,6 +1337,15 @@
- 		*n_args = 2;
- 		break;
- 	}
-+	/* clock_getcpuclockid2 */
-+	case 247: {
-+		struct clock_getcpuclockid2_args *p = params;
-+		iarg[0] = p->id; /* id_t */
-+		iarg[1] = p->which; /* int */
-+		uarg[2] = (intptr_t) p->clock_id; /* clockid_t * */
-+		*n_args = 3;
-+		break;
-+	}
- 	/* ntp_gettime */
- 	case 248: {
- 		struct ntp_gettime_args *p = params;
-@@ -5379,6 +5388,22 @@
- 			break;
- 		default:
- 			break;
-+		};
-+		break;
-+	/* clock_getcpuclockid2 */
-+	case 247:
-+		switch(ndx) {
-+		case 0:
-+			p = "id_t";
-+			break;
-+		case 1:
-+			p = "int";
-+			break;
-+		case 2:
-+			p = "clockid_t *";
-+			break;
-+		default:
-+			break;
- 		};
- 		break;
- 	/* ntp_gettime */

Deleted: trunk/kfreebsd-9/debian/patches/000_zombie.diff
===================================================================
--- trunk/kfreebsd-9/debian/patches/000_zombie.diff	2013-07-19 19:48:46 UTC (rev 4771)
+++ trunk/kfreebsd-9/debian/patches/000_zombie.diff	2013-07-19 19:50:48 UTC (rev 4772)
@@ -1,199 +0,0 @@
-apply patch from STABLE-9 branch
-enhances clock_getcpuclockid2 patch
-
-------------------------------------------------------------------------
-r243962 | kib | 2012-12-07 02:13:07 +0100 (Fri, 07 Dec 2012) | 11 lines
-
-MFC r243142:
-In pget(9), if PGET_NOTWEXIT flag is not specified, also search the
-zombie list for the pid. This allows several kern.proc sysctls to
-report useful information for zombies.
-
-Hold the allproc_lock around all searches instead of relocking it.
-Remove private pfind_locked() from the new nfs client code.
-
-MFC r243528 (by pjd):
-Look for zombie process only if we were given process id.
-
---- a/sys/fs/nfsclient/nfs_clport.c
-+++ b/sys/fs/nfsclient/nfs_clport.c
-@@ -1150,31 +1150,6 @@
- }
- 
- /*
-- * Locate a process by number; return only "live" processes -- i.e., neither
-- * zombies nor newly born but incompletely initialized processes.  By not
-- * returning processes in the PRS_NEW state, we allow callers to avoid
-- * testing for that condition to avoid dereferencing p_ucred, et al.
-- * Identical to pfind() in kern_proc.c, except it assume the list is
-- * already locked.
-- */
--static struct proc *
--pfind_locked(pid_t pid)
--{
--	struct proc *p;
--
--	LIST_FOREACH(p, PIDHASH(pid), p_hash)
--		if (p->p_pid == pid) {
--			PROC_LOCK(p);
--			if (p->p_state == PRS_NEW) {
--				PROC_UNLOCK(p);
--				p = NULL;
--			}
--			break;
--		}
--	return (p);
--}
--
--/*
-  * Check to see if the process for this owner exists. Return 1 if it doesn't
-  * and 0 otherwise.
-  */
---- a/sys/sys/proc.h
-+++ b/sys/sys/proc.h
-@@ -829,6 +829,7 @@
- extern struct uma_zone *proc_zone;
- 
- struct	proc *pfind(pid_t);		/* Find process by id. */
-+struct	proc *pfind_locked(pid_t pid);
- struct	pgrp *pgfind(pid_t);		/* Find process group by id. */
- struct	proc *zpfind(pid_t);		/* Find zombie process by id. */
- 
---- a/sys/kern/kern_proc.c
-+++ b/sys/kern/kern_proc.c
-@@ -136,6 +136,7 @@
- static int proc_init(void *mem, int size, int flags);
- static void proc_fini(void *mem, int size);
- static void pargs_free(struct pargs *pa);
-+static struct proc *zpfind_locked(pid_t pid);
- 
- /*
-  * Other process lists
-@@ -283,20 +284,13 @@
- 	return (1);
- }
- 
--/*
-- * Locate a process by number; return only "live" processes -- i.e., neither
-- * zombies nor newly born but incompletely initialized processes.  By not
-- * returning processes in the PRS_NEW state, we allow callers to avoid
-- * testing for that condition to avoid dereferencing p_ucred, et al.
-- */
- struct proc *
--pfind(pid)
--	register pid_t pid;
-+pfind_locked(pid_t pid)
- {
--	register struct proc *p;
-+	struct proc *p;
- 
--	sx_slock(&allproc_lock);
--	LIST_FOREACH(p, PIDHASH(pid), p_hash)
-+	sx_assert(&allproc_lock, SX_LOCKED);
-+	LIST_FOREACH(p, PIDHASH(pid), p_hash) {
- 		if (p->p_pid == pid) {
- 			PROC_LOCK(p);
- 			if (p->p_state == PRS_NEW) {
-@@ -305,17 +299,34 @@
- 			}
- 			break;
- 		}
-+	}
-+	return (p);
-+}
-+
-+/*
-+ * Locate a process by number; return only "live" processes -- i.e., neither
-+ * zombies nor newly born but incompletely initialized processes.  By not
-+ * returning processes in the PRS_NEW state, we allow callers to avoid
-+ * testing for that condition to avoid dereferencing p_ucred, et al.
-+ */
-+struct proc *
-+pfind(pid_t pid)
-+{
-+	struct proc *p;
-+
-+	sx_slock(&allproc_lock);
-+	p = pfind_locked(pid);
- 	sx_sunlock(&allproc_lock);
- 	return (p);
- }
- 
- static struct proc *
--pfind_tid(pid_t tid)
-+pfind_tid_locked(pid_t tid)
- {
- 	struct proc *p;
- 	struct thread *td;
- 
--	sx_slock(&allproc_lock);
-+	sx_assert(&allproc_lock, SX_LOCKED);
- 	FOREACH_PROC_IN_SYSTEM(p) {
- 		PROC_LOCK(p);
- 		if (p->p_state == PRS_NEW) {
-@@ -329,7 +340,6 @@
- 		PROC_UNLOCK(p);
- 	}
- found:
--	sx_sunlock(&allproc_lock);
- 	return (p);
- }
- 
-@@ -363,12 +373,17 @@
- 	struct proc *p;
- 	int error;
- 
--	if (pid <= PID_MAX)
--		p = pfind(pid);
--	else if ((flags & PGET_NOTID) == 0)
--		p = pfind_tid(pid);
--	else
-+	sx_slock(&allproc_lock);
-+	if (pid <= PID_MAX) {
-+		p = pfind_locked(pid);
-+		if (p == NULL && (flags & PGET_NOTWEXIT) == 0)
-+			p = zpfind_locked(pid);
-+	} else if ((flags & PGET_NOTID) == 0) {
-+		p = pfind_tid_locked(pid);
-+	} else {
- 		p = NULL;
-+	}
-+	sx_sunlock(&allproc_lock);
- 	if (p == NULL)
- 		return (ESRCH);
- 	if ((flags & PGET_CANSEE) != 0) {
-@@ -1049,6 +1064,21 @@
- 	free(ps, M_SUBPROC);
- }
- 
-+static struct proc *
-+zpfind_locked(pid_t pid)
-+{
-+	struct proc *p;
-+
-+	sx_assert(&allproc_lock, SX_LOCKED);
-+	LIST_FOREACH(p, &zombproc, p_list) {
-+		if (p->p_pid == pid) {
-+			PROC_LOCK(p);
-+			break;
-+		}
-+	}
-+	return (p);
-+}
-+
- /*
-  * Locate a zombie process by number
-  */
-@@ -1058,11 +1088,7 @@
- 	struct proc *p;
- 
- 	sx_slock(&allproc_lock);
--	LIST_FOREACH(p, &zombproc, p_list)
--		if (p->p_pid == pid) {
--			PROC_LOCK(p);
--			break;
--		}
-+	p = zpfind_locked(pid);
- 	sx_sunlock(&allproc_lock);
- 	return (p);
- }




More information about the Glibc-bsd-commits mailing list