ÿØÿà JFIF    ÿÛ „ !.%+&8&+/1555$;@;4?.451 4,$,44444444444414444444444444444444444444444444444444ÿÀ  á á" ÿÄ     ÿÄ ?    !1AQaq"2‘¡±ÁðBRbrÑá#‚’¢²3S CñÿÄ   ÿÄ !    !1QAa‘2ÿÚ   ? 5˜Z¯V¦cø)›t/? z¨±>Õ5€¶‹Á¤·¼z¼Ü¬+ñ®v¤¨_ˆR­BFn©—˜ý®ç̝P8gýt·ÉSTŦˆìät?þé¼íìN/Þa)ì–í6ô… Ï¿øÃj´¿KÇü]ÿ ªô¹-eKànëÕHTx}ýSÜ›ÿ ”7Ø×&µ<¦  ¥ÑO¶[Ù¯ä¨ÞÃÿ PZ-¬;#õ|•oaÿ ©CìÞz3˜öː/¤­ñTûIØ}š^ mÓ%ªxˆ¥ÉŸu=Z+ISe¿45™¼u;ú&WØ÷€æßQ™®{|íx*TC“#ZŠìZ§²‹ 6pv…³¿¡äª*áZÐ%ÒOáˆo"x«OHk w±æ+¬V(kMúŸ5Vö«$ ÁrÏbàb57/luR ¸ÑÛj Òµì`Мq­û žICÀÊ•©4€Âcà¨Ï€O´<èÐ:›ù(Ë^L8þ‘ÍÌ#¸Ð_Ì©ÙK(Öz 4¬û+¸;ü’V’84‘¬ÃŽ:[â‡ÔÌáõp¢~§ªlæ£ö{®G>J¼"°‡7¯ÆÉèßû ‹É‹§ÁòÃýâßî ^ƾÙõ‹×óH#«LP½ïX=xÑÍ$|W?•~• îëÔ©ª‹ {ÝT…Kÿ ”hûâá)J*ö˜–ÔU;iÇ€/ ÆþjóZ\ýwØ=Ìm ºèËL9 ýèÆð/¨’¥öo=nË.%Îì ŽÕ¯È|{Oj²ƒE6e/ßdÄõ²Ìâ1O®ò×TsəԸhOMýíMˆ¿¼H˜l²,7Â¥#MF/Úf°Ö½± ¸–dr‹NýÊ íjqx{œÉ ä-È ¦ øÄër¨q°ð †nцýÑÄÆ’mä…n<0È™;ÁÝá¯ÁZƒ7FÀmì­ É&9ˆîéi¶ùN§Y• ÃZãAâ?•‡©‰ , ó¾IŸŠc1 4â&y­&pŠ­6;M À 0¹qç»p.á …ŸÅáK@%6·y6ƒ‰3?”úºŽ‰éX5ªPT §µ!=Mž«Ú½‹ÅgÂSâÉaþÓoö–¯ÁÔìR>5éÿ üs¶ÆUcÌ kÇR ]ÿ ù¬¼«VŽ;Â|‡~¢¦”ÏŰæ {L™Õ°Óv¹ò¸írޡעCÃ!íVÕ {¶»sŒNPg/ "uÕbkm²“$ďå¿é¹§°½æz¯6 †s¿!s–wÚÝ“™Œ °.ûj>·+™Òa…©Œ&rÝÎtÛë긪Ît’LAVp%c Úý[ÄzJ¾ÇàXXç@˜ó<êL]·T˜¾¥1Ó©V‡g´æ½¦Ý@¹óø!_@´ÞâSÁ —S3™•& ]@JHÚý©ZŽ €×æÔr»Áf!‡yÞ4Mv*èÓã_{‘åóUuљØ«Oïé*®EvÑ Œ÷‡U \"㪒ÍK+À 4“M¡ï:0¥5í!'<@î´”>Ç»&Z–ïCCV˜Ì5Šo&îhè.žû |ÓK©h$s6KìŒëã)¹hI¦GïOåóI;ììü#É$Š0…Ææ¥TØ.5­¾gn´ “ÂÖ\:hœ89G)J@„}œ:’Ò{/Š"¦_Æ×7Æ3VÇŠÊa]ÚŒÙ€Ä–=®uÁßâACZƒ§§£ Qnâ:«,×{tyø¬iÛcœÜÄ€H½ÄÍCk´÷šß .W'b¤Íåh]÷€=,Žv×cÚEÚHXJX¶îo¨FÒtèöŸ>ªª6[J®Fµ£sGÁeqõfe\íjÒÐïÄÐGˆe1Ø‹.Ø”‘Ëuø Y­ˆÜ ŽG|zùªüMpDnQWÄ”%JŠ™)â*p@Örš«ÕT2Ð%ˆG#ª„ ·¤!°ŸOTÂT¸aÚ%4&h™LµšØüÐ.F¿²ÐÞ_Ç‚¾ÅÃaÜ÷09Æ q€öy˜v‡85õN÷]¬äѼóS{°_MެúÔ#°Ç¸0åÞè2ëôPcvÆw9®ií1Ä8F™˜à‰´+‰Ik1òÝ7“Ñ×ÒsÝ\x‚h`ÞÑ`ó"|µEcý£n˜h`}GÞ !±ù²Ápü²ß6 0ïi󜵩SÈÇ7˜-ÕURO˜¦´f$ªž-Í6(œ}<„ éc øs]ŽŽ„*—¾ ìdŽ„)méª\¿êÎIg¾ØÞ~I#C/¼¼´EÁÈŽi8“©õådô·>euä ƒ'Ê×लR1ÉJE1ÐAát`t;ÇР%Ý<‡¥„ÍÆ`×Oyó)õiI€ñQaŸ4Ûù\áàaÃÔ¹HÃu¹*k€¦<„e S‡&õÏ B!ŽhüÞ`yj}mªf×\¿ Ç~æ­9‡û\՞Ǖg²1Žû5V7 !àöšm° c`ܬøÇìµÒ'P"?…´Ö,"§^•õލsÔ)6˜sæéÍR¼ ò|Sl”‹7 nPW Gòú÷½§O¯‡„l¡kSÞŒr½PÊ@æ¢pŽ-mÿ #Ÿ˜Àº¶Áä¦;ïÔæ$1££`“Õ>„—·ž)ßð³ñ#Ï Ô$¶œ‰ÊE‹À;÷º ¯«P:Ñ”8–IÊtpÞ3ª“>ê“þës4ò2OÏÕ­±zô†Õ§‰.÷ä¸;¿˜“'œ›žª}«Œ{ª±Ì 9ÔóÞÕ‡0 $íWV3Üì¬ —@kÝ4@¿r¼±½¬™›?øØæ´'Áé®CË3-g$˜ö‡×auÚi´Žp/êÛ æF›Ú2v‹ã¿¿,nB1̨ƃqÞa5͝@&Æû“él÷ \C²½UÍc ¯k×¢U ÖéQå™—-r wô ÞÏ<Ò=&=ÿ Ôê Òêˈt,i—;LîÜ á¸*ÚÃ1$êL•LÍ <É)ýÐà’ ;F™{ƒ™˜€&'}‚ãÄK`¡ÞT@I;®žZóè‚s’7®°›+§O­Åq©é»²9<Ô J ¼9O’HL»Ùïì¸rk¼Ž_ý‘TŸu[²ßÚŒ·ü÷B%¯E ŸÔX5êO´ Ç•€’I0 ÉJX` ñ¹õ%;µŸD‘«´€àwÒ™U ûئžÖö\×®×´8 ½‡ºÐÆÓ§?Àkmœ=;d5*@-ì0F Rªýš[Ü6âö̃ڸr*KA9· u*µæ£?U¸Âêí†8@¦X4 e-ò„0s{ HâUpU?¼mñRa°®a%Ð'tÉ×’\¾ÊÉ]t›h>·(Ë@R¼¡Ãt h}’O÷au<+nT…Ö…MӐ??Óe95 q>í/;&JSû °¯ÊéÞ øƒ*Ã2½Ài&:nôUl=¾¿5eˆ3”ñc|Ú2V”>„»&eE;«ÚäC p¢Û úy 9š[ŒÌx¼擼A&DåÒ¯ˆ¤ÀÌ;"˜ ÏQä¸åhÊ}Ûq«Û0WžÒ|»€ø®öCm5•\ÇÀ§Pe3£]0ÃàLDÉ‰1øªxjgwT‚÷¿LΨK‹›ùs—xˆÜ±µ kæ¸f‰‰ÜGk/LÛØ6d9ò¶ùA{ƒA3š/¬D¬khÓk‰`˜"㯒r¿±Óã jx‡°e}<Ñø\3y:'À•/h½Í€Ç4~g ?Û(¼]v‘ªlKÎâ~?O‚W%{Ì:“'©úNq¾›úo(X’¥¯ˆ nFê{Ç€ü?º'ë ø‹ì Þ09ŒÌç9Æ —ËC`j@ÓÄ(+a‹un¸#ÂꟋ{K`‘ÑÍÍ'à´»/Û,KW;Þ4²þð ï Nm|~fGÏ(…³Ã)«1ö­Õ ¥‡¨©ƒÃ™ü-s=à=U66Ï«Ýc蓦W¹íž®›nÔ%êÇìŒ<#Ü×84ån®Ð ÒåOC` ñânÑs‡¢ç 1õ%Îhì½Ã½® e:ݼUZo™`  ÅZŸŒÊ«ê1ÏÄo$q¹Þ€©ˆhÐÉä¯ñ[!…Ú˜àJ:x2$Íß&PåT£6ç— ‡Í*4Ýšçjÿ ‰É nófÐ ó(L5C•åÆ\rMÒ@ò }y-W}™üýVù—ú¢=Ù”c®‘< M ž ´Phr ¦©TD ‘ù.$´÷O‡‘V2Æò.=IUŒ=ž‡â¬i™aþÓåÙ?òUø'ØÖ•.~* šTŒ!•-×áºTâ®ä#õü'´ eýlYÅÓeÕKÂrT"CÚ@u!Óxƒ{š3€}1¿(r}%«nËamjÑ%ÑNEò v ˜à  σöK³,*º.àzù¨™Ó ÚçâU¦*¿ 9{%Ö¹ njûdaXöb) kÛÆ±ûÓ\°M7ˆÂ=û›ç¿Ã‚­V»Cg–8ÙêE- j)k$º`Ã-ùEýeBÆÇ]c¡°ñty&Òd0nõ'¡W+ƒ*|–øµFa\GQªEAÔp5\Ǽ·¼Ç8·õ -â§Ú[ ‡ uZeÖ 3}×d'+¹:ð+K†Û®s!Ï$úe€<Û”x)1»a­¡LC]¸µík…ÚàA»AYº{†ªS[¦5HÒ7ù --,ísòDØ€èk ÞÀîÜ ò@â( ËNˆë›4ô½•/¦o‡€Û7 ê•ÆêòðÜy'Án½µ á˜ݦ ndeo…[ì¶Ê,¥R³Ä=À±—–ß;£™´ñSâ*g§”ïaið‘Jå~™ÓÞ ß³Õ¢»8x埒²52>AÊb&-÷\7´éÄù€T˜,w;3{ï˜k…à¹ÄqÀ«œ{€\ ˆ¾[´¨јr &Úé„Ívˆ±8†¿]|¬ņ4I×pÞS1ÈÖz‰#Ìv‡G!YNògñ:màTz¢Ý1ô©^O=~ë|5Bã™ç•¼µõ•bÆ@úÕS¬ÈŒ#¬zünrŸ û” Z²•èðV"ÁHÚý©wÝ €7¼Ìu1hÑa3Éä û f$o¿É ™Ú›ÝçnpÒ3äÌ3†Í§,Äï]$‰/pê †«À¼¸e9­Æê_C]žƒ·ý·frÁN«, E=›Çq -‰öŒ:aÏ¿±í&£Í:-} 84‘ÿ eƒQÑeëSsuiA ³g㟥ú£?ÿ ʼn*”“÷aühe:ÊWa@ÒÞk±eØ] F Ô—r.åä˜ @ö¥ªZoÐýYL·¥S²G/‡ñ <~*ZÆ´è>JlòàÛÆ½ÿ 窘ìGN¢:I®KšJp/`íIÁÀõ#Ä-€ö­šµŒoF4|ÆQØÆ@Ì|£Ô…¢À{9˜è½Üó›€ôYÒÎYsið;ís¤€à²ˆ‚4qÉVŒI$ ‰"° æµ8cXGjœˏ¡Aâý•ËÜ¢ûï e·çLx']á"oÅÎê3¯Ç—¹”ó0nå‚âg{Œñ> S´˜îè°g238‚ãköÝfÚd´6Ò€;ò÷±¢™¼›º ¢Æ'¥Ðx'e¬ç ]bÈÆV¢ó‹kýBO ðÊâ$Ÿ!×T 3Mýמ žìٍàÌü‘8÷€àæØ8æ©6‰©L´«…oãpð„~Çk‰!ñ;‹”ÛžÍ àž±z Ÿôû øŸÝužÏ;ÿ #|u6™Þ¬ÚˆÐõA4¶â|ôl|Ê2ŽÇ¤ÝÅÇY.<#Aí.k§hóF‚”Y; M½Ö4hŸ4&›­¿tès´%FìL¥£Ãk‰ÇT¤haÁ¤ÚxfÉ`ÑìË›>i 3t‚:,–+^÷´–{Û–Nxi"x‘Ûg î¨>¥Õ܁ùZH,2Û“:8xÊ¢Çí9.É-Ìâã-=çjwµS˜dütžçwýGòú®®ûº_ˆýx$–¡ãøO EÚÛÏ÷R„×w+3£Á£öUMyR²¹âŒ°š›¸Ñãò9§Ó_Dl+Ùßc›úšGÅÌc†Ž!Ko=¶.‘Îÿ c²(2®V mª.ÿ ¹B›¹å ù„öŸSV>™ü¯$y:G¢Z×àøúdî¹û­·ýÇ´:•c LÍõi_‹ö+ÎæGÊè>OŠ•äž´§Þ{X}¨1ÚTc›»Qþ•êô°t¿OP?eæ~É{5]•ÙR£r5†nZ\ã@ &îJõ ¾àC°þV>fé¥/ü5ñÊIº_é5 ;e­h<@ Ä&æÃëE%;X,ÒãÆÞ`Oò¦kŸm#˜!ÀyÄ¢| óLšò¥Ä` ¶R=|ÈCâh5ò3DˆïF†ðÒ#ÅìÛœ?¸yhBãœí ZxßÎÄhºRK„`Þödvײ™ÀÈÑÒgŒuY w³%†ƒÓzõ ÖÏp‚dH®¦A´ù§»ÓÇMæ~)ˆð‡û:ù&Ä •vGD´À n ݇¼Ö8Fö óáà£~Ë¥x`oK|Ä?fxiØü%pìR>éò+Û±éÎ>núlFŤ'tq8LZÏvÃ?„¡ß±È⽆¯³íü@x|PöUäèØã¡ð‚ŒAìÏ"vÍwóŸÍ{ ý0.z È•Ö{,N¡£¡ŸKÕÙž>Ýœþ ÍÀ°<×EA!Å‚D™IúOÍ¡>ôG}Â` ÍßkÜL™Ž Þð™ {IøF²¹òQ3&!ÃÂÞz.d&Ï-sH¸,Ôõ˜ŽP€ 77ˆÝ¼ÊëÜw =cÕ Ú,ØÐ5ÎYÐ)ì´öœgŒ[¤ßv㙑8心>h]§µháYš£²ºÑ.{Ï7Sð•?´~×SÃKýJÛ˜ ™Íäiúu<µX¶1õ^kâçIÑ£sZ4h>j*ÔšD:4­¿_ ÷¸ Õxæÿ ¸?Mù _•­ÊÐ ä ÷ý ÑwL œ­ïnTkÛUÍN©ë:¦fV ¶ÜÔÜMªÅâA½–¿R×TXš-%iTÊT•‡Ù‚JôϐZxWÑè‰f‰òG º ×Õû2aZ7OU3[“×AT–ÞŒ…-‘¤”Ì ì&(ˆ¿­•ƒkï’:ðY¦W‘ Å)“†‘˜³Åtcø˜ñTÂwÚÇ4|üLÇªí–v- qˆèU qPE.†â‘˜µ Æ,ÐÅs]8¾„oúÑ i>ÜxxÈó)ƒ ´æÁâØ$À‰vžŸf$Ž |ãw;ÀÁIJ»b` {¦Ó¤Ú$©YÀ‘n@Óïž«9J¼êG m¤ ܯ¹ÌW4€ÐÒÅÛ‡#褕Ÿn-?í|с¥÷Ú¹¬'´ÞÜ9ÓK `hê£SÄSà?7—Wí_´…óB›»:=Ãïq`<8ñÓŒÑlú2d¬ê³£hÖ[l|$vÝro~'R®‰§°ñmY ͧäP |PUª¹·:3Œ[Û{Xÿ ºâ@‚W–Äé u‚ ¯´*=íή.pûÒdt @G‰¬ s¸ ëÉücr ÞæÑ¨Ê@>¤¢Ö±. Þ'¯°ÌME[YéïĵÂCå½ Ué©Áû'Ê9%eÔðNU”ë‘ÌsD3/®+UI˜9h.WC”빓$#:pz:YÓ ¿xž* ³$Í +$kñAŠ‹†¢ Uê>¸)_š¬÷©ßAÂÔb9ÇU ¯¾á•9¯ÏÏ÷O÷¼¼Fähal1‰3Ì[Ïr•´UCksNÐ] R‘¸¥H+§Šé†c©vÖÞ0iÓ76s†î!§=ß ¼~Ô'°Ãmäoäš³ªøi1úÉ)³yV8 CLÄØÁ‘WYïi€H6ÖÑiámø^ÈY´°Ñ7¥Û*—Ñ©L«Qƒï—Ùrÿ ›£Ð*š¸ˆL©ˆ$ˆ ÷¾D§9È®«qbqC)–ˆïv´çñsÑVT­Ø, <àïºÀO«Jý·õ àfPìð .wFšir´þ’2_Y *Æ€x\« ì€9š@ Ž|F⇥ˆkZ@hÖÄ0t¿-<“‹qµ¾*ZL¤Ú)&BJpÓF5=$„at*Zš$’ÑtdûÝRI1 2މ$€$I$#‰SÞ’Hë¬ï;Á$¡t$’`<(ñÇt)$‡Ð.Êf¢X’Kt=Éé$‚ˆªè¢oÝëòI%Rgcª÷ŠyI%¡‰ÿ !ñ)´õ $¤ Ô’IIGÿÙa 3g@sddlZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl m Z ddlmZmZz ddlZWneydZYn0Gddde jZe ejdkdGdd d e jZe ejdkd Gd d d e jZGd dde jZe ejdkdGddde jZe eeddGddde jZe ejdkdGddde jZe ejdkdGddde jZGddde jZ Gddde jZ!Gddde jZ"Gdd d e jZ#d!d"Z$e%d#kre &dS)$N)support)assert_python_ok spawn_pythonc@seZdZddZddZdS) GenericTestscCsttD]}tt|}|dvr.||tjq|dvrF||tjq|drj|dsj||tjq|dr||tj|t j dqdS)N>SIG_DFLSIG_IGN> SIG_UNBLOCK SIG_BLOCK SIG_SETMASKZSIGZSIG_ZCTRL_win32) dirsignalgetattrassertIsInstanceHandlersSigmasks startswithSignals assertEqualsysplatform)selfnamesigr//opt/python39/lib/python3.9/test/test_signal.py test_enumss   zGenericTests.test_enumscCs>ttD]0}tt|}t|rt|s||jdqdS)Nr )r r rinspectZ isroutineZ isbuiltinr __module__)rrvaluerrrtest_functions_module_attr$s  z'GenericTests.test_functions_module_attrN)__name__r __qualname__rr rrrrrs rr zNot valid on Windowsc@sZeZdZddZddZddZddZd d Zd d Zd dZ e e j dddZdS) PosixTestscGsdSNrrargsrrrtrivial_signal_handler/sz!PosixTests.trivial_signal_handlercCs8|ttjd|ttjd|j|ttjddS)Ni) assertRaises ValueErrorr getsignalr' strsignalrrrr,test_out_of_range_signal_number_raises_error2s  z7PosixTests.test_out_of_range_signal_number_raises_errorcCs|ttjtjddSr$)r( TypeErrorr SIGUSR1r,rrr0test_setting_signal_handler_to_none_raises_error:s z;PosixTests.test_setting_signal_handler_to_none_raises_errorcCsZttj|j}||tj|ttj|jttj||ttj|dSr$)r SIGHUPr'rrrr*)rZhuprrrtest_getsignal>szPosixTests.test_getsignalcCs@|dttj|dttj|dttjdS)NZ InterruptZ TerminatedZHangup)assertInr r+SIGINTSIGTERMr1r,rrrtest_strsignalFszPosixTests.test_strsignalcCs&tjt}tj|d}t|dS)Nzsignalinterproctester.py)ospathdirname__file__joinr)rr9Zscriptrrrtest_interprocess_signalLs z#PosixTests.test_interprocess_signalcCsdt}||t|tjj||tjj||d||tj || t |tj dSNr) r valid_signalsrsetr3rr4SIGALRM assertNotInNSIG assertLesslenrsrrrtest_valid_signalsQs  zPosixTests.test_valid_signalssys.executable required.cCs<tjtjddgtjd}|d|j||jt j dS)N-czaimport os, signal, time os.kill(os.getpid(), signal.SIGINT) for _ in range(999): time.sleep(0.01)stderrKeyboardInterrupt) subprocessrunr executablePIPEr3rKr returncoder r4)rprocessrrr!test_keyboard_interrupt_exit_codeZsz,PosixTests.test_keyboard_interrupt_exit_codeN)r!rr"r'r-r0r2r6r<rGunittest skipUnlessrrOrSrrrrr#-s r#zWindows specificc@s2eZdZddZddZeejdddZ dS) WindowsSignalTestscCsdt}||t|t|d|tjj|| d|| tj || t|tj dS)Nr) r r>rr?ZassertGreaterEqualrDr3rr4rArBrCrErrrrGns  z%WindowsSignalTests.test_valid_signalscCsdd}t}tjtjtjtjtjtjtjfD]0}t |dur.t|t||| |q.| || t td|Wdn1s0Y| t td|Wdn1s0YdS)NcSsdSr$r)xyrrryz3WindowsSignalTests.test_issue9324..)r?r SIGABRTZSIGBREAKSIGFPESIGILLr4SIGSEGVr5r*add assertTruer(r))rhandlercheckedrrrrtest_issue9324ws     * z!WindowsSignalTests.test_issue9324rHcCs<tjtjddgtjd}|d|jd}||j|dS)NrIzraise KeyboardInterruptrJrLl:) rMrNrrOrPr3rKrrQ)rrRZSTATUS_CONTROL_C_EXITrrrrSs z4WindowsSignalTests.test_keyboard_interrupt_exit_codeN) r!rr"rGrfrTrUrrOrSrrrrrVks  rVc@sNeZdZddZddZddZddZd d Ze e j d kd d dZ dS) WakeupFDTestscCst|ttjtjdWdn1s.0Y|tttjdWdn1sf0YdS)N)signumF)r(r.r set_wakeup_fdr4r,rrrtest_invalid_calls , zWakeupFDTests.test_invalid_callcCs t}|ttftj|dSr$)rZ make_bad_fdr(r)OSErrorr ri)rfdrrrtest_invalid_fds zWakeupFDTests.test_invalid_fdcCs0t}|}||ttftj|dSr$)socketfilenocloser(r)rkr ri)rsockrlrrrtest_invalid_sockets  z!WakeupFDTests.test_invalid_socketcCst\}}|tj||tj|t\}}|tj||tj|ttdrrt|dt|dt||t|||td||tdddS)N set_blockingFr\) r7pipe addCleanuprphasattrrsr rir)rZr1Zw1Zr2Zw2rrrtest_set_wakeup_fd_results      z'WakeupFDTests.test_set_wakeup_fd_resultcCst}||j|d|}t}||j|d|}t||t|||td||tdddS)NFr\)rnrurp setblockingror rir)rZsock1fd1Zsock2fd2rrr test_set_wakeup_fd_socket_results     z.WakeupFDTests.test_set_wakeup_fd_socket_resultr ztests specific to POSIXcCst\}}|tj||tj|t|d|t}t|Wdn1s^0Y| t |j d|t|dt|tddS)NTz&the fd %s must be in non-blocking modeFr\) r7rtrurprsr(r)r rirstr exception)rZrfdZwfdcmrrrtest_set_wakeup_fd_blockings   (   z)WakeupFDTests.test_set_wakeup_fd_blockingN) r!rr"rjrmrrrwr{rTskipIfrrrrrrrrgs rgc@steZdZeedudddddZeedudddZd d Zd d Z d dZ e e e ddddZdS)WakeupSignalTestsNneed _testcapiTorderedcGs&dttt|||}td|dS)Naif 1: import _testcapi import os import signal import struct signals = {!r} def handler(signum, frame): pass def check_signum(signals): data = os.read(read, len(signals)+1) raised = struct.unpack('%uB' % len(data), data) if not {!r}: raised = set(raised) signals = set(signals) if raised != signals: raise Exception("%r != %r" % (raised, signals)) {} signal.signal(signal.SIGALRM, handler) read, write = os.pipe() os.set_blocking(write, False) signal.set_wakeup_fd(write) test() check_signum(signals) os.close(read) os.close(write) rI)formattuplemapintr)rZ test_bodyrZsignalscoderrr check_wakeups "zWakeupSignalTests.check_wakeupc Cs|d}t\}}zFzt|dWnty4Yn 0|dWt|t|nt|t|0td|dS)Na&if 1: import _testcapi import errno import os import signal import sys from test.support import captured_stderr def handler(signum, frame): 1/0 signal.signal(signal.SIGALRM, handler) r, w = os.pipe() os.set_blocking(r, False) # Set wakeup_fd a read-only file descriptor to trigger the error signal.set_wakeup_fd(r) try: with captured_stderr() as err: signal.raise_signal(signal.SIGALRM) except ZeroDivisionError: # An ignored exception should have been printed out on stderr err = err.getvalue() if ('Exception ignored when trying to write to the signal wakeup fd' not in err): raise AssertionError(err) if ('OSError: [Errno %d]' % errno.EBADF) not in err: raise AssertionError(err) else: raise AssertionError("ZeroDivisionError not raised") os.close(r) os.close(w) xz9OS doesn't report write() error on the read end of a piperI)r7rtwriterkskipTestrpr)rrrwrrrtest_wakeup_write_errors"      z)WakeupSignalTests.test_wakeup_write_errorcCs|dtjdS)Nadef test(): import select import time TIMEOUT_FULL = 10 TIMEOUT_HALF = 5 class InterruptSelect(Exception): pass def handler(signum, frame): raise InterruptSelect signal.signal(signal.SIGALRM, handler) signal.alarm(1) # We attempt to get a signal during the sleep, # before select is called try: select.select([], [], [], TIMEOUT_FULL) except InterruptSelect: pass else: raise Exception("select() was not interrupted") before_time = time.monotonic() select.select([read], [], [], TIMEOUT_FULL) after_time = time.monotonic() dt = after_time - before_time if dt >= TIMEOUT_HALF: raise Exception("%s >= %s" % (dt, TIMEOUT_HALF)) rr r@r,rrrtest_wakeup_fd_earlyEsz&WakeupSignalTests.test_wakeup_fd_earlycCs|dtjdS)Na`def test(): import select import time TIMEOUT_FULL = 10 TIMEOUT_HALF = 5 class InterruptSelect(Exception): pass def handler(signum, frame): raise InterruptSelect signal.signal(signal.SIGALRM, handler) signal.alarm(1) before_time = time.monotonic() # We attempt to get a signal during the select call try: select.select([read], [], [], TIMEOUT_FULL) except InterruptSelect: pass else: raise Exception("select() was not interrupted") after_time = time.monotonic() dt = after_time - before_time if dt >= TIMEOUT_HALF: raise Exception("%s >= %s" % (dt, TIMEOUT_HALF)) rr,rrrtest_wakeup_fd_duringgsz'WakeupSignalTests.test_wakeup_fd_duringcCs|dtjtjdS)Nzdef test(): signal.signal(signal.SIGUSR1, handler) signal.raise_signal(signal.SIGUSR1) signal.raise_signal(signal.SIGALRM) )rr r/r@r,rrr test_signumszWakeupSignalTests.test_signumpthread_sigmaskneed signal.pthread_sigmask()cCs|jdtjtjdddS)Nadef test(): signum1 = signal.SIGUSR1 signum2 = signal.SIGUSR2 signal.signal(signum1, handler) signal.signal(signum2, handler) signal.pthread_sigmask(signal.SIG_BLOCK, (signum1, signum2)) signal.raise_signal(signum1) signal.raise_signal(signum2) # Unblocking the 2 signals calls the C signal handler twice signal.pthread_sigmask(signal.SIG_UNBLOCK, (signum1, signum2)) Fr)rr r/SIGUSR2r,rrr test_pendings zWakeupSignalTests.test_pending)r!rr"rTr _testcapirrrrrrUrvr rrrrrrs& 3" r socketpairzneed socket.socketpairc@sTeZdZeedudddZeedudddZeedudddZdS) WakeupSocketSignalTestsNrcCsd}td|dS)Naif 1: import signal import socket import struct import _testcapi signum = signal.SIGINT signals = (signum,) def handler(signum, frame): pass signal.signal(signum, handler) read, write = socket.socketpair() write.setblocking(False) signal.set_wakeup_fd(write.fileno()) signal.raise_signal(signum) data = read.recv(1) if not data: raise Exception("no signum written") raised = struct.unpack('B', data) if raised != signals: raise Exception("%r != %r" % (raised, signals)) read.close() write.close() rIrrrrrr test_socketsz#WakeupSocketSignalTests.test_socketcCs.tjdkrd}nd}dj|d}td|dS)Nntsendra+if 1: import errno import signal import socket import sys import time import _testcapi from test.support import captured_stderr signum = signal.SIGINT def handler(signum, frame): pass signal.signal(signum, handler) read, write = socket.socketpair() read.setblocking(False) write.setblocking(False) signal.set_wakeup_fd(write.fileno()) # Close sockets: send() will fail read.close() write.close() with captured_stderr() as err: signal.raise_signal(signum) err = err.getvalue() if ('Exception ignored when trying to {action} to the signal wakeup fd' not in err): raise AssertionError(err) actionrIr7rrrrrrrrrtest_send_errors !"z'WakeupSocketSignalTests.test_send_errorcCs.tjdkrd}nd}dj|d}td|dS)Nrrra if 1: import errno import signal import socket import sys import time import _testcapi from test.support import captured_stderr signum = signal.SIGINT # This handler will be called, but we intentionally won't read from # the wakeup fd. def handler(signum, frame): pass signal.signal(signum, handler) read, write = socket.socketpair() # Fill the socketpair buffer if sys.platform == 'win32': # bpo-34130: On Windows, sometimes non-blocking send fails to fill # the full socketpair buffer, so use a timeout of 50 ms instead. write.settimeout(0.050) else: write.setblocking(False) # Start with large chunk size to reduce the # number of send needed to fill the buffer. written = 0 for chunk_size in (2 ** 16, 2 ** 8, 1): chunk = b"x" * chunk_size try: while True: write.send(chunk) written += chunk_size except (BlockingIOError, socket.timeout): pass print(f"%s bytes written into the socketpair" % written, flush=True) write.setblocking(False) try: write.send(b"x") except BlockingIOError: # The socketpair buffer seems full pass else: raise AssertionError("%s bytes failed to fill the socketpair " "buffer" % written) # By default, we get a warning when a signal arrives msg = ('Exception ignored when trying to {action} ' 'to the signal wakeup fd') signal.set_wakeup_fd(write.fileno()) with captured_stderr() as err: signal.raise_signal(signum) err = err.getvalue() if msg not in err: raise AssertionError("first set_wakeup_fd() test failed, " "stderr: %r" % err) # And also if warn_on_full_buffer=True signal.set_wakeup_fd(write.fileno(), warn_on_full_buffer=True) with captured_stderr() as err: signal.raise_signal(signum) err = err.getvalue() if msg not in err: raise AssertionError("set_wakeup_fd(warn_on_full_buffer=True) " "test failed, stderr: %r" % err) # But not if warn_on_full_buffer=False signal.set_wakeup_fd(write.fileno(), warn_on_full_buffer=False) with captured_stderr() as err: signal.raise_signal(signum) err = err.getvalue() if err != "": raise AssertionError("set_wakeup_fd(warn_on_full_buffer=False) " "test failed, stderr: %r" % err) # And then check the default again, to make sure warn_on_full_buffer # settings don't leak across calls. signal.set_wakeup_fd(write.fileno()) with captured_stderr() as err: signal.raise_signal(signum) err = err.getvalue() if msg not in err: raise AssertionError("second set_wakeup_fd() test failed, " "stderr: %r" % err) rrIrrrrrtest_warn_on_full_buffers cdz0WakeupSocketSignalTests.test_warn_on_full_buffer) r!rr"rTrrrrrrrrrrs  # *rc@s,eZdZddZddZddZddZd S) SiginterruptTestc Csd|f}td|}z |j}|jtjd\}}Wn*tjy`|YWddS0||}| }|dvrt d||f|dkWdSWdn1s0YdS)Naif 1: import errno import os import signal import sys interrupt = %r r, w = os.pipe() def handler(signum, frame): 1 / 0 signal.signal(signal.SIGALRM, handler) if interrupt is not None: signal.siginterrupt(signal.SIGALRM, interrupt) print("ready") sys.stdout.flush() # run the test twice try: for loop in range(2): # send a SIGALRM in a second (during the read) signal.alarm(1) try: # blocking call: read from a pipe without data os.read(r, 1) except ZeroDivisionError: pass else: sys.exit(2) sys.exit(3) finally: os.close(r) os.close(w) rI)timeoutF)zChild error (exit code %s): %rr) rstdoutreadline communicater SHORT_TIMEOUTrMTimeoutExpiredkillwait Exception)rZ interruptrrRZ first_linerrKexitcoderrrreadpipe_interruptedas"#$  z%SiginterruptTest.readpipe_interruptedcCs|d}||dSr$rrcrZ interruptedrrrtest_without_siginterrupts z*SiginterruptTest.test_without_siginterruptcCs|d}||dSNTrrrrrtest_siginterrupt_ons z%SiginterruptTest.test_siginterrupt_oncCs|d}||dS)NF)rZ assertFalserrrrtest_siginterrupt_offs z&SiginterruptTest.test_siginterrupt_offN)r!rr"rrrrrrrrr^s<rc@sneZdZddZddZddZddZd d Zd d Zd dZ e e j dvdddZddZddZdS) ItimerTestcCs(d|_d|_d|_ttj|j|_dS)NFr) hndl_called hndl_countitimerr r@sig_alrm old_alarmr,rrrsetUpszItimerTest.setUpcCs,ttj|j|jdur(t|jddSr=)r r@rr setitimerr,rrrtearDowns zItimerTest.tearDowncGs d|_dSr)rr%rrrrszItimerTest.sig_alrmcGsFd|_|jdkrtdn|jdkr4ttjd|jd7_dS)NTrz.setitimer didn't disable ITIMER_VIRTUAL timer.r)rrr ItimerErrorrITIMER_VIRTUALr%rrr sig_vtalrms    zItimerTest.sig_vtalrmcGsd|_ttjddS)NTr)rr r ITIMER_PROFr%rrrsig_profszItimerTest.sig_profcCs|tjtjdddS)Nr\r)r(r rrr,rrrtest_itimer_excszItimerTest.test_itimer_exccCs0tj|_t|jdt||jddS)Ng?T)r ITIMER_REALrrpauserrr,rrrtest_itimer_realszItimerTest.test_itimer_real)Znetbsd5zDitimer not reliable (does not mix well with threading) on some BSDs.cCstj|_ttj|jt|jddt}t|dkr`tddd}t |jdkr0qjq0| d| t |jd| |j d dS) Ng333333?皙?N@902 铖r8timeout: likely cause: machine too slow or load too highT) r rr SIGVTALRMrrtime monotonicpow getitimerrrrrZ start_time_rrrtest_itimer_virtuals  zItimerTest.test_itimer_virtualcCstj|_ttj|jt|jddt}t|dkr`tddd}t |jdkr0qjq0| d| t |jd| |j ddS) NrrrrrrrT) r rrSIGPROFrrrrrrrrrrrrrtest_itimer_profs  zItimerTest.test_itimer_profcCs2tj|_t|jdtd||jddS)Nư>rT)r rrrrsleeprrr,rrrtest_setitimer_tinys zItimerTest.test_setitimer_tinyN)r!rr"rrrrrrrrTrrrrrrrrrrrs    rc@seZdZeeeddddZeeeddeeeddddZeeed d d d Z eeeddd dZ eeeddddZ eeeddddZ eeeddddZ eeeddddZeeeddddZeeedddd Zeeeddeeeddd!d"Zeeeddd#d$Zeeeddd%d&Zeeeddd'd(Zeeed d d)d*Zd+S),PendingSignalsTests sigpendingzneed signal.sigpending()cCs|ttdSr$)rr rr?r,rrrtest_sigpending_emptysz)PendingSignalsTests.test_sigpending_emptyrrcCsd}td|dS)Na if 1: import os import signal def handler(signum, frame): 1/0 signum = signal.SIGUSR1 signal.signal(signum, handler) signal.pthread_sigmask(signal.SIG_BLOCK, [signum]) os.kill(os.getpid(), signum) pending = signal.sigpending() for sig in pending: assert isinstance(sig, signal.Signals), repr(pending) if pending != {signum}: raise Exception('%s != {%s}' % (pending, signum)) try: signal.pthread_sigmask(signal.SIG_UNBLOCK, [signum]) except ZeroDivisionError: pass else: raise Exception("ZeroDivisionError not raised") rIrrrrrtest_sigpending#sz#PendingSignalsTests.test_sigpending pthread_killzneed signal.pthread_kill()cCsd}td|dS)Naif 1: import signal import threading import sys signum = signal.SIGUSR1 def handler(signum, frame): 1/0 signal.signal(signum, handler) tid = threading.get_ident() try: signal.pthread_kill(tid, signum) except ZeroDivisionError: pass else: raise Exception("ZeroDivisionError not raised") rIrrrrrtest_pthread_killBsz%PendingSignalsTests.test_pthread_killcCsd||f}td|dS)Nawif 1: import signal import sys from signal import Signals def handler(signum, frame): 1/0 %s blocked = %s signum = signal.SIGALRM # child: block and wait the signal try: signal.signal(signum, handler) signal.pthread_sigmask(signal.SIG_BLOCK, [blocked]) # Do the tests test(signum) # The handler must not be called on unblock try: signal.pthread_sigmask(signal.SIG_UNBLOCK, [blocked]) except ZeroDivisionError: print("the signal handler has been called", file=sys.stderr) sys.exit(1) except BaseException as err: print("error: {}".format(err), file=sys.stderr) sys.stderr.flush() sys.exit(1) rI)stripr)rZblockedtestrrrr wait_helper[s %zPendingSignalsTests.wait_helpersigwaitzneed signal.sigwait()cCs|tjddS)Na  def test(signum): signal.alarm(1) received = signal.sigwait([signum]) assert isinstance(received, signal.Signals), received if received != signum: raise Exception('received %s, not %s' % (received, signum)) rr r@r,rrr test_sigwaitsz PendingSignalsTests.test_sigwait sigwaitinfozneed signal.sigwaitinfo()cCs|tjddS)Nz def test(signum): signal.alarm(1) info = signal.sigwaitinfo([signum]) if info.si_signo != signum: raise Exception("info.si_signo != %s" % signum) rr,rrrtest_sigwaitinfosz$PendingSignalsTests.test_sigwaitinfo sigtimedwaitzneed signal.sigtimedwait()cCs|tjddS)Nz def test(signum): signal.alarm(1) info = signal.sigtimedwait([signum], 10.1000) if info.si_signo != signum: raise Exception('info.si_signo != %s' % signum) rr,rrrtest_sigtimedwaitsz%PendingSignalsTests.test_sigtimedwaitcCs|tjddS)Nz def test(signum): import os os.kill(os.getpid(), signum) info = signal.sigtimedwait([signum], 0) if info.si_signo != signum: raise Exception('info.si_signo != %s' % signum) rr,rrrtest_sigtimedwait_pollsz*PendingSignalsTests.test_sigtimedwait_pollcCs|tjddS)Nz def test(signum): received = signal.sigtimedwait([signum], 1.0) if received is not None: raise Exception("received=%r" % (received,)) rr,rrrtest_sigtimedwait_timeoutsz-PendingSignalsTests.test_sigtimedwait_timeoutcCstj}|ttj|gddS)Ng)r r@r(r)r)rrhrrr"test_sigtimedwait_negative_timeoutsz6PendingSignalsTests.test_sigtimedwait_negative_timeoutcCstdddS)NrIaif True: import os, threading, sys, time, signal # the default handler terminates the process signum = signal.SIGUSR1 def kill_later(): # wait until the main thread is waiting in sigwait() time.sleep(1) os.kill(os.getpid(), signum) # the signal must be blocked by all the threads signal.pthread_sigmask(signal.SIG_BLOCK, [signum]) killer = threading.Thread(target=kill_later) killer.start() received = signal.sigwait([signum]) if received != signum: print("sigwait() received %s, not %s" % (received, signum), file=sys.stderr) sys.exit(1) killer.join() # unblock the signal, which should have been cleared by sigwait() signal.pthread_sigmask(signal.SIG_UNBLOCK, [signum]) rr,rrrtest_sigwait_threads z'PendingSignalsTests.test_sigwait_threadcCs|ttj|ttjd|ttjddd|ttjdg|t"ttjtjgWdn1sv0Y|t ttjdgWdn1s0Y|t$ttjdd>gWdn1s0YdS)Nrrriri)r(r.r rrkr)r rBr,rrrtest_pthread_sigmask_argumentss 0 . z2PendingSignalsTests.test_pthread_sigmask_argumentscCsJttjt}|tjtj|ttjt}||tdSr$)r rr r>rur rZassertLessEqualrErrr"test_pthread_sigmask_valid_signalssz6PendingSignalsTests.test_pthread_sigmask_valid_signalscCsd}td|dS)Na- if 1: import signal import os; import threading def handler(signum, frame): 1/0 def kill(signum): os.kill(os.getpid(), signum) def check_mask(mask): for sig in mask: assert isinstance(sig, signal.Signals), repr(sig) def read_sigmask(): sigmask = signal.pthread_sigmask(signal.SIG_BLOCK, []) check_mask(sigmask) return sigmask signum = signal.SIGUSR1 # Install our signal handler old_handler = signal.signal(signum, handler) # Unblock SIGUSR1 (and copy the old mask) to test our signal handler old_mask = signal.pthread_sigmask(signal.SIG_UNBLOCK, [signum]) check_mask(old_mask) try: kill(signum) except ZeroDivisionError: pass else: raise Exception("ZeroDivisionError not raised") # Block and then raise SIGUSR1. The signal is blocked: the signal # handler is not called, and the signal is now pending mask = signal.pthread_sigmask(signal.SIG_BLOCK, [signum]) check_mask(mask) kill(signum) # Check the new mask blocked = read_sigmask() check_mask(blocked) if signum not in blocked: raise Exception("%s not in %s" % (signum, blocked)) if old_mask ^ blocked != {signum}: raise Exception("%s ^ %s != {%s}" % (old_mask, blocked, signum)) # Unblock SIGUSR1 try: # unblock the pending signal calls immediately the signal handler signal.pthread_sigmask(signal.SIG_UNBLOCK, [signum]) except ZeroDivisionError: pass else: raise Exception("ZeroDivisionError not raised") try: kill(signum) except ZeroDivisionError: pass else: raise Exception("ZeroDivisionError not raised") # Check the new mask unblocked = read_sigmask() if signum in unblocked: raise Exception("%s in %s" % (signum, unblocked)) if blocked ^ unblocked != {signum}: raise Exception("%s ^ %s != {%s}" % (blocked, unblocked, signum)) if old_mask != unblocked: raise Exception("%s != %s" % (old_mask, unblocked)) rIrrrrrtest_pthread_sigmasksHz(PendingSignalsTests.test_pthread_sigmaskcCs^d}td|<}|\}}|}|dkrfddt tdD}t |}t j rtd |f|S) Ncs,tkr(tttjddS)Nr)rDappendr perf_counterr rrrhframeNtimesrrrdws z5StressTest.measure_itimer_resolution..handlerrgMbP?cs g|]}|d|qS)rr).0i)rrr r[z8StressTest.measure_itimer_resolution..rz,detected median itimer() resolution: %.6f s.)NN)rur rrrr@rDrrrange statisticsZmedianrverboseprint)rrdZ durationsZmedrrrmeasure_itimer_resolutionss   z$StressTest.measure_itimer_resolutioncCs4|}|dkrdS|dkr dS|d|fdS)Ng-C6?i'g{Gz?dz^detected itimer resolution (%.3f s.) too high (> 10 ms.) on this platform (or system too busy))r r)rZresorrrdecide_itimer_countszStressTest.decide_itimer_countrztest needs setitimer()cs|}gdd}d fdd }|tj||tj||tj|d}ttj }||krt t tj|d7}t |krt|krtdqt t tj|d7}t |kr^t|kr^tdqq^|t |ddS) NcSsttjdtddS)Nrh㈵>)r rrrandomrrrr first_handlersz@StressTest.test_stress_delivery_dependent..first_handlercs|dSr$rrZsigsrrsecond_handlerszAStressTest.test_stress_delivery_dependent..second_handlerrrrSome signals were lost)NN)rrr rr/r@rrrrr7rgetpidrDrr)rrrr expected_sigsdeadlinerrrtest_stress_delivery_dependents& z)StressTest.test_stress_delivery_dependentcs|}gfdd}|tj||tj|d}ttj}||krt tj dt dt t tj|d7}t|krFt|krFtdqqF|t|ddS)Ncs|dSr$rrrrrrdsz=StressTest.test_stress_delivery_simultaneous..handlerrrrrr)rrr r/r@rrrrrrrr7rrrDrr)rrrdrrrrr!test_stress_delivery_simultaneouss z,StressTest.test_stress_delivery_simultaneousr/ztest needs SIGUSR1cs&tjdddfddfdd}fdd}t}|tj|tj|d }zd}td}||d ||j dur| |j j t | d d t|j j d }Wdn1s0Y|s|d|Wd |nd |0dS) NrFcs d7dSNrrr)num_received_signalsrrcustom_handlerszAStressTest.test_stress_modifying_handlers..custom_handlercsstd7qdSr)r raise_signalr)do_stopnum_sent_signalsrhrrset_interruptss zAStressTest.test_stress_modifying_handlers..set_interruptscs8dkr4tdD] }tjfD]}t|qqqdS)Nri N)r r r)rrd)rr!rhrrcycle_handlerss zAStressTest.test_stress_modifying_handlers..cycle_handlers)targetTzSignal z ignored due to race condition)r r/ru threadingThreadrZcatch_unraisable_exceptionstartr;Z unraisabler exc_valuerkr3r|Z assertGreaterrC)rr"r#rtZignoredr~r)rr rr!rhrtest_stress_modifying_handlerss>       "  z)StressTest.test_stress_modifying_handlersN) r!rr"rr rrTrUrvr rrr*rrrrrhs  ,   rc@s6eZdZddZeejdkdddZddZ d S) RaiseSignalTestcCs:|tttjWdn1s,0YdSr$)r(KeyboardInterruptr rr4r,rrr test_sigint%s zRaiseSignalTest.test_sigintr zWindows specific testc CsVzd}t||dWn4tyP}z|jtjkr:nWYd}~n d}~00dS)Nrz#OSError (Invalid argument) expected)r rZfailrkerrnoEINVAL)rr1errrtest_invalid_argument)s  z%RaiseSignalTest.test_invalid_argumentcsJdfdd}ttj|}|tjtj|ttj|dS)NFcsddSrr)abZis_okrrrd7sz-RaiseSignalTest.test_handler..handler)r r4rurrc)rrdZ old_signalrr4r test_handler5s   zRaiseSignalTest.test_handlerN) r!rr"r-rTrrrr1r5rrrrr+#s r+c@s&eZdZeeeddddZdS)PidfdSignalTestpidfd_send_signalzpidfd support not built incCs |t}tdtjWdn1s.0Y|jjtjkrR|dn|jjtj krj|d| |jjtj t dt t j}|t j||td$t|tjtdWdn1s0Y|tt|tjWdn1s0YdS)Nrzkernel does not support pidfdsz"Not enough privileges to use pidfsz/proc/z^siginfo must be None$)r(rkr r7r4r}r.ZENOSYSrEPERMrEBADFr7openr O_DIRECTORYrurpZassertRaisesRegexr.objectr,)rr~Zmy_pidfdrrrtest_pidfd_send_signalCs ,  2 z&PidfdSignalTest.test_pidfd_send_signalN)r!rr"rTrUrvr r=rrrrr6As r6cCs tdSr$)r reap_childrenrrrrtearDownModuleVsr?__main__)'r.rr7rr rnr rMrr%rrTrrZtest.support.script_helperrrr ImportErrorZTestCaserrrr#rUrVrgrrvrrrrrr+r6r?r!mainrrrrsV    =/M6@TeQ<