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
87cf2209
Commit
87cf2209
authored
May 09, 2011
by
Antoine Pitrou
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Issue #11743: Rewrite multiprocessing connection classes in pure Python.
parent
df77e3d4
Changes
15
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
15 changed files
with
490 additions
and
983 deletions
+490
-983
Lib/multiprocessing/connection.py
Lib/multiprocessing/connection.py
+300
-15
Lib/multiprocessing/forking.py
Lib/multiprocessing/forking.py
+4
-1
Lib/multiprocessing/reduction.py
Lib/multiprocessing/reduction.py
+7
-6
Lib/test/test_multiprocessing.py
Lib/test/test_multiprocessing.py
+9
-3
Misc/NEWS
Misc/NEWS
+2
-0
Modules/_multiprocessing/connection.h
Modules/_multiprocessing/connection.h
+0
-527
Modules/_multiprocessing/multiprocessing.c
Modules/_multiprocessing/multiprocessing.c
+0
-23
Modules/_multiprocessing/multiprocessing.h
Modules/_multiprocessing/multiprocessing.h
+2
-22
Modules/_multiprocessing/pipe_connection.c
Modules/_multiprocessing/pipe_connection.c
+0
-149
Modules/_multiprocessing/socket_connection.c
Modules/_multiprocessing/socket_connection.c
+0
-202
Modules/_multiprocessing/win32_functions.c
Modules/_multiprocessing/win32_functions.c
+166
-0
PC/VC6/_multiprocessing.dsp
PC/VC6/_multiprocessing.dsp
+0
-8
PC/VS8.0/_multiprocessing.vcproj
PC/VS8.0/_multiprocessing.vcproj
+0
-12
PCbuild/_multiprocessing.vcproj
PCbuild/_multiprocessing.vcproj
+0
-12
setup.py
setup.py
+0
-3
No files found.
Lib/multiprocessing/connection.py
View file @
87cf2209
This diff is collapsed.
Click to expand it.
Lib/multiprocessing/forking.py
View file @
87cf2209
...
...
@@ -183,7 +183,7 @@ else:
import
time
from
pickle
import
dump
,
load
,
HIGHEST_PROTOCOL
from
_multiprocessing
import
win32
,
Connection
,
PipeConnection
from
_multiprocessing
import
win32
from
.util
import
Finalize
def
dump
(
obj
,
file
,
protocol
=
None
):
...
...
@@ -411,6 +411,9 @@ else:
# Make (Pipe)Connection picklable
#
# Late import because of circular import
from
.connection
import
Connection
,
PipeConnection
def
reduce_connection
(
conn
):
if
not
Popen
.
thread_is_spawning
():
raise
RuntimeError
(
...
...
Lib/multiprocessing/reduction.py
View file @
87cf2209
...
...
@@ -44,7 +44,7 @@ import _multiprocessing
from
multiprocessing
import
current_process
from
multiprocessing.forking
import
Popen
,
duplicate
,
close
,
ForkingPickler
from
multiprocessing.util
import
register_after_fork
,
debug
,
sub_debug
from
multiprocessing.connection
import
Client
,
Listener
from
multiprocessing.connection
import
Client
,
Listener
,
Connection
#
...
...
@@ -159,7 +159,7 @@ def rebuild_handle(pickled_data):
return
new_handle
#
# Register `
_multiprocessing.
Connection` with `ForkingPickler`
# Register `Connection` with `ForkingPickler`
#
def
reduce_connection
(
conn
):
...
...
@@ -168,11 +168,11 @@ def reduce_connection(conn):
def
rebuild_connection
(
reduced_handle
,
readable
,
writable
):
handle
=
rebuild_handle
(
reduced_handle
)
return
_multiprocessing
.
Connection
(
return
Connection
(
handle
,
readable
=
readable
,
writable
=
writable
)
ForkingPickler
.
register
(
_multiprocessing
.
Connection
,
reduce_connection
)
ForkingPickler
.
register
(
Connection
,
reduce_connection
)
#
# Register `socket.socket` with `ForkingPickler`
...
...
@@ -201,6 +201,7 @@ ForkingPickler.register(socket.socket, reduce_socket)
#
if
sys
.
platform
==
'win32'
:
from
multiprocessing.connection
import
PipeConnection
def
reduce_pipe_connection
(
conn
):
rh
=
reduce_handle
(
conn
.
fileno
())
...
...
@@ -208,8 +209,8 @@ if sys.platform == 'win32':
def
rebuild_pipe_connection
(
reduced_handle
,
readable
,
writable
):
handle
=
rebuild_handle
(
reduced_handle
)
return
_multiprocessing
.
PipeConnection
(
return
PipeConnection
(
handle
,
readable
=
readable
,
writable
=
writable
)
ForkingPickler
.
register
(
_multiprocessing
.
PipeConnection
,
reduce_pipe_connection
)
ForkingPickler
.
register
(
PipeConnection
,
reduce_pipe_connection
)
Lib/test/test_multiprocessing.py
View file @
87cf2209
...
...
@@ -1915,9 +1915,15 @@ class TestInvalidHandle(unittest.TestCase):
@
unittest
.
skipIf
(
WIN32
,
"skipped on Windows"
)
def
test_invalid_handles
(
self
):
conn
=
_multiprocessing
.
Connection
(
44977608
)
self
.
assertRaises
(
IOError
,
conn
.
poll
)
self
.
assertRaises
(
IOError
,
_multiprocessing
.
Connection
,
-
1
)
conn
=
multiprocessing
.
connection
.
Connection
(
44977608
)
try
:
self
.
assertRaises
((
ValueError
,
IOError
),
conn
.
poll
)
finally
:
# Hack private attribute _handle to avoid printing an error
# in conn.__del__
conn
.
_handle
=
None
self
.
assertRaises
((
ValueError
,
IOError
),
multiprocessing
.
connection
.
Connection
,
-
1
)
#
# Functions used to create test cases from the base ones in this module
...
...
Misc/NEWS
View file @
87cf2209
...
...
@@ -140,6 +140,8 @@ Core and Builtins
Library
-------
- Issue #11743: Rewrite multiprocessing connection classes in pure Python.
- Issue #11164: Stop trying to use _xmlplus in the xml module.
- Issue #11888: Add log2 function to math module. Patch written by Mark
...
...
Modules/_multiprocessing/connection.h
deleted
100644 → 0
View file @
df77e3d4
This diff is collapsed.
Click to expand it.
Modules/_multiprocessing/multiprocessing.c
View file @
87cf2209
...
...
@@ -49,16 +49,6 @@ mp_SetError(PyObject *Type, int num)
case
MP_MEMORY_ERROR
:
PyErr_NoMemory
();
break
;
case
MP_END_OF_FILE
:
PyErr_SetNone
(
PyExc_EOFError
);
break
;
case
MP_EARLY_END_OF_FILE
:
PyErr_SetString
(
PyExc_IOError
,
"got end of file during message"
);
break
;
case
MP_BAD_MESSAGE_LENGTH
:
PyErr_SetString
(
PyExc_IOError
,
"bad message length"
);
break
;
case
MP_EXCEPTION_HAS_BEEN_SET
:
break
;
default:
...
...
@@ -257,12 +247,6 @@ PyInit__multiprocessing(void)
BufferTooShort
=
PyObject_GetAttrString
(
temp
,
"BufferTooShort"
);
Py_XDECREF
(
temp
);
/* Add connection type to module */
if
(
PyType_Ready
(
&
ConnectionType
)
<
0
)
return
NULL
;
Py_INCREF
(
&
ConnectionType
);
PyModule_AddObject
(
module
,
"Connection"
,
(
PyObject
*
)
&
ConnectionType
);
#if defined(MS_WINDOWS) || \
(defined(HAVE_SEM_OPEN) && !defined(POSIX_SEMAPHORES_NOT_ENABLED))
/* Add SemLock type to module */
...
...
@@ -286,13 +270,6 @@ PyInit__multiprocessing(void)
#endif
#ifdef MS_WINDOWS
/* Add PipeConnection to module */
if
(
PyType_Ready
(
&
PipeConnectionType
)
<
0
)
return
NULL
;
Py_INCREF
(
&
PipeConnectionType
);
PyModule_AddObject
(
module
,
"PipeConnection"
,
(
PyObject
*
)
&
PipeConnectionType
);
/* Initialize win32 class and add to multiprocessing */
temp
=
create_win32_namespace
();
if
(
!
temp
)
...
...
Modules/_multiprocessing/multiprocessing.h
View file @
87cf2209
...
...
@@ -118,11 +118,8 @@
#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)
#define MP_SOCKET_ERROR (-1002)
#define MP_EXCEPTION_HAS_BEEN_SET (-1003)
PyObject
*
mp_SetError
(
PyObject
*
Type
,
int
num
);
...
...
@@ -135,7 +132,6 @@ extern PyObject *pickle_loads;
extern
PyObject
*
pickle_protocol
;
extern
PyObject
*
BufferTooShort
;
extern
PyTypeObject
SemLockType
;
extern
PyTypeObject
ConnectionType
;
extern
PyTypeObject
PipeConnectionType
;
extern
HANDLE
sigint_event
;
...
...
@@ -161,26 +157,10 @@ extern HANDLE sigint_event;
# 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)
...
...
Modules/_multiprocessing/pipe_connection.c
deleted
100644 → 0
View file @
df77e3d4
/*
* 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
;
BOOL
ret
;
Py_BEGIN_ALLOW_THREADS
ret
=
WriteFile
(
conn
->
handle
,
string
,
length
,
&
amount_written
,
NULL
);
Py_END_ALLOW_THREADS
if
(
ret
==
0
&&
GetLastError
()
==
ERROR_NO_SYSTEM_RESOURCES
)
{
PyErr_Format
(
PyExc_ValueError
,
"Cannnot send %"
PY_FORMAT_SIZE_T
"d bytes over connection"
,
length
);
return
MP_STANDARD_ERROR
;
}
return
ret
?
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
;
BOOL
ret
;
*
newbuffer
=
NULL
;
Py_BEGIN_ALLOW_THREADS
ret
=
ReadFile
(
conn
->
handle
,
buffer
,
MIN
(
buflength
,
maxlength
),
&
length
,
NULL
);
Py_END_ALLOW_THREADS
if
(
ret
)
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
);
Py_BEGIN_ALLOW_THREADS
ret
=
ReadFile
(
conn
->
handle
,
*
newbuffer
+
length
,
left
,
&
length
,
NULL
);
Py_END_ALLOW_THREADS
if
(
ret
)
{
assert
(
length
==
left
);
return
full_length
;
}
else
{
PyMem_Free
(
*
newbuffer
);
return
MP_STANDARD_ERROR
;
}
}
/*
* Check whether any data is available for reading
*/
static
int
conn_poll
(
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/socket_connection.c
deleted
100644 → 0
View file @
df77e3d4
/*
* A type which wraps a socket
*
* socket_connection.c
*
* Copyright (c) 2006-2008, R Oudkerk --- see COPYING.txt
*/
#include "multiprocessing.h"
#ifdef MS_WINDOWS
# define WRITE(h, buffer, length) send((SOCKET)h, buffer, length, 0)
# define READ(h, buffer, length) recv((SOCKET)h, buffer, length, 0)
# define CLOSE(h) closesocket((SOCKET)h)
#else
# define WRITE(h, buffer, length) write(h, buffer, length)
# define READ(h, buffer, length) read(h, buffer, length)
# define CLOSE(h) close(h)
#endif
/*
* Send string to file descriptor
*/
static
Py_ssize_t
_conn_sendall
(
HANDLE
h
,
char
*
string
,
size_t
length
)
{
char
*
p
=
string
;
Py_ssize_t
res
;
while
(
length
>
0
)
{
res
=
WRITE
(
h
,
p
,
length
);
if
(
res
<
0
)
return
MP_SOCKET_ERROR
;
length
-=
res
;
p
+=
res
;
}
return
MP_SUCCESS
;
}
/*
* Receive string of exact length from file descriptor
*/
static
Py_ssize_t
_conn_recvall
(
HANDLE
h
,
char
*
buffer
,
size_t
length
)
{
size_t
remaining
=
length
;
Py_ssize_t
temp
;
char
*
p
=
buffer
;
while
(
remaining
>
0
)
{
temp
=
READ
(
h
,
p
,
remaining
);
if
(
temp
<=
0
)
{
if
(
temp
==
0
)
return
remaining
==
length
?
MP_END_OF_FILE
:
MP_EARLY_END_OF_FILE
;
else
return
temp
;
}
remaining
-=
temp
;
p
+=
temp
;
}
return
MP_SUCCESS
;
}
/*
* Send a string prepended by the string length in network byte order
*/
static
Py_ssize_t
conn_send_string
(
ConnectionObject
*
conn
,
char
*
string
,
size_t
length
)
{
Py_ssize_t
res
;
/* The "header" of the message is a 32 bit unsigned number (in
network order) which specifies the length of the "body". If
the message is shorter than about 16kb then it is quicker to
combine the "header" and the "body" of the message and send
them at once. */
if
(
length
<
(
16
*
1024
))
{
char
*
message
;
message
=
PyMem_Malloc
(
length
+
4
);
if
(
message
==
NULL
)
return
MP_MEMORY_ERROR
;
*
(
UINT32
*
)
message
=
htonl
((
UINT32
)
length
);
memcpy
(
message
+
4
,
string
,
length
);
Py_BEGIN_ALLOW_THREADS
res
=
_conn_sendall
(
conn
->
handle
,
message
,
length
+
4
);
Py_END_ALLOW_THREADS
PyMem_Free
(
message
);
}
else
{
UINT32
lenbuff
;
if
(
length
>
MAX_MESSAGE_LENGTH
)
return
MP_BAD_MESSAGE_LENGTH
;
lenbuff
=
htonl
((
UINT32
)
length
);
Py_BEGIN_ALLOW_THREADS
res
=
_conn_sendall
(
conn
->
handle
,
(
char
*
)
&
lenbuff
,
4
)
||
_conn_sendall
(
conn
->
handle
,
string
,
length
);
Py_END_ALLOW_THREADS
}
return
res
;
}
/*
* Attempts to read into buffer, or failing that into *newbuffer
*
* Returns number of bytes read.
*/
static
Py_ssize_t
conn_recv_string
(
ConnectionObject
*
conn
,
char
*
buffer
,
size_t
buflength
,
char
**
newbuffer
,
size_t
maxlength
)
{
int
res
;
UINT32
ulength
;
*
newbuffer
=
NULL
;
Py_BEGIN_ALLOW_THREADS
res
=
_conn_recvall
(
conn
->
handle
,
(
char
*
)
&
ulength
,
4
);
Py_END_ALLOW_THREADS
if
(
res
<
0
)
return
res
;
ulength
=
ntohl
(
ulength
);
if
(
ulength
>
maxlength
)
return
MP_BAD_MESSAGE_LENGTH
;
if
(
ulength
<=
buflength
)
{
Py_BEGIN_ALLOW_THREADS
res
=
_conn_recvall
(
conn
->
handle
,
buffer
,
(
size_t
)
ulength
);
Py_END_ALLOW_THREADS
return
res
<
0
?
res
:
ulength
;
}
else
{
*
newbuffer
=
PyMem_Malloc
((
size_t
)
ulength
);
if
(
*
newbuffer
==
NULL
)
return
MP_MEMORY_ERROR
;
Py_BEGIN_ALLOW_THREADS
res
=
_conn_recvall
(
conn
->
handle
,
*
newbuffer
,
(
size_t
)
ulength
);
Py_END_ALLOW_THREADS
return
res
<
0
?
(
Py_ssize_t
)
res
:
(
Py_ssize_t
)
ulength
;
}
}
/*
* Check whether any data is available for reading -- neg timeout blocks
*/
static
int
conn_poll
(
ConnectionObject
*
conn
,
double
timeout
,
PyThreadState
*
_save
)
{
int
res
;
fd_set
rfds
;
/*
* Verify the handle, issue 3321. Not required for windows.
*/
#ifndef MS_WINDOWS
if
(((
int
)
conn
->
handle
)
<
0
||
((
int
)
conn
->
handle
)
>=
FD_SETSIZE
)
{
Py_BLOCK_THREADS
PyErr_SetString
(
PyExc_IOError
,
"handle out of range in select()"
);
Py_UNBLOCK_THREADS
return
MP_EXCEPTION_HAS_BEEN_SET
;
}
#endif
FD_ZERO
(
&
rfds
);
FD_SET
((
SOCKET
)
conn
->
handle
,
&
rfds
);
if
(
timeout
<
0
.
0
)
{
res
=
select
((
int
)
conn
->
handle
+
1
,
&
rfds
,
NULL
,
NULL
,
NULL
);
}
else
{
struct
timeval
tv
;
tv
.
tv_sec
=
(
long
)
timeout
;
tv
.
tv_usec
=
(
long
)((
timeout
-
tv
.
tv_sec
)
*
1e6
+
0
.
5
);
res
=
select
((
int
)
conn
->
handle
+
1
,
&
rfds
,
NULL
,
NULL
,
&
tv
);
}
if
(
res
<
0
)
{
return
MP_SOCKET_ERROR
;
}
else
if
(
FD_ISSET
(
conn
->
handle
,
&
rfds
))
{
return
TRUE
;
}
else
{
assert
(
res
==
0
);
return
FALSE
;
}
}
/*
* "connection.h" defines the Connection type using defs above
*/
#define CONNECTION_NAME "Connection"
#define CONNECTION_TYPE ConnectionType
#include "connection.h"
Modules/_multiprocessing/win32_functions.c
View file @
87cf2209
...
...
@@ -215,6 +215,164 @@ win32_WaitNamedPipe(PyObject *self, PyObject *args)
Py_RETURN_NONE
;
}
static
PyObject
*
win32_closesocket
(
PyObject
*
self
,
PyObject
*
args
)
{
HANDLE
handle
;
int
ret
;
if
(
!
PyArg_ParseTuple
(
args
,
F_HANDLE
":closesocket"
,
&
handle
))
return
NULL
;
Py_BEGIN_ALLOW_THREADS
ret
=
closesocket
((
SOCKET
)
handle
);
Py_END_ALLOW_THREADS
if
(
ret
)
return
PyErr_SetExcFromWindowsErr
(
PyExc_IOError
,
WSAGetLastError
());
Py_RETURN_NONE
;
}
static
PyObject
*
win32_recv
(
PyObject
*
self
,
PyObject
*
args
)
{
HANDLE
handle
;
int
size
,
nread
;
PyObject
*
buf
;
if
(
!
PyArg_ParseTuple
(
args
,
F_HANDLE
"i:recv"
,
&
handle
,
&
size
))
return
NULL
;
buf
=
PyBytes_FromStringAndSize
(
NULL
,
size
);
if
(
!
buf
)
return
NULL
;
Py_BEGIN_ALLOW_THREADS
nread
=
recv
((
SOCKET
)
handle
,
PyBytes_AS_STRING
(
buf
),
size
,
0
);
Py_END_ALLOW_THREADS
if
(
nread
<
0
)
{
Py_DECREF
(
buf
);
return
PyErr_SetExcFromWindowsErr
(
PyExc_IOError
,
WSAGetLastError
());
}
_PyBytes_Resize
(
&
buf
,
nread
);
return
buf
;
}
static
PyObject
*
win32_send
(
PyObject
*
self
,
PyObject
*
args
)
{
HANDLE
handle
;
Py_buffer
buf
;
int
ret
;
if
(
!
PyArg_ParseTuple
(
args
,
F_HANDLE
"y*:send"
,
&
handle
,
&
buf
))
return
NULL
;
Py_BEGIN_ALLOW_THREADS
ret
=
send
((
SOCKET
)
handle
,
buf
.
buf
,
buf
.
len
,
0
);
Py_END_ALLOW_THREADS
PyBuffer_Release
(
&
buf
);
if
(
ret
<
0
)
return
PyErr_SetExcFromWindowsErr
(
PyExc_IOError
,
WSAGetLastError
());
return
PyLong_FromLong
(
ret
);
}
static
PyObject
*
win32_WriteFile
(
PyObject
*
self
,
PyObject
*
args
)
{
HANDLE
handle
;
Py_buffer
buf
;
int
written
;
BOOL
ret
;
if
(
!
PyArg_ParseTuple
(
args
,
F_HANDLE
"y*:WriteFile"
,
&
handle
,
&
buf
))
return
NULL
;
Py_BEGIN_ALLOW_THREADS
ret
=
WriteFile
(
handle
,
buf
.
buf
,
buf
.
len
,
&
written
,
NULL
);
Py_END_ALLOW_THREADS
PyBuffer_Release
(
&
buf
);
if
(
!
ret
)
return
PyErr_SetExcFromWindowsErr
(
PyExc_IOError
,
0
);
return
PyLong_FromLong
(
written
);
}
static
PyObject
*
win32_ReadFile
(
PyObject
*
self
,
PyObject
*
args
)
{
HANDLE
handle
;
int
size
;
DWORD
nread
;
PyObject
*
buf
;
BOOL
ret
;
if
(
!
PyArg_ParseTuple
(
args
,
F_HANDLE
"i:ReadFile"
,
&
handle
,
&
size
))
return
NULL
;
buf
=
PyBytes_FromStringAndSize
(
NULL
,
size
);
if
(
!
buf
)
return
NULL
;
Py_BEGIN_ALLOW_THREADS
ret
=
ReadFile
(
handle
,
PyBytes_AS_STRING
(
buf
),
size
,
&
nread
,
NULL
);
Py_END_ALLOW_THREADS
if
(
!
ret
&&
GetLastError
()
!=
ERROR_MORE_DATA
)
{
Py_DECREF
(
buf
);
return
PyErr_SetExcFromWindowsErr
(
PyExc_IOError
,
0
);
}
if
(
_PyBytes_Resize
(
&
buf
,
nread
))
return
NULL
;
return
Py_BuildValue
(
"NN"
,
buf
,
PyBool_FromLong
(
ret
));
}
static
PyObject
*
win32_PeekNamedPipe
(
PyObject
*
self
,
PyObject
*
args
)
{
HANDLE
handle
;
int
size
=
0
;
PyObject
*
buf
=
NULL
;
DWORD
nread
,
navail
,
nleft
;
BOOL
ret
;
if
(
!
PyArg_ParseTuple
(
args
,
F_HANDLE
"|i:PeekNamedPipe"
,
&
handle
,
&
size
))
return
NULL
;
if
(
size
<
0
)
{
PyErr_SetString
(
PyExc_ValueError
,
"negative size"
);
return
NULL
;
}
if
(
size
)
{
buf
=
PyBytes_FromStringAndSize
(
NULL
,
size
);
if
(
!
buf
)
return
NULL
;
Py_BEGIN_ALLOW_THREADS
ret
=
PeekNamedPipe
(
handle
,
PyBytes_AS_STRING
(
buf
),
size
,
&
nread
,
&
navail
,
&
nleft
);
Py_END_ALLOW_THREADS
if
(
!
ret
)
{
Py_DECREF
(
buf
);
return
PyErr_SetExcFromWindowsErr
(
PyExc_IOError
,
0
);
}
if
(
_PyBytes_Resize
(
&
buf
,
nread
))
return
NULL
;
return
Py_BuildValue
(
"Nii"
,
buf
,
navail
,
nleft
);
}
else
{
Py_BEGIN_ALLOW_THREADS
ret
=
PeekNamedPipe
(
handle
,
NULL
,
0
,
NULL
,
&
navail
,
&
nleft
);
Py_END_ALLOW_THREADS
if
(
!
ret
)
{
return
PyErr_SetExcFromWindowsErr
(
PyExc_IOError
,
0
);
}
return
Py_BuildValue
(
"ii"
,
navail
,
nleft
);
}
}
static
PyMethodDef
win32_methods
[]
=
{
WIN32_FUNCTION
(
CloseHandle
),
WIN32_FUNCTION
(
GetLastError
),
...
...
@@ -223,8 +381,14 @@ static PyMethodDef win32_methods[] = {
WIN32_FUNCTION
(
ConnectNamedPipe
),
WIN32_FUNCTION
(
CreateFile
),
WIN32_FUNCTION
(
CreateNamedPipe
),
WIN32_FUNCTION
(
ReadFile
),
WIN32_FUNCTION
(
PeekNamedPipe
),
WIN32_FUNCTION
(
SetNamedPipeHandleState
),
WIN32_FUNCTION
(
WaitNamedPipe
),
WIN32_FUNCTION
(
WriteFile
),
WIN32_FUNCTION
(
closesocket
),
WIN32_FUNCTION
(
recv
),
WIN32_FUNCTION
(
send
),
{
NULL
}
};
...
...
@@ -244,6 +408,8 @@ create_win32_namespace(void)
Py_INCREF
(
&
Win32Type
);
WIN32_CONSTANT
(
F_DWORD
,
ERROR_ALREADY_EXISTS
);
WIN32_CONSTANT
(
F_DWORD
,
ERROR_BROKEN_PIPE
);
WIN32_CONSTANT
(
F_DWORD
,
ERROR_NO_SYSTEM_RESOURCES
);
WIN32_CONSTANT
(
F_DWORD
,
ERROR_PIPE_BUSY
);
WIN32_CONSTANT
(
F_DWORD
,
ERROR_PIPE_CONNECTED
);
WIN32_CONSTANT
(
F_DWORD
,
ERROR_SEM_TIMEOUT
);
...
...
PC/VC6/_multiprocessing.dsp
View file @
87cf2209
...
...
@@ -97,18 +97,10 @@ SOURCE=..\..\Modules\_multiprocessing\multiprocessing.c
# End Source File
# Begin Source File
SOURCE=..\..\Modules\_multiprocessing\pipe_connection.c
# End Source File
# Begin Source File
SOURCE=..\..\Modules\_multiprocessing\semaphore.c
# End Source File
# Begin Source File
SOURCE=..\..\Modules\_multiprocessing\socket_connection.c
# End Source File
# Begin Source File
SOURCE=..\..\Modules\_multiprocessing\win32_functions.c
# End Source File
# End Target
...
...
PC/VS8.0/_multiprocessing.vcproj
View file @
87cf2209
...
...
@@ -522,10 +522,6 @@
RelativePath=
"..\..\Modules\_multiprocessing\multiprocessing.h"
>
</File>
<File
RelativePath=
"..\..\Modules\_multiprocessing\connection.h"
>
</File>
</Filter>
<Filter
Name=
"Source Files"
...
...
@@ -534,18 +530,10 @@
RelativePath=
"..\..\Modules\_multiprocessing\multiprocessing.c"
>
</File>
<File
RelativePath=
"..\..\Modules\_multiprocessing\pipe_connection.c"
>
</File>
<File
RelativePath=
"..\..\Modules\_multiprocessing\semaphore.c"
>
</File>
<File
RelativePath=
"..\..\Modules\_multiprocessing\socket_connection.c"
>
</File>
<File
RelativePath=
"..\..\Modules\_multiprocessing\win32_functions.c"
>
...
...
PCbuild/_multiprocessing.vcproj
View file @
87cf2209
...
...
@@ -522,10 +522,6 @@
RelativePath=
"..\Modules\_multiprocessing\multiprocessing.h"
>
</File>
<File
RelativePath=
"..\Modules\_multiprocessing\connection.h"
>
</File>
</Filter>
<Filter
Name=
"Source Files"
...
...
@@ -534,18 +530,10 @@
RelativePath=
"..\Modules\_multiprocessing\multiprocessing.c"
>
</File>
<File
RelativePath=
"..\Modules\_multiprocessing\pipe_connection.c"
>
</File>
<File
RelativePath=
"..\Modules\_multiprocessing\semaphore.c"
>
</File>
<File
RelativePath=
"..\Modules\_multiprocessing\socket_connection.c"
>
</File>
<File
RelativePath=
"..\Modules\_multiprocessing\win32_functions.c"
>
...
...
setup.py
View file @
87cf2209
...
...
@@ -1353,14 +1353,11 @@ class PyBuildExt(build_ext):
if
platform
==
'win32'
:
multiprocessing_srcs
=
[
'_multiprocessing/multiprocessing.c'
,
'_multiprocessing/semaphore.c'
,
'_multiprocessing/pipe_connection.c'
,
'_multiprocessing/socket_connection.c'
,
'_multiprocessing/win32_functions.c'
]
else
:
multiprocessing_srcs
=
[
'_multiprocessing/multiprocessing.c'
,
'_multiprocessing/socket_connection.c'
]
if
(
sysconfig
.
get_config_var
(
'HAVE_SEM_OPEN'
)
and
not
sysconfig
.
get_config_var
(
'POSIX_SEMAPHORES_NOT_ENABLED'
)):
...
...
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