3 gYR@szddlZddlZddlZddlZddlZddlZddlmZmZy ej Z Wne e fk rhejZ YnXd(Z d)Z dZeZdaGdddeZddZejd*krd d Znd d ZedddddgZGdddeZGdddeZeedrGdddeZeedrGdddeZeedr:GdddeZeed rVGd!d"d"eZeedsfd#Zd$d%Zd&d'Z dS)+N) namedtupleMappingTcs,eZdZfddZddZddZZS) SelectorErrorcstt|j||_dS)N)superr__init__errno)selferrcode) __class__G/Users/olari/OneDrive/sandbox/awsBlog2/lambda/urllib3/util/selectors.pyrszSelectorError.__init__cCs dj|jS)Nz)formatr)r r r r __repr__"szSelectorError.__repr__cCs|jS)N)r)r r r r __str__%szSelectorError.__str__)__name__ __module__ __qualname__rrr __classcell__r r )r r rs rc Csdt|tr|}n:yt|j}Wn(tttfk rHtdj|YnX|dkr`tdj||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)fileobjfdr r r _fileobj_to_fd)s rcOsVy |||Stttjfk rP}z"d}t|dr8|j}t|WYdd}~XnXdS)z This is the short-circuit version of the below logic because in Python 3.5+ all system calls automatically restart and recalculate their timeouts. Nr)OSErrorIOErrorselecterrorhasattrrr)func_argskwargser r r r _syscall_wrapper;s  r*c OsR|jdd}|dkrd}d}n t|}|dkr4d}n t|}t|}|rZd|krZtdt}x|tkrLy|||}Wq`tttj fk rH}zd}t |dr|j }nt |dr|j d}|t j kpt t d o|t jk} | r&|dk r$t} | |krtt jd |r$d|kr$|| |d<w`|r6t|nWYdd}~Xq`Xq`W|S) z Wrapper function for syscalls that could fail due to EINTR. All functions should be retried if there is time left in the timeout in accordance with PEP 475. timeoutNFgz4Timeout must be in args or kwargs to be recalculatedrr'rWSAEINTR)r)getfloat monotoniclistr_SYSCALL_SENTINELr r!r"r#r$rr'ZEINTRr,Z ETIMEDOUTr) r%Zrecalc_timeoutr'r(r+expiresresultr)r Z is_interrupt current_timer r r r*GsJ               SelectorKeyrreventsdatac@s0eZdZdZddZddZddZdd Zd S) _SelectorMappingz* Mapping of file objects to selector keys cCs ||_dS)N) _selector)r selectorr r r rsz_SelectorMapping.__init__cCs t|jjS)N)lenr9 _fd_to_key)r r r r __len__sz_SelectorMapping.__len__c Cs@y|jj|}|jj|Stk r:tdj|YnXdS)Nz{0!r} is not registered.)r9_fileobj_lookupr<KeyErrorr)r rrr r r __getitem__s   z_SelectorMapping.__getitem__cCs t|jjS)N)iterr9r<)r r r r __iter__sz_SelectorMapping.__iter__N)rrr__doc__rr=r@rBr r r r r8s r8c@sveZdZdZddZddZdddZd d Zdd d Zdd dZ ddZ ddZ ddZ ddZ ddZddZdS) BaseSelectora/ 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||_dS)N)r<r8_map)r r r r rszBaseSelector.__init__c CsHyt|Stk rBx"|jjD]}|j|kr$|jSq$WYnXdS)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 N)rrr<valuesrr)r rkeyr r r r>s  zBaseSelector._fileobj_lookupNcCsd| s|ttB@r"tdj|t||j|||}|j|jkrTtdj||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) EVENT_READ EVENT_WRITErrr5r>rr<r?)r rr6r7rGr r r registers   zBaseSelector.registercCsy|jj|j|}Wntk r8tdj|Ynptjk r}zR|jtjkrZnr?rsocketr#rEBADFrFrr)r rrGr)r r r unregisters   zBaseSelector.unregisterc Csy|j|j|}Wn"tk r6tdj|YnX||jkr\|j||j|||}n"||jkr~|j|d}||j|j <|S)z< Change a registered file object monitored events and data. z{0!r} is not registered)r7) r<r>r?rr6rNrJr7_replacer)r rr6r7rGr r r modifys     zBaseSelector.modifycCs tdS)zj Perform the actual selection until some monitored file objects are ready or the timeout expires. N)NotImplementedError)r r+r r r r"szBaseSelector.selectcCs|jjd|_dS)zd Close the selector. This must be called to ensure that all underlying resources are freed. N)r<clearrE)r r r r closes zBaseSelector.closec CsH|j}|dkrtdy||Stk rBtdj|YnXdS)z: Return the key associated with a registered file object. NzSelector is closedz{0!r} is not registered)get_map RuntimeErrorr?r)r rmappingr r r get_keyszBaseSelector.get_keycCs|jS)z3 Return a mapping of file objects to selector keys )rE)r r r r rT szBaseSelector.get_mapc Cs$y |j|Stk rdSXdS)z_ Return the key associated to a given file descriptor Return None if it is not found. N)r<r?)r rr r r _key_from_fds zBaseSelector._key_from_fdcCs|S)Nr )r r r r __enter__szBaseSelector.__enter__cGs |jdS)N)rS)r r'r r r __exit__szBaseSelector.__exit__)N)N)N)rrrrCrr>rJrNrPr"rSrWrTrXrYrZr r r r rDs    rDr"csNeZdZdZfddZd fdd ZfddZdd d Zdd d ZZ S)SelectSelectorz Select-based selector. cs"tt|jt|_t|_dS)N)rr[rset_readers_writers)r )r r r r!szSelectSelector.__init__NcsDtt|j|||}|t@r*|jj|j|t@r@|jj|j|S)N) rr[rJrHr]addrrIr^)r rr6r7rG)r r r rJ&s zSelectSelector.registercs0tt|j|}|jj|j|jj|j|S)N)rr[rNr]discardrr^)r rrG)r r r rN.szSelectSelector.unregistercCstj||g|S)z? Wrapper for select.select because timeout is a positional arg )r")r rwr+r r r _select4szSelectSelector._selectc Cst|j rt|j rgS|dkr(dnt|d}g}t|jd|j|j|\}}}t|}t|}xV||BD]J}d}||kr|tO}||kr|tO}|j |}|rl|j |||j @fqlW|S)NgTr) r;r]r^maxr*rcr\rHrIrXappendr6) r r+readyrarbr&rr6rGr r r r"8s$  zSelectSelector.select)N)N)N) rrrrCrrJrNrcr"rr r )r r r[s    r[pollcsNeZdZdZfddZd fdd ZfddZdd d Zdd d ZZ S) PollSelectorz Poll-based selector cstt|jtj|_dS)N)rrhrr"rg_poll)r )r r r rSszPollSelector.__init__NcsPtt|j|||}d}|t@r*|tjO}|t@r<|tjO}|jj|j ||S)Nr) rrhrJrHr"POLLINrIPOLLOUTrir)r rr6r7rG event_mask)r r r rJWs  zPollSelector.registercs"tt|j|}|jj|j|S)N)rrhrNrir)r rrG)r r r rNaszPollSelector.unregistercCs4|dk r$|dkrd}ntj|d}|jj|}|S)zj Wrapper function for select.poll.poll() so that _syscall_wrapper can work with only seconds. Nrg@@)mathceilrirg)r r+r3r r r _wrap_pollfs  zPollSelector._wrap_pollcCsxg}t|jd|d}x^|D]V\}}d}|tj@r:|tO}|tj@rN|tO}|j|}|r|j|||j @fqW|S)NT)r+r) r*ror"rjrIrkrHrXrer6)r r+rf fd_eventsrrlr6rGr r r r"ts   zPollSelector.select)N)N)N) rrrrCrrJrNror"rr r )r r rhQs    rhepollcsXeZdZdZfddZddZdfdd Zfd d Zdd d Zfd dZ Z S) EpollSelectorz Epoll-based selector cstt|jtj|_dS)N)rrrrr"rq_epoll)r )r r r rszEpollSelector.__init__cCs |jjS)N)rsr)r r r r rszEpollSelector.filenoNcsTtt|j|||}d}|t@r*|tjO}|t@r<|tjO}t|j jd|j ||S)NrF) rrrrJrHr"EPOLLINrIEPOLLOUTr*rsr)r rr6r7rGZ events_mask)r r r rJs  zEpollSelector.registerc s@tt|j|}yt|jjd|jWntk r:YnX|S)NF)rrrrNr*rsrr)r rrG)r r r rNs zEpollSelector.unregisterc Cs|dk r2|dkrd}ntj|dd}t|}nd }tt|jd}g}t|jjd||d}x^|D]V\}}d}|t j @r|t O}|t j @r|t O}|j|}|rd|j|||j@fqdW|S) Nrgg@@gMbP?g?rT)r+Z maxeventsg)rmrnr.rdr;r<r*rsrgr"rtrIrurHrXrer6) r r+ max_eventsrfrprrlr6rGr r r r"s*     zEpollSelector.selectcs|jjtt|jdS)N)rsrSrrr)r )r r r rSs zEpollSelector.close)N)N) rrrrCrrrJrNr"rSrr r )r r rrs  !rrkqueuecsXeZdZdZfddZddZdfdd Zfd d Zdd d Zfd dZ Z S)KqueueSelectorz Kqueue / Kevent-based selector cstt|jtj|_dS)N)rrxrr"rw_kqueue)r )r r r rszKqueueSelector.__init__cCs |jjS)N)ryr)r r r r rszKqueueSelector.filenoNcs|tt|j|||}|t@rFtj|jtjtj}t |j j d|gdd|t @rxtj|jtj tj}t |j j d|gdd|S)NFr)rrxrJrHr"keventrKQ_FILTER_READ KQ_EV_ADDr*rycontrolrIKQ_FILTER_WRITE)r rr6r7rGrz)r r r rJszKqueueSelector.registercstt|j|}|jt@r^tj|jtjtj }yt |j j d|gddWnt k r\YnX|jt@rtj|jtjtj }yt |j j d|gddWnt k rYnX|S)NFr)rrxrNr6rHr"rzrr{ KQ_EV_DELETEr*ryr}rrIr~)r rrGrz)r r r rNs$  zKqueueSelector.unregisterc Cs|dk rt|d}t|jd}i}t|jjdd||}x|D]}|j}|j}d}|tj krd|t O}|tj krv|t O}|j |} | r>| j|kr| || j@f|| j<q>|| jd} | || B| j@f|| j<q>Wt|jS)NrTr)rdr;r<r*ryr}identfilterr"r{rHr~rIrXrr6r0rF) r r+rvZ ready_fdsZ kevent_listrzrrlr6rGZ old_eventsr r r r"s*        zKqueueSelector.selectcs|jjtt|jdS)N)ryrSrrx)r )r r r rSs zKqueueSelector.close)N)N) rrrrCrrrJrNr"rSrr r )r r rxs   rxFcCsZy0|dkrtj}|jdntt|jdSttfk rT}zdSd}~XnXdS)a  Checks that select structs can be allocated by the underlying operating system, not just advertised by the select module. We don't check select() because we'll be hopeful that most platforms that don't have it available will not advertise it. (ie: GAE) rgrTFN)r"rggetattrrSr r)structpr)r r r _can_allocates rcCsPtdkrJtdrtan4tdr$tan&tdr2tanttdrBtantdtS)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. Nrwrqrgr"z!Platform does not have a selector) _DEFAULT_SELECTORrrxrrrhr$r"r[rr r r r DefaultSelector5s rrr)rr)!rrmr"rLsystime collectionsrrr/r ImportErrorrHrI HAS_SELECTobjectr1r Exceptionrr version_infor*r5r8rDr$r[rhrrrxrrr r r r sH     8 1 4 B R