Skip to content
Projeler
Gruplar
Parçacıklar
Yardım
Yükleniyor...
Oturum aç / Kaydol
Gezinmeyi değiştir
C
cpython
Proje
Proje
Ayrıntılar
Etkinlik
Cycle Analytics
Depo (repository)
Depo (repository)
Dosyalar
Kayıtlar (commit)
Dallar (branch)
Etiketler
Katkıda bulunanlar
Grafik
Karşılaştır
Grafikler
Konular (issue)
0
Konular (issue)
0
Liste
Pano
Etiketler
Kilometre Taşları
Birleştirme (merge) Talepleri
0
Birleştirme (merge) Talepleri
0
CI / CD
CI / CD
İş akışları (pipeline)
İşler
Zamanlamalar
Grafikler
Paketler
Paketler
Wiki
Wiki
Parçacıklar
Parçacıklar
Üyeler
Üyeler
Collapse sidebar
Close sidebar
Etkinlik
Grafik
Grafikler
Yeni bir konu (issue) oluştur
İşler
Kayıtlar (commit)
Konu (issue) Panoları
Kenar çubuğunu aç
Batuhan Osman TASKAYA
cpython
Commits
87cf2209
Kaydet (Commit)
87cf2209
authored
May 09, 2011
tarafından
Antoine Pitrou
Dosyalara gözat
Seçenekler
Dosyalara Gözat
İndir
Eposta Yamaları
Sade Fark
Issue #11743: Rewrite multiprocessing connection classes in pure Python.
üst
df77e3d4
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
15 changed files
with
190 additions
and
441 deletions
+190
-441
connection.py
Lib/multiprocessing/connection.py
+0
-0
forking.py
Lib/multiprocessing/forking.py
+4
-1
reduction.py
Lib/multiprocessing/reduction.py
+7
-6
test_multiprocessing.py
Lib/test/test_multiprocessing.py
+9
-3
NEWS
Misc/NEWS
+2
-0
connection.h
Modules/_multiprocessing/connection.h
+0
-0
multiprocessing.c
Modules/_multiprocessing/multiprocessing.c
+0
-23
multiprocessing.h
Modules/_multiprocessing/multiprocessing.h
+2
-22
pipe_connection.c
Modules/_multiprocessing/pipe_connection.c
+0
-149
socket_connection.c
Modules/_multiprocessing/socket_connection.c
+0
-202
win32_functions.c
Modules/_multiprocessing/win32_functions.c
+166
-0
_multiprocessing.dsp
PC/VC6/_multiprocessing.dsp
+0
-8
_multiprocessing.vcproj
PC/VS8.0/_multiprocessing.vcproj
+0
-12
_multiprocessing.vcproj
PCbuild/_multiprocessing.vcproj
+0
-12
setup.py
setup.py
+0
-3
No files found.
Lib/multiprocessing/connection.py
Dosyayı görüntüle @
87cf2209
This diff is collapsed.
Click to expand it.
Lib/multiprocessing/forking.py
Dosyayı görüntüle @
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
Dosyayı görüntüle @
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
Dosyayı görüntüle @
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
Dosyayı görüntüle @
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
Dosyayı görüntüle @
df77e3d4
This diff is collapsed.
Click to expand it.
Modules/_multiprocessing/multiprocessing.c
Dosyayı görüntüle @
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
Dosyayı görüntüle @
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
Dosyayı görüntüle @
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
Dosyayı görüntüle @
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
Dosyayı görüntüle @
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
Dosyayı görüntüle @
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
Dosyayı görüntüle @
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
Dosyayı görüntüle @
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
Dosyayı görüntüle @
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