Skip to content

Commit 6878533

Browse files
committed
Changes to _winapi use from eryksun feedback.
1 parent 715ded9 commit 6878533

File tree

3 files changed

+82
-48
lines changed

3 files changed

+82
-48
lines changed

Lib/multiprocessing/shared_memory.py

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
from .managers import dispatch, BaseManager, Server, State, ProcessError
1616
from . import util
1717
import os
18+
import errno
1819
import struct
1920
import secrets
2021
try:
@@ -28,10 +29,6 @@
2829
if os.name == "nt":
2930
import _winapi
3031

31-
PAGE_READONLY = 0x02
32-
PAGE_EXECUTE_READWRITE = 0x04
33-
INVALID_HANDLE_VALUE = -1
34-
3532

3633
class WindowsNamedSharedMemory:
3734

@@ -42,31 +39,39 @@ def __init__(self, name, flags=None, mode=384, size=0, read_only=False):
4239
if size == 0:
4340
# Attempt to dynamically determine the existing named shared
4441
# memory block's size which is likely a multiple of mmap.PAGESIZE.
42+
h_map = _winapi.OpenFileMapping(_winapi.FILE_MAP_READ, False, name)
4543
try:
46-
h_map = _winapi.OpenFileMappingW(PAGE_READONLY, False, name)
47-
except OSError:
48-
raise FileNotFoundError(name)
49-
try:
50-
p_buf = _winapi.MapViewOfFile(h_map, PAGE_READONLY, 0, 0, 0)
44+
p_buf = _winapi.MapViewOfFile(
45+
h_map,
46+
_winapi.FILE_MAP_READ,
47+
0,
48+
0,
49+
0
50+
)
5151
finally:
5252
_winapi.CloseHandle(h_map)
5353
size = _winapi.VirtualQuerySize(p_buf)
5454

5555
if flags == O_CREX:
5656
# Create and reserve shared memory block with this name until
5757
# it can be attached to by mmap.
58-
h_map = _winapi.CreateFileMappingW(
59-
INVALID_HANDLE_VALUE,
58+
h_map = _winapi.CreateFileMapping(
59+
_winapi.INVALID_HANDLE_VALUE,
6060
_winapi.NULL,
61-
PAGE_EXECUTE_READWRITE,
61+
_winapi.PAGE_READWRITE,
6262
(size >> 32) & 0xFFFFFFFF,
6363
size & 0xFFFFFFFF,
6464
name
6565
)
6666
try:
6767
last_error_code = _winapi.GetLastError()
6868
if last_error_code == _winapi.ERROR_ALREADY_EXISTS:
69-
raise FileExistsError(f"File exists: {name!r}")
69+
raise FileExistsError(
70+
errno.EEXIST,
71+
os.strerror(errno.EEXIST),
72+
name,
73+
_winapi.ERROR_ALREADY_EXISTS
74+
)
7075
self._mmap = mmap.mmap(-1, size, tagname=name)
7176
finally:
7277
_winapi.CloseHandle(h_map)

Modules/_winapi.c

Lines changed: 42 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -475,7 +475,7 @@ _winapi_CreateFile_impl(PyObject *module, LPCTSTR file_name,
475475
}
476476

477477
/*[clinic input]
478-
_winapi.CreateFileMappingW -> HANDLE
478+
_winapi.CreateFileMapping -> HANDLE
479479
480480
file_handle: HANDLE
481481
security_attributes: LPSECURITY_ATTRIBUTES
@@ -487,11 +487,11 @@ _winapi.CreateFileMappingW -> HANDLE
487487
[clinic start generated code]*/
488488

489489
static HANDLE
490-
_winapi_CreateFileMappingW_impl(PyObject *module, HANDLE file_handle,
491-
LPSECURITY_ATTRIBUTES security_attributes,
492-
DWORD protect, DWORD max_size_high,
493-
DWORD max_size_low, LPCWSTR name)
494-
/*[clinic end generated code: output=c6b017501c929de1 input=35cadabe53b3b4da]*/
490+
_winapi_CreateFileMapping_impl(PyObject *module, HANDLE file_handle,
491+
LPSECURITY_ATTRIBUTES security_attributes,
492+
DWORD protect, DWORD max_size_high,
493+
DWORD max_size_low, LPCWSTR name)
494+
/*[clinic end generated code: output=6c0a4d5cf7f6fcc6 input=3dc5cf762a74dee8]*/
495495
{
496496
HANDLE handle;
497497

@@ -502,7 +502,7 @@ _winapi_CreateFileMappingW_impl(PyObject *module, HANDLE file_handle,
502502
Py_END_ALLOW_THREADS
503503

504504
if (handle == NULL) {
505-
PyErr_SetFromWindowsErr(0);
505+
PyErr_SetFromWindowsErrWithUnicodeFilename(0, name);
506506
handle = INVALID_HANDLE_VALUE;
507507
}
508508

@@ -1371,7 +1371,7 @@ _winapi_MapViewOfFile_impl(PyObject *module, HANDLE file_map,
13711371
}
13721372

13731373
/*[clinic input]
1374-
_winapi.OpenFileMappingW -> HANDLE
1374+
_winapi.OpenFileMapping -> HANDLE
13751375
13761376
desired_access: DWORD
13771377
inherit_handle: BOOL
@@ -1380,9 +1380,9 @@ _winapi.OpenFileMappingW -> HANDLE
13801380
[clinic start generated code]*/
13811381

13821382
static HANDLE
1383-
_winapi_OpenFileMappingW_impl(PyObject *module, DWORD desired_access,
1384-
BOOL inherit_handle, LPCWSTR name)
1385-
/*[clinic end generated code: output=ad829d0e68cac379 input=68fa4e0f2d5d5c42]*/
1383+
_winapi_OpenFileMapping_impl(PyObject *module, DWORD desired_access,
1384+
BOOL inherit_handle, LPCWSTR name)
1385+
/*[clinic end generated code: output=08cc44def1cb11f1 input=131f2a405359de7f]*/
13861386
{
13871387
HANDLE handle;
13881388

@@ -1848,7 +1848,7 @@ static PyMethodDef winapi_functions[] = {
18481848
_WINAPI_CLOSEHANDLE_METHODDEF
18491849
_WINAPI_CONNECTNAMEDPIPE_METHODDEF
18501850
_WINAPI_CREATEFILE_METHODDEF
1851-
_WINAPI_CREATEFILEMAPPINGW_METHODDEF
1851+
_WINAPI_CREATEFILEMAPPING_METHODDEF
18521852
_WINAPI_CREATENAMEDPIPE_METHODDEF
18531853
_WINAPI_CREATEPIPE_METHODDEF
18541854
_WINAPI_CREATEPROCESS_METHODDEF
@@ -1862,7 +1862,7 @@ static PyMethodDef winapi_functions[] = {
18621862
_WINAPI_GETSTDHANDLE_METHODDEF
18631863
_WINAPI_GETVERSION_METHODDEF
18641864
_WINAPI_MAPVIEWOFFILE_METHODDEF
1865-
_WINAPI_OPENFILEMAPPINGW_METHODDEF
1865+
_WINAPI_OPENFILEMAPPING_METHODDEF
18661866
_WINAPI_OPENPROCESS_METHODDEF
18671867
_WINAPI_PEEKNAMEDPIPE_METHODDEF
18681868
_WINAPI_READFILE_METHODDEF
@@ -1932,11 +1932,34 @@ PyInit__winapi(void)
19321932
WINAPI_CONSTANT(F_DWORD, FILE_FLAG_OVERLAPPED);
19331933
WINAPI_CONSTANT(F_DWORD, FILE_GENERIC_READ);
19341934
WINAPI_CONSTANT(F_DWORD, FILE_GENERIC_WRITE);
1935+
WINAPI_CONSTANT(F_DWORD, FILE_MAP_ALL_ACCESS);
1936+
WINAPI_CONSTANT(F_DWORD, FILE_MAP_COPY);
1937+
WINAPI_CONSTANT(F_DWORD, FILE_MAP_EXECUTE);
1938+
WINAPI_CONSTANT(F_DWORD, FILE_MAP_READ);
1939+
WINAPI_CONSTANT(F_DWORD, FILE_MAP_WRITE);
19351940
WINAPI_CONSTANT(F_DWORD, GENERIC_READ);
19361941
WINAPI_CONSTANT(F_DWORD, GENERIC_WRITE);
19371942
WINAPI_CONSTANT(F_DWORD, INFINITE);
1943+
WINAPI_CONSTANT(F_HANDLE, INVALID_HANDLE_VALUE);
1944+
WINAPI_CONSTANT(F_DWORD, MEM_COMMIT);
1945+
WINAPI_CONSTANT(F_DWORD, MEM_FREE);
1946+
WINAPI_CONSTANT(F_DWORD, MEM_IMAGE);
1947+
WINAPI_CONSTANT(F_DWORD, MEM_MAPPED);
1948+
WINAPI_CONSTANT(F_DWORD, MEM_PRIVATE);
1949+
WINAPI_CONSTANT(F_DWORD, MEM_RESERVE);
19381950
WINAPI_CONSTANT(F_DWORD, NMPWAIT_WAIT_FOREVER);
19391951
WINAPI_CONSTANT(F_DWORD, OPEN_EXISTING);
1952+
WINAPI_CONSTANT(F_DWORD, PAGE_EXECUTE);
1953+
WINAPI_CONSTANT(F_DWORD, PAGE_EXECUTE_READ);
1954+
WINAPI_CONSTANT(F_DWORD, PAGE_EXECUTE_READWRITE);
1955+
WINAPI_CONSTANT(F_DWORD, PAGE_EXECUTE_WRITECOPY);
1956+
WINAPI_CONSTANT(F_DWORD, PAGE_GUARD);
1957+
WINAPI_CONSTANT(F_DWORD, PAGE_NOACCESS);
1958+
WINAPI_CONSTANT(F_DWORD, PAGE_NOCACHE);
1959+
WINAPI_CONSTANT(F_DWORD, PAGE_READONLY);
1960+
WINAPI_CONSTANT(F_DWORD, PAGE_READWRITE);
1961+
WINAPI_CONSTANT(F_DWORD, PAGE_WRITECOMBINE);
1962+
WINAPI_CONSTANT(F_DWORD, PAGE_WRITECOPY);
19401963
WINAPI_CONSTANT(F_DWORD, PIPE_ACCESS_DUPLEX);
19411964
WINAPI_CONSTANT(F_DWORD, PIPE_ACCESS_INBOUND);
19421965
WINAPI_CONSTANT(F_DWORD, PIPE_READMODE_MESSAGE);
@@ -1945,6 +1968,12 @@ PyInit__winapi(void)
19451968
WINAPI_CONSTANT(F_DWORD, PIPE_WAIT);
19461969
WINAPI_CONSTANT(F_DWORD, PROCESS_ALL_ACCESS);
19471970
WINAPI_CONSTANT(F_DWORD, PROCESS_DUP_HANDLE);
1971+
WINAPI_CONSTANT(F_DWORD, SEC_COMMIT);
1972+
WINAPI_CONSTANT(F_DWORD, SEC_IMAGE);
1973+
WINAPI_CONSTANT(F_DWORD, SEC_LARGE_PAGES);
1974+
WINAPI_CONSTANT(F_DWORD, SEC_NOCACHE);
1975+
WINAPI_CONSTANT(F_DWORD, SEC_RESERVE);
1976+
WINAPI_CONSTANT(F_DWORD, SEC_WRITECOMBINE);
19481977
WINAPI_CONSTANT(F_DWORD, STARTF_USESHOWWINDOW);
19491978
WINAPI_CONSTANT(F_DWORD, STARTF_USESTDHANDLES);
19501979
WINAPI_CONSTANT(F_DWORD, STD_INPUT_HANDLE);

Modules/clinic/_winapi.c.h

Lines changed: 22 additions & 22 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)