[Python-checkins] r72854 - in python/branches/py3k: Misc/NEWS Modules/posixmodule.c

antoine.pitrou python-checkins at python.org
Sat May 23 18:02:33 CEST 2009


Author: antoine.pitrou
Date: Sat May 23 18:02:33 2009
New Revision: 72854

Log:
Merged revisions 72852 via svnmerge from 
svn+ssh://pythondev@svn.python.org/python/trunk

........
  r72852 | antoine.pitrou | 2009-05-23 17:37:45 +0200 (sam., 23 mai 2009) | 5 lines
  
  Issue #1983: Fix functions taking or returning a process identifier to use
  the dedicated C type `pid_t` instead of a C `int`. Some platforms have
  a process identifier type wider than the standard C integer type.
........


Modified:
   python/branches/py3k/   (props changed)
   python/branches/py3k/Misc/NEWS
   python/branches/py3k/Modules/posixmodule.c

Modified: python/branches/py3k/Misc/NEWS
==============================================================================
--- python/branches/py3k/Misc/NEWS	(original)
+++ python/branches/py3k/Misc/NEWS	Sat May 23 18:02:33 2009
@@ -32,6 +32,10 @@
 Library
 -------
 
+- Issue #1983: Fix functions taking or returning a process identifier to use
+  the dedicated C type ``pid_t`` instead of a C ``int``. Some platforms have
+  a process identifier type wider than the standard C integer type.
+
 - Issue #4066: smtplib.SMTP_SSL._get_socket now correctly returns the socket.
   Patch by Farhan Ahmad, test by Marcin Bachry.
 

Modified: python/branches/py3k/Modules/posixmodule.c
==============================================================================
--- python/branches/py3k/Modules/posixmodule.c	(original)
+++ python/branches/py3k/Modules/posixmodule.c	Sat May 23 18:02:33 2009
@@ -303,6 +303,25 @@
 #define WAIT_STATUS_INT(s) (s)
 #endif /* UNION_WAIT */
 
+/* Issue #1983: pid_t can be longer than a C long on some systems */
+#ifdef SIZEOF_PID_T
+#if SIZEOF_PID_T == SIZEOF_INT
+#define PARSE_PID "i"
+#define PyLong_FromPid PyLong_FromLong
+#define PyLong_AsPid PyLong_AsLong
+#elif SIZEOF_PID_T == SIZEOF_LONG
+#define PARSE_PID "l"
+#define PyLong_FromPid PyLong_FromLong
+#define PyLong_AsPid PyLong_AsLong
+#elif defined(SIZEOF_LONG_LONG) && SIZEOF_PID_T == SIZEOF_LONG_LONG
+#define PARSE_PID "L"
+#define PyLong_FromPid PyLong_FromLongLong
+#define PyLong_AsPid PyLong_AsLongLong
+#else
+#error "sizeof(pid_t) is neither sizeof(int), sizeof(long) or sizeof(long long)"
+#endif
+#endif /* SIZEOF_PID_T */
+
 /* Don't use the "_r" form if we don't need it (also, won't have a
    prototype for it, at least on Solaris -- maybe others as well?). */
 #if defined(HAVE_CTERMID_R) && defined(WITH_THREAD)
@@ -3820,7 +3839,7 @@
 		return posix_error();
 	if (pid == 0)
 		PyOS_AfterFork();
-	return PyLong_FromLong(pid);
+	return PyLong_FromPid(pid);
 }
 #endif
 
@@ -3839,7 +3858,7 @@
 		return posix_error();
 	if (pid == 0)
 		PyOS_AfterFork();
-	return PyLong_FromLong(pid);
+	return PyLong_FromPid(pid);
 }
 #endif
 
@@ -3949,7 +3968,7 @@
 		return posix_error();
 	if (pid == 0)
 		PyOS_AfterFork();
-	return Py_BuildValue("(li)", pid, master_fd);
+	return Py_BuildValue("(Ni)", PyLong_FromPid(pid), master_fd);
 }
 #endif
 
