zmc
2023-12-22 9fdbf60165db0400c2e8e6be2dc6e88138ac719a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
U
Z±djã@sÖddlZddlmZddlZddlZddlZddlmZddlZddl    m
Z
ddl m Z ddl mZdd    lmZdd
lmZmZmZmZmZmZmZmZmZmZmZmZmZer¾ejd ks¾t ‚Gd d „d ej!ƒZ"dd„Z#ej$dœdd„Z%dd„Z&dd„Z'ej(ej)Bej*Bej+Bej,BZ-ej.ej/Bej+Bej,BZ0ej1dddGdd„dƒƒZ2ej1ddddGdd„dƒƒZ3dZ4ej1dddGd d!„d!ƒƒZ5ej1ddddGd"d#„d#ƒƒZ6d$Z7ej1dd%Gd&d'„d'ƒƒZ8Gd(d)„d)ƒZ9dS)*éN)Úcontextmanager)Ú TYPE_CHECKING)ÚValueé)Ú_coreé)Ú_public)Úwake_all) ÚffiÚkernel32ÚntdllÚws2_32ÚINVALID_HANDLE_VALUEÚraise_winerrorÚ_handleÚ
ErrorCodesÚ    FileFlagsÚ AFDPollFlagsÚ    WSAIoctlsÚCompletionModesÚIoControlCodesÚwin32c@s eZdZdZdZdZdZdZdS)ÚCKeysrrrééN)Ú__name__Ú
__module__Ú __qualname__ÚAFD_POLLÚWAIT_OVERLAPPEDÚ LATE_CANCELÚ FORCE_WAKEUPÚ USER_DEFINED©r#r#úMd:\z\workplace\vscode\pyvenv\venv\Lib\site-packages\trio/_core/_io_windows.pyr¯s
rcCs|s
tƒ|S©N)r)Úsuccessr#r#r$Ú_check·sr'©Úwhichc Cspt|dƒr| ¡}t d¡}t d¡}t t d|¡|tjd|t d¡|tjtj¡    }|rht     ¡}t
|ƒ|dS)NÚfilenozHANDLE *zDWORD *ZSOCKETrÚHANDLE) Úhasattrr*r
Únewr ZWSAIoctlÚcastÚNULLÚsizeofZWSAGetLastErrorr)Úsockr)Zbase_ptrZout_sizeÚfailedÚcoder#r#r$Ú_get_underlying_socket½s&
 
 
 
