Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
cpython
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
cpython
Commits
fa268032
Commit
fa268032
authored
Jun 13, 2008
by
Benjamin Peterson
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fix multiprocessing line endings in py3k
parent
53a5b0d3
Changes
4
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
887 additions
and
887 deletions
+887
-887
Modules/_multiprocessing/multiprocessing.c
Modules/_multiprocessing/multiprocessing.c
+328
-328
Modules/_multiprocessing/multiprocessing.h
Modules/_multiprocessing/multiprocessing.h
+163
-163
Modules/_multiprocessing/pipe_connection.c
Modules/_multiprocessing/pipe_connection.c
+136
-136
Modules/_multiprocessing/win32_functions.c
Modules/_multiprocessing/win32_functions.c
+260
-260
No files found.
Modules/_multiprocessing/multiprocessing.c
View file @
fa268032
This diff is collapsed.
Click to expand it.
Modules/_multiprocessing/multiprocessing.h
View file @
fa268032
#ifndef MULTIPROCESSING_H
#define MULTIPROCESSING_H
#define PY_SSIZE_T_CLEAN
#include "Python.h"
#include "structmember.h"
#include "pythread.h"
/*
* Platform includes and definitions
*/
#ifdef MS_WINDOWS
# define WIN32_LEAN_AND_MEAN
# include <windows.h>
# include <winsock2.h>
# include <process.h>
/* getpid() */
# define SEM_HANDLE HANDLE
# define SEM_VALUE_MAX LONG_MAX
#else
# include <fcntl.h>
/* O_CREAT and O_EXCL */
# include <sys/socket.h>
# include <arpa/inet.h>
/* htonl() and ntohl() */
# if HAVE_SEM_OPEN
# include <semaphore.h>
typedef
sem_t
*
SEM_HANDLE
;
# endif
# define HANDLE int
# define SOCKET int
# define BOOL int
# define UINT32 uint32_t
# define INT32 int32_t
# define TRUE 1
# define FALSE 0
# define INVALID_HANDLE_VALUE (-1)
#endif
/*
* Make sure Py_ssize_t available
*/
#if PY_VERSION_HEX < 0x02050000 && !defined(PY_SSIZE_T_MIN)
typedef
int
Py_ssize_t
;
# define PY_SSIZE_T_MAX INT_MAX
# define PY_SSIZE_T_MIN INT_MIN
# define F_PY_SSIZE_T "i"
# define PY_FORMAT_SIZE_T ""
# define PyInt_FromSsize_t(n) PyInt_FromLong((long)n)
#else
# define F_PY_SSIZE_T "n"
#endif
/*
* Format codes
*/
#if SIZEOF_VOID_P == SIZEOF_LONG
# define F_POINTER "k"
# define T_POINTER T_ULONG
#elif defined(HAVE_LONG_LONG) && (SIZEOF_VOID_P == SIZEOF_LONG_LONG)
# define F_POINTER "K"
# define T_POINTER T_ULONGLONG
#else
# error "can't find format code for unsigned integer of same size as void*"
#endif
#ifdef MS_WINDOWS
# define F_HANDLE F_POINTER
# define T_HANDLE T_POINTER
# define F_SEM_HANDLE F_HANDLE
# define T_SEM_HANDLE T_HANDLE
# define F_DWORD "k"
# define T_DWORD T_ULONG
#else
# define F_HANDLE "i"
# define T_HANDLE T_INT
# define F_SEM_HANDLE F_POINTER
# define T_SEM_HANDLE T_POINTER
#endif
#if PY_VERSION_HEX >= 0x03000000
# define F_RBUFFER "y"
#else
# define F_RBUFFER "s"
#endif
/*
* Error codes which can be returned by functions called without GIL
*/
#define MP_SUCCESS (0)
#define MP_STANDARD_ERROR (-1)
#define MP_MEMORY_ERROR (-1001)
#define MP_END_OF_FILE (-1002)
#define MP_EARLY_END_OF_FILE (-1003)
#define MP_BAD_MESSAGE_LENGTH (-1004)
#define MP_SOCKET_ERROR (-1005)
#define MP_EXCEPTION_HAS_BEEN_SET (-1006)
PyObject
*
mp_SetError
(
PyObject
*
Type
,
int
num
);
/*
* Externs - not all will really exist on all platforms
*/
extern
PyObject
*
pickle_dumps
;
extern
PyObject
*
pickle_loads
;
extern
PyObject
*
pickle_protocol
;
extern
PyObject
*
BufferTooShort
;
extern
PyTypeObject
SemLockType
;
extern
PyTypeObject
ConnectionType
;
extern
PyTypeObject
PipeConnectionType
;
extern
HANDLE
sigint_event
;
/*
* Py3k compatibility
*/
#if PY_VERSION_HEX >= 0x03000000
# define PICKLE_MODULE "pickle"
# define FROM_FORMAT PyUnicode_FromFormat
# define PyInt_FromLong PyLong_FromLong
# define PyInt_FromSsize_t PyLong_FromSsize_t
#else
# define PICKLE_MODULE "cPickle"
# define FROM_FORMAT PyString_FromFormat
#endif
#ifndef PyVarObject_HEAD_INIT
# define PyVarObject_HEAD_INIT(type, size) PyObject_HEAD_INIT(type) size,
#endif
#ifndef Py_TPFLAGS_HAVE_WEAKREFS
# define Py_TPFLAGS_HAVE_WEAKREFS 0
#endif
/*
* Connection definition
*/
#define CONNECTION_BUFFER_SIZE 1024
typedef
struct
{
PyObject_HEAD
HANDLE
handle
;
int
flags
;
PyObject
*
weakreflist
;
char
buffer
[
CONNECTION_BUFFER_SIZE
];
}
ConnectionObject
;
/*
* Miscellaneous
*/
#define MAX_MESSAGE_LENGTH 0x7fffffff
#ifndef MIN
# define MIN(x, y) ((x) < (y) ? x : y)
# define MAX(x, y) ((x) > (y) ? x : y)
#endif
#endif
/* MULTIPROCESSING_H */
#ifndef MULTIPROCESSING_H
#define MULTIPROCESSING_H
#define PY_SSIZE_T_CLEAN
#include "Python.h"
#include "structmember.h"
#include "pythread.h"
/*
* Platform includes and definitions
*/
#ifdef MS_WINDOWS
# define WIN32_LEAN_AND_MEAN
# include <windows.h>
# include <winsock2.h>
# include <process.h>
/* getpid() */
# define SEM_HANDLE HANDLE
# define SEM_VALUE_MAX LONG_MAX
#else
# include <fcntl.h>
/* O_CREAT and O_EXCL */
# include <sys/socket.h>
# include <arpa/inet.h>
/* htonl() and ntohl() */
# if HAVE_SEM_OPEN
# include <semaphore.h>
typedef
sem_t
*
SEM_HANDLE
;
# endif
# define HANDLE int
# define SOCKET int
# define BOOL int
# define UINT32 uint32_t
# define INT32 int32_t
# define TRUE 1
# define FALSE 0
# define INVALID_HANDLE_VALUE (-1)
#endif
/*
* Make sure Py_ssize_t available
*/
#if PY_VERSION_HEX < 0x02050000 && !defined(PY_SSIZE_T_MIN)
typedef
int
Py_ssize_t
;
# define PY_SSIZE_T_MAX INT_MAX
# define PY_SSIZE_T_MIN INT_MIN
# define F_PY_SSIZE_T "i"
# define PY_FORMAT_SIZE_T ""
# define PyInt_FromSsize_t(n) PyInt_FromLong((long)n)
#else
# define F_PY_SSIZE_T "n"
#endif
/*
* Format codes
*/
#if SIZEOF_VOID_P == SIZEOF_LONG
# define F_POINTER "k"
# define T_POINTER T_ULONG
#elif defined(HAVE_LONG_LONG) && (SIZEOF_VOID_P == SIZEOF_LONG_LONG)
# define F_POINTER "K"
# define T_POINTER T_ULONGLONG
#else
# error "can't find format code for unsigned integer of same size as void*"
#endif
#ifdef MS_WINDOWS
# define F_HANDLE F_POINTER
# define T_HANDLE T_POINTER
# define F_SEM_HANDLE F_HANDLE
# define T_SEM_HANDLE T_HANDLE
# define F_DWORD "k"
# define T_DWORD T_ULONG
#else
# define F_HANDLE "i"
# define T_HANDLE T_INT
# define F_SEM_HANDLE F_POINTER
# define T_SEM_HANDLE T_POINTER
#endif
#if PY_VERSION_HEX >= 0x03000000
# define F_RBUFFER "y"
#else
# define F_RBUFFER "s"
#endif
/*
* Error codes which can be returned by functions called without GIL
*/
#define MP_SUCCESS (0)
#define MP_STANDARD_ERROR (-1)
#define MP_MEMORY_ERROR (-1001)
#define MP_END_OF_FILE (-1002)
#define MP_EARLY_END_OF_FILE (-1003)
#define MP_BAD_MESSAGE_LENGTH (-1004)
#define MP_SOCKET_ERROR (-1005)
#define MP_EXCEPTION_HAS_BEEN_SET (-1006)
PyObject
*
mp_SetError
(
PyObject
*
Type
,
int
num
);
/*
* Externs - not all will really exist on all platforms
*/
extern
PyObject
*
pickle_dumps
;
extern
PyObject
*
pickle_loads
;
extern
PyObject
*
pickle_protocol
;
extern
PyObject
*
BufferTooShort
;
extern
PyTypeObject
SemLockType
;
extern
PyTypeObject
ConnectionType
;
extern
PyTypeObject
PipeConnectionType
;
extern
HANDLE
sigint_event
;
/*
* Py3k compatibility
*/
#if PY_VERSION_HEX >= 0x03000000
# define PICKLE_MODULE "pickle"
# define FROM_FORMAT PyUnicode_FromFormat
# define PyInt_FromLong PyLong_FromLong
# define PyInt_FromSsize_t PyLong_FromSsize_t
#else
# define PICKLE_MODULE "cPickle"
# define FROM_FORMAT PyString_FromFormat
#endif
#ifndef PyVarObject_HEAD_INIT
# define PyVarObject_HEAD_INIT(type, size) PyObject_HEAD_INIT(type) size,
#endif
#ifndef Py_TPFLAGS_HAVE_WEAKREFS
# define Py_TPFLAGS_HAVE_WEAKREFS 0
#endif
/*
* Connection definition
*/
#define CONNECTION_BUFFER_SIZE 1024
typedef
struct
{
PyObject_HEAD
HANDLE
handle
;
int
flags
;
PyObject
*
weakreflist
;
char
buffer
[
CONNECTION_BUFFER_SIZE
];
}
ConnectionObject
;
/*
* Miscellaneous
*/
#define MAX_MESSAGE_LENGTH 0x7fffffff
#ifndef MIN
# define MIN(x, y) ((x) < (y) ? x : y)
# define MAX(x, y) ((x) > (y) ? x : y)
#endif
#endif
/* MULTIPROCESSING_H */
Modules/_multiprocessing/pipe_connection.c
View file @
fa268032
/*
* A type which wraps a pipe handle in message oriented mode
*
* pipe_connection.c
*
* Copyright (c) 2006-2008, R Oudkerk --- see COPYING.txt
*/
#include "multiprocessing.h"
#define CLOSE(h) CloseHandle(h)
/*
* Send string to the pipe; assumes in message oriented mode
*/
static
Py_ssize_t
conn_send_string
(
ConnectionObject
*
conn
,
char
*
string
,
size_t
length
)
{
DWORD
amount_written
;
return
WriteFile
(
conn
->
handle
,
string
,
length
,
&
amount_written
,
NULL
)
?
MP_SUCCESS
:
MP_STANDARD_ERROR
;
}
/*
* Attempts to read into buffer, or if buffer too small into *newbuffer.
*
* Returns number of bytes read. Assumes in message oriented mode.
*/
static
Py_ssize_t
conn_recv_string
(
ConnectionObject
*
conn
,
char
*
buffer
,
size_t
buflength
,
char
**
newbuffer
,
size_t
maxlength
)
{
DWORD
left
,
length
,
full_length
,
err
;
*
newbuffer
=
NULL
;
if
(
ReadFile
(
conn
->
handle
,
buffer
,
MIN
(
buflength
,
maxlength
),
&
length
,
NULL
))
return
length
;
err
=
GetLastError
();
if
(
err
!=
ERROR_MORE_DATA
)
{
if
(
err
==
ERROR_BROKEN_PIPE
)
return
MP_END_OF_FILE
;
return
MP_STANDARD_ERROR
;
}
if
(
!
PeekNamedPipe
(
conn
->
handle
,
NULL
,
0
,
NULL
,
NULL
,
&
left
))
return
MP_STANDARD_ERROR
;
full_length
=
length
+
left
;
if
(
full_length
>
maxlength
)
return
MP_BAD_MESSAGE_LENGTH
;
*
newbuffer
=
PyMem_Malloc
(
full_length
);
if
(
*
newbuffer
==
NULL
)
return
MP_MEMORY_ERROR
;
memcpy
(
*
newbuffer
,
buffer
,
length
);
if
(
ReadFile
(
conn
->
handle
,
*
newbuffer
+
length
,
left
,
&
length
,
NULL
))
{
assert
(
length
==
left
);
return
full_length
;
}
else
{
PyMem_Free
(
*
newbuffer
);
return
MP_STANDARD_ERROR
;
}
}
/*
* Check whether any data is available for reading
*/
#define conn_poll(conn, timeout) conn_poll_save(conn, timeout, _save)
static
int
conn_poll_save
(
ConnectionObject
*
conn
,
double
timeout
,
PyThreadState
*
_save
)
{
DWORD
bytes
,
deadline
,
delay
;
int
difference
,
res
;
BOOL
block
=
FALSE
;
if
(
!
PeekNamedPipe
(
conn
->
handle
,
NULL
,
0
,
NULL
,
&
bytes
,
NULL
))
return
MP_STANDARD_ERROR
;
if
(
timeout
==
0
.
0
)
return
bytes
>
0
;
if
(
timeout
<
0
.
0
)
block
=
TRUE
;
else
/* XXX does not check for overflow */
deadline
=
GetTickCount
()
+
(
DWORD
)(
1000
*
timeout
+
0
.
5
);
Sleep
(
0
);
for
(
delay
=
1
;
;
delay
+=
1
)
{
if
(
!
PeekNamedPipe
(
conn
->
handle
,
NULL
,
0
,
NULL
,
&
bytes
,
NULL
))
return
MP_STANDARD_ERROR
;
else
if
(
bytes
>
0
)
return
TRUE
;
if
(
!
block
)
{
difference
=
deadline
-
GetTickCount
();
if
(
difference
<
0
)
return
FALSE
;
if
((
int
)
delay
>
difference
)
delay
=
difference
;
}
if
(
delay
>
20
)
delay
=
20
;
Sleep
(
delay
);
/* check for signals */
Py_BLOCK_THREADS
res
=
PyErr_CheckSignals
();
Py_UNBLOCK_THREADS
if
(
res
)
return
MP_EXCEPTION_HAS_BEEN_SET
;
}
}
/*
* "connection.h" defines the PipeConnection type using the definitions above
*/
#define CONNECTION_NAME "PipeConnection"
#define CONNECTION_TYPE PipeConnectionType
#include "connection.h"
/*
* A type which wraps a pipe handle in message oriented mode
*
* pipe_connection.c
*
* Copyright (c) 2006-2008, R Oudkerk --- see COPYING.txt
*/
#include "multiprocessing.h"
#define CLOSE(h) CloseHandle(h)
/*
* Send string to the pipe; assumes in message oriented mode
*/
static
Py_ssize_t
conn_send_string
(
ConnectionObject
*
conn
,
char
*
string
,
size_t
length
)
{
DWORD
amount_written
;
return
WriteFile
(
conn
->
handle
,
string
,
length
,
&
amount_written
,
NULL
)
?
MP_SUCCESS
:
MP_STANDARD_ERROR
;
}
/*
* Attempts to read into buffer, or if buffer too small into *newbuffer.
*
* Returns number of bytes read. Assumes in message oriented mode.
*/
static
Py_ssize_t
conn_recv_string
(
ConnectionObject
*
conn
,
char
*
buffer
,
size_t
buflength
,
char
**
newbuffer
,
size_t
maxlength
)
{
DWORD
left
,
length
,
full_length
,
err
;
*
newbuffer
=
NULL
;
if
(
ReadFile
(
conn
->
handle
,
buffer
,
MIN
(
buflength
,
maxlength
),
&
length
,
NULL
))
return
length
;
err
=
GetLastError
();
if
(
err
!=
ERROR_MORE_DATA
)
{
if
(
err
==
ERROR_BROKEN_PIPE
)
return
MP_END_OF_FILE
;
return
MP_STANDARD_ERROR
;
}
if
(
!
PeekNamedPipe
(
conn
->
handle
,
NULL
,
0
,
NULL
,
NULL
,
&
left
))
return
MP_STANDARD_ERROR
;
full_length
=
length
+
left
;
if
(
full_length
>
maxlength
)
return
MP_BAD_MESSAGE_LENGTH
;
*
newbuffer
=
PyMem_Malloc
(
full_length
);
if
(
*
newbuffer
==
NULL
)
return
MP_MEMORY_ERROR
;
memcpy
(
*
newbuffer
,
buffer
,
length
);
if
(
ReadFile
(
conn
->
handle
,
*
newbuffer
+
length
,
left
,
&
length
,
NULL
))
{
assert
(
length
==
left
);
return
full_length
;
}
else
{
PyMem_Free
(
*
newbuffer
);
return
MP_STANDARD_ERROR
;
}
}
/*
* Check whether any data is available for reading
*/
#define conn_poll(conn, timeout) conn_poll_save(conn, timeout, _save)
static
int
conn_poll_save
(
ConnectionObject
*
conn
,
double
timeout
,
PyThreadState
*
_save
)
{
DWORD
bytes
,
deadline
,
delay
;
int
difference
,
res
;
BOOL
block
=
FALSE
;
if
(
!
PeekNamedPipe
(
conn
->
handle
,
NULL
,
0
,
NULL
,
&
bytes
,
NULL
))
return
MP_STANDARD_ERROR
;
if
(
timeout
==
0
.
0
)
return
bytes
>
0
;
if
(
timeout
<
0
.
0
)
block
=
TRUE
;
else
/* XXX does not check for overflow */
deadline
=
GetTickCount
()
+
(
DWORD
)(
1000
*
timeout
+
0
.
5
);
Sleep
(
0
);
for
(
delay
=
1
;
;
delay
+=
1
)
{
if
(
!
PeekNamedPipe
(
conn
->
handle
,
NULL
,
0
,
NULL
,
&
bytes
,
NULL
))
return
MP_STANDARD_ERROR
;
else
if
(
bytes
>
0
)
return
TRUE
;
if
(
!
block
)
{
difference
=
deadline
-
GetTickCount
();
if
(
difference
<
0
)
return
FALSE
;
if
((
int
)
delay
>
difference
)
delay
=
difference
;
}
if
(
delay
>
20
)
delay
=
20
;
Sleep
(
delay
);
/* check for signals */
Py_BLOCK_THREADS
res
=
PyErr_CheckSignals
();
Py_UNBLOCK_THREADS
if
(
res
)
return
MP_EXCEPTION_HAS_BEEN_SET
;
}
}
/*
* "connection.h" defines the PipeConnection type using the definitions above
*/
#define CONNECTION_NAME "PipeConnection"
#define CONNECTION_TYPE PipeConnectionType
#include "connection.h"
Modules/_multiprocessing/win32_functions.c
View file @
fa268032
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment