o ]LbVk@s dZddlmZddlZddlZddlZddlZddlZddlZddl Z ddl m Z ej Z ej Z ze jZWn eyAe j ZYnwdZdZdZd Zd Zgd Zd ZdZdaeZeeejfZe d gdZGddde Z ddZ!GdddeZ"e#edrGddde"Z$e%de j&rGdddeZ'Gddde$Z(e%de(Z$e#edrGddde"Z)e%de#edrGd d!d!e"Z*e%d!e#ed"rGd#d$d$e"Z+e%d$e#ed%rGd&d'd'e"Z,e%d'd(d)Z-ej.d*krd+d,Z/nd-d,Z/d.d/Z0dS)0z. Back-ported, durable, and portable selectors )absolute_importN)pycompatzSeth Michael Larsonz sethmichaellarson@protonmail.comz2.0.0MITz3https://www.github.com/SethMichaelLarson/selectors2) EVENT_READ EVENT_WRITE SelectorKeyDefaultSelector BaseSelectorr)fileobjfdeventsdatac@s0eZdZdZddZddZddZdd Zd S) _SelectorMappingz* Mapping of file objects to selector keys cCs ||_dSN) _selectorselfselectorrA/usr/lib/python3/dist-packages/mercurial/thirdparty/selectors2.py__init__F z_SelectorMapping.__init__cC t|jjSr)lenr _fd_to_keyrrrr__len__I z_SelectorMapping.__len__cCs8z |j|}|jj|WStytd|wNz{0!r} is not registered.)r_fileobj_lookuprKeyErrorformat)rr r rrr __getitem__Ls   z_SelectorMapping.__getitem__cCrr)iterrrrrrr__iter__Srz_SelectorMapping.__iter__N)__name__ __module__ __qualname____doc__rrr$r&rrrrrCs  rc Cs^t|tr|}nzt|}Wntttfy!td|w|dkr-td||S)zl Return a file descriptor from a file object. If given an integer will simply return that integer back. zInvalid file object: {0!r}rzInvalid file descriptor: {0}) isinstanceintfilenoAttributeError TypeError ValueErrorr#)r r rrr_fileobj_to_fdWs r1c@sveZdZdZddZddZdddZd d Zdd d Zdd dZ ddZ ddZ ddZ ddZ ddZddZdS)r a/ Abstract Selector class A selector supports registering file objects to be monitored for specific I/O events. A file object is a file descriptor or any object with a `fileno()` method. An arbitrary object can be attached to the file object which can be used for example to store context info, a callback, etc. A selector can use various implementations (select(), poll(), epoll(), and kqueue()) depending on the platform. The 'DefaultSelector' class uses the most efficient implementation for the current platform. cCsi|_t||_dSr)rr_maprrrrruszBaseSelector.__init__cCsDzt|WSty!|jD]}|j|ur|jYSqw)aa Return a file descriptor from a file object. This wraps _fileobj_to_fd() to do an exhaustive search in case the object is invalid but we still have it in our map. Used by unregister() so we can unregister an object that was previously registered even if it is closed. It is also used by _SelectorMapping )r1r0rvaluesr r rr keyrrrr!|s   zBaseSelector._fileobj_lookupNcCsb|r |ttB@rtd|t|||||}|j|jvr)td||j||j|j<|S)z8 Register a file object for a set of events to monitor. zInvalid events: {0!r}z${0!r} (FD {1}) is already registered) rrr0r#rr!r rr"rr rrr5rrrregisters   zBaseSelector.registerc Csz |j||}W|Stytd|tjyQ}z+|jtjkr)|j D]}|j |ur>|j|j nq.td|WYd}~|Sd}~ww)z0 Unregister a file object from being monitored. {0!r} is not registeredN) rpopr!r"r#socketerrorerrnoEBADFr3r r )rr r5errrrr unregisters$    zBaseSelector.unregistercCs~z |j||}Wntytd|w||jkr,||||||}|S||jkr=|j|d}||j|j <|S)z< Change a registered file object monitored events and data. r8)r) rr!r"r#rr?r7r_replacer r6rrrmodifys     zBaseSelector.modifycCst)zj Perform the actual selection until some monitored file objects are ready or the timeout expires. )NotImplementedError)rtimeoutrrrselectszBaseSelector.selectcCs|jd|_dS)zd Close the selector. This must be called to ensure that all underlying resources are freed. N)rclearr2rrrrcloses  zBaseSelector.closecCs@|}|dur tdz||WStytd|w)z: Return the key associated with a registered file object. NzSelector is closedr8)get_map RuntimeErrorr"r#)rr mappingrrrget_keys  zBaseSelector.get_keycCs|jS)z3 Return a mapping of file objects to selector keys )r2rrrrrGszBaseSelector.get_mapcCs"z|j|WStyYdSw)z_ Return the key associated to a given file descriptor Return None if it is not found. N)rr")rr rrr _key_from_fds   zBaseSelector._key_from_fdcCs|Srrrrrr __enter__szBaseSelector.__enter__cGs |dSr)rF)r_rrr__exit__rzBaseSelector.__exit__r)r'r(r)r*rr!r7r?rArDrFrJrGrKrLrNrrrrr fs     r rDcNeZdZdZfddZd fdd ZfddZd d d Zd d d ZZ S)SelectSelectorz Select-based selector. cs"tt|t|_t|_dSr)superrPrset_readers_writersr __class__rrrs zSelectSelector.__init__NcsDtt||||}|t@r|j|j|t@r |j|j|Sr) rQrPr7rrSaddr rrTr6rUrrr7s zSelectSelector.registercs0tt||}|j|j|j|j|Sr)rQrPr?rSdiscardr rTr4rUrrr?szSelectSelector.unregisterc Cst|js t|js gS|durdnt|d}g}t|jd|j|j|\}}}t|}t|}||BD]%}d}||vr?|tO}||vrG|tO}| |}|rX| |||j @fq3|S)NTr) rrSrTmax_syscall_wrapper _wrap_selectrRrrrKappendr) rrCreadyrwrMr rr5rrrrDs(    zSelectSelector.selectcCst||g|Sz? Wrapper for select.select because timeout is a positional arg )rDrr_r`rCrrrr\zSelectSelector._wrap_selectr) r'r(r)r*rr7r?rDr\ __classcell__rrrUrrPs   rPc@s(eZdZdZddZddZddZdS) _JythonSelectorMappingz This is an implementation of _SelectorMapping that is built for use specifically with Jython, which does not provide a hashable value from socket.socket.fileno(). cCst|tsJ||_dSr)r+JythonSelectSelectorrrrrrr(s z_JythonSelectorMapping.__init__cCrr)rr_socketsrrrrr,rz_JythonSelectorMapping.__len__cCs0|jjD] \}}||ur|Sqtd|r )rrgr"r#)rr sockr5rrrr$/s z"_JythonSelectorMapping.__getitem__N)r'r(r)r*rrr$rrrrre#s  recs<eZdZdZfddZd ddZddZd d d ZZS) rfaz This is an implementation of SelectSelector that is for Jython which works around that Jython's socket.socket.fileno() does not return an integer fd value. All SelectorKey.fd will be equal to -1 and should not be used. This instead uses object id to compare fileobj and will only use select.select as it's the only selector that allows directly passing in socket objects rather than registering fds. See: http://bugs.jython.org/issue1678 https://wiki.python.org/jython/NewSocketModule#socket.fileno.28.29_does_not_return_an_integer cs>tt|g|_t||_g|_g|_tt dt j |_ dS)Ncpython_compatible_select) rQrfrrgrer2rSrTgetattrrD _select_funcrrUrrrAs  zJythonSelectSelector.__init__NcCsr|jD]\}}||urtd||qt|d||}|j||f|t@r-|j||t@r7|j||S)Nz{0!r} is already registered) rgr"r#rr]rrSrrT)rr rrrhrMr5rrrr7Ls  zJythonSelectSelector.registercCsjt|jD] \}\}}||urnqtd||jt@r$|j||jt@r/|j ||j|=|Sr ) enumeratergr"r#rrrSremoverrT)rr irhr5rrrr?[s    zJythonSelectSelector.unregistercCs|||g|Sra)rkrbrrrr\jrcz!JythonSelectSelector._wrap_selectr) r'r(r)r*rr7r?r\rdrrrUrrf6s  rfpollcrO) PollSelectorz Poll-based selector ctt|t|_dSr)rQrqrrDrp_pollrrUrrruzPollSelector.__init__NcPtt||||}d}|t@r|tjO}|t@r|tjO}|j|j ||SNr) rQrqr7rrDPOLLINrPOLLOUTrsr )rr rrr5 event_maskrUrrr7y  zPollSelector.registerc"tt||}|j|j|Sr)rQrqr?rsr r4rUrrr?zPollSelector.unregistercC4|dur|dkr d}nt|d}|j|}|Szj Wrapper function for select.poll.poll() so that _syscall_wrapper can work with only seconds. Nr)mathceilrsrprrCresultrrr _wrap_poll  zPollSelector._wrap_pollcCtg}t|jd|d}|D]+\}}d}|tj@r|tO}|tj@r&|tO}||}|r7||||j @fq |SNT)rCr r[rrDrwrrxrrKr]rrrCr^ fd_eventsr ryrr5rrrrD    zPollSelector.selectr) r'r(r)r*rr7r?rrDrdrrrUrrqss  rqepollcXeZdZdZfddZddZdfdd Zfd d Zdd d Zfd dZ Z S) EpollSelectorz Epoll-based selector crrr)rQrrrDr_epollrrUrrrrtzEpollSelector.__init__cC |jSr)rr-rrrrr-rzEpollSelector.filenoNcsTtt||||}d}|t@r|tjO}|t@r|tjO}t|j jd|j ||S)NrF) rQrr7rrDEPOLLINrEPOLLOUTr[rr )rr rrr5 events_maskrUrrr7s  zEpollSelector.registercs>tt||}z t|jjd|jW|StyY|Sw)NF)rQrr?r[rr _ERROR_TYPESr4rUrrr?s zEpollSelector.unregisterc Cs|dur|dkr d}n t|dd}t|}nd}tt|jd}g}t|jjd||d}|D]+\}}d}|t j @rA|t O}|t j @rK|t O}||}|r\||||j@fq1|S) NrrYrgMbP?gr T)rC maxevents)rrfloatrZrrr[rrprDrrrrrKr]r) rrC max_eventsr^rr ryrr5rrrrDs.      zEpollSelector.selectc|jtt|dSr)rrFrQrrrUrrrF zEpollSelector.closer r'r(r)r*rr-r7r?rDrFrdrrrUrrs  !rdevpollcsbeZdZdZfddZddZdfdd Zfd d Zdd d Zdd dZ fddZ Z S)DevpollSelectorzSolaris /dev/poll selector.crrr)rQrrrDr_devpollrrUrrrrtzDevpollSelector.__init__cCrr)rr-rrrrr-rzDevpollSelector.filenoNcrurv) rQrr7rrDrwrrxrr )rr rrr5 poll_eventsrUrrr7rzzDevpollSelector.registercr{r)rQrr?rr r4rUrrr?r|zDevpollSelector.unregistercCr}r~)rrrrprrrrrrzDevpollSelector._wrap_pollcCrrrrrrrrDrzDevpollSelector.selectcrr)rrFrQrrrUrrrF%rzDevpollSelector.closer) r'r(r)r*rr-r7r?rrDrFrdrrrUrrs   rkqueuecr)KqueueSelectorz Kqueue / Kevent-based selector crrr)rQrrrDr_kqueuerrUrrr/rtzKqueueSelector.__init__cCrr)rr-rrrrr-3rzKqueueSelector.filenoNcs|tt||||}|t@r#t|jtjtj}t |j j d|gdd|t @rtjr tatStdrtatStdrtatStdr'tatStdr0tatSt t dr:t atSt dtS)z This function serves as a first call for DefaultSelector to detect if the select module is being monkey-patched incorrectly by eventlet, greenlet, and preserve proper behavior. NrrrrprDz"Platform does not have a selector.) _DEFAULT_SELECTORrisjythonrfrrrrrqrrDrPrHrrrrr s*    r )1r* __future__r collectionsr<rrDr:systimer namedtupleMappingrr. __author__ __email__ __version__ __license____url____all__rrrobjectrrrr;rrrr1r rrPr]rrerfrqrrrr version_infor[r rrrrst        0 8  3  A  ;  Q   8