÷ r4c
Cs~z
t|ƒWStk
rv}zN|jtjkr*‚t|dƒr<| ¡}t|ƒ}t|tj    d}||krbt
dƒ‚|}W5d}~XYqXqdS)Nr*r(zþUnexpected network configuration detected: SIO_BASE_HANDLE failed and SIO_BSP_HANDLE_POLL didn't return a different socket. Please file a bug at https://github.com/python-trio/trio/issues/new, and include the output of running: netsh winsock show catalog) r4ÚOSErrorÚwinerrorrZERROR_NOT_SOCKETr,r*rrZSIO_BSP_HANDLE_POLLÚ RuntimeError)r1ÚexZ    next_sockr#r#r$Ú_get_base_socketÓs"
 
ÿÿ
r9c    CsZd d¡d}t |¡}t t d|¡tjtjtj    Btj
tj tj tj
¡}|t krVtƒ|S)Nz\\.\GLOBALROOT\Device\Afd\Triozutf-16lesÚLPCWSTR)Úencoder
Ú from_bufferr Z CreateFileWr.rÚ SYNCHRONIZEZFILE_SHARE_READZFILE_SHARE_WRITEr/Ú OPEN_EXISTINGÚFILE_FLAG_OVERLAPPEDrr)ZrawnameZ rawname_bufÚhandler#r#r$Ú_afd_helper_handles
 
 
ù    rATF)ÚslotsÚeqc@s0eZdZejddZejddZejddZdS)Ú
AFDWaitersN©Údefault)rrrÚattrÚibÚ    read_taskÚ
write_taskÚ
current_opr#r#r#r$rDLs  rD)rBrCÚfrozenc@s,eZdZe ¡Ze ¡Ze ¡Ze ¡ZdS)Ú    AFDPollOpN)    rrrrGrHÚ lpOverlappedÚ    poll_infoÚwaitersÚ    afd_groupr#r#r#r$rMVsrMiôc@seZdZe ¡Ze ¡ZdS)ÚAFDGroupN)rrrrGrHÚsizer@r#r#r#r$rRisrRc@s8eZdZe ¡Ze ¡Ze ¡Ze ¡ZejddZ    dS)Ú_WindowsStatisticsZwindowsrEN)
rrrrGrHÚtasks_waiting_readÚtasks_waiting_writeÚtasks_waiting_overlappedÚcompletion_key_monitorsÚbackendr#r#r#r$rTos
rTéè)rLc@seZdZe ¡Ze ¡ZdS)ÚCompletionKeyEventInfoN)rrrrGrHrNÚdwNumberOfBytesTransferredr#r#r#r$r[sr[c@sØeZdZdd„Zdd„Zdd„Zdd„Zd    d
„Zd d „Zd d„Z    dd„Z
dd„Z dd„Z e dd„ƒZe dd„ƒZe dd„ƒZe dd„ƒZe dd„ƒZdd „Ze d+d"d#„ƒZe d,d$d%„ƒZe d&d'„ƒZee d(d)„ƒƒZd*S)-ÚWindowsIOManagerc    CsÎd|_g|_tt ttjdd¡ƒ|_t dt    ¡|_
t ƒ|_ i|_ i|_i|_t ƒ|_i|_t tj¡|_t ¡T}t|tjd}zt|tjd}Wntk
r®t|ƒYnX||krÀtdƒ‚W5QRXdS)NrzOVERLAPPED_ENTRY[]r(zßUnexpected network configuration detected: SIO_BASE_HANDLE and SIO_BSP_HANDLE_SELECT differ. Please file a bug at https://github.com/python-trio/trio/issues/new, and include the output of running: netsh winsock show catalog)Ú_iocpÚ_all_afd_handlesr'r ÚCreateIoCompletionPortrr
r/r-Ú
MAX_EVENTSÚ_eventsÚsetÚ_vacant_afd_groupsÚ_afd_opsÚ _afd_waitersÚ_overlapped_waitersÚ_posted_too_late_to_cancelÚ_completion_key_queuesÚ    itertoolsÚcountrr"Ú_completion_key_counterÚsocketr4rZSIO_BSP_HANDLE_SELECTÚSIO_BASE_HANDLEr5r9r7)ÚselfÚsZ select_handleÚ base_handler#r#r$Ú__init__†s4ÿ
ÿÿzWindowsIOManager.__init__c
CsPz(|jdk    r&|j}d|_tt |¡ƒW5|jrJ|j ¡}tt |¡ƒq*XdSr%)r_Úpopr'r Ú CloseHandler^)roZ
afd_handleZiocpr#r#r$ÚcloseÅs
 
zWindowsIOManager.closecCs | ¡dSr%)ru©ror#r#r$Ú__del__ÐszWindowsIOManager.__del__cCsXd}d}|j ¡D](}|jdk    r(|d7}|jdk    r|d7}qt||t|jƒt|jƒdS)Nrr)rUrVrWrX)rfÚvaluesrIrJrTÚlenrgri)rorUrVÚwaiterr#r#r$Ú
statisticsÓs
 
 
üzWindowsIOManager.statisticscCstt |jdtjtj¡ƒdS©Nr)r'r ÚPostQueuedCompletionStatusr^rr!r
r/rvr#r#r$Ú force_wakeupâsÿÿzWindowsIOManager.force_wakeupc
CsŠt d¡}td|ƒ}|dkr*|dkr*d}z tt |j|jt||d¡ƒWn6t    k
r€}z|j
t j krj‚WY¢dSd}~XYnX|dS)NÚPULONGrZrr) r
r-Úroundr'r ZGetQueuedCompletionStatusExr^rbrar5r6rÚ WAIT_TIMEOUT)roÚtimeoutÚreceivedZ millisecondsÚexcr#r#r$Ú
get_eventsés(
 ÿÿ zWindowsIOManager.get_eventsc    CsÄt|ƒD]´}|j|}|jtjkrÐ|j}|j |¡}|j}|j    |k    rHn†d|_    |j
dkrlt   |j
¡}t |ƒ|jjdj}|jrš|t@ršt |j¡d|_|jrº|t@rºt |j¡d|_| |jjdj¡q|jtjkr|j |j¡}    |j}
|j} t|
| d} t |    t| ƒ¡q|jtjkrt|j  |j¡z|j |j¡}    Wnt!k
rZYnXt "d #|    j$¡¡} | ‚q|jtj%kr„q|j&|j}t't( )d|j¡ƒ}
|j} t|
| d} | *| ¡qdS)Nr)rNr\z|Failed to cancel overlapped I/O in {} and didn't receive the completion either. Did you forget to call register_with_iocp()?Ú    uintptr_t)+ÚrangerbZlpCompletionKeyrrrNrersrPrKÚInternalr ÚRtlNtStatusToDosErrorrrOÚHandlesÚEventsrIÚREADABLE_FLAGSrZ
reschedulerJÚWRITABLE_FLAGSÚ _refresh_afdÚHandlerrgr\r[rr rhÚremoveÚKeyErrorÚTrioInternalErrorÚformatÚnamer!riÚintr
r.Ú
put_nowait)rorƒÚiÚentryZlpoÚoprPr3ÚflagsrzZ
overlappedZ transferredÚinfor„Úqueuer#r#r$Úprocess_eventsúsf
 
 
   ÿþÿ ÿzWindowsIOManager.process_eventscCs4t|ƒ}tt ||j|d¡ƒtt |tj¡ƒdSr|)rr'r r`r^Z"SetFileCompletionNotificationModesrZFILE_SKIP_SET_EVENT_ON_HANDLE)ror@Zcompletion_keyr#r#r$Ú_register_with_iocpJsÿÿz$WindowsIOManager._register_with_iocpc     Cs0|j|}|jdk    rˆ|jj}ztt |j|jj¡ƒWn0tk
rf}z|j    t
j krV‚W5d}~XYnXd|_|j d8_ |j  |¡d}|jdk    rž|tO}|jdk    r°|tO}|sÀ|j|=nlz|j  ¡}Wn@tk
rtdtƒƒ}| |jtj¡|j |j¡YnX|j  |¡t d¡}t d¡}d|_d|_d|_ ||j!d_"d|j!d_#||j!d_$z2tt %|jt&j'|t (d¡|t (d¡tj)|¡ƒWnNtk
ræ}z.|j    t
j*krÖ|j|=t+||ƒWY¢dSW5d}~XYnXt,||||ƒ}||_||j-|<|j d7_ |j t.kr,|j  /|¡dS)NrrÚ LPOVERLAPPEDzAFD_POLL_INFO *lÿÿÿÿZ AFD_POLL_INFO)0rfrKrQr'r Ú
CancelIoExr@rNr5r6rÚERROR_NOT_FOUNDrSrdÚaddrIrŒrJrrsr‘rRrAržrrr_Úappendr
r-ÚTimeoutZNumberOfHandlesZ    ExclusiverŠrZStatusr‹ZDeviceIoControlrZIOCTL_AFD_POLLr0r/ÚERROR_IO_PENDINGr    rMreÚMAX_AFD_GROUP_SIZEr)    rorqrPrQr„ršrNrOr™r#r#r$rŽ[s|
 
ÿÿ  
 
 
 
   øÿ 
 
 zWindowsIOManager._refresh_afdcƒs€t|ƒ‰ˆj ˆ¡‰ˆdkr,tƒ‰ˆˆjˆ<tˆˆƒdk    r@tj‚tˆˆt ¡ƒˆ     ˆ¡‡‡‡‡fdd„}t 
|¡IdHdS)Ncstˆˆdƒˆ ˆ¡tjjSr%)ÚsetattrrŽrÚAbortZ    SUCCEEDED)Ú_©rqÚmoderorPr#r$Úabort_fn´s 
z,WindowsIOManager._afd_poll.<locals>.abort_fn) r9rfÚgetrDÚgetattrrÚBusyResourceErrorr§Ú current_taskrŽÚwait_task_rescheduled)ror1r«r¬r#rªr$Ú    _afd_poll§s 
 
zWindowsIOManager._afd_pollcÃs| |d¡IdHdS)NrI©r²©ror1r#r#r$Ú wait_readable»szWindowsIOManager.wait_readablecÃs| |d¡IdHdS)NrJr³r´r#r#r$Ú wait_writable¿szWindowsIOManager.wait_writablecCs8t|ƒ}|j |¡}|dk    r4t|t ¡ƒ| |¡dSr%)r9rfr­r    rÚClosedResourceErrorrŽ)ror@rPr#r#r$Únotify_closingÃs
 zWindowsIOManager.notify_closingcCs| |tj¡dSr%)ržrr)ror@r#r#r$Úregister_with_iocpÏsz#WindowsIOManager.register_with_iocpcƒs²tˆƒ‰tˆtƒrt dˆ¡‰ˆˆjkr2t d¡‚t ¡}|ˆjˆ<d‰‡‡‡‡fdd„}t     |¡IdH}ˆj
dkr®t   ˆj
¡}|t jkr¦ˆdk    ršˆƒq®t d¡‚nt|ƒ|S)NrŸz4another task is already waiting on that lpOverlappedc
s‚|‰ztt ˆˆ¡ƒWn`tk
rx}zB|jtjkr\tt ˆjdt    j
ˆ¡ƒˆj   ˆ¡n t  d¡|‚W5d}~XYnXt jjS)Nrz'CancelIoEx failed with unexpected error)r'r r r5r6rr¡r}r^rr rhr¢rr’r¨ZFAILED)Z raise_cancel_r„©r@rNZ raise_cancelror#r$Úabortàs( ÿÿ
ÿþz/WindowsIOManager.wait_overlapped.<locals>.abortrz!another task closed this resource)rÚ
isinstancer•r
r.rgrr¯r°r±rˆr r‰rÚERROR_OPERATION_ABORTEDr·r)ror@rNZtaskr»r›r3r#rºr$Úwait_overlappedÓs(
 
ÿ
#
 
 z WindowsIOManager.wait_overlappedc
Ãslt ¡IdHt d¡}z ||ƒWn0tk
rT}z|jtjkrD‚W5d}~XYnX| ||¡IdH|S)NrŸ)    rZcheckpoint_if_cancelledr
r-r5r6rr¥r¾)ror@Z    submit_fnrNr„r#r#r$Ú_perform_overlappeds
  z$WindowsIOManager._perform_overlappedrc
ƒsJt |¡6‰‡‡‡fdd„}| ˆ|¡IdH}|jW5QR£SQRXdS)NcsH|jj}ˆd@|_ˆd?|_tt tˆƒt     dˆ¡t
ˆƒtj |¡ƒdS)Nìÿÿé ÚLPCVOID) ÚDUMMYUNIONNAMEÚDUMMYSTRUCTNAMEÚOffsetÚ
OffsetHighr'r Ú    WriteFilerr
r.ryr/©rNZ offset_fields©ZcbufÚ file_offsetr@r#r$Ú submit_write+s
 
 
ûÿz7WindowsIOManager.write_overlapped.<locals>.submit_write©r
r<r¿Z InternalHigh)ror@ÚdatarÊrËrNr#rÉr$Úwrite_overlapped's z!WindowsIOManager.write_overlappedc
ƒsNtj|dd6‰‡‡‡fdd„}| ˆ|¡IdH}|jW5QR£SQRXdS)NT)Zrequire_writablecsH|jj}ˆd@|_ˆd?|_tt tˆƒt     dˆ¡t
ˆƒtj |¡ƒdS)NrÀrÁÚLPVOID) rÃrÄrÅrÆr'r ÚReadFilerr
r.ryr/rÈrÉr#r$Ú submit_readBs
 
 
ûÿz9WindowsIOManager.readinto_overlapped.<locals>.submit_readrÌ)ror@ÚbufferrÊrÑrNr#rÉr$Úreadinto_overlapped>sz$WindowsIOManager.readinto_overlappedcCstt d|j¡ƒS)Nr†)r•r
r.r^rvr#r#r$Ú current_iocpWszWindowsIOManager.current_iocpccs:t|jƒ}t ¡}||j|<z||fVW5|j|=XdSr%)ÚnextrlrZUnboundedQueueri)roÚkeyrœr#r#r$Úmonitor_completion_key[s 
 
z'WindowsIOManager.monitor_completion_keyN)r)r)rrrrrrurwr{r~r…rržrŽr²rrµr¶r¸r¹r¾r¿rÎrÓrÔrr×r#r#r#r$r]…s<? PL
 
 
 
 
A  
r]):rjÚ
contextlibrÚenumrmÚsysÚtypingrrGZoutcomerÚrZ_runrZ
_io_commonr    Z _windows_cffir
r r r rrrrrrrrrÚplatformÚAssertionErrorÚIntEnumrr'rnr4r9rAZAFD_POLL_RECEIVEZAFD_POLL_ACCEPTZAFD_POLL_DISCONNECTZAFD_POLL_ABORTZAFD_POLL_LOCAL_CLOSErŒZ AFD_POLL_SENDZAFD_POLL_CONNECT_FAILrrprDrMr¦rRrTrar[r]r#r#r#r$Ú<module>sb      <//ÿþýüÿ    ÿþýÿ