@@ -4166,7 +4185,7 @@
 {
 	pid_t pid;
 	int sig;
-	if (!PyArg_ParseTuple(args, "ii:kill", &pid, &sig))
+	if (!PyArg_ParseTuple(args, PARSE_PID "i:kill", &pid, &sig))
 		return NULL;
 #if defined(PYOS_OS2) && !defined(PYCC_GCC)
     if (sig == XCPT_SIGNAL_INTR || sig == XCPT_SIGNAL_BREAK) {
@@ -4231,9 +4250,6 @@
 }
 #endif
 
-
-
-
 #ifdef HAVE_SETUID
 PyDoc_STRVAR(posix_setuid__doc__,
 "setuid(uid)\n\n\
@@ -4502,7 +4518,7 @@
 		return NULL;
 	}
 
-	return Py_BuildValue("iiN", pid, status, result);
+	return Py_BuildValue("NiN", PyLong_FromPid(pid), status, result);
 }
 #endif /* HAVE_WAIT3 || HAVE_WAIT4 */
 
@@ -4545,7 +4561,7 @@
 	WAIT_TYPE status;
 	WAIT_STATUS_INT(status) = 0;
 
-	if (!PyArg_ParseTuple(args, "ii:wait4", &pid, &options))
+	if (!PyArg_ParseTuple(args, PARSE_PID "i:wait4", &pid, &options))
 		return NULL;
 
 	Py_BEGIN_ALLOW_THREADS
@@ -4569,7 +4585,7 @@
 	WAIT_TYPE status;
 	WAIT_STATUS_INT(status) = 0;
 
-	if (!PyArg_ParseTuple(args, "ii:waitpid", &pid, &options))
+	if (!PyArg_ParseTuple(args, PARSE_PID "i:waitpid", &pid, &options))
 		return NULL;
 	Py_BEGIN_ALLOW_THREADS
 	pid = waitpid(pid, &status, options);
@@ -4577,7 +4593,7 @@
 	if (pid == -1)
 		return posix_error();
 
-	return Py_BuildValue("ii", pid, WAIT_STATUS_INT(status));
+	return Py_BuildValue("Ni", PyLong_FromPid(pid), WAIT_STATUS_INT(status));
 }
 
 #elif defined(HAVE_CWAIT)
@@ -4593,7 +4609,7 @@
 	Py_intptr_t pid;
 	int status, options;
 
-	if (!PyArg_ParseTuple(args, "ii:waitpid", &pid, &options))
+	if (!PyArg_ParseTuple(args, PARSE_PID "i:waitpid", &pid, &options))
 		return NULL;
 	Py_BEGIN_ALLOW_THREADS
 	pid = _cwait(&status, pid, options);
@@ -4602,7 +4618,7 @@
 		return posix_error();
 
 	/* shift the status left a byte so this is more like the POSIX waitpid */
-	return Py_BuildValue("ii", pid, status << 8);
+	return Py_BuildValue("Ni", PyLong_FromPid(pid), status << 8);
 }
 #endif /* HAVE_WAITPID || HAVE_CWAIT */
 
@@ -4624,7 +4640,7 @@
 	if (pid == -1)
 		return posix_error();
 
-	return Py_BuildValue("ii", pid, WAIT_STATUS_INT(status));
+	return Py_BuildValue("Ni", PyLong_FromPid(pid), WAIT_STATUS_INT(status));
 }
 #endif
 
@@ -4809,7 +4825,7 @@
 {
 	pid_t pid;
 	int sid;
-	if (!PyArg_ParseTuple(args, "i:getsid", &pid))
+	if (!PyArg_ParseTuple(args, PARSE_PID ":getsid", &pid))
 		return NULL;
 	sid = getsid(pid);
 	if (sid < 0)
@@ -4844,7 +4860,7 @@
 {
 	pid_t pid;
 	int pgrp;
-	if (!PyArg_ParseTuple(args, "ii:setpgid", &pid, &pgrp))
+	if (!PyArg_ParseTuple(args, PARSE_PID "i:setpgid", &pid, &pgrp))
 		return NULL;
 	if (setpgid(pid, pgrp) < 0)
 		return posix_error();
@@ -4869,7 +4885,7 @@
 	pgid = tcgetpgrp(fd);
 	if (pgid < 0)
 		return posix_error();
-	return PyLong_FromLong((long)pgid);
+	return PyLong_FromPid(pgid);
 }
 #endif /* HAVE_TCGETPGRP */
 


More information about the Python-checkins mailing list