(original) (raw)

%!PS-Adobe-2.0 %%Creator: dvips(k) 5.86 Copyright 1999 Radical Eye Software %%Title: main.dvi %%Pages: 6 %%PageOrder: Ascend %%BoundingBox: 0 0 612 792 %%EndComments %DVIPSWebPage: (www.radicaleye.com) %DVIPSCommandLine: dvips -o main.ps -t letter main %DVIPSParameters: dpi=600, compressed %DVIPSSource: TeX output 2004.08.01:1428 %%BeginProcSet: texc.pro %! /TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S N}B/A{dup}B/TR{translate}N/isls false N/vsize 11 72 mul N/hsize 8.5 72 mul N/landplus90{false}def/@rigin{isls{[0 landplus90{1 -1}{-1 1}ifelse 0 0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{ landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR[ matrix currentmatrix{A A round sub abs 0.00001 lt{round}if}forall round exch round exch]setmatrix}N/@landscape{/isls true N}B/@manualfeed{ statusdict/manualfeed true put}B/@copies{/#copies X}B/FMat[1 0 0 -1 0 0] N/FBB[0 0 0 0]N/nn 0 N/IEn 0 N/ctr 0 N/df-tail{/nn 8 dict N nn begin /FontType 3 N/FontMatrix fntrx N/FontBBox FBB N string/base X array /BitMaps X/BuildChar{CharBuilder}N/Encoding IEn N end A{/foo setfont}2 array copy cvx N load 0 nn put/ctr 0 N[}B/sf 0 N/df{/sf 1 N/fntrx FMat N df-tail}B/dfs{div/sf X/fntrx[sf 0 0 sf neg 0 0]N df-tail}B/E{pop nn A definefont setfont}B/Cw{Cd A length 5 sub get}B/Ch{Cd A length 4 sub get }B/Cx{128 Cd A length 3 sub get sub}B/Cy{Cd A length 2 sub get 127 sub} B/Cdx{Cd A length 1 sub get}B/Ci{Cd A type/stringtype ne{ctr get/ctr ctr 1 add N}if}B/id 0 N/rw 0 N/rc 0 N/gp 0 N/cp 0 N/G 0 N/CharBuilder{save 3 1 roll S A/base get 2 index get S/BitMaps get S get/Cd X pop/ctr 0 N Cdx 0 Cx Cy Ch sub Cx Cw add Cy setcachedevice Cw Ch true[1 0 0 -1 -.1 Cx sub Cy .1 sub]/id Ci N/rw Cw 7 add 8 idiv string N/rc 0 N/gp 0 N/cp 0 N{ rc 0 ne{rc 1 sub/rc X rw}{G}ifelse}imagemask restore}B/G{{id gp get/gp gp 1 add N A 18 mod S 18 idiv pl S get exec}loop}B/adv{cp add/cp X}B /chg{rw cp id gp 4 index getinterval putinterval A gp add/gp X adv}B/nd{ /cp 0 N rw exit}B/lsh{rw cp 2 copy get A 0 eq{pop 1}{A 255 eq{pop 254}{ A A add 255 and S 1 and or}ifelse}ifelse put 1 adv}B/rsh{rw cp 2 copy get A 0 eq{pop 128}{A 255 eq{pop 127}{A 2 idiv S 128 and or}ifelse} ifelse put 1 adv}B/clr{rw cp 2 index string putinterval adv}B/set{rw cp fillstr 0 4 index getinterval putinterval adv}B/fillstr 18 string 0 1 17 {2 copy 255 put pop}for N/pl[{adv 1 chg}{adv 1 chg nd}{1 add chg}{1 add chg nd}{adv lsh}{adv lsh nd}{adv rsh}{adv rsh nd}{1 add adv}{/rc X nd}{ 1 add set}{1 add clr}{adv 2 chg}{adv 2 chg nd}{pop nd}]A{bind pop} forall N/D{/cc X A type/stringtype ne{]}if nn/base get cc ctr put nn /BitMaps get S ctr S sf 1 ne{A A length 1 sub A 2 index S get sf div put }if put/ctr ctr 1 add N}B/I{cc 1 add D}B/bop{userdict/bop-hook known{ bop-hook}if/SI save N @rigin 0 0 moveto/V matrix currentmatrix A 1 get A mul exch 0 get A mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N/eop{ SI restore userdict/eop-hook known{eop-hook}if showpage}N/@start{ userdict/start-hook known{start-hook}if pop/VResolution X/Resolution X 1000 div/DVImag X/IEn 256 array N 2 string 0 1 255{IEn S A 360 add 36 4 index cvrs cvn put}for pop 65781.76 div/vsize X 65781.76 div/hsize X}N /p{show}N/RMat[1 0 0 -1 0 0]N/BDot 260 string N/Rx 0 N/Ry 0 N/V{}B/RV/v{ /Ry X/Rx X V}B statusdict begin/product where{pop false[(Display)(NeXT) (LaserWriter 16/600)]{A length product length le{A length product exch 0 exch getinterval eq{pop true exit}if}{pop}ifelse}forall}{false}ifelse end{{gsave TR -.1 .1 TR 1 1 scale Rx Ry false RMat{BDot}imagemask grestore}}{{gsave TR -.1 .1 TR Rx Ry scale 1 1 false RMat{BDot} imagemask grestore}}ifelse B/QV{gsave newpath transform round exch round exch itransform moveto Rx 0 rlineto 0 Ry neg rlineto Rx neg 0 rlineto fill grestore}B/a{moveto}B/delta 0 N/tail{A/delta X 0 rmoveto}B/M{S p delta add tail}B/b{S p tail}B/c{-4 M}B/d{-3 M}B/e{-2 M}B/f{-1 M}B/g{0 M} B/h{1 M}B/i{2 M}B/j{3 M}B/k{4 M}B/w{0 rmoveto}B/l{p -4 w}B/m{p -3 w}B/n{ p -2 w}B/o{p -1 w}B/q{p 1 w}B/r{p 2 w}B/s{p 3 w}B/t{p 4 w}B/x{0 S rmoveto}B/y{3 2 roll p a}B/bos{/SS save N}B/eos{SS restore}B end %%EndProcSet TeXDict begin 40258431 52099146 1000 600 600 (main.dvi) @start %DVIPSBitmapFont: Fa cmmi10 10 1 /Fa 1 116 df<14FF010313C090380F80F090383E00380178131C153C4913FC00011301 13E0A33903F000F06D13007F3801FFE014FC14FF6C14806D13C0011F13E013039038003F F014071403001E1301127FA24814E0A348EB03C012F800E0EB07800070EB0F006C133E00 1E13F83807FFE0000190C7FC1E267CA427>115 D E %EndDVIPSBitmapFont %DVIPSBitmapFont: Fb cmtt10 10 46 /Fb 46 122 df<003C131E007F137F481480A66C1400A6007E7FA6003E133EA3003C131E 001C131C191977B32C>34 D<143814FC13011303EB07F8EB0FF0EB1FC0EB3F80EB7F0013 FE485A485A5B12075B120F5B485AA2123F90C7FCA25A127EA312FE5AAC7E127EA3127F7E A27F121FA26C7E7F12077F12037F6C7E6C7E137FEB3F80EB1FC0EB0FF0EB07F8EB03FC13 0113001438164272B92C>40 D<127012FC7E7E6C7E6C7EEA0FE06C7E6C7E6C7E6C7E137F 7F1480131F14C0130FEB07E0A214F01303A214F81301A314FC1300AC130114F8A3130314 F0A2130714E0A2EB0FC0131F1480133F14005B13FE485A485A485A485AEA3FC0485A48C7 FC5A5A1270164279B92C>I44 D<007FB6FCB71280A46C150021067B9B2C>I<121FEA3F80EA7FC0EAFFE0A5EA7FC0EA3F 80EA1F000B0B708A2C>I<1507ED0F80151FA2153F16005D157E15FE5D14015D14035DA2 14075D140F5D141F5D143F92C7FC5C147E14FE5CA213015C13035C13075C130F5C131F5C A2133F91C8FC5B137E13FE5B12015B12035B12075BA2120F5B121F5B123F90C9FC5A127E 12FE5AA25A127821417BB92C>I<121FEA3F80EA7FC0EAFFE0A5EA7FC0EA3F80EA1F00C7 FCAE121FEA3F80EA7FC0EAFFE0A5EA7FC0EA3F80EA1F000B2470A32C>58 D<007FB612F0B712F8A4003F15F0CAFCA8003FB612F0B712F8A46C15F025147DA22C>61 D<14FE497EA4497FA214EFA2130781A214C7A2010F7FA314C390381F83F0A590383F01F8 A490387E00FCA549137E90B512FEA34880A29038F8003FA34848EB1F80A4000715C04913 0FD87FFEEBFFFC6D5AB514FE6C15FC497E27347EB32C>65 D<007FB612F0B712F8A37E39 03F00001A7ED00F01600A4EC01E04A7EA490B5FCA5EBF003A46E5A91C8FCA5163C167EA8 007FB612FEB7FCA36C15FC27337EB22C>69 D<903901FC038090390FFF87C04913EF017F 13FF90B6FC4813073803FC01497E4848137F4848133F49131F121F5B003F140F90C7FCA2 127EED078092C7FCA212FE5AA8913803FFF84A13FCA27E007E6D13F89138000FC0A36C14 1FA27F121F6D133F120F6D137F6C7E6C6C13FF6D5A3801FF076C90B5FC6D13EF011F13CF 6DEB0780D901FCC7FC26357DB32C>71 D<007FB512F8B612FCA36C14F839000FC000B3B3 A5007FB512F8B612FCA36C14F81E3379B22C>73 D75 D<387FFFE0B57EA36C5BD803F0C8FCB3AE16F0ED01F8A8007FB6 FCB7FCA36C15F025337DB22C>IIII<387FFFFCB67E15E015F86C803907 E007FE1401EC007F6F7E151FA26F7EA64B5AA2153F4BC7FCEC01FE140790B55A5D15E081 819038E007FCEC01FE1400157F81A8160FEE1F80A5D87FFEEB1FBFB5ECFF00815E6C486D 5AC8EA01F029347EB22C>82 D<90381FF80790B5EA0F804814CF000714FF5A381FF01F38 3FC003497E48C7FC007E147F00FE143F5A151FA46CEC0F00007E91C7FC127F7FEA3FE0EA 1FFCEBFFC06C13FC0003EBFFC06C14F06C6C7F01077F9038007FFEEC07FF02001380153F ED1FC0A2ED0FE0A20078140712FCA56CEC0FC0A26CEC1F806D133F01E0EB7F009038FE01 FF90B55A5D00F914F0D8F83F13C0D8700790C7FC23357CB32C>I<007FB612FCB712FEA4 3AFC007E007EA70078153CC71400B3AF90383FFFFCA2497F6D5BA227337EB22C>I87 D<3801FFF0000713FE001F6D7E15E048809038C01FF81407EC01FC381F80000006C77EC8 127EA3ECFFFE131F90B5FC1203120F48EB807E383FF800EA7FC090C7FC12FE5AA47E007F 14FEEB8003383FE01F6CB612FC6C15FE6C14BF0001EBFE1F3A003FF007FC27247CA32C> 97 DI<903803FFE0011F13F8017F13FE48B5FC48804848C6FCEA0FF0485A49137E 4848131890C9FC5A127EA25AA8127EA2127F6C140F6DEB1F806C7E6D133F6C6CEB7F0039 07FE03FF6CB55A6C5C6C6C5B011F13E0010390C7FC21247AA32C>IIIIII< 1307EB1FC0A2497EA36D5AA20107C7FC90C8FCA7387FFFC080B5FC7EA2EA0007B3A8007F B512FCB612FEA36C14FC1F3479B32C>I<140EEC3F80A2EC7FC0A3EC3F80A2EC0E0091C7 FCA748B512804814C0A37EC7120FB3B3A2141F003C1480007E133FB414005CEB01FEEBFF FC6C5B5C001F5B000790C7FC1A467CB32C>II<387FFFE0B57EA37EEA0003B3B3A5007F B61280B712C0A36C158022337BB22C>I<3A7F83F007E09039CFFC1FF83AFFDFFE3FFCD8 7FFF13FF91B57E3A07FE1FFC3E01FCEBF83F496C487E01F013E001E013C0A301C01380B3 3B7FFC3FF87FF0027F13FFD8FFFE6D13F8D87FFC4913F0023F137F2D2481A32C>I<397F F01FE039FFF87FFC9038F9FFFE01FB7F6CB6FC00019038F03F80ECC01F02807FEC000F5B 5BA25BB3267FFFE0B5FCB500F11480A36C01E0140029247FA32C>II<397FF01FE0 39FFF8FFF801FB13FE90B6FC6C158000019038F07FC09138801FE091380007F049EB03F8 5BED01FC491300A216FE167EA816FE6D14FCA2ED01F86D13036DEB07F0150F9138801FE0 9138E07FC091B51280160001FB5B01F813F8EC3FC091C8FCAD387FFFE0B57EA36C5B2736 7FA32C>I114 D<90387FF8700003B512F8120F5A5A387FC00F387E00034813015AA36CEB00F0007F1400 13F0383FFFC06C13FE6CEBFF80000314E0C66C13F8010113FCEB0007EC00FE0078147F00 FC143F151F7EA26C143F6D133E6D13FE9038F007FC90B5FC15F815E000F8148039701FFC 0020247AA32C>I<131E133FA9007FB6FCB71280A36C1500D8003FC8FCB1ED03C0ED07E0 A5EC800F011FEB1FC0ECE07F6DB51280160001035B6D13F89038003FE0232E7EAD2C>I< 3A7FF003FF80486C487FA3007F7F0001EB000FB3A3151FA2153F6D137F3900FE03FF90B7 FC6D15807F6D13CF902603FE07130029247FA32C>I<3A7FFF01FFFCB514FE148314016C 15FC3A03E0000F80A26D131F00011500A26D5B0000143EA26D137E017C137CA2017E13FC 013E5BA2EB3F01011F5BA21483010F5BA214C701075BA214EF01035BA214FF6D90C7FCA2 6D5A147C27247EA32C>II<3A3FFF03 FFF048018713F8A36C010313F03A00FC007E005D90387E01F8013F5BEB1F83EC87E09038 0FCFC0903807EF80EB03FF6D90C7FC5C6D5A147C14FE130180903803EF80903807CFC0EB 0FC7EC83E090381F01F0013F7FEB7E00017C137C49137E0001803A7FFF01FFFC1483B514 FE6C15FC140127247EA32C>I<3A7FFF01FFFCB5008113FE148314816C010113FC3A03E0 000F806C7E151F6D140012005D6D133E137C017E137E013E137CA2013F13FC6D5BA2EB0F 815DA2EB07C1ECC3E0A2EB03E3ECE7C0130114F75DEB00FFA292C7FC80A2143EA2147E14 7CA214FC5CA2EA0C01003F5BEA7F83EB87E0EA7E0F495A387FFF806C90C8FC6C5A6C5AEA 07E027367EA32C>I E %EndDVIPSBitmapFont %DVIPSBitmapFont: Fc cmtt8 7 6 /Fc 6 117 df102 D<1370EA01FCA5EA007090C7FCA5EA7FF8487EA2127FEA007CB1387FFFFCB5FCA27E1625 7CA41F>105 D<387F83F838FFCFFC90B5FC7E3907FE1F8013F8EBF00F13E0A213C0AC39 7FFC3FF839FFFE7FFCA2397FFC3FF81E1980981F>110 D<387F87F038FFDFFCEBFFFE6C EBFF803907FC1FC0EBF00F9038E007E0A29038C003F0A21401A5140313E0EC07E013F090 38F80FC09038FC3F8090B512005CEBDFFCEBC7E001C0C7FCA9EA7FFC487EA26C5A1C2680 981F>112 D<387FE03F39FFF0FFC001F313E0EA7FF73801FFE714879038FE03C091C7FC 5B5BA35BA9387FFFF0B5FCA27E1B197F981F>114 D<13E0487EA6387FFFFCB57EA26C5B D801F0C7FCAB1407EC0F80A2141F13F89038FC3F006CB5FC6D5AEB3FF8EB0FE019207F9F 1F>116 D E %EndDVIPSBitmapFont %DVIPSBitmapFont: Fd cmr5 5 2 /Fd 2 51 df<1360EA01E0120F12FF12F11201B3A3387FFF80A2111C7B9B1C>49 DI E %EndDVIPSBitmapFont %DVIPSBitmapFont: Fe cmsy5 5 1 /Fe 1 4 df<13E0A438F0E1E0EAF843387E4FC0380F5E00EA01F0A2EA0F5E387E4FC038 F843E0EAF0E13800E000A413127B921F>3 D E %EndDVIPSBitmapFont %DVIPSBitmapFont: Ff cmr7 7 40 /Ff 40 122 df<14FF010F13C090383F01E090387C00F0EBF001EA01E01203EA07C06E5A 92C7FCA6EC0FF8B6FCA23807C000B3A2486C487E3A7FFC0FFF80A221297FA826>12 D<1238127C12FE12FFA2127F123B1203A31206A3120C121812381270122008127B8613> 44 D<1238127C12FEA3127C123807077B8613>46 D48 D<13381378EA01F8121F12FE12E01200B3AB487EB512F8A215267BA521>I<13FF000313 E0380E03F0381800F848137C48137E00787F12FC6CEB1F80A4127CC7FC15005C143E147E 147C5C495A495A5C495A010EC7FC5B5B903870018013E0EA0180390300030012065A001F B5FC5A485BB5FCA219267DA521>I<13FF000313E0380F01F8381C007C0030137E003C13 3E007E133FA4123CC7123E147E147C5C495AEB07E03801FF8091C7FC380001E06D7E147C 80143F801580A21238127C12FEA21500485B0078133E00705B6C5B381F01F03807FFC0C6 90C7FC19277DA521>I<1438A2147814F81301A2130313071306130C131C131813301370 136013C012011380EA03005A120E120C121C5A12305A12E0B612E0A2C7EAF800A7497E90 383FFFE0A21B277EA621>I<91387FC002903903FFF80690390FE01E0E90383F0007017C EB019ED801F0EB00FE4848147E4848143E5B000F151E48C8FC48150E123EA2007E1506A2 127C00FC1500A8127C007E1506A2123EA2003F150C7E6C7E000715186D14386C6C14306C 6C1460D8007CEB01C0013FEB038090390FE01E00903803FFF89038007FC0272A7DA82F> 67 D70 D73 D76 D78 D80 D<007FB7FCA23A7E003F003F0078150F007081006081A200E01680481501A5C791C7FCB3 A64A7E013FB5FCA229287EA72F>84 D87 D<13FE3807FFC0380F03 E0381C00F0003E1378003F137C143C143E121EC7FCA3EB3FFEEA01FF3807F03EEA1FC0EA 3F00127EA2481418A3147E127EECDF38393F838FF0390FFE0FE03903F807C01D1C7E9A21 >97 DIII<133F3801FFE038 03E1F0380F80F8381F007C143E123E007E131E141F127C12FCA2B6FCA200FCC7FCA4127C 127E1403123E6C1307380F800E3807C01C3803E0783800FFE0EB3F80181C7E9A1E>II<90387E03E03901FF9FF03807C3FC380F00F048EBF80000 1E1378003E137CA6001E1378001F13F86C5BEBC3E0380DFF80D81C7EC7FC90C8FCA3121E 380FFFF014FC6C13FF001F1480393E001FC000781307EC03E0481301A40078EB03C0007C 13076CEB0F80390FC07E003803FFF838007FC01C277E9921>II<120EEA3F80A5EA0E00C7FCA7EA078012FFA2121F120FB3121FEA FFF8A20D287EA713>I<130EEB3F80A5EB0E0090C7FCA7EB0F80EA01FFA2EA001F130FB3 A8127812FCEB1F00A2133EEA707CEA3FF8EA0FE0113483A715>II< EA0F8012FFA2121F120FB3AFEA1FC0EAFFF8A20D287EA713>I<260F81FC137F3BFF8FFF 03FFC0903A9C0F8703E03B1FB007CC01F0D80FE013D8903AC003F000F8A301805BAF486C 486C487E3CFFF83FFE0FFF80A2311A7E9937>I<380F81FC38FF8FFF90389C0F80391FB0 07C0EA0FE09038C003E0A31380AF391FC007F039FFF83FFEA21F1A7E9925>II<380F81FC38FF8FFF9038BC0FC0391FF007E0390FC003F0EB800115F8EC00FCA2157C15 7EA7157C15FCA2EC01F801C013F0EC03E09038F007C09038BC1F8090388FFF00EB83F801 80C7FCA7487EEAFFF8A21F257E9925>I<380F07C038FF1FF0EB38F8EA1F71EA0F6113C1 EBC0F014005BAF487EEAFFFCA2151A7E991A>114 D<3803F840380FFEC0EA3C07EA7803 EA7001EAF000A37E6C1300EA7FC013FC6CB4FC6C1380000713C0C613E0130738C003F013 0113007EA26C13E0130100F813C038EE078038C7FF00EA81FC141C7E9A1A>I<13C0A412 01A312031207120F121FB512E0A23807C000AC1430A73803E060A23801F0C03800FF80EB 3F0014257FA31A>I<390F8003E000FF133FA2001F1307000F1303B01407A20007130F90 38C01BF03903E073FE3801FFE339007F83E01F1B7E9925>I<39FFF807FEA2390FE001F0 01C013E0000714C013E000031480EBF00300011400A23800F806A2EB7C0CA2EB7E1CEB3E 18A26D5AA2EB0FE0A36D5AA26D5AA21F1A7F9823>I<3BFFF8FFF07FE0A23B1FC01FC01F 80000F90390F800E00A20007150CEC1FC02603E01B5B15E0143B2601F0315B15F0D9F860 13700000156015F89039FCC078E0017CEB7CC0137D90393F803D80153FEC001F6D91C7FC A2011E7F010E130EA22B1A7F982F>I<39FFF81FFCA2390FF00FE0D807E01380D803F013 003801F80E00005BEB7C386D5AEB3FE06D5A130F130780497EEB1DF8EB38FCEB707EEBE0 3E48487E0003EB0F80000714C0001F14E039FFE01FFEA21F197F9823>I<39FFF807FEA2 390FE001F001C013E0000714C0EA03E01580EBF003000114006D5A0000130613FCEB7C0C A26D5AA26D5AA214F06D5AA26D5AA26D5AA291C7FCA213061230EA780EEAFC0C131C1318 485AEA70E0EA3FC06CC8FC1F257F9823>I E %EndDVIPSBitmapFont %DVIPSBitmapFont: Fg cmti10 10 47 /Fg 47 122 df12 D<4B7E4B7EA21507A25EA2150FA293C8FCA25DA2151EA2153EA2153CA2157CA2 1578A2007FB812E0B9FCA27EC7D801F0C8FCA25DA21403A25DA21407A25DA2140FA292C9 FCA25CA2141EA2143EA2141C333275AD40>43 DI< 387FFFF8A2B5FCA214F0150579941E>I<1703EF0780170FA2EF1F005F173E5FA25FA24C 5A16035F4C5AA24C5AA24CC7FCA2163E167E167C5EA24B5AA24B5A15075E4B5AA24BC8FC A2153E157E157C5DA24A5AA24A5A14075D4A5AA24AC9FCA2143EA25C14FC5C495AA2495A A2495A130F5C49CAFCA2133EA25B13FC5B485AA2485AA2485A120F5B48CBFCA2123EA25A A25AA2127031537FBD2A>47 D<15181538157815F0140114031407EC0FE0141F147FEB03 FF90383FEFC0148FEB1C1F13001580A2143FA21500A25CA2147EA214FEA25CA21301A25C A21303A25CA21307A25CA2130FA25CA2131FA25CA2133FA291C7FC497EB61280A31D3877 B72A>49 D51 D<16E0ED01F01503A3150716E0A3150F16C0A2151F1680A2ED3F00A3157EA2157C15FC5D 14015D14035D14075D140F5D141F92C7FC143EA25CECF81C153E903801F07EEB03E014C0 90380780FE130F49485A133EEB7C01137801F05BEA01E03803C003EA0FFE391FFFC3F048 13FB267C01FF13403AF0003FFFE000601307C71400EC0FE05DA3141F5DA3143F92C7FCA4 143E141C24487DB72A>I<010314186E13F8903907F007F091B512E016C01600495B15F8 010E13E0020CC7FC011EC8FC131CA3133C1338A313781370A2147F9038F3FFC09038EF83 E09038FC01F0496C7E485A497F49137CC8FC157EA315FEA41401000C5C123F5A1403485C 5A4A5A12F800E05C140F4A5A5D6C49C7FC0070137E00785B387C01F8383E07F0381FFFC0 6C90C8FCEA01F8253A77B72A>I56 DI<133C137E13FF5AA313FE13FCEA00701300B2120EEA3F80127F 12FFA31300127E123C102477A319>I65 D67 D<0103B612FEEFFFC018F0903B0007F8000FF84BEB03FCEF00FE020F157FF03F804B141F 19C0021F150F19E05D1807143F19F05DA2147FA292C8FCA25C180F5CA2130119E04A151F A2130319C04A153FA201071780187F4A1600A2010F16FEA24A4A5A60011F15034D5A4A5D 4D5A013F4B5A173F4A4AC7FC17FC017FEC03F84C5A91C7EA1FC04949B45A007F90B548C8 FCB712F016803C397CB83F>I<0107B8FCA3903A000FF000034BEB007F183E141F181E5D A2143FA25D181C147FA29238000380A24A130718004A91C7FC5E13015E4A133E167E49B5 12FEA25EECF8000107147C163C4A1338A2010F147818E04A13701701011F16C016004A14 031880013F150718004A5CA2017F151E173E91C8123C177C4915FC4C5A4914070001ED7F F0B8FCA25F38397BB838>I<0107B712FEA3903A000FF000074B1300187C021F153CA25D A2143FA25D1838147FA292C8FCEE03804A130718004A91C7FCA201015CA24A131E163E01 0314FE91B5FC5EA2903807F800167C4A1378A2130FA24A1370A2011F14F0A24A90C8FCA2 133FA25CA2137FA291CAFCA25BA25B487EB6FCA337397BB836>I<0103B512F8A3903900 07F8005DA2140FA25DA2141FA25DA2143FA25DA2147FA292C7FCA25CA25CA21301A25CA2 1303A25CA21307A25CA2130FA25CA2131FA25CA2133FA25CA2137FA291C8FC497EB6FCA2 5C25397CB820>73 D<0207B512F0A391390007FC006F5AA215075EA3150F5EA3151F5EA3 153F5EA3157F93C7FCA35D5DA314015DA314035DA31407A25DA2140FA2003F5C5A141F48 5CA24A5A12FC00E049C8FC14FE00705B495A6C485A381E0FC06CB4C9FCEA01F82C3B78B8 2C>I<0107B512FCA25E9026000FF8C7FC5D5D141FA25DA2143FA25DA2147FA292C8FCA2 5CA25CA21301A25CA21303A25CA21307A25CA2130F170C4A141CA2011F153C17384A1478 A2013F157017F04A14E01601017F140317C091C71207160F49EC1F80163F4914FF000102 071300B8FCA25E2E397BB834>76 D<902607FFF8923807FFF0614F13E0D9000FEFF0004F 5AA2021F167FF1EFC0141DDA1CFCEC01CF023C16DF9538039F800238ED071FA20278ED0E 3F97C7FC0270151CA202F04B5AF0707E14E0037E14E0010117FE4D485A02C0EC0380A201 03ED0701610280140EA20107ED1C0305385B14006F137049160705E05B010EEC01C0A201 1E913803800F61011CEC0700A2013C020E131F4C5C1338ED1FB80178163F04F091C8FC01 705CA201F04A5B187E00015DD807F816FEB500C09039007FFFFC151E150E4C397AB84A> I<0107B612F817FF1880903B000FF0003FE04BEB0FF0EF03F8141FEF01FC5DA2023F15FE A25DA2147FEF03FC92C7FCA24A15F817074A15F0EF0FE01301EF1FC04AEC3F80EFFE0001 034A5AEE0FF091B612C04CC7FCD907F8C9FCA25CA2130FA25CA2131FA25CA2133FA25CA2 137FA291CAFCA25BA25B1201B512FCA337397BB838>80 D<0103B612F017FEEFFF80903B 0007F8003FC04BEB0FF01707020FEC03F8EF01FC5DA2021F15FEA25DA2143FEF03FC5DA2 027FEC07F818F092C7120F18E04AEC1FC0EF3F004A14FEEE01F80101EC0FE091B6128004 FCC7FC9138FC003F0103EC0F80834A6D7E8301071403A25C83010F14075F5CA2011F140F A25CA2133F161F4AECE007A2017F160F180E91C7FC49020F131C007F01FE153CB5913807 F078040313F0CAEAFFE0EF3F80383B7CB83D>82 D<92383FC00E913901FFF01C020713FC 91391FC07E3C91393F001F7C027CEB0FF84A130749481303495A4948EB01F0A2495AA201 1F15E091C7FCA34915C0A36E90C7FCA2806D7E14FCECFF806D13F015FE6D6D7E6D14E001 0080023F7F14079138007FFC150F15031501A21500A2167C120EA3001E15FC5EA3003E4A 5AA24B5AA2007F4A5A4B5A6D49C7FC6D133ED8F9F013FC39F8FC03F839F07FFFE0D8E01F 138026C003FCC8FC2F3D7ABA2F>I<0007B812E0A25AD9F800EB001F01C049EB07C0485A D900011403121E001C5C003C17801403123800785C00701607140700F01700485CA2140F C792C7FC5DA2141FA25DA2143FA25DA2147FA292C9FCA25CA25CA21301A25CA21303A25C A21307A25CA2130FA25CEB3FF0007FB512F8B6FCA2333971B83B>I<003FB539800FFFFE A326007F80C7EA7F8091C8EA3F00173E49153CA2491538A20001167817705BA2000316F0 5F5BA2000715015F5BA2000F15035F5BA2001F150794C7FC5BA2003F5D160E5BA2007F15 1E161C90C8FCA2163C4815385A16781670A216F04B5A5E1503007E4A5A4BC8FC150E6C14 3E6C6C5B15F0390FC003E03907F01FC00001B5C9FC38007FFCEB1FE0373B70B83E>I<14 F8EB07FE90381F871C90383E03FE137CEBF801120148486C5A485A120FEBC001001F5CA2 EA3F801403007F5C1300A21407485C5AA2140F5D48ECC1C0A2141F15831680143F158700 7C017F1300ECFF076C485B9038038F8E391F0F079E3907FE03FC3901F000F0222677A42A >97 D<147F903803FFC090380FC1E090381F0070017E13784913383901F801F83803F003 120713E0120FD81FC013F091C7FC485AA2127F90C8FCA35A5AA45AA3153015381578007C 14F0007EEB01E0003EEB03C0EC0F806CEB3E00380F81F83803FFE0C690C7FC1D2677A426 >99 DI<147F903803FFC090380FC1E090383F00F0017E13785B485A485A485A120F 4913F8001F14F0383F8001EC07E0EC1F80397F81FF00EBFFF891C7FC90C8FC5A5AA55AA2 1530007C14381578007E14F0003EEB01E0EC03C06CEB0F806CEB3E00380781F83803FFE0 C690C7FC1D2677A426>IIIII107 DIII<147F903803FFC090380FC1F090381F 00F8017E137C5B4848137E4848133E0007143F5B120F485AA2485A157F127F90C7FCA215 FF5A4814FEA2140115FC5AEC03F8A2EC07F015E0140F007C14C0007EEB1F80003EEB3F00 147E6C13F8380F83F03803FFC0C648C7FC202677A42A>I<9039078007C090391FE03FF0 90393CF0787C903938F8E03E9038787FC00170497EECFF00D9F0FE148013E05CEA01E113 C15CA2D80003143FA25CA20107147FA24A1400A2010F5C5E5C4B5A131F5EEC80035E013F 495A6E485A5E6E48C7FC017F133EEC70FC90387E3FF0EC0F8001FEC9FCA25BA21201A25B A21203A25B1207B512C0A3293580A42A>I<3903C003F0390FF01FFC391E783C0F381C7C 703A3C3EE03F8038383FC0EB7F800078150000701300151CD8F07E90C7FCEAE0FE5BA212 0012015BA312035BA312075BA3120F5BA3121F5BA3123F90C9FC120E212679A423>114 D<14FE903807FF8090380F83C090383E00E04913F00178137001F813F00001130313F0A2 15E00003EB01C06DC7FC7FEBFFC06C13F814FE6C7F6D13807F010F13C01300143F141F14 0F123E127E00FE1480A348EB1F0012E06C133E00705B6C5B381E03E06CB45AD801FEC7FC 1C267AA422>II<13F8D8 03FEEB01C0D8078FEB03E0390E0F8007121E121C0038140F131F007815C01270013F131F 00F0130000E015805BD8007E133FA201FE14005B5D120149137EA215FE120349EBFC0EA2 0201131E161C15F813E0163CD9F003133814070001ECF07091381EF8F03A00F83C78E090 393FF03FC090390FC00F00272679A42D>I<01F01507D803FC903903801F80D8071E9039 07C03FC0D80E1F130F121C123C0038021F131F49EC800F00701607A249133FD8F07E1680 00E0ED000313FEC64849130718000001147E5B03FE5B0003160E495BA2171E0007010114 1C01E05B173C1738A217781770020314F05F0003010713016D486C485A000190391E7C07 802800FC3C3E0FC7FC90393FF81FFE90390FE003F0322679A437>119 D<903907E007C090391FF81FF89039787C383C9038F03E703A01E01EE0FE3803C01F0180 13C0D8070014FC481480000E1570023F1300001E91C7FC121CA2C75AA2147EA214FEA25C A21301A24A1370A2010314F016E0001C5B007E1401010714C000FEEC0380010F1307010E EB0F0039781CF81E9038387C3C393FF03FF03907C00FC027267CA427>I<13F0D803FCEB 01C0D8071EEB03E0D80E1F1307121C123C0038140F4914C01270A249131FD8F07E148012 E013FEC648133F160012015B5D0003147E5BA215FE00075C5BA214015DA314035D140700 03130FEBF01F3901F87FE038007FF7EB1FC7EB000F5DA2141F003F5C48133F92C7FC147E 147C007E13FC387001F8EB03E06C485A383C1F80D80FFEC8FCEA03F0233679A428>I E %EndDVIPSBitmapFont %DVIPSBitmapFont: Fh cmbx10 10 40 /Fh 40 122 df<141E143E14FE1307133FB5FCA313CFEA000FB3B3A6007FB61280A42137 79B630>49 DI< EB03FF011F13F0017F13FC3901FC07FF2603F003138048486C13C0496C13E0EA0FF001FC 14F0121F7FA56C4814E0A23803F001C714C04A138016004A5A4A5AEC3FF090380FFFC092 C7FC15F090380007FE913801FF806E13C016E0ED7FF016F816FC153FA216FEEA1FC0487E 487E487EA416FCA249EB7FF8127F01C0EBFFF06C4814E06C6C4813C0260FFC0713806CB6 1200000114FC6C6C13F0010790C7FC27387CB630>II<001C 15C0D81F80130701F8137F90B61280A216005D5D15F05D15804AC7FC14F090C9FCA8EB07 FE90383FFFE090B512F89038FC07FC9038E003FFD98001138090C713C0120EC813E0157F 16F0A216F8A21206EA3F80EA7FE012FF7FA44914F0A26C4813FF90C713E0007C15C06C5B 6C491380D9C0071300390FF01FFE6CB512F8000114E06C6C1380D90FF8C7FC25387BB630 >II<123C123EEA3FE090B71280A417 00485D5E5E5EA25E007CC7EA0FC000784A5A4BC7FC00F8147E48147C15FC4A5A4A5AC748 5A5D140F4A5A143F92C8FC5C147E14FE1301A2495AA31307A2130F5CA2131FA5133FA96D 5A6D5A6D5A293A7BB830>I58 D67 D69 DI72 DI< B600FC0103B512C0A426007FF8C8381FE00019804EC7FC18FEEF01F84D5A4D5A4D5AEF3F 80057EC8FC5F4C5A4C5AEE0FE0EE1F804CC9FC167E5EED03F84B7E4B7E4B7E4B7F5D02F9 B57EDAFBF77FDAFFE37F15C103807F4A487F4A6D7E4A133F707E707F8482707F707F8482 717E717E8483717F717F858385B600FC017FEBFFE0A443397DB84B>75 D77 D79 DI82 DI97 D<13FFB5FCA412077EAF4AB47E020F13F0023F13FC9138FE03FFDAF00013804A EB7FC00280EB3FE091C713F0EE1FF8A217FC160FA217FEAA17FCA3EE1FF8A217F06E133F 6EEB7FE06E14C0903AFDF001FF80903AF8FC07FE009039F03FFFF8D9E00F13E0D9C00390 C7FC2F3A7EB935>I<903801FFC0010F13FC017F13FFD9FF8013802603FE0013C048485A EA0FF8121F13F0123F6E13804848EB7F00151C92C7FC12FFA9127FA27F123FED01E06C7E 15036C6CEB07C06C6C14806C6C131FC69038C07E006DB45A010F13F00101138023257DA4 2A>II<9038 03FF80011F13F0017F13FC3901FF83FE3A03FE007F804848133F484814C0001FEC1FE05B 003FEC0FF0A2485A16F8150712FFA290B6FCA301E0C8FCA4127FA36C7E1678121F6C6C14 F86D14F000071403D801FFEB0FE06C9038C07FC06DB51200010F13FC010113E025257DA4 2C>I<161FD907FEEBFFC090387FFFE348B6EAEFE02607FE07138F260FF801131F48486C 138F003F15CF4990387FC7C0EEC000007F81A6003F5DA26D13FF001F5D6C6C4890C7FC39 07FE07FE48B512F86D13E0261E07FEC8FC90CAFCA2123E123F7F6C7E90B512F8EDFF8016 E06C15F86C816C815A001F81393FC0000F48C8138048157F5A163FA36C157F6C16006D5C 6C6C495AD81FF0EB07FCD807FEEB3FF00001B612C06C6C91C7FC010713F02B377DA530> 103 D<13FFB5FCA412077EAFED7FC0913803FFF8020F13FE91381F03FFDA3C0113801478 4A7E4A14C05CA25CA291C7FCB3A3B5D8FC3F13FFA4303A7DB935>II< 13FFB5FCA412077EB3B3ACB512FCA4163A7DB91B>108 D<01FED97FE0EB0FFC00FF9026 01FFFC90383FFF80020701FF90B512E0DA1F81903983F03FF0DA3C00903887801F000749 DACF007F00034914DE6D48D97FFC6D7E4A5CA24A5CA291C75BB3A3B5D8FC1FB50083B512 F0A44C257DA451>I<01FEEB7FC000FF903803FFF8020F13FE91381F03FFDA3C01138000 0713780003497E6D4814C05CA25CA291C7FCB3A3B5D8FC3F13FFA430257DA435>I<9038 01FFC0010F13F8017F13FFD9FF807F3A03FE003FE048486D7E48486D7E48486D7EA2003F 81491303007F81A300FF1680A9007F1600A3003F5D6D1307001F5DA26C6C495A6C6C495A 6C6C495A6C6C6CB45A6C6CB5C7FC011F13FC010113C029257DA430>I<9039FF01FF80B5 000F13F0023F13FC9138FE07FFDAF00113800007496C13C06C0180EB7FE091C713F0EE3F F8A2EE1FFCA3EE0FFEAA17FC161FA217F8163F17F06E137F6E14E06EEBFFC0DAF0031380 9139FC07FE0091383FFFF8020F13E0020390C7FC91C9FCACB512FCA42F357EA435>I<90 38FE03F000FFEB0FFEEC3FFF91387C7F809138F8FFC000075B6C6C5A5CA29138807F80ED 3F00150C92C7FC91C8FCB3A2B512FEA422257EA427>114 D<90383FF0383903FFFEF800 0F13FF381FC00F383F0003007E1301007C130012FC15787E7E6D130013FCEBFFE06C13FC ECFF806C14C06C14F06C14F81203C614FC131F9038007FFE140700F0130114007E157E7E 157C6C14FC6C14F8EB80019038F007F090B512C000F8140038E01FF81F257DA426>I<13 0FA55BA45BA25B5BA25A1207001FEBFFE0B6FCA3000390C7FCB21578A815F86CEB80F014 816CEBC3E090383FFFC06D1380903803FE001D357EB425>I<01FFEC3FC0B5EB3FFFA400 0714016C80B3A35DA25DA26C5C6E4813E06CD9C03E13FF90387FFFFC011F13F001031380 30257DA435>IIIII E %EndDVIPSBitmapFont %DVIPSBitmapFont: Fi cmbx10 10.95 42 /Fi 42 122 df45 DI<140F143F5C495A130F48B5FCB6FCA313F7EA FE071200B3B3A8007FB612F0A5243C78BB34>49 D<903803FF80013F13F890B512FE0003 6E7E4881260FF80F7F261FC0037F4848C67F486C6D7E6D6D7E487E6D6D7EA26F1380A46C 5A6C5A6C5A0007C7FCC8FC4B1300A25E153F5E4B5AA24B5A5E4A5B4A5B4A48C7FC5D4A5A EC1FE04A5A4A5A9139FF000F80EB01FC495A4948EB1F00495AEB1F8049C7FC017E5C5B48 B7FC485D5A5A5A5A5AB7FC5EA4293C7BBB34>I<903801FFE0010F13FE013F6D7E90B612 E04801817F3A03FC007FF8D807F06D7E82D80FFC131F6D80121F7FA56C5A5E6C48133FD8 01F05CC8FC4B5A5E4B5A4A5B020F5B902607FFFEC7FC15F815FEEDFFC0D9000113F06E6C 7E6F7E6F7E6F7E1780A26F13C0A217E0EA0FC0487E487E487E487EA317C0A25D49158012 7F49491300D83FC0495A6C6C495A3A0FFE01FFF86CB65A6C5DC61580013F49C7FC010313 E02B3D7CBB34>II<0007 1538D80FE0EB01F801FE133F90B6FC5E5E5E5E93C7FC5D15F85D15C04AC8FC0180C9FCA9 ECFFC0018713FC019F13FF90B67E020113E09039F8007FF0496D7E01C06D7E5B6CC77FC8 120F82A31780A21207EA1FC0487E487E12FF7FA21700A25B4B5A6C5A01805C6CC7123F6D 495AD81FE0495A260FFC075B6CB65A6C92C7FCC614FC013F13F0010790C8FC293D7BBB34 >I<16FCA24B7EA24B7EA34B7FA24B7FA34B7FA24B7FA34B7F157C03FC7FEDF87FA20201 80EDF03F0203804B7E02078115C082020F814B7E021F811500824A81023E7F027E81027C 7FA202FC814A147F49B77EA34982A2D907E0C7001F7F4A80010F835C83011F8391C87E49 83133E83017E83017C81B500FC91B612FCA5463F7CBE4F>65 DI69 D72 DI79 DI82 D<903A03FFC001C0011FEBF803017FEBFE0748B6128F4815DF48010013FFD80FF8130F48 481303497F4848EB007F127F49143F161F12FF160FA27F1607A27F7F01FC91C7FCEBFF80 6C13F8ECFFC06C14FCEDFF806C15E016F86C816C816C816C16806C6C15C07F010715E0EB 007F020714F0EC003F1503030013F8167F163F127800F8151FA2160FA27EA217F07E161F 6C16E06D143F01E015C001F8EC7F8001FEEB01FF9026FFE00713004890B55A486C14F8D8 F81F5CD8F00314C027E0003FFEC7FC2D407ABE3A>I<003FB912FCA5903BFE003FFE003F D87FF0EE0FFE01C0160349160190C71500197E127EA2007C183EA400FC183F48181FA5C8 1600B3AF010FB712F8A5403D7CBC49>II87 D<903807FFC0013F13F848B6FC48812607FE037F260FF8 007F6DEB3FF0486C806F7EA36F7EA26C5A6C5AEA01E0C8FC153F91B5FC130F137F3901FF FE0F4813E0000F1380381FFE00485A5B485A12FF5BA4151F7F007F143F6D90387BFF806C 6C01FB13FE391FFF07F36CEBFFE100031480C6EC003FD91FF890C7FC2F2B7DA933>97 D<13FFB5FCA512077EAFEDFFE0020713FC021FEBFF80027F80DAFF8113F09139FC003FF8 02F06D7E4A6D7E4A13074A80701380A218C082A318E0AA18C0A25E1880A218005E6E5C6E 495A6E495A02FCEB7FF0903AFCFF01FFE0496CB55AD9F01F91C7FCD9E00713FCC7000113 C033407DBE3A>IIIII<903A03FF8007F0 013F9038F83FF8499038FCFFFC48B712FE48018313F93A07FC007FC34848EB3FE1001FED F1FC4990381FF0F81700003F81A7001F5DA26D133F000F5D6C6C495A3A03FF83FF8091B5 C7FC4814FC01BF5BD80F03138090CAFCA2487EA27F13F06CB6FC16F016FC6C15FF17806C 16C06C16E01207001F16F0393FE000034848EB003F49EC1FF800FF150F90C81207A56C6C EC0FF06D141F003F16E001F0147FD81FFC903801FFC02707FF800F13006C90B55AC615F8 013F14E0010101FCC7FC2F3D7DA834>I<13FFB5FCA512077EAFED1FF8EDFFFE02036D7E 4A80DA0FE07F91381F007F023C805C4A6D7E5CA25CA35CB3A4B5D8FE0FB512E0A5333F7C BE3A>II<13FFB5FCA512077EB092380FFFFEA5DB01FEC7FC4B5A ED07F0ED1FE04B5A4B5A4BC8FCEC03FC4A5A4A5A141F4A7EECFFFCA2818102E77F02C37F 148102007F826F7E6F7E151F6F7E826F7F6F7F816F7FB5D8FC07EBFFC0A5323F7DBE37> 107 D<13FFB5FCA512077EB3B3AFB512FCA5163F7CBE1D>I<01FFD91FF8ECFFC0B590B5 010713F80203DAC01F13FE4A6E487FDA0FE09026F07F077F91261F003FEBF8010007013E DAF9F0806C0178ECFBC04A6DB4486C7FA24A92C7FC4A5CA34A5CB3A4B5D8FE07B5D8F03F EBFF80A551297CA858>I<01FFEB1FF8B5EBFFFE02036D7E4A80DA0FE07F91381F007F00 07013C806C5B4A6D7E5CA25CA35CB3A4B5D8FE0FB512E0A533297CA83A>II<01FFEBFFE0B5000713FC021FEBFF80027F80DA FF8113F09139FC007FF8000701F06D7E6C496D7E4A130F4A6D7E1880A27013C0A38218E0 AA4C13C0A318805E18005E6E5C6E495A6E495A02FCEBFFF0DAFF035B92B55A029F91C7FC 028713FC028113C00280C9FCACB512FEA5333B7DA83A>I<3901FE01FE00FF903807FF80 4A13E04A13F0EC3F1F91387C3FF8000713F8000313F0EBFFE0A29138C01FF0ED0FE09138 8007C092C7FCA391C8FCB3A2B6FCA525297DA82B>114 D<90383FFC1E48B512BE000714 FE5A381FF00F383F800148C7FC007E147EA200FE143EA27E7F6D90C7FC13F8EBFFE06C13 FF15C06C14F06C806C806C806C80C61580131F1300020713C014000078147F00F8143F15 1F7EA27E16806C143F6D140001E013FF9038F803FE90B55A15F0D8F87F13C026E00FFEC7 FC222B7DA929>IIIIIII E %EndDVIPSBitmapFont %DVIPSBitmapFont: Fj cmr10 10.95 43 /Fj 43 122 df<121EEA7F8012FF13C0A213E0A3127FEA1E601200A413E013C0A3120113 80120313005A120E5A1218123812300B1C798919>44 D<121EEA7F80A2EAFFC0A4EA7F80 A2EA1E000A0A798919>46 D48 DII<150E151E153EA2157EA215FE1401A21403EC077E1406140E141CA2143814 70A214E0EB01C0A2EB0380EB0700A2130E5BA25B5BA25B5B1201485A90C7FC5A120E120C 121C5AA25A5AB8FCA3C8EAFE00AC4A7E49B6FCA3283E7EBD2D>52 D<00061403D80780131F01F813FE90B5FC5D5D5D15C092C7FC14FCEB3FE090C9FCACEB01 FE90380FFF8090383E03E090387001F8496C7E49137E497F90C713800006141FC813C0A2 16E0150FA316F0A3120C127F7F12FFA416E090C7121F12FC007015C012780038EC3F8012 3C6CEC7F00001F14FE6C6C485A6C6C485A3903F80FE0C6B55A013F90C7FCEB07F8243F7C BC2D>II<1238123C123F90B612FC A316F85A16F016E00078C712010070EC03C0ED078016005D48141E151C153C5DC8127015 F04A5A5D14034A5A92C7FC5C141EA25CA2147C147814F8A213015C1303A31307A3130F5C A2131FA6133FAA6D5A0107C8FC26407BBD2D>III<15074B 7EA34B7EA34B7EA34B7EA34B7E15E7A2913801C7FC15C3A291380381FEA34AC67EA3020E 6D7EA34A6D7EA34A6D7EA34A6D7EA34A6D7EA349486D7E91B6FCA249819138800001A249 C87EA24982010E157FA2011E82011C153FA2013C820138151FA2017882170F13FC00034C 7ED80FFF4B7EB500F0010FB512F8A33D417DC044>65 DIII70 DI76 DII80 D83 D87 D97 D<49B4FC010F13E090383F00F8017C131E4848131F4848137F00 07ECFF80485A5B121FA24848EB7F00151C007F91C7FCA290C9FC5AAB6C7EA3003FEC01C0 7F001F140316806C6C13076C6C14000003140E6C6C131E6C6C137890383F01F090380FFF C0D901FEC7FC222A7DA828>99 DIII<167C903903F801FF903A1F FF078F8090397E0FDE1F9038F803F83803F001A23B07E000FC0600000F6EC7FC49137E00 1F147FA8000F147E6D13FE00075C6C6C485AA23901F803E03903FE0FC026071FFFC8FCEB 03F80006CAFC120EA3120FA27F7F6CB512E015FE6C6E7E6C15E06C810003813A0FC0001F FC48C7EA01FE003E140048157E825A82A46C5D007C153E007E157E6C5D6C6C495A6C6C49 5AD803F0EB0FC0D800FE017FC7FC90383FFFFC010313C0293D7EA82D>III107 DI<2701F801FE 14FF00FF902707FFC00313E0913B1E07E00F03F0913B7803F03C01F80007903BE001F870 00FC2603F9C06D487F000101805C01FBD900FF147F91C75B13FF4992C7FCA2495CB3A648 6C496CECFF80B5D8F87FD9FC3F13FEA347287DA74C>I<3901F801FE00FF903807FFC091 381E07E091387803F000079038E001F82603F9C07F0001138001FB6D7E91C7FC13FF5BA2 5BB3A6486C497EB5D8F87F13FCA32E287DA733>I<14FF010713E090381F81F890387E00 7E01F8131F4848EB0F804848EB07C04848EB03E0000F15F04848EB01F8A2003F15FCA248 C812FEA44815FFA96C15FEA36C6CEB01FCA3001F15F86C6CEB03F0A26C6CEB07E06C6CEB 0FC06C6CEB1F80D8007EEB7E0090383F81FC90380FFFF0010090C7FC282A7EA82D>I<39 01FC03FC00FF90381FFF8091387C0FE09039FDE003F03A07FFC001FC6C496C7E6C90C712 7F49EC3F805BEE1FC017E0A2EE0FF0A3EE07F8AAEE0FF0A4EE1FE0A2EE3FC06D1580EE7F 007F6E13FE9138C001F89039FDE007F09039FC780FC0DA3FFFC7FCEC07F891C9FCAD487E B512F8A32D3A7EA733>I<3901F807E000FFEB1FF8EC787CECE1FE3807F9C100031381EA 01FB1401EC00FC01FF1330491300A35BB3A5487EB512FEA31F287EA724>114 D<90383FC0603901FFF8E03807C03F381F000F003E1307003C1303127C0078130112F814 00A27E7E7E6D1300EA7FF8EBFFC06C13F86C13FE6C7F6C1480000114C0D8003F13E00103 13F0EB001FEC0FF800E01303A214017E1400A27E15F07E14016C14E06CEB03C090388007 8039F3E01F0038E0FFFC38C01FE01D2A7DA824>I<131CA6133CA4137CA213FCA2120112 031207001FB512C0B6FCA2D801FCC7FCB3A215E0A912009038FE01C0A2EB7F03013F1380 90381F8700EB07FEEB01F81B397EB723>II119 D121 D E %EndDVIPSBitmapFont %DVIPSBitmapFont: Fk cmr10 10 81 /Fk 81 125 df11 DIII<001C131C007F137F39FF80FF80A26D13C0A3007F137F001C 131C00001300A40001130101801380A20003130301001300485B00061306000E130E485B 485B485B006013601A197DB92A>34 D<121C127FEAFF80A213C0A3127F121C1200A41201 1380A2120313005A1206120E5A5A5A12600A1979B917>39 D<146014E0EB01C0EB0380EB 0700130E131E5B5BA25B485AA2485AA212075B120F90C7FCA25A121EA2123EA35AA65AB2 127CA67EA3121EA2121F7EA27F12077F1203A26C7EA26C7E1378A27F7F130E7FEB0380EB 01C0EB00E01460135278BD20>I<12C07E12707E7E7E120F6C7E6C7EA26C7E6C7EA21378 A2137C133C133E131EA2131F7FA21480A3EB07C0A6EB03E0B2EB07C0A6EB0F80A31400A2 5B131EA2133E133C137C1378A25BA2485A485AA2485A48C7FC120E5A5A5A5A5A13527CBD 20>I<15301578B3A6007FB812F8B912FCA26C17F8C80078C8FCB3A6153036367BAF41> 43 D<121C127FEAFF80A213C0A3127F121C1200A412011380A2120313005A1206120E5A 5A5A12600A19798817>II<121C127FEAFF80A5EA7F00121C0909 798817>I<150C151E153EA2153C157CA2157815F8A215F01401A215E01403A215C01407 A21580140FA215005CA2141E143EA2143C147CA2147814F8A25C1301A25C1303A2495AA2 5C130FA291C7FC5BA2131E133EA2133C137CA2137813F8A25B1201A25B1203A25B1207A2 5B120FA290C8FC5AA2121E123EA2123C127CA2127812F8A25A12601F537BBD2A>IIIII<1538A2157815F8A214 0114031407A2140F141F141B14331473146314C313011483EB030313071306130C131C13 1813301370136013C01201EA038013005A120E120C5A123812305A12E0B712F8A3C73803 F800AB4A7E0103B512F8A325397EB82A>I<0006140CD80780133C9038F003F890B5FC5D 5D158092C7FC14FC38067FE090C9FCABEB07F8EB3FFE9038780F803907E007E090388003 F0496C7E12066E7EC87EA28181A21680A4123E127F487EA490C71300485C12E000605C12 700030495A00385C6C1303001E495A6C6C485A3907E03F800001B5C7FC38007FFCEB1FE0 213A7CB72A>II<12301238123E003FB612E0A316C0 5A168016000070C712060060140E5D151800E01438485C5D5DC712014A5A92C7FC5C140E 140C141C5CA25CA214F0495AA21303A25C1307A2130FA3495AA3133FA5137FA96DC8FC13 1E233B7BB82A>III<121C127FEA FF80A5EA7F00121CC7FCB2121C127FEAFF80A5EA7F00121C092479A317>I<121C127FEA FF80A5EA7F00121CC7FCB2121C127F5A1380A4127F121D1201A412031300A25A1206A212 0E5A121812385A1260093479A317>I63 D<1538A3157CA315FEA34A7EA34A6C7EA202077FEC06 3FA2020E7FEC0C1FA2021C7FEC180FA202387FEC3007A202707FEC6003A202C07F1501A2 D901807F81A249C77F167FA20106810107B6FCA24981010CC7121FA2496E7EA3496E7EA3 496E7EA213E0707E1201486C81D80FFC02071380B56C90B512FEA3373C7DBB3E>65 DI<913A01FF800180020FEBE003027F13F8903A01FF807E07903A03 FC000F0FD90FF0EB039F4948EB01DFD93F80EB00FF49C8127F01FE153F12014848151F48 48150FA248481507A2485A1703123F5B007F1601A35B00FF93C7FCAD127F6DED0180A312 3F7F001F160318006C7E5F6C7E17066C6C150E6C6C5D00001618017F15386D6C5CD91FE0 5C6D6CEB03C0D903FCEB0F80902701FF803FC7FC9039007FFFFC020F13F002011380313D 7BBA3C>III< B812F8A30001903880001F6C90C71201EE00FC177C173C171CA2170CA4170E1706A2ED01 80A21700A41503A21507151F91B5FCA3EC001F15071503A21501A692C8FCAD4813C0B612 C0A32F397DB836>IIII<013FB512E0A39039001FFC00EC07F8B3B3A3123FEA7F80EAFFC0A44A5A1380D87F005B 0070131F6C5C6C495A6C49C7FC380781FC3801FFF038007F80233B7DB82B>I76 DIIIIIII<003FB812E0A3D9 C003EB001F273E0001FE130348EE01F00078160000701770A300601730A400E017384817 18A4C71600B3B0913807FF80011FB612E0A335397DB83C>IIII<007FB590 383FFFFCA3C601F801071380D97FE0D903FCC7FC013FEC01F06D6C5C5F6D6C5C6D6C1303 4CC8FC6D6C1306160E6D6C5B6DEB8018163891387FC0306E6C5A16E06E6C5A91380FF180 15FB6EB4C9FC5D14036E7EA26E7F6F7EA24B7E15DF9138019FF09138038FF8150F913806 07FC91380E03FE140C4A6C7EEC38000230804A6D7E14E04A6D7E49486D7E130391C76C7E 01066E7E130E010C6E7E011C1401013C8101FE822607FF80010713E0B500E0013FEBFF80 A339397EB83E>II91 D<3901800180000313033907000700000E130E48 5B0018131800381338003013300070137000601360A200E013E0485BA400CE13CE39FF80 FF806D13C0A3007F137FA2393F803F80390E000E001A1974B92A>II97 DIIII<147E 903803FF8090380FC1E0EB1F8790383F0FF0137EA213FCA23901F803C091C7FCADB512FC A3D801F8C7FCB3AB487E387FFFF8A31C3B7FBA19>IIIIIII<2703F00FF0EB1FE000 FFD93FFCEB7FF8913AF03F01E07E903BF1C01F83803F3D0FF3800FC7001F802603F70013 CE01FE14DC49D907F8EB0FC0A2495CA3495CB3A3486C496CEB1FE0B500C1B50083B5FCA3 40257EA445>I<3903F00FF000FFEB3FFCECF03F9039F1C01F803A0FF3800FC03803F700 13FE496D7EA25BA35BB3A3486C497EB500C1B51280A329257EA42E>II<3903F01FE000FFEB7FF89038F1E07E9039F3801F803A0FF7000FC0D803FEEB07E049EB 03F04914F849130116FC150016FEA3167FAA16FEA3ED01FCA26DEB03F816F06D13076DEB 0FE001F614C09039F7803F009038F1E07E9038F0FFF8EC1FC091C8FCAB487EB512C0A328 357EA42E>II<3807E01F00FFEB7FC09038E1E3E09038E387F0380FE707EA03E613EE 9038EC03E09038FC0080491300A45BB3A2487EB512F0A31C257EA421>II<1318A51338A31378A313 F8120112031207001FB5FCB6FCA2D801F8C7FCB215C0A93800FC011580EB7C03017E1300 6D5AEB0FFEEB01F81A347FB220>IIIIII<003FB512FCA2EB8003D83E0013F8003CEB07 F00038EB0FE012300070EB1FC0EC3F800060137F150014FE495AA2C6485A495AA2495A49 5A495AA290387F000613FEA2485A485A0007140E5B4848130C4848131CA24848133C48C7 127C48EB03FC90B5FCA21F247EA325>III E %EndDVIPSBitmapFont %DVIPSBitmapFont: Fl cmsy10 10 1 /Fl 1 4 df3 D E %EndDVIPSBitmapFont %DVIPSBitmapFont: Fm cmr12 14.4 20 /Fm 20 122 df65 D69 DI80 D83 D97 D99 D101 D<157F913803FFE0020F13F091383FC0F891387F01FC903901FE03FE903803FC 0714F81307EB0FF0A290391FE003FCED01F892C7FC495AB3B612FEA426003FC0C7FCB3B3 A580EBFFF0007FEBFFF8A427547DD324>I104 D<1378EA01FE487E487FA66C90C7FC6C5AEA007890C8FCB0EB7F80B5FCA41203C6FC 137FB3B3A43801FFE0B61280A419507CCF21>I<01FFEB07FCB590383FFF8092B512E091 3901F00FF8913903C007FC000349C66C7EC6010E13016D486D7E5C143002706E7E146014 E05CA35CB3AD2601FFE0903801FFE0B600C0B612C0A43A347CB341>110 DI<90397F8007FCB590387FFF800281B512E0913987F00F F891398F8003FC000390399E0001FFC601BC6D7FD97FF86E7E4A6E7E4A6E7E4A140F844A 6E7EA2717EA3717EA4711380AB4D1300A44D5AA24D5AA2606E140F4D5A6E5D6E4A5A6E4A 5A02BC4AC7FC029E495A028FEB07FC913987E01FF00281B512C0DA807F90C8FCED0FF892 CAFCB13801FFE0B612C0A4394B7DB341>I<01FFEB1F80B5EB7FF0913801FFF8913803E1 FC91380783FE0003EB0F07C6131EEB7F1C1438143091387003FC91386000F0160014E05C A45CB3AA8048487EB612F0A427347DB32E>114 DIII<007FB5D8800FB51280A4C69026FC0003EBF000D93FF86D1380011F4B C7FC010F15F801075D6D6C5C6E495A6D6C5C6D14076E6C48C8FCEDC01E6E6C5A021F1338 91380FF0786F5A913807FDE002035BEC01FF5E80157F6F7E824B7E15FFEDE7F802017F91 3803C3FEEC07814AC67E020E80021E6D7E4A133F4A6D7E4A80707E4948130749486D7E01 0781010F6E7E013F8201FF8200076D010713F0B500F8011FEBFFE0A43B337FB23E>120 DI E %EndDVIPSBitmapFont end %%EndProlog %%BeginSetup %%Feature: *Resolution 600dpi TeXDict begin %%BeginPaperSize: Letter letter %%EndPaperSize %%EndSetup %%Page: 1 1 1 0 bop 848 37 a Fm(Safe)38 b(Async)m(hronous)g(Exceptions)f(F)-10 b(or)39 b(Python)3035 -6 y Fl(\003)995 237 y Fk(Williams)28 b(College)f(T)-7 b(ec)n(hnical)27 b(Note)g(02-2002,)e(Dec.)j(2002)1009 502 y Fj(Stephen)i(N.)h(F)-8 b(reund)595 b(Mark)31 b(P)-8 b(.)31 b(Mitc)m(hell)721 615 y(Departmen)m(t)h(of)e(Computer)g(Science) 257 b(Co)s(deSourcery)-8 b(,)30 b(LLC)1050 728 y(Williams)e(College)517 b(9978)32 b(Granite)e(P)m(oin)m(t)h(Ct.)880 841 y(Williamsto)m(wn,)d (MA)j(01267)343 b(Granite)30 b(Ba)m(y)-8 b(,)32 b(CA)e(95746)-152 1216 y Fi(Abstract)-152 1398 y Fk(W)-7 b(e)19 b(demonstrate)f(that)g (the)h(Python)f(programming)e(language)-152 1498 y(is)35 b(not)f(signal-safe,)g(due)h(to)f(Python's)f(supp)r(ort)i(for)e (raising)-152 1597 y(exceptions)i(from)f(signal)g(handlers.)58 b(W)-7 b(e)35 b(examine)f(the)i(ap-)-152 1697 y(proac)n(hes)31 b(that)i(v)-5 b(arious)32 b(languages)f(ha)n(v)n(e)h(used)h(when)g (deal-)-152 1797 y(ing)d(with)g(the)g(com)n(bination)f(of)h(async)n (hron)n(y)e(and)h(exception)-152 1896 y(handling,)22 b(and)e(prop)r(ose)f(a)h(mo)r(di\014cation)g(of)g(the)h(Python)e(lan-) -152 1996 y(guage)27 b(that)g(restores)f(signal)h(safet)n(y)-7 b(.)-152 2195 y Fh(Keyw)m(ords:)34 b Fk(programming)20 b(languages,)h(exceptions,)i(asyn-)-152 2295 y(c)n(hronous)j(signals,)h (resource)f(managemen)n(t,)g(Python)-152 2533 y Fi(1)105 b(In)m(tro)s(duction)-152 2715 y Fk(Async)n(hron)n(y)24 b(is)h(a)f(fact)i(of)f(life)g(in)g(computer)g(systems.)36 b(Man)n(y)-152 2814 y(programs)42 b(m)n(ust)j(handle)f(async)n(hronous) e(ev)n(en)n(ts,)48 b(suc)n(h)c(as)-152 2914 y(k)n(eyb)r(oard)28 b(in)n(terrupts,)g(timer)h(alarms,)f(and)h(sensor)e(activit)n(y)-7 b(,)-152 3014 y(to)37 b(function)h(prop)r(erly)-7 b(.)64 b(Ho)n(w)n(ev)n(er,)38 b(these)f(ev)n(en)n(ts)g(o)r(ccur)f(at)-152 3113 y(unpredictable)28 b(p)r(oin)n(ts)f(in)h(time.)-40 3213 y(Python)33 b(emplo)n(ys)g(the)g Fg(signal)43 b Fk(mo)r(del)34 b(to)f(capture)g(asyn-)-152 3312 y(c)n(hronous)j(ev)n (en)n(ts.)65 b(Signals)37 b(are)f(used)h(in)h(b)r(oth)f(the)h(UNIX)-152 3412 y(op)r(erating)43 b(system)h(and)h(the)f(C)g(programming)f (language.)-152 3512 y(When)36 b(the)f(op)r(erating)e(system)i Fg(r)l(aises)42 b Fk(a)34 b(signal,)i(con)n(trol)d(is)-152 3611 y(transferred)g(to)i(a)e Fg(signal)k(hand)t(ler)p Fk(,)h(i.e.,)e(a)e(sp)r(ecial)g(purp)r(ose)-152 3711 y(routine)19 b(designed)g(to)g(pro)r(cess)f(the)i(async)n(hronous)d(ev) n(en)n(t.)33 b(Be-)-152 3811 y(cause)21 b(the)h(signal)e(handler)h (executes)g(async)n(hronously)-7 b(,)20 b(it)i(can)-152 3910 y(mak)n(e)h(only)g(v)n(ery)f(limited)i(assumptions)f(ab)r(out)g (the)h(in)n(tegrit)n(y)-152 4010 y(of)j(data)f(structures)g(b)r(eing)h (manipulated)g(b)n(y)f(the)h(remainder)-152 4109 y(of)i(the)f(program.) 417 4079 y Ff(1)491 4109 y Fk(When)h(the)g(signal)e(handler)h(returns,) g(the)-152 4209 y(main)j(program)e(resumes)g(from)i(the)g(p)r(oin)n(t)g (at)f(whic)n(h)h(it)g(w)n(as)-152 4309 y(in)n(terrupted.)-40 4408 y(Programmers)20 b(often)j(w)n(an)n(t)f(to)g(treat)g(signals)g(in) h(the)g(same)-152 4508 y(w)n(a)n(y)35 b(that)h(they)g(treat)f(error)e (conditions.)61 b(F)-7 b(or)35 b(example,)i(a)-152 4608 y(program)26 b(ma)n(y)i(reco)n(v)n(er)d(from)j(an)g(error)e(writing)i (to)g(an)g(op)r(en)-152 4707 y(\014le)41 b(and)g(pro)r(cess)f(a)h(\\k)n (eyb)r(oard)e(in)n(terrupt")h(signal)g(raised)-152 4807 y(during)25 b(the)g(write)f(in)h(m)n(uc)n(h)f(the)h(same)f(w)n(a)n(y)-7 b(.)35 b(As)25 b(w)n(e)f(describ)r(e)-152 4906 y(b)r(elo)n(w,)e(Python) e(com)n(bines)f(error)g(handling)h(with)h(signal)e(han-)-152 5006 y(dling)28 b(to)f(enable)h(them)g(to)f(b)r(e)h(treated)f (uniformly)-7 b(.)p -152 5068 797 4 v -67 5111 a Fe(\003)-33 5136 y Ff(This)16 b(w)n(ork)g(w)n(as)h(presen)n(ted)c(at)j(the)e(Ligh)n (t)n(w)n(eigh)n(t)i(Languages)f(W)-5 b(orkshop,)-152 5202 y(No)n(v.)23 b(2002.)-65 5249 y Fd(1)-33 5274 y Ff(F)-5 b(or)25 b(example,)f(in)h(C,)g(it)g(is)h(not)f(ev)n(en)f(v)l (alid)g(to)i(use)f Fc(printf)f Ff(in)h(a)g(signal)-152 5340 y(handler.)2152 1216 y Fk(Python,)h(lik)n(e)g(man)n(y)g(recen)n(t) g(languages,)e(uses)i Fg(exc)l(eptions)2040 1316 y Fk(to)38 b(deal)f(with)h(error)e(conditions)h(and)h(other)f(similar)g(prob-)2040 1416 y(lems.)g(Exceptions)25 b(are)h(non-lo)r(cal)f(gotos)h(that)h (transfer)e(con-)2040 1515 y(trol)19 b(from)g(the)g(p)r(oin)n(t)h(at)f (whic)n(h)g(the)h(exception)f(is)g Fg(r)l(aise)l(d)29 b Fk(to)19 b(an)2040 1615 y Fg(exc)l(eption)29 b(hand)t(ler)p Fk(.)39 b(Exception)26 b(handlers)g(are)f(dynamically)2040 1714 y(scop)r(ed;)k(con)n(trol)e(is)i(transferred)e(to)i(the)g (innermost)f(handler)2040 1814 y(of)k(the)g(appropriate)f(t)n(yp)r(e)h (on)g(the)g(curren)n(t)f(call)h(stac)n(k.)49 b(Ex-)2040 1914 y(ceptions)30 b(enable)g(errors)f(to)h(propagate)f(without)i(the)f (use)h(of)2040 2013 y(cum)n(b)r(ersome)e(and)g(error-prone)e(return)i (co)r(des.)43 b(Exceptions)2040 2113 y(also)33 b(allo)n(w)f(the)j (authors)d(of)i(library)e(mo)r(dules)i(to)g(defer)f(the)2040 2213 y(handling)24 b(of)f(errors)f(to)h(clien)n(ts,)i(under)e(the)h (assumption)f(that)2040 2312 y(the)j(clien)n(t)g(application)g(is)f(b)r (est)i(able)e(to)h(decide)g(ho)n(w)f(to)h(deal)2040 2412 y(with)i(the)g(error)e(condition.)2152 2511 y(T)-7 b(o)40 b(treat)g(signals)g(as)g(exceptions,)j(Python)d(pro)n(vides)f(a)2040 2611 y(w)n(a)n(y)17 b(to)h(raise)g(an)g(exception)g(within)h(a)f (signal)f(handler,)j(thereb)n(y)2040 2711 y(turning)38 b(an)g(async)n(hronous)e(signal)i(in)n(to)g(an)g Fg(asynchr)l(onous) 2040 2810 y(exc)l(eption)p Fk(.)77 b(Once)40 b(raised,)j(async)n (hronous)c(exceptions)h(are)2040 2910 y(handled)20 b(using)f(the)i (exception)e(handler)g(mec)n(hanism)h(for)f(nor-)2040 3010 y(mal)28 b(\(sync)n(hronous\))e(exceptions.)2152 3109 y(Unfortunately)-7 b(,)47 b(the)c(Python)g(language's)e (transforma-)2040 3209 y(tion)22 b(of)g(signals)f(in)n(to)h(async)n (hronous)e(exceptions)i(is)g(curren)n(tly)2040 3308 y(not)k(robust.)36 b(Subtle)26 b(race)f(conditions)g(actually)g(mak)n(e)g(it)i(im-)2040 3408 y(p)r(ossible)g(to)g(write)g(reliable)g(co)r(de)g(that)g(handles)g (signals)g(in)g(a)2040 3508 y(timely)g(fashion.)36 b(W)-7 b(e)26 b(prop)r(ose)f(a)h(small)f(mo)r(di\014cation)h(to)g(the)2040 3607 y(Python)i(programming)e(language)h(to)h(correct)f(this)h(problem) 2040 3707 y(in)e(a)f(satisfactory)f(w)n(a)n(y)-7 b(.)35 b(Our)25 b(extension,)h(follo)n(wing)f(the)h(sug-)2040 3807 y(gestions)34 b(in)i([4)o(])f(for)g(Hask)n(ell,)h(in)n(tro)r (duces)f(statemen)n(ts)f(that)2040 3906 y(blo)r(c)n(k)24 b(and)f(un)n(blo)r(c)n(k)h(async)n(hronous)d(signal)j(deliv)n(ery)e(in) j(their)2040 4006 y(dynamic)34 b(scop)r(e.)57 b(These)34 b(statemen)n(ts)g(are)f(1\))h(a)g(simple)g(ex-)2040 4105 y(tension)29 b(to)f(the)h(Python)g(language,)e(2\))i(easy)e(to)i (implemen)n(t,)2040 4205 y(and)f(3\))f(in)n(tuitiv)n(e.)2152 4305 y(The)39 b(need)g(for)g(more)f(a)h(reliable)f(async)n(hronous)e (excep-)2040 4404 y(tion)e(mec)n(hanism)g(is)g(not)g(merely)g (theoretical.)55 b(One)34 b(of)g(the)2040 4504 y(authors)39 b(unco)n(v)n(ered)f(the)j(problem)e(while)h(trying)f(to)h(build)2040 4604 y(a)33 b(robust)f(soft)n(w)n(are)g(to)r(ol)h(using)g(Python.)53 b(In)33 b(addition,)h(the)2040 4703 y(Python)25 b(standard)f(library)f (itself)j(con)n(tains)e(sev)n(eral)f(h)n(undred)2040 4803 y(exception)g(handlers)f(to)h(manage)f(v)-5 b(arious)22 b(resources,)g(and)h(all)2040 4902 y(of)g(them)g(ma)n(y)f(b)r(eha)n(v)n (e)g(incorrectly)g(in)h(the)g(presence)f(of)h(asyn-)2040 5002 y(c)n(hronous)j(exceptions.)2152 5102 y(After)k(sho)n(wing)e(ho)n (w)h(our)f(extension)h(solv)n(es)f(the)i(demon-)2040 5201 y(strated)25 b(problem)h(in)g(an)g(elegan)n(t)f(w)n(a)n(y)-7 b(,)25 b(w)n(e)g(giv)n(e)g(an)h(o)n(v)n(erview)2040 5301 y(of)h(other)g(w)n(a)n(ys)f(in)h(whic)n(h)h(v)-5 b(arious)26 b(programming)f(languages)2040 5401 y(ha)n(v)n(e)i(com)n(bined)g (signals)f(and)i(exceptions.)p eop %%Page: 2 2 2 1 bop -152 -129 a Fi(2)105 b(Async)m(hronous)37 b(Exceptions)f(and)e (Python)-152 53 y Fk(As)25 b(w)n(e)f(demonstrate)g(in)h(this)g (section,)f(Python)g(do)r(es)h(not)f(en-)-152 153 y(able)k(programmers) e(to)i(write)f(robust)h(co)r(de)g(in)g(the)h(presence)-152 252 y(of)e(async)n(hronous)c(exceptions.)36 b(The)27 b(existing)f(language)e(fea-)-152 352 y(tures)30 b(to)g(handle)f (exceptions)h(su\013er)f(from)h(subtle)g(race)f(con-)-152 452 y(ditions)f(when)g(async)n(hronous)d(exceptions)i(are)f(generated)h (in)-152 551 y(signal)34 b(handlers.)57 b(This)35 b(is)g(a)f(kno)n(wn)g (pitfall)h(that)g(has)f(also)-152 651 y(app)r(eared)27 b(in)h(other)f(languages)f([8)o(,)i(4)o(].)-40 751 y(Python)d(mo)r (dels)f(signal)g(handling)h(similar)e(to)i(the)g(C)g(pro-)-152 850 y(gramming)c(language.)34 b(In)22 b(particular,)g(programs)e(ma)n (y)h(regis-)-152 950 y(ter)f(signal)f(handlers)h(\(i.e.,)i(Python)d (functions\))i(that)f(are)f(then)-152 1049 y(called)33 b(when)h(signals)e(o)r(ccur.)53 b(F)-7 b(or)33 b(example,)h(the)g (follo)n(wing)-152 1149 y(Python)28 b(program)e(installs)i(the)g Fb(handle)p 1171 1149 27 4 v 29 w(alarm)e Fk(function)j(as)-152 1249 y(the)f(handler)f(for)g(the)h(SIGALRM)h(signal.)-152 1392 y Fh(Figure)j(1:)41 b(Signal)31 b(Handlers)p -152 1456 8 36 v -144 1427 1979 8 v 1835 1456 8 36 v -79 1534 a Fb(def)42 b(handle)p 364 1534 27 4 v 29 w(alarm\(signum,)c(frame\):)8 1633 y(print)k("received)d(alarm)j(signal")-79 1833 y (signal.signal\(si)o(gn)o(al.)o(SI)o(GA)o(LRM)o(,)37 b(handle)p 1497 1833 V 29 w(alarm\))-79 2032 y(...)p -152 2103 8 36 v -144 2103 1979 8 v 1835 2103 8 36 v -152 2246 a Fk(The)20 b(Python)f(in)n(terpreter)g(will)h(call)f(this)i (function)f(ev)n(ery)e(time)-152 2345 y(the)37 b(op)r(erating)e(system) i(generates)e(a)h(SIGALRM)h(noti\014ca-)-152 2445 y(tion.)-40 2545 y(The)f(Python)f(in)n(terpreter)g(\(written)h(in)g(C\))h(implemen) n(ts)-152 2644 y(this)i(functionalit)n(y)g(b)n(y)f(setting)h(a)f (\015ag)g(when)h(a)g(signal)e(o)r(c-)-152 2744 y(curs.)f(Then,)25 b(when)g(iterating)e(through)h(the)h(main)g(b)n(yte)f(co)r(de)-152 2844 y(execution)h(lo)r(op,)h(the)f(in)n(terpreter)g(notices)g(that)g (the)h(\015ag)e(has)-152 2943 y(b)r(een)33 b(set,)g(and)e(b)r(egins)h (in)n(terpreting)f(the)h(co)r(de)g(that)g(mak)n(es)-152 3043 y(up)19 b(the)h(signal)d(handler,)j(as)e(if)i(the)f(next)g(b)n (yteco)r(de)f(instruction)-152 3142 y(had)26 b(b)r(een)g(a)f (subroutine)h(call)f(to)h(the)g(signal)e(handler.)36 b(Th)n(us,)-152 3242 y(the)i(Python)f(in)n(terpreter)f(partially)h (sync)n(hronizes)e(the)j(sig-)-152 3342 y(nal.)44 b(While)30 b(the)h(signal)e(handler)g(executes)h(async)n(hronously)-152 3441 y(with)i(resp)r(ect)f(to)h(the)g(main)f(Python)g(program,)f(it)i (executes)-152 3541 y(sync)n(hronously)f(with)j(resp)r(ect)f(to)g(the)g (Python)g(in)n(terpreter,)-152 3641 y(i.e.,)28 b(it)g(do)r(es)f(not)h (execute)g(as)e(part)i(of)f(a)g(C)h(signal)f(handler.)-40 3740 y(Python)42 b(explicitly)g(p)r(ermits)h(signal)e(handlers)g(to)h (raise)-152 3840 y(exceptions.)60 b(F)-7 b(or)35 b(example,)i(w)n(e)e (could)h(replace)e(the)i Fb(print)-152 3939 y Fk(statemen)n(t)45 b(in)g(Figure)g(1)f(with)i Fb(raise)41 b(TimeOutError)f Fk(to)-152 4039 y(raise)18 b(an)g(exception)g(when)g(the)h(signal)e(o)r (ccurs.)33 b(Also,)20 b(Python's)-152 4139 y(default)27 b(signal)f(handler)g(for)g Fb(SIGINT)e Fk(\(the)j(in)n(terrupt)g (signal\))-152 4238 y(raises)33 b(the)i Fb(KeyboardInterrup)o(t)29 b Fk(exception.)57 b(This)34 b(trans-)-152 4338 y(lation)k(of)g(async)n (hronous)e(signals)g(in)n(to)i(exceptions)g(is)g(con-)-152 4438 y(v)n(enien)n(t;)g(programmers)32 b(can)j(handle)f(k)n(eyb)r(oard) f(in)n(terrupts)-152 4537 y(as)e(they)h(w)n(ould)f(\\\014le)g(not)g (found")g(or)g(\\p)r(ermission)f(denied")-152 4637 y(errors.)-40 4736 y(As)h(a)f(result,)h(ho)n(w)n(ev)n(er,)f(Python)g(programs)e(m)n (ust)j(an)n(tic-)-152 4836 y(ipate)41 b(the)g(fact)g(that)g(exceptions) f(can)g(b)r(e)h(thro)n(wn)f Fg(at)h(any)-152 4936 y(p)l(oint)p Fk(,)21 b(i.e.,)f(exceptions)e(are)g(no)n(w)f(async)n(hronous)f(ev)n (en)n(ts.)33 b(Com-)-152 5035 y(mon)23 b(practice)f(is)h(to)f(surround) g(co)r(de)g(in)h(whic)n(h)g(the)g(program-)-152 5135 y(mer)38 b(w)n(an)n(ts)f(to)h(handle)g(async)n(hronous)e(exceptions)i (with)g(a)-152 5235 y(Python)j(exception)g(handler.)76 b(Ho)n(w)n(ev)n(er,)43 b(this)e(leads)f(to)h(a)-152 5334 y(n)n(um)n(b)r(er)22 b(of)g(race)f(conditions,)i(whic)n(h)f(are)f (exempli\014ed)i(b)n(y)f(the)-152 5434 y(follo)n(wing)27 b(co)r(de:)2040 -129 y Fh(Figure)k(2:)42 b(Python)32 b(Race)h(Condition)p 2040 -65 V 2048 -93 1979 8 v 4027 -65 8 36 v 2113 13 a Fb(f)43 b(=)g(open\(file)p 2688 13 27 4 v 28 w(name\))2113 113 y(try:)2200 213 y(s)g(=)g(f.read\(\)) 2113 312 y(finally:)2200 412 y(f.close\(\))p 2040 483 8 36 v 2048 483 1979 8 v 4027 483 8 36 v 2152 642 a Fk(The)d(seman)n (tics)f(of)g(Python's)g Fb(try)p Fk(-)p Fb(finally)c Fk(construct)2040 742 y(are)22 b(that)h(the)h(co)r(de)f(in)g(the)g Fb(try)f Fk(blo)r(c)n(k)g(is)h(executed)g(and)g(then,)2040 842 y(whether)c(the)h Fb(try)e Fk(blo)r(c)n(k)h(is)g(executed)g (normally)f(or)h(via)f(an)h(ex-)2040 941 y(ception,)27 b(the)h Fb(finally)c Fk(blo)r(c)n(k)j(is)g(executed.)37 b(This)27 b(construct)2040 1041 y(is)j(in)n(tended)h(to)f(b)r(e)h (used,)g(as)e(sho)n(wn)h(ab)r(o)n(v)n(e,)f(to)h(manage)g(re-)2040 1140 y(sources)22 b(robustly)-7 b(.)34 b(This)23 b(co)r(de)g(attempts)h (to)f(ensure)f(that)h(the)2040 1240 y(\014le)g Fb(f)g Fk(will)g(b)r(e)g(closed)f(ev)n(en)g(if)i(an)e(error)f(o)r(ccurs)h (when)h(reading)2040 1340 y(from)k(the)g(\014le.)37 b(\(The)27 b Fb(read)f Fk(function)h(raises)f(an)h(exception)f(if)2040 1439 y(data)33 b(cannot)f(b)r(e)i(read.\))52 b(Idioms)33 b(similar)g(to)f(this)i(co)r(de)f(are)2040 1539 y(used)28 b(to)f(handle)h(man)n(y)f(di\013eren)n(t)h(resources,)d(including)j(m)n (u-)2040 1639 y(tex)g(lo)r(c)n(ks,)f(net)n(w)n(ork)f(connections,)h (and)g(so)g(on.)2152 1738 y(Ho)n(w)n(ev)n(er,)33 b(in)h(the)g(presence) f(of)h(signals,)g(this)g(co)r(de)f(do)r(es)2040 1838 y(not)39 b(p)r(erform)g(as)g(in)n(tended.)72 b(In)40 b(particular,)h(consider)d(the)2040 1937 y(case)25 b(in)h(whic)n(h)g(a) f(signal)g(o)r(ccurs)g(immediately)h(after)g(the)g(call)2040 2037 y(to)39 b Fb(open)p Fk(,)h(but)f(b)r(efore)g(the)g(in)n(terpreter) e(has)i(b)r(egun)g(to)f(ex-)2040 2137 y(ecute)f(the)h Fb(try)d Fk(blo)r(c)n(k.)65 b(If)37 b(the)h(signal)e(handler)g(thro)n (ws)g(an)2040 2236 y(exception,)c(the)g Fb(finally)c Fk(blo)r(c)n(k)j(is)g(nev)n(er)f(executed.)48 b(Simi-)2040 2336 y(larly)-7 b(,)28 b(consider)f(the)i(case)e(in)i(whic)n(h)f(a)g (signal)g(o)r(ccurs)f(just)i(as)2040 2436 y(the)23 b(in)n(terpreter)e (en)n(ters)g(the)i Fb(finally)d Fk(blo)r(c)n(k,)i(but)h(b)r(efore)f (the)2040 2535 y(call)f(to)g Fb(close)p Fk(.)33 b(If)21 b(the)h(signal)e(handler)h(thro)n(ws)f(an)h(exception,)2040 2635 y(the)26 b(in)n(terpreter)e(will)h(nev)n(er)g(call)f Fb(close)p Fk(.)35 b(In)25 b(b)r(oth)h(cases,)e(the)2040 2734 y(program)i(will)h(leak)g(the)h(op)r(en)g(\014le.)3175 2704 y Ff(2)2040 2964 y Fi(2.1)105 b(A)m(ttempted)23 b(Solutions)i(and)f(Their)g(Pitfalls)2040 3117 y Fk(There)36 b(are)g(no)g(adequate)g(solutions)g(to)g(a)n(v)n(oid)f(these)i(prob-) 2040 3216 y(lems.)k(T)-7 b(o)29 b(illustrate)g(the)g(subtle)h(in)n (teractions)e(b)r(et)n(w)n(een)h(sig-)2040 3316 y(nals)42 b(and)h(exceptions,)j(w)n(e)d(describ)r(e)f(t)n(w)n(o)g(suggested)g (pro-)2040 3416 y(gramming)17 b(practices)h(to)g(prev)n(en)n(t)f(race)h (conditions)f(and)i(demon-)2040 3515 y(strate)27 b(their)h(w)n (eaknesses.)2152 3615 y(One)21 b(approac)n(h)f(is)h(to)g(explicitly)h (blo)r(c)n(k)f(signals)f(b)r(efore)h(the)2040 3715 y(call)29 b(to)h Fb(open)e Fk(and)h(un)n(blo)r(c)n(k)g(them)i(after)e(the)h(call) f(to)h Fb(close)p Fk(.)2040 3814 y(Although)e(Python)g(do)r(es)f(not)h (pro)n(vide)f(signal-blo)r(c)n(king)f(and)2040 3914 y(signal-un)n(blo)r (c)n(king)37 b(routines)i(in)g(its)h(library)-7 b(,)41 b(it)e(is)h(easy)e(to)2040 4013 y(write)24 b(a)f(C)g(extension)h(mo)r (dule)f(that)h(pro)n(vides)f(this)g(function-)2040 4113 y(alit)n(y:)2040 4289 y Fh(Figure)31 b(3:)42 b(Python)32 b(Race)h(Condition)p 2040 4353 V 2048 4325 1979 8 v 4027 4353 8 36 v 2113 4431 a Fb(block)p 2338 4431 27 4 v 29 w(all)p 2499 4431 V 30 w(signals\(\))2113 4531 y(f)43 b(=)g(open\(file)p 2688 4531 V 28 w(name\))2113 4630 y(try:)2200 4730 y(s)g(=)g(f.read\(\))2113 4830 y(finally:)2200 4929 y(f.close\(\))2113 5029 y(unblock)p 2426 5029 V 28 w(all)p 2586 5029 V 30 w(signals\(\))p 2040 5100 8 36 v 2048 5100 1979 8 v 4027 5100 8 36 v 2040 5175 797 4 v 2127 5224 a Fd(2)2159 5249 y Ff(When)17 b(Python)g(garbage)g (collects)f(the)h(\014le)g(ob)t(ject,)g(it)g(will)h(close)f(the)g (\014le,)2040 5315 y(but)h(there)f(is)h(no)g(guaran)n(tee)g(that)g (this)g(will)g(happ)r(en)f(in)g(a)i(timely)e(fashion.)27 b(In)2040 5382 y(general,)19 b(the)h(resource)e(migh)n(t)i(b)r(e)f(one) h(that)g(Python)f(will)h(nev)n(er)f(deallo)r(cate.)1920 5683 y Fk(2)p eop %%Page: 3 3 3 2 bop -152 -129 a Fk(While)40 b(this)f(approac)n(h)e(do)r(es)i (indeed)g(a)n(v)n(oid)e(the)j(race)e(con-)-152 -29 y(ditions)32 b(describ)r(ed)g(ab)r(o)n(v)n(e,)f(it)h(do)r(es)g(not)g(solv)n(e)e(the) i(problem)-152 71 y(in)f(a)g(satisfactory)e(w)n(a)n(y)-7 b(.)46 b(In)31 b(particular,)f(if)h(the)h(b)r(o)r(dy)f(of)g(the)-152 170 y Fb(try)h Fk(blo)r(c)n(k)g(con)n(tains)g(a)g(long-running)f (computation,)j(asyn-)-152 270 y(c)n(hronous)27 b(ev)n(en)n(ts)g(ma)n (y)h(b)r(e)g(blo)r(c)n(k)n(ed)g(for)f(an)h(arbitrarily)f(long)-152 369 y(p)r(erio)r(d)g(of)f(time,)h(making)f(the)h(program)d (unacceptably)i(non-)-152 469 y(resp)r(onsiv)n(e.)33 b(Also,)22 b(note)f(that)g(the)g(call)f(to)g Fb(open)g Fk(is)g(no)n(w)g(made)-152 569 y(when)31 b(signals)e(are)g(turned)i (o\013.)45 b(If)30 b(the)h(\014le)f(is)g(on)g(a)g(net)n(w)n(ork)-152 668 y(\014le)c(system,)g(and)g(cannot)f(b)r(e)h(op)r(ened)g(quic)n(kly) -7 b(,)26 b(the)g(user)f(can)-152 768 y(no)c(longer)f(in)n(terrupt)g (the)h(program.)33 b(By)21 b(mo)n(ving)f(the)h(calls)f(to)-152 868 y(di\013eren)n(t)j(lo)r(cations,)f(w)n(e)g(can)g(impro)n(v)n(e)e (resp)r(onsiv)n(eness|but)-152 967 y(only)28 b(at)f(the)h(cost)f(of)h (robustness.)-40 1067 y(Another)42 b(approac)n(h)f(is)h(to)g (explicitly)h(reset)e(the)i(signal)-152 1166 y(handler)23 b(to)f(a)h(routine)f(that)i(will)f(nev)n(er)f(thro)n(w)g(an)g (exception.)-152 1266 y(Instead,)29 b(the)g(signal)f(handler)g(w)n (ould)g(queue)h(the)g(exception.)-152 1366 y(Later,)h(at)g(an)g (appropriate)e(p)r(oin)n(t,)j(the)g(exception)f(could)g(b)r(e)-152 1465 y(thro)n(wn.)40 b(This)29 b(approac)n(h)d(is)j(not)g(easy)f(to)g (get)h(righ)n(t,)f(ev)n(en)g(if)-152 1565 y(it)g(can)f(b)r(e)g(made)g (to)h(w)n(ork.)35 b(Signals)26 b(m)n(ust)i(b)r(e)f(blo)r(c)n(k)n(ed)g (while)-152 1665 y(the)33 b(signal)e(handlers)g(are)g(b)r(eing)h (replaced,)g(some)g(pro)n(vision)-152 1764 y(m)n(ust)22 b(b)r(e)g(made)g(to)g(deal)f(with)i(the)f(case)f(in)h(whic)n(h)g (signal)e(han-)-152 1864 y(dlers)i(are)f(c)n(hanged)g(explicitly)i(b)n (y)f(co)r(de)g(in)g(the)h(middle)f(of)h(the)-152 1963 y Fb(try)i Fk(blo)r(c)n(k,)h(and)g(it)h(is)f(di\016cult)h(to)f(handle)g (the)g(p)r(ossibilit)n(y)g(of)-152 2063 y(m)n(ultiple)i(signals)f (arriving)f(during)h(the)h Fb(try)e Fk(blo)r(c)n(k.)-40 2163 y(P)n(erhaps)38 b(more)g(imp)r(ortan)n(tly)-7 b(,)41 b(b)r(oth)e(approac)n(hes)e(su\013er)-152 2262 y(from)22 b(the)g(fundamen)n(tal)g(defect)g(that)g(the)g(programmer)e(m)n(ust) -152 2362 y(explicitly)j(remem)n(b)r(er)e(to)h(insert)g(co)r(de)h(to)f (blo)r(c)n(k)f(and)h(un)n(blo)r(c)n(k)-152 2462 y(signals,)e(or)d(to)i (register)e(and)h(unregister)g(signal)f(handlers.)34 b(W)-7 b(e)-152 2561 y(also)19 b(b)r(eliev)n(e)g(that)h(requiring)f (the)g(programmer)f(to)h(matc)n(h)h(the)-152 2661 y(t)n(w)n(o)32 b(separate)f(op)r(erations)g(correctly)g(is)h(dangerous.)49 b(Other)-152 2761 y(paired)27 b(op)r(erations,)f(suc)n(h)h(as)f(lo)r(c) n(k)h(acquire)f(and)h(release,)f(are)-152 2860 y(frequen)n(tly)20 b(used)h(incorrectly)-7 b(,)20 b(and)g(w)n(e)g(wish)g(to)h(a)n(v)n(oid) d(adding)-152 2960 y(a)28 b(similar)e(feature)i(here.)-152 3193 y Fi(3)105 b(Blo)s(c)m(king)40 b(and)f(Un)m(blo)s(c)m(king)i (Async)m(hronous)5 3306 y(Exceptions)-152 3488 y Fk(W)-7 b(e)45 b(no)n(w)f(presen)n(t)g(a)g(simple)g(language)f(extension)h(to)g (en-)-152 3588 y(able)22 b(safe)h(use)f(of)g(async)n(hronous)e (exceptions)i(in)h(Python)f(pro-)-152 3687 y(grams.)55 b(Our)33 b(prop)r(osal)f(is)i(based)g(on)f(features)h(explored)f(in) -152 3787 y(other)d(programming)f(languages,)g(particularly)h(in)h(the) g(con-)-152 3887 y(text)h(of)f(the)h(Hask)n(ell)e(programming)f (language)g([4].)48 b(W)-7 b(e)31 b(ex-)-152 3986 y(plore)37 b(the)g(full)h(design)f(space)f(for)h(handling)f(async)n(hronous)-152 4086 y(exceptions)27 b(in)h(the)g(next)g(section.)-40 4185 y(Our)38 b(prop)r(osed)g(mo)r(di\014cation)g(to)g(Python)g (extends)h(the)-152 4285 y(syn)n(tax)d(with)i(t)n(w)n(o)e(additional)h (scop)r(ed)g(constructs|)p Fb(block)-152 4385 y Fk(and)26 b Fb(unblock)m Fk(.)36 b(The)25 b(follo)n(wing)g(program)e (demonstrates)i(the)-152 4484 y(constructs:)-152 4623 y Fh(Figure)32 b(4:)41 b Fb(block)30 b Fh(and)i Fb(unblock)p -152 4687 8 36 v -144 4659 1979 8 v 1835 4687 8 36 v -107 4765 a Fa(s)-68 4777 y Ff(0)-107 4865 y Fb(block:)-20 4964 y Fa(s)19 4976 y Ff(1)-20 5064 y Fb(unblock:)67 5164 y Fa(s)106 5176 y Ff(2)67 5263 y Fa(s)106 5275 y Ff(3)-20 5363 y Fa(s)19 5375 y Ff(4)p -152 5434 V -144 5434 1979 8 v 1835 5434 8 36 v 2040 -129 a Fk(The)27 b Fb(block)e Fk(and)h Fb(unblock)e Fk(statemen)n(ts)j(disable)f(and)h (enable)2040 -29 y(async)n(hronous)39 b(signal)i(deliv)n(ery)f(in)i (their)f(dynamic)g(scop)r(e.)2040 71 y(Th)n(us,)24 b(no)e(async)n (hronous)f(exceptions)h(will)h(o)r(ccur)f(during)g(the)2040 170 y(execution)35 b(of)f Fa(s)2559 182 y Ff(1)2631 170 y Fk(or)g Fa(s)2779 182 y Ff(4)2816 170 y Fk(,)j(but)e(they)g(ma)n(y)f (o)r(ccur)g(during)g(the)2040 270 y(execution)h(of)h Fa(s)2561 282 y Ff(0)2598 270 y Fk(,)i Fa(s)2698 282 y Ff(2)2735 270 y Fk(,)g(and)d Fa(s)3004 282 y Ff(3)3042 270 y Fk(.)61 b(The)35 b Fb(block)f Fk(and)i Fb(unblock)2040 369 y Fk(statemen)n(ts)e(can)g(b)r(e)g(arbitrarily)f(nested)h(with)h (the)f(ob)n(vious)2040 469 y(meaning.)h(Using)22 b Fb(block)e Fk(and)i Fb(unblock)p Fk(,)e(w)n(e)i(can)f(rewrite)g(the)2040 569 y(co)r(de)i(in)h(Figure)f(2)g(to)g(ensure)g(that)h(the)g(\014le)g (resource)d(is)j(nev)n(er)2040 668 y(left)36 b(op)r(en)f(while)h(still) g(enabling)e(async)n(hronous)f(exceptions)2040 768 y(while)28 b(using)f(the)h(\014le:)2040 912 y Fh(Figure)j(5:)42 b(Revised)31 b(Example)p 2040 976 V 2048 948 1979 8 v 4027 976 8 36 v 2085 1054 a Fb(block:)2172 1154 y(f)43 b(=)g(open\(file)p 2747 1154 27 4 v 28 w(name\))2172 1253 y(try:)2259 1353 y(unblock:)2346 1453 y(s)h(=)f(f.read\(\))2172 1552 y(finally:)2259 1652 y(f.close\(\))p 2040 1723 8 36 v 2048 1723 1979 8 v 4027 1723 8 36 v 2040 1867 a Fk(With)d(these)g(extensions,)h(the)f(Python)f(run)g(time)g(will)h(de-) 2040 1966 y(liv)n(er)35 b(async)n(hronous)f(exceptions)i(only)f(when)i (con)n(trol)d(is)i(in)2040 2066 y(the)c Fb(unblock)d Fk(statemen)n(t.)50 b(Th)n(us,)33 b(the)f(race)f(conditions)g(de-)2040 2166 y(scrib)r(ed)38 b(ab)r(o)n(v)n(e)f(are)g(eliminated.)69 b(Ho)n(w)n(ev)n(er,)39 b(long-running)2040 2265 y(computations)c(in)g (the)h Fb(unblock)c Fk(blo)r(c)n(k)j(can)f(still)i(b)r(e)f(in)n(ter-) 2040 2365 y(rupted)c(b)n(y)f(an)g(async)n(hronous)e(ev)n(en)n(t,)i(and) g(signals)f(can)h(still)2040 2465 y(b)r(e)e(transformed)f(in)n(to)h (exceptions)f(as)h(appropriate.)36 b(If)28 b Fb(open)2040 2564 y Fk(ma)n(y)19 b(tak)n(e)g(a)g(long)f(time)i(to)g(complete,)h(it)f (to)r(o)f(could)g(b)r(e)h(rewrit-)2040 2664 y(ten)28 b(to)f(use)f Fb(unblock)f Fk(to)i(ensure)f(that)i(the)f(user)f(could)h (in)n(ter-)2040 2763 y(rupt)h(the)g(call)f(at)g(appropriate)f(times.) 2152 2863 y(Note)38 b(that)g(the)g(op)r(erators)e(nest)i(naturally)e (and)i(matc)n(h)2040 2963 y(our)21 b(in)n(tuition)g(ab)r(out)h(when)f (w)n(e)g(w)n(ould)g(lik)n(e)g(to)g(prev)n(en)n(t)g(asyn-)2040 3062 y(c)n(hronous)26 b(exceptions)h(from)g(o)r(ccurring.)2040 3288 y Fi(3.1)105 b(Implemen)m(tation)2040 3441 y Fk(As)19 b(describ)r(ed)f(in)h(Section)g(1,)h(the)f(Python)f(in)n(terpreter)f (queues)2040 3541 y(signals)33 b(and)g(only)g(deliv)n(ers)g(them)h(to)g (the)g(in)n(terpreted)f(pro-)2040 3641 y(gram)19 b(at)h(the)h(top)f(of) g(the)h(in)n(terpreter's)e(main)h(lo)r(op.)34 b(This)20 b(ma-)2040 3740 y(c)n(hinery)25 b(mak)n(es)g(it)i(easy)e(to)g(em)n(b)r (ed)i(implemen)n(tations)e(of)h(the)2040 3840 y Fb(block)e Fk(and)i Fb(unblock)d Fk(statemen)n(ts)j(in)g(the)g(Python)f(run)h (time)2040 3939 y(with)i(no)g(measurable)e(memory)h(or)f(p)r (erformance)h(p)r(enalt)n(y)-7 b(.)2152 4039 y(Activ)i(ation)19 b(records)e(in)h(the)h(standard)e(Python)h(in)n(terpreter)2040 4139 y(con)n(tain)j(a)h(stac)n(k)e(of)i(information)f(ab)r(out)h (exception)g(handlers)2040 4238 y(in)36 b(the)h(dynamic)f(scop)r(e)f (of)h(execution.)63 b(W)-7 b(e)36 b(extended)g(the)2040 4338 y(in)n(terpreter)i(to)h(record)f(en)n(tries)h(and)g(exits)g(for)g Fb(block)e Fk(and)2040 4438 y Fb(unblock)19 b Fk(statemen)n(ts)j(on)g (this)g(stac)n(k)f(as)g(w)n(ell.)35 b(W)-7 b(e)22 b(also)f(mo)r(d-)2040 4537 y(i\014ed)30 b(the)f(in)n(terpreter)f(to)i(deliv)n(er)e(signals)g (at)h(the)h(top)f(of)g(the)2040 4637 y(main)19 b(lo)r(op)g(only)g (after)f(insp)r(ecting)i(this)f(stac)n(k)f(for)h(the)h(curren)n(t)2040 4736 y(activ)-5 b(ation)31 b(record)e(and)i(determining)g(that)g (signals)f(are)g(not)2040 4836 y(curren)n(tly)21 b(blo)r(c)n(k)n(ed.)34 b(If)22 b(signals)e(are)h(blo)r(c)n(k)n(ed,)h(the)g(in)n(terpreter)2040 4936 y(dela)n(ys)32 b(deliv)n(ery)f(un)n(til)i(they)g(b)r(ecome)g(un)n (blo)r(c)n(k)n(ed.)51 b(When)33 b(a)2040 5035 y(function)f(is)f (called,)g(the)g(in)n(terpreter)f(pushes)h(on)n(to)f(the)i(new)2040 5135 y(activ)-5 b(ation)34 b(record's)e(stac)n(k)h(an)g(indication)h (of)g(whether)g(sig-)2040 5235 y(nals)29 b(are)f(curren)n(tly)g(blo)r (c)n(k)n(ed)h(in)g(the)h(caller.)41 b(This)29 b(allo)n(ws)f(us)2040 5334 y(to)d(a)n(v)n(oid)e(searc)n(hing)g(outside)h(the)h(curren)n(t)f (activ)-5 b(ation)24 b(record)2040 5434 y(when)k(determining)f(if)h (signals)f(are)f(blo)r(c)n(k)n(ed.)1920 5683 y(3)p eop %%Page: 4 4 4 3 bop -152 -129 a Fi(3.2)105 b(Higher-lev)m(el)36 b(Extensions)-152 25 y Fk(The)30 b Fb(block)d Fk(and)j Fb(unblock)c Fk(statemen)n(ts)j (are)g(relativ)n(ely)f(lo)n(w-)-152 124 y(lev)n(el)39 b(constructs,)j(and)d(w)n(e)g(suggest)f(pro)n(viding)g(\\syn)n(tactic) -152 224 y(sugar")32 b(for)h(common,)i(higher-lev)n(el)d(programming)g (idioms.)-152 323 y(Resource)27 b(acquisition,)g(usage,)f(and)i (release)e(is)h(one)h(suc)n(h)f(id-)-152 423 y(ioms,)f(and)g(extending) g(Python)f(to)h(b)r(etter)g(handle)f(this)i(com-)-152 523 y(mon)37 b(case)f(is)g(straigh)n(tforw)n(ard)e(once)i Fb(block)e Fk(and)j Fb(unblock)-152 622 y Fk(ha)n(v)n(e)c(b)r(een)h (implemen)n(ted.)57 b(One)33 b(p)r(ossible)h(w)n(a)n(y)e(to)i(pro)n (vide)-152 722 y(supp)r(ort)22 b(for)f(this)i(feature)e(is)h(with)g (the)g(follo)n(wing)f(extension:)-152 881 y Fh(Figure)32 b(6:)41 b(Resource)31 b(Managemen)m(t)p -152 945 8 36 v -144 917 1979 8 v 1835 945 8 36 v -107 1023 a Fb(initially:)-20 1123 y(f)43 b(=)h(open\(file)p 556 1123 27 4 v 27 w(name\))-107 1223 y(try:)-20 1322 y(s)f(=)h(f.read\(\))-107 1422 y(finally:)-20 1522 y(f.close\(\))p -152 1593 8 36 v -144 1593 1979 8 v 1835 1593 8 36 v -40 1752 a Fk(This)30 b(extension)g(is)g(merely)f (syn)n(tactic)g(sugar)g(for)g(the)h(ex-)-152 1852 y(ample)19 b(ab)r(o)n(v)n(e.)32 b(The)19 b(virtual)f(mac)n(hine)g(blo)r(c)n(ks)g (signal)g(deliv)n(ery)-152 1951 y(during)27 b(the)g Fb(initially)c Fk(and)j Fb(finally)e Fk(fragmen)n(ts,)i(but)h(not)-152 2051 y(the)j Fb(try)d Fk(co)r(de)i(fragmen)n(t.)40 b(All)29 b(exits)g(from)f(the)i Fb(try)d Fk(section,)-152 2150 y(exceptional)34 b(or)f(not,)i(will)g(execute)f(the)g Fb(finally)m Fk(.)56 b(W)-7 b(e)35 b(b)r(e-)-152 2250 y(liev)n(e)27 b(that)g(most)f(co)r(de)h(in)g Fb(initially)c Fk(and)k Fb(finally)d Fk(blo)r(c)n(ks)-152 2350 y(will)32 b(run)f(quic)n(kly)g(and)g(that)h(latency)f(in)g(pro)r(cessing)f (signals)-152 2449 y(will)22 b(therefore)e(not)i(b)r(e)f(unduly)h (a\013ected.)35 b(Nested)22 b Fb(block)d Fk(and)-152 2549 y Fb(unblock)m Fk(,)35 b(or)e Fb(initially-try-fi)o(na)o(lly)-7 b Fk(,)35 b(statemen)n(ts)e(can)-152 2649 y(pro)n(vide)38 b(b)r(etter)h(\014ne-grained)e(con)n(trol)h(o)n(v)n(er)e(async)n (hronous)-152 2748 y(exception)24 b(deliv)n(ery)g(when)g(more)g(subtle) g(programming)e(pat-)-152 2848 y(terns)28 b(are)e(emplo)n(y)n(ed.)-40 2948 y(As)36 b(illustrated)g(in)g([4)o(],)i(the)e(prop)r(osed)f (language)f(exten-)-152 3047 y(sion)27 b(can)f(also)g(easily)g(mo)r (del)g(man)n(y)h(other)f(idioms)g(in)n(v)n(olving)-152 3147 y(async)n(hronous)d(signals)i(or)f(comm)n(unication)h(as)g(w)n (ell,)h(includ-)-152 3246 y(ing)37 b(parallel)e(logical-or)f(and)j (timeouts.)64 b(Clearly)-7 b(,)37 b(features)-152 3346 y(m)n(ust)28 b(b)r(e)g(added)f(to)g(a)g(language)f(with)i(care,)f(and)g (it)h(remains)-152 3446 y(to)21 b(b)r(e)g(seen)g(whic)n(h)g(com)n (bination)f(of)h(lo)n(w-lev)n(el)e(and)i(high-lev)n(el)-152 3545 y(constructs)g(for)g(dealing)g(with)i(async)n(hronous)c (exceptions)i(are)-152 3645 y(most)i(appropriate,)f(giv)n(en)f(the)i(o) n(v)n(erall)e(design)h(and)h(in)n(tended)-152 3745 y(use)28 b(of)f(Python.)-152 3974 y Fi(3.3)105 b(In)m(terruptible)35 b(Op)s(erations)-152 4127 y Fk(While)j(the)f(presen)n(ted)f(features)g (are)g(su\016cien)n(t)h(to)g(prev)n(en)n(t)-152 4226 y(the)24 b(t)n(yp)r(es)f(of)g(race)e(conditions)i(that)g(are)f(of)h (greatest)f(concern)-152 4326 y(to)32 b(us,)h(they)f(still)h(do)e(not)h (prev)n(en)n(t)g(all)f(p)r(oten)n(tially)h(bad)g(b)r(e-)-152 4426 y(ha)n(viors.)37 b(F)-7 b(or)27 b(example,)h(an)g(exception)g (could)g(b)r(e)g(generated)-152 4525 y(after)23 b(the)g(call)f(to)h Fb(f.read)d Fk(completes)i(but)i(b)r(efore)e(the)h(return)-152 4625 y(v)-5 b(alue)28 b(is)f(assigned)g(to)g Fb(s)p Fk(.)37 b(In)27 b(that)h(case,)f(the)h(v)-5 b(alue)28 b(just)g(read)-152 4725 y(w)n(ould)33 b(b)r(e)h(lost.)53 b(As)33 b(in)h(the)f(Hask)n(ell,) h(w)n(e)f(can)g(address)f(this)-152 4824 y(problem)h(b)n(y)h(p)r (ermitting)g(some)f(lo)n(w-lev)n(el)f(blo)r(c)n(king)g(op)r(era-)-152 4924 y(tions,)j(suc)n(h)d(as)h Fb(read)e Fk(to)i(b)r(e)h(in)n (terruptible,)g(ev)n(en)f(when)g(in-)-152 5023 y(side)25 b(a)g Fb(block)e Fk(statemen)n(t.)36 b(With)25 b(this)h(extension,)f (one)f(could)-152 5123 y(write)k(the)g(follo)n(wing)e(safer)h(v)n (ersion)f(of)i(the)g(co)r(de:)2040 -129 y Fh(Figure)j(7:)42 b(In)m(terruptible)32 b Fb(read)e Fh(Op)s(eration)p 2040 -65 V 2048 -93 1979 8 v 4027 -65 8 36 v 2085 13 a Fb(block:)2172 113 y(f)43 b(=)g(open\(file)p 2747 113 27 4 v 28 w(name\))2172 213 y(try:)2259 312 y(s)g(=)h(f.read\(\))2172 412 y(finally:)2259 512 y(f.close\(\))p 2040 583 8 36 v 2048 583 1979 8 v 4027 583 8 36 v 2040 742 a Fk(Either)33 b(the)h(call)f(to)h Fb(read)e Fk(will)i(b)r(e)g(in)n(terrupted)f(b)r(efore)g(an)n(y)2040 842 y(input)25 b(is)f(actually)f(read,)h(or)g(it)g(will)g(complete,)h (in)g(whic)n(h)f(case)2040 941 y(w)n(e)18 b(are)g(guaran)n(teed)f(not)i (to)f(b)r(e)h(in)n(terrupted)g(b)r(efore)f(assigning)2040 1041 y(the)29 b(result)f(to)g Fb(s)o Fk(.)39 b(Our)28 b(initial)g(protot)n(yp)r(e)g(do)r(es)g(not)g(supp)r(ort)2040 1140 y(in)n(terruptible)35 b(op)r(erations,)g(although)f(adding)h(them) g(w)n(ould)2040 1240 y(b)r(e)f(trivial.)55 b(The)33 b(more)g (di\016cult)i(issue)e(w)n(ould)g(b)r(e)i(iden)n(tify-)2040 1340 y(ing)29 b(whic)n(h)g(op)r(erations)e(in)i(the)h(Python)e (libraries)g(should)g(b)r(e)2040 1439 y(in)n(terruptible)e(in)h(this)f (w)n(a)n(y)-7 b(,)25 b(and)h(annotating)g(them)g(as)g(suc)n(h.)2040 1677 y Fi(4)105 b(Related)35 b(W)-9 b(ork)2040 1859 y Fk(W)i(e)33 b(ha)n(v)n(e)f(based)g(our)g(Python)g(language)f(extension) i(on)f(the)2040 1959 y(scop)r(ed)40 b Fb(block)f Fk(and)h Fb(unblock)e Fk(com)n(binators)g(designed)i(for)2040 2058 y(Concurren)n(t)25 b(Hask)n(ell)h([4)o(].)37 b(In)26 b(some)g(sense,)g(the)h(purely)e(func-)2040 2158 y(tional)j(nature)g (of)g(Hask)n(ell)g(mak)n(es)f Fb(block)g Fk(and)h Fb(unblock)d Fk(the)2040 2258 y(ideal)j(primitiv)n(es.)37 b(It)28 b(is)f(easy)g(and)h(natural)f(to)h(use)f(the)h(com-)2040 2357 y(binators)h(in)g(more)g(complex)g(w)n(a)n(ys)f(to)i(supp)r(ort)f (higher-lev)n(el)2040 2457 y(idioms.)39 b(W)-7 b(e)29 b(b)r(eliev)n(e)f(that)h(these)f(op)r(erations)f(are)g(appropri-)2040 2557 y(ate)35 b(for)g(use)g(in)h(Python)f(as)f(w)n(ell.)60 b(They)35 b(are)g(a)g(simple)g(ex-)2040 2656 y(tension)25 b(to)f(the)i(Python)e(language,)g(ha)n(v)n(e)f(a)i(straigh)n(tforw)n (ard)2040 2756 y(and)d(e\016cien)n(t)h(implemen)n(tation,)h(and)e(are)f (\015exible)i(enough)f(to)2040 2855 y(capture)g(the)h(most)f(common)f (idioms)h(used)h(in)f(large)f(systems.)2152 2955 y(The)38 b(treatmen)n(t)f(of)g(async)n(hronous)e(signals)h(and)h(excep-)2040 3055 y(tions)20 b(in)g(other)f(languages)e(co)n(v)n(ers)h(a)h(broad-sp) r(ectrum)g(of)g(p)r(os-)2040 3154 y(sible)39 b(solutions.)71 b(W)-7 b(e)39 b(highligh)n(t)g(represen)n(tativ)n(e)e(language)2040 3254 y(features)c(to)h(demonstrate)f(approac)n(hes,)g(starting)g(with)h (the)2040 3354 y(most)27 b(restrictiv)n(e)f(designs.)36 b(In)27 b(addition)h(to)f(language)e(arc)n(hi-)2040 3453 y(tectures)35 b(that)g(supp)r(ort)f(signals)g(generated)g(b)n(y)g(the)h (under-)2040 3553 y(lying)26 b(op)r(erating)g(system,)h(w)n(e)f(lo)r (ok)g(at)g(languages)f(pro)n(viding)2040 3652 y(mec)n(hanisms)i(to)g (send)h(signals)e(b)r(et)n(w)n(een)i(threads.)2152 3752 y(W)-7 b(e)25 b(b)r(egin)g(with)g(languages)e(that)i(prev)n(en)n(t)f (async)n(hronous)2040 3852 y(generation)33 b(of)h(exceptions.)56 b(F)-7 b(or)33 b(example,)i(the)g(C++)e(lan-)2040 3951 y(guage)27 b(sp)r(eci\014cation)h(forbids)g(signal)f(handlers)g(from)h (raising)2040 4051 y(exceptions)33 b([11)o(].)54 b(Therefore,)33 b(the)h(programs)c(m)n(ust)k(handle)2040 4151 y(signals)e(b)n(y)g (setting)h(a)f(global)g(v)-5 b(ariable)32 b(that)h(can)f(b)r(e)i(p)r (olled)2040 4250 y(later)27 b(to)h(determine)f(whic)n(h)h(signals)e(ha) n(v)n(e)h(o)r(ccurred.)2152 4350 y(Other)43 b(languages)d(supp)r(ort)j (this)g(t)n(yp)r(e)g(of)g(p)r(olling)g(dis-)2040 4449 y(cipline)c(directly)-7 b(.)70 b(In)38 b(Mo)r(dula-2+)g([9)o(])h(and)f (Mo)r(dula-3)g([6],)2040 4549 y(one)23 b(thread)g(ma)n(y)f(send)h(an)g (async)n(hronous)e(signal)i(to)g(another)2040 4649 y(thread,)35 b(but)g(deliv)n(ery)d(is)i(dela)n(y)n(ed)f(un)n(til)h(the)g(receiv)n (er)f(indi-)2040 4748 y(cates)d(in)n(terest)f(in)h(receiving)f (noti\014cation)h(b)n(y)g(calling)f(either)2040 4848 y Fb(AlertWait)34 b Fk(or)j Fb(TestAlert)l Fk(.)67 b(The)38 b Fb(TestAlert)c Fk(pro)r(cedure)2040 4948 y(returns)e(a)h(b)r(o)r (olean)f(v)-5 b(alue)33 b(indicating)g(whether)f(or)g(not)h(an-)2040 5047 y(other)i(thread)g(signaled)f(an)h Fb(Alert)e Fk(for)i(the)h (curren)n(tly)e(exe-)2040 5147 y(cuting)d(thread.)44 b(When)31 b(a)f(thread)g(calls)g Fb(AlertWait)l Fk(,)i(it)e(will)2040 5247 y(blo)r(c)n(k)19 b(un)n(til)h(an)f Fb(Alert)f Fk(is)h(raised,)h (whic)n(h)g(causes)e(the)i(run)f(time)2040 5346 y(to)29 b(generate)f(an)h(exception)g(to)g(b)r(e)g(handled)g(b)n(y)g(the)g(blo) r(c)n(k)n(ed)1920 5683 y(4)p eop %%Page: 5 5 5 4 bop -152 -129 a Fk(thread.)61 b(In)36 b(e\013ect,)i(the)e(alert)f (p)r(olling)g(pro)r(cess)g(turns)g(syn-)-152 -29 y(c)n(hronous)28 b(signals)h(in)n(to)h(sync)n(hronous)d(ev)n(en)n(ts.)43 b(Another)29 b(ex-)-152 71 y(ample)38 b(of)g(this)h(tec)n(hnique)f(app) r(ears)f(in)h(Scsh,)j(a)d(dialect)g(of)-152 170 y(Sc)n(heme)28 b(for)f(systems)g(programming)e([10].)-40 270 y(T)-7 b(o)26 b(use)f(this)h(t)n(yp)r(e)g(of)f(p)r(olling,)h(it)g(is)f (necessary)f(to)i(include)-152 369 y(calls)40 b(to)g(the)g(p)r(olling)g (routines)g(in)g(all)g(libraries)f(and)h(co)r(de)-152 469 y(segmen)n(ts)33 b(that)h(ma)n(y)f(b)r(e)h(used)g(in)g(conjunction) g(with)g(asyn-)-152 569 y(c)n(hronous)26 b(ev)n(en)n(ts.)36 b(This)27 b(requiremen)n(t)f(mak)n(es)g(it)i(di\016cult)g(to)-152 668 y(reason)c(lo)r(cally)h(ab)r(out)g(async)n(hron)n(y)e(and)i (requires)f(co)r(ordina-)-152 768 y(tion)34 b(throughout)f(the)g(en)n (tire)g(program,)g(whic)n(h)h(is)f(a)g(sev)n(ere)-152 868 y(handicap)27 b(when)h(building)g(large)e(systems.)-40 967 y(A)k(similar)e(p)r(olling)h(tec)n(hnique)f(is)h(used)g(in)g(Ja)n (v)-5 b(a)28 b(to)h(in)n(ter-)-152 1067 y(rupt)d(sleeping)e(threads.)36 b(A)25 b(thread)g(can)f(w)n(ak)n(e)g(up)i(a)e(sleeping)-152 1166 y(thread)32 b(b)n(y)f(in)n(v)n(oking)g(the)h Fb(interrupt)c Fk(metho)r(d)33 b(on)f(it.)50 b(The)-152 1266 y(metho)r(d)19 b(in)n(v)n(o)r(cation)e(generates)g(an)h Fb(InterruptedExcept)o(io)o(n) -152 1366 y Fk(exception)i(in)h(the)g(susp)r(ended)f(thread,)h(whic)n (h)g(is)f(then)h(caugh)n(t)-152 1465 y(with)f(a)e(standard)g(Ja)n(v)-5 b(a)17 b(exception)h(handler.)34 b(If)19 b Fb(interrupt)c Fk(is)-152 1565 y(in)n(v)n(ok)n(ed)22 b(on)h(a)g(running)g(thread,)h (no)f(exception)g(is)g(generated.)-152 1665 y(Instead,)37 b(a)e(\015ag)f(that)i(can)f(b)r(e)g(tested)h(later)e(is)i(set)f(to)g (indi-)-152 1764 y(cate)h(the)h(o)r(ccurrence)d(of)i(the)h(async)n (hronous)c(in)n(terruption.)-152 1864 y(Libraries)j(pro)n(viding)g (thread)h(supp)r(ort,)j(most)d(notably)g(the)-152 1963 y(POSIX)31 b(threads)f(in)n(terface)g(\(accessible)g(from)g(C)h(and)g (man)n(y)-152 2063 y(other)41 b(languages\),)h(often)g(de\014ne)f(p)r (olling)g(mec)n(hanisms)f(to)-152 2163 y(handle)28 b(thread)f (cancellation)g([7)o(].)-40 2262 y(Ja)n(v)-5 b(a)44 b(originally)f(pro) n(vided)h(metho)r(ds)h(to)g(susp)r(end,)50 b(re-)-152 2362 y(sume,)23 b(and)f(stop)f(threads)g(async)n(hronously)-7 b(.)33 b(Ho)n(w)n(ev)n(er,)21 b(these)-152 2462 y(features)30 b(presen)n(ted)f(a)g(n)n(um)n(b)r(er)h(of)g(signi\014can)n(t)f(safet)n (y)g(prob-)-152 2561 y(lems)d([12)o(].)36 b(F)-7 b(or)25 b(example,)g(programs)e(that)j(susp)r(end)g(threads)-152 2661 y(while)36 b(they)h(hold)e(lo)r(c)n(ks)g(b)r(ecame)h(prone)f(to)h (deadlo)r(c)n(k,)h(and)-152 2761 y(stopping)28 b(threads)g(outrigh)n(t) f(prev)n(en)n(ts)h(them)h(from)f(cleaning)-152 2860 y(up)g(an)n(y)e (resources)f(and)i(ensuring)f(that)i(data)f(structures)f(are)-152 2960 y(left)f(in)g(a)f(consisten)n(t)g(state.)35 b(Sun)25 b(deprecated)f(these)g(features)-152 3059 y(after)29 b(the)g(initial)g(release)e(of)i(Ja)n(v)-5 b(a.)38 b(Although)29 b(susp)r(end)g(and)-152 3159 y(resume)38 b(op)r(erations)f(app)r(ear)h (in)g(other)g(run-time)g(arc)n(hitec-)-152 3259 y(tures,)k(suc)n(h)e (as)e(the)i(Microsoft)f(.NET)g(framew)n(ork)e(thread)-152 3358 y(mo)r(del)24 b(and)f(Ada)g(tasks)f([2],)i(separate)e(threads)g (cannot)h(in)n(ter-)-152 3458 y(act)28 b(via)f(async)n(hronous)e (exceptions.)-40 3558 y(The)20 b(de\014nition)g(of)g(Standard)f(ML)g ([5])h(originally)d(included)-152 3657 y(an)j Fb(Interrupt)d Fk(exception)j(that)g(w)n(as)f(generated)g(on)h(the)h(SIG-)-152 3757 y(INT)29 b(signal,)f(whic)n(h)h(indicates)f(a)g(user)g(in)n (terrupt.)40 b(Ho)n(w)n(ev)n(er,)-152 3856 y(the)29 b(designers)d(remo) n(v)n(ed)h(it)h(b)r(ecause)g(of)f(the)i(di\016cult)n(y)f(mo)r(d-)-152 3956 y(eling)42 b(this)h(b)r(eha)n(vior)d(formally)h(and)h(problems)g (similar)f(to)-152 4056 y(those)c(illustrated)g(in)g(Section)g(2.)64 b(SML/NJ)37 b(in)n(tro)r(duced)f(a)-152 4155 y(more)22 b(general)f(signal)h(handling)g(mec)n(hanism)g([8)o(])h(in)g(its)f (place.)-152 4255 y(When)34 b(a)f(signal)f(is)i(receiv)n(ed)e(in)h(the) h(new)f(sc)n(heme,)h(the)g(run)-152 4355 y(time)25 b(creates)f(a)g(con) n(tin)n(uation)g(out)g(of)h(the)g(curren)n(tly)e(execut-)-152 4454 y(ing)28 b(thread.)37 b(The)28 b(con)n(tin)n(uation)f(is)h(then)g (passed)f(to)h(the)g(sig-)-152 4554 y(nal)h(handler)g(\(whic)n(h)g (runs)g(with)h(further)f(signals)f(disabled\),)-152 4653 y(and)40 b(the)g(handler)f(ma)n(y)f(either)i(resume)f(the)h(original)e (con-)-152 4753 y(tin)n(uation)i(or)f(transfer)g(con)n(trol)f(to)i (di\013eren)n(t)g(thread)f(after)-152 4853 y(it)31 b(has)f(\014nished)h (its)g(o)n(wn)f(pro)r(cessing.)44 b(Although)30 b(this)h(tec)n(h-)-152 4952 y(nique)41 b(pro)n(vides)e(some)i(of)f(the)h(b)r(ene\014ts)h(of)e (scop)r(ed)h Fb(block)-152 5052 y Fk(and)33 b Fb(unblock)c Fk(constructs,)k(the)g(reliance)e(on)h(con)n(tin)n(uations)-152 5152 y(mak)n(es)27 b(it)h(inappropriate)e(for)h(Python.)-40 5251 y(Sev)n(eral)37 b(Lisp)h(dialects)g(also)f(pro)n(vide)f(supp)r (ort)i(for)g(lim-)-152 5351 y(ited)32 b(async)n(hronous)d(signals)i(b)r (et)n(w)n(een)g(concurren)n(t)g(threads,)2040 -129 y(primarily)22 b(to)g(allo)n(w)g(sp)r(eculativ)n(e)g(execution.)35 b(In)23 b(P)n(aiLisp)e([3],)2040 -29 y(one)e(thread)g(ma)n(y)f(force)h(a)f (di\013eren)n(t)i(thread)e(to)i(execute)f(a)f(con-)2040 71 y(tin)n(uation.)59 b(In)35 b(addition,)h(QLisp)f(pro)n(vides)e(a)i (hea)n(vyw)n(eigh)n(t)2040 170 y(mec)n(hanism)25 b(that)h(allo)n(ws)e (easy)h(destruction)g(of)h(a)f(whole)g(tree)2040 270 y(of)30 b(related)f(threads,)h(but)g(this)g(mec)n(hanism)f(is)h(to)r(o) g(costly)f(to)2040 369 y(use)f(in)f(the)h(t)n(yp)r(es)g(of)f(programs)f (considered)g(here)h([1].)2040 607 y Fi(5)105 b(Summary)2040 789 y Fk(Async)n(hron)n(y)43 b(creates)g(subtle,)49 b(but)44 b(notoriously)f(complex,)2040 889 y(problems)h(for)f(programmers.)84 b(Programming)42 b(languages)2040 989 y(can)20 b(pro)n(vide)f(a)h (foundation)g(for)f(tac)n(kling)h(these)g(problems)f(via)2040 1088 y(simple)29 b(and)g(e\013ectiv)n(e)f(features)g(that)i(handle)e (async)n(hronous)2040 1188 y(ev)n(en)n(ts)23 b(reliably)-7 b(.)34 b(In)24 b(this)g(pap)r(er,)g(w)n(e)f(ha)n(v)n(e)f(iden)n (ti\014ed)i(one)f(as-)2040 1287 y(p)r(ect)h(of)f(Python)g(where)g(this) g(is)g(curren)n(tly)g(not)g(the)h(case,)f(and)2040 1387 y(w)n(e)h(prop)r(ose)g(a)g(straigh)n(tforw)n(ard)e(extension)i(to)g (the)h(language)2040 1487 y(to)e(enable)f(safe)h(use)g(of)f(async)n (hronous)f(exceptions.)34 b(W)-7 b(e)24 b(hop)r(e)2040 1586 y(that)33 b(the)g(Python)f(dev)n(elop)r(ers)f(will)h(seriously)f (examine)h(the)2040 1686 y(situation)25 b(and)g(adopt)g(either)g(our)g (prop)r(osed)f(solution)h(or)f(an-)2040 1786 y(other)j(solution)g(with) h(similar)f(prop)r(erties.)2152 1885 y(The)36 b(same)f(\(or)g(closely)g (related\))g(problems)g(with)h(asyn-)2040 1985 y(c)n(hronous)30 b(exceptions)i(ha)n(v)n(e)e(surfaced)h(in)h(man)n(y)g(languages,)2040 2084 y(including)k(Hask)n(ell,)h(ML,)e(and)h(Ja)n(v)-5 b(a,)36 b(and)g(w)n(e)f(ha)n(v)n(e)f(sho)n(wn)2040 2184 y(ho)n(w)g(these)h(other)f(languages)f(ha)n(v)n(e)g(attempted)i(to)g (pro)n(vide)2040 2284 y(safe)h(async)n(hronous)f(features.)64 b(In)37 b(addition)f(to)h(impro)n(ving)2040 2383 y(Python,)d(w)n(e)f (hop)r(e)g(that)g(this)g(pap)r(er)g(encourages)d(language)2040 2483 y(designers)37 b(to)g(deal)h(with)g(the)h(subtle)f(in)n(teraction) f(b)r(et)n(w)n(een)2040 2583 y(signals)20 b(and)g(exceptions)g(more)g (proactiv)n(ely)f(in)i(the)g(next)g(gen-)2040 2682 y(eration)27 b(of)g(languages.)2040 2911 y Fi(Ac)m(kno)m(wledgmen)m(ts)2040 3065 y Fk(W)-7 b(e)22 b(thank)g(Mik)n(e)f(Burro)n(ws,)g(John)g(Mitc)n (hell,)j(and)d(the)h(anon)n(y-)2040 3164 y(mous)27 b(review)n(ers)f (for)h(commen)n(ts)g(on)h(a)f(draft)g(of)h(this)g(pap)r(er.)2040 3402 y Fi(References)2082 3584 y Fk([1])37 b(R.)19 b(P)-7 b(.)19 b(Gabriel)f(and)h(J.)g(McCarth)n(y)-7 b(.)22 b(Queue-based)c(m)n (ulti-)2207 3684 y(pro)r(cessing)33 b(lisp.)60 b(In)35 b Fg(Pr)l(o)l(c)l(e)l(e)l(dings)i(of)h(the)f(1984)h(A)n(CM)2207 3783 y(Symp)l(osium)32 b(on)f(LISP)h(and)g(functional)h(pr)l(o)l(gr)l (amming)p Fk(,)2207 3883 y(pages)26 b(25{44,)f(1984.)2082 4042 y([2])37 b(In)n(ternational)60 b(Organization)g(for)h (Standardization.)2207 4142 y Fg(A)l(da)30 b(95)g(R)l(efer)l(enc)l(e)g (Manual)p Fk(.)37 b(Jan)n(uary)26 b(1995.)2082 4301 y([3])37 b(T.)21 b(Ito)g(and)g(M.)g(Matsui.)27 b(A)21 b(parallel)f(lisp)i (language)d(pail-)2207 4401 y(isp)33 b(and)h(its)g(k)n(ernel)e(sp)r (eci\014cation.)55 b(In)34 b Fg(Pr)l(o)l(c)l(e)l(e)l(dings)i(of)2207 4501 y(the)f(US/Jap)l(an)h(workshop)h(on)f(Par)l(al)t(lel)h(Lisp)g(on)e (Par-)2207 4600 y(al)t(lel)40 b(Lisp:)58 b(languages)40 b(and)f(systems)p Fk(,)h(pages)c(58{100.)2207 4700 y(Springer-V)-7 b(erlag)25 b(New)i(Y)-7 b(ork,)27 b(Inc.,)h(1990.)2082 4859 y([4])37 b(S.)20 b(Marlo)n(w,)g(S.)h(L.)f(P)n(eyton)g(Jones,)h(A.) f(Moran,)h(and)f(J.)g(H.)2207 4959 y(Repp)n(y)-7 b(.)73 b(Async)n(hronous)38 b(exceptions)h(in)h(Hask)n(ell.)73 b(In)2207 5059 y Fg(A)n(CM)38 b(Confer)l(enc)l(e)i(on)e(Pr)l(o)l(gr)l (amming)h(L)l(anguage)g(De-)2207 5158 y(sign)30 b(and)g(Implementation) p Fk(,)e(pages)f(274{285,)d(2001.)2082 5318 y([5])37 b(R.)20 b(Milner,)i(M.)e(T)-7 b(ofte,)22 b(and)e(R.)h(Harp)r(er.)j Fg(The)g(De\014nition)2207 5417 y(of)30 b(Standar)l(d)g(ML)p Fk(.)38 b(MIT)27 b(Press,)g(1990.)1920 5683 y(5)p eop %%Page: 6 6 6 5 bop -110 -129 a Fk([6])37 b(G.)50 b(Nelson.)103 b Fg(System)50 b(Pr)l(o)l(gr)l(amming)h(in)f(Mo)l(dula-3)p Fk(.)15 -29 y(Pren)n(tice)26 b(Hall,)i(1991.)-110 130 y([7])37 b(B.)28 b(Nic)n(hols,)g(D.)h(Buttlar,)g(and)f(J.)g(P)-7 b(.)29 b(F)-7 b(arrell.)38 b Fg(Pthr)l(e)l(ads)15 230 y(Pr)l(o)l(gr)l(amming)p Fk(.)f(O'Rielly)-7 b(,)28 b(1996.)-110 389 y([8])37 b(J.)j(H.)h(Repp)n(y)-7 b(.)75 b(Async)n(hronous)39 b(signals)h(in)h(Standard)15 489 y(ML.)83 b(T)-7 b(ec)n(hnical)42 b(Rep)r(ort)h(T)-7 b(ec)n(hnical)42 b(Rep)r(ort)h(TR90-)15 589 y(1144,)26 b(Cornell)g(Univ)n(ersit)n(y)-7 b(,)27 b(August)h(1990.)-110 748 y([9])37 b(P)-7 b(.)33 b(Ro)n(vner,)g(R.)g (Levin,)i(and)e(J.)g(Wic)n(k.)53 b(On)33 b(extending)15 848 y(Mo)r(dula-2)41 b(for)h(building)h(large,)i(in)n(tegrated)c (systems.)15 947 y(Researc)n(h)18 b(Rep)r(ort)h(3,)i(Digital)e (Equipmen)n(t)h(Corp)r(oration)15 1047 y(Systems)27 b(Researc)n(h)f (Cen)n(ter,)h(1985.)-152 1206 y([10])37 b(O.)31 b(Shiv)n(ers.)47 b(Automatic)32 b(managemen)n(t)e(of)h(op)r(erating-)15 1306 y(system)20 b(resources.)j(In)d Fg(Pr)l(o)l(c)l(e)l(e)l(dings)k (of)g(the)f(A)n(CM)h(Inter-)15 1406 y(national)39 b(Confer)l(enc)l(e)g (on)g(F)-6 b(unctional)38 b(Pr)l(o)l(gr)l(amming)p Fk(,)15 1505 y(pages)26 b(274{279,)f(1997.)-152 1665 y([11])37 b(B.)29 b(Stroustrop.)40 b Fg(The)32 b(C++)f(Pr)l(o)l(gr)l(amming)h(L)l (anguage,)15 1764 y(Thir)l(d)f(Edition)p Fk(.)38 b(Addison-W)-7 b(esley)g(,)28 b(1997.)-152 1924 y([12])37 b(Sun)79 b(Microsystems.)190 b(Wh)n(y)79 b(are)f(Thread.stop,)15 2023 y(Thread.susp)r(end,)122 b(Thread.resume,)f(and)104 b(Run-)15 2123 y(time.runFinalizersOnExit)40 b(deprecated?,)45 b(2002.)76 b(A)n(t)15 2223 y Fb(http://www.javas)o (of)o(t.c)o(om)o(/)p Fk(.)1920 5683 y(6)p eop %%Trailer end userdict /end-hook known{end-hook}if %%EOF