-
Notifications
You must be signed in to change notification settings - Fork 0
/
rse-pmt.ps
2647 lines (2621 loc) · 132 KB
/
rse-pmt.ps
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
%!PS-Adobe-2.0
%%Creator: dvips(k) 5.86 Copyright 1999 Radical Eye Software
%%Title: pmt.dvi
%%Pages: 11
%%PageOrder: Ascend
%%BoundingBox: 0 0 612 792
%%DocumentFonts: Times-Bold Times-Roman Times-Italic Helvetica-Bold
%%+ Courier Times-BoldItalic Courier-Bold Courier-BoldOblique Helvetica
%%EndComments
%DVIPSWebPage: (www.radicaleye.com)
%DVIPSCommandLine: dvips -t letter pmt.dvi
%DVIPSParameters: dpi=600, compressed
%DVIPSSource: TeX output 2000.06.18:1110
%%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
%%BeginProcSet: 8r.enc
% @@psencodingfile@{
% author = "S. Rahtz, P. MacKay, Alan Jeffrey, B. Horn, K. Berry",
% version = "0.6",
% date = "1 July 1998",
% filename = "8r.enc",
% email = "tex-fonts@@tug.org",
% docstring = "Encoding for TrueType or Type 1 fonts
% to be used with TeX."
% @}
%
% Idea is to have all the characters normally included in Type 1 fonts
% available for typesetting. This is effectively the characters in Adobe
% Standard Encoding + ISO Latin 1 + extra characters from Lucida.
%
% Character code assignments were made as follows:
%
% (1) the Windows ANSI characters are almost all in their Windows ANSI
% positions, because some Windows users cannot easily reencode the
% fonts, and it makes no difference on other systems. The only Windows
% ANSI characters not available are those that make no sense for
% typesetting -- rubout (127 decimal), nobreakspace (160), softhyphen
% (173). quotesingle and grave are moved just because it's such an
% irritation not having them in TeX positions.
%
% (2) Remaining characters are assigned arbitrarily to the lower part
% of the range, avoiding 0, 10 and 13 in case we meet dumb software.
%
% (3) Y&Y Lucida Bright includes some extra text characters; in the
% hopes that other PostScript fonts, perhaps created for public
% consumption, will include them, they are included starting at 0x12.
%
% (4) Remaining positions left undefined are for use in (hopefully)
% upward-compatible revisions, if someday more characters are generally
% available.
%
% (5) hyphen appears twice for compatibility with both
% ASCII and Windows.
%
/TeXBase1Encoding [
% 0x00 (encoded characters from Adobe Standard not in Windows 3.1)
/.notdef /dotaccent /fi /fl
/fraction /hungarumlaut /Lslash /lslash
/ogonek /ring /.notdef
/breve /minus /.notdef
% These are the only two remaining unencoded characters, so may as
% well include them.
/Zcaron /zcaron
% 0x10
/caron /dotlessi
% (unusual TeX characters available in, e.g., Lucida Bright)
/dotlessj /ff /ffi /ffl
/.notdef /.notdef /.notdef /.notdef
/.notdef /.notdef /.notdef /.notdef
% very contentious; it's so painful not having quoteleft and quoteright
% at 96 and 145 that we move the things normally found there to here.
/grave /quotesingle
% 0x20 (ASCII begins)
/space /exclam /quotedbl /numbersign
/dollar /percent /ampersand /quoteright
/parenleft /parenright /asterisk /plus /comma /hyphen /period /slash
% 0x30
/zero /one /two /three /four /five /six /seven
/eight /nine /colon /semicolon /less /equal /greater /question
% 0x40
/at /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O
% 0x50
/P /Q /R /S /T /U /V /W
/X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore
% 0x60
/quoteleft /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o
% 0x70
/p /q /r /s /t /u /v /w
/x /y /z /braceleft /bar /braceright /asciitilde
/.notdef % rubout; ASCII ends
% 0x80
/.notdef /.notdef /quotesinglbase /florin
/quotedblbase /ellipsis /dagger /daggerdbl
/circumflex /perthousand /Scaron /guilsinglleft
/OE /.notdef /.notdef /.notdef
% 0x90
/.notdef /.notdef /.notdef /quotedblleft
/quotedblright /bullet /endash /emdash
/tilde /trademark /scaron /guilsinglright
/oe /.notdef /.notdef /Ydieresis
% 0xA0
/.notdef % nobreakspace
/exclamdown /cent /sterling
/currency /yen /brokenbar /section
/dieresis /copyright /ordfeminine /guillemotleft
/logicalnot
/hyphen % Y&Y (also at 45); Windows' softhyphen
/registered
/macron
% 0xD0
/degree /plusminus /twosuperior /threesuperior
/acute /mu /paragraph /periodcentered
/cedilla /onesuperior /ordmasculine /guillemotright
/onequarter /onehalf /threequarters /questiondown
% 0xC0
/Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla
/Egrave /Eacute /Ecircumflex /Edieresis
/Igrave /Iacute /Icircumflex /Idieresis
% 0xD0
/Eth /Ntilde /Ograve /Oacute
/Ocircumflex /Otilde /Odieresis /multiply
/Oslash /Ugrave /Uacute /Ucircumflex
/Udieresis /Yacute /Thorn /germandbls
% 0xE0
/agrave /aacute /acircumflex /atilde
/adieresis /aring /ae /ccedilla
/egrave /eacute /ecircumflex /edieresis
/igrave /iacute /icircumflex /idieresis
% 0xF0
/eth /ntilde /ograve /oacute
/ocircumflex /otilde /odieresis /divide
/oslash /ugrave /uacute /ucircumflex
/udieresis /yacute /thorn /ydieresis
] def
%%EndProcSet
%%BeginProcSet: texps.pro
%!
TeXDict begin/rf{findfont dup length 1 add dict begin{1 index/FID ne 2
index/UniqueID ne and{def}{pop pop}ifelse}forall[1 index 0 6 -1 roll
exec 0 exch 5 -1 roll VResolution Resolution div mul neg 0 0]/Metrics
exch def dict begin Encoding{exch dup type/integertype ne{pop pop 1 sub
dup 0 le{pop}{[}ifelse}{FontMatrix 0 get div Metrics 0 get div def}
ifelse}forall Metrics/Metrics currentdict end def[2 index currentdict
end definefont 3 -1 roll makefont/setfont cvx]cvx def}def/ObliqueSlant{
dup sin S cos div neg}B/SlantFont{4 index mul add}def/ExtendFont{3 -1
roll mul exch}def/ReEncodeFont{CharStrings rcheck{/Encoding false def
dup[exch{dup CharStrings exch known not{pop/.notdef/Encoding true def}
if}forall Encoding{]exch pop}{cleartomark}ifelse}if/Encoding exch def}
def end
%%EndProcSet
%%BeginProcSet: special.pro
%!
TeXDict begin/SDict 200 dict N SDict begin/@SpecialDefaults{/hs 612 N
/vs 792 N/ho 0 N/vo 0 N/hsc 1 N/vsc 1 N/ang 0 N/CLIP 0 N/rwiSeen false N
/rhiSeen false N/letter{}N/note{}N/a4{}N/legal{}N}B/@scaleunit 100 N
/@hscale{@scaleunit div/hsc X}B/@vscale{@scaleunit div/vsc X}B/@hsize{
/hs X/CLIP 1 N}B/@vsize{/vs X/CLIP 1 N}B/@clip{/CLIP 2 N}B/@hoffset{/ho
X}B/@voffset{/vo X}B/@angle{/ang X}B/@rwi{10 div/rwi X/rwiSeen true N}B
/@rhi{10 div/rhi X/rhiSeen true N}B/@llx{/llx X}B/@lly{/lly X}B/@urx{
/urx X}B/@ury{/ury X}B/magscale true def end/@MacSetUp{userdict/md known
{userdict/md get type/dicttype eq{userdict begin md length 10 add md
maxlength ge{/md md dup length 20 add dict copy def}if end md begin
/letter{}N/note{}N/legal{}N/od{txpose 1 0 mtx defaultmatrix dtransform S
atan/pa X newpath clippath mark{transform{itransform moveto}}{transform{
itransform lineto}}{6 -2 roll transform 6 -2 roll transform 6 -2 roll
transform{itransform 6 2 roll itransform 6 2 roll itransform 6 2 roll
curveto}}{{closepath}}pathforall newpath counttomark array astore/gc xdf
pop ct 39 0 put 10 fz 0 fs 2 F/|______Courier fnt invertflag{PaintBlack}
if}N/txpose{pxs pys scale ppr aload pop por{noflips{pop S neg S TR pop 1
-1 scale}if xflip yflip and{pop S neg S TR 180 rotate 1 -1 scale ppr 3
get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR}if xflip
yflip not and{pop S neg S TR pop 180 rotate ppr 3 get ppr 1 get neg sub
neg 0 TR}if yflip xflip not and{ppr 1 get neg ppr 0 get neg TR}if}{
noflips{TR pop pop 270 rotate 1 -1 scale}if xflip yflip and{TR pop pop
90 rotate 1 -1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0 get
neg sub neg TR}if xflip yflip not and{TR pop pop 90 rotate ppr 3 get ppr
1 get neg sub neg 0 TR}if yflip xflip not and{TR pop pop 270 rotate ppr
2 get ppr 0 get neg sub neg 0 S TR}if}ifelse scaleby96{ppr aload pop 4
-1 roll add 2 div 3 1 roll add 2 div 2 copy TR .96 dup scale neg S neg S
TR}if}N/cp{pop pop showpage pm restore}N end}if}if}N/normalscale{
Resolution 72 div VResolution 72 div neg scale magscale{DVImag dup scale
}if 0 setgray}N/psfts{S 65781.76 div N}N/startTexFig{/psf$SavedState
save N userdict maxlength dict begin/magscale true def normalscale
currentpoint TR/psf$ury psfts/psf$urx psfts/psf$lly psfts/psf$llx psfts
/psf$y psfts/psf$x psfts currentpoint/psf$cy X/psf$cx X/psf$sx psf$x
psf$urx psf$llx sub div N/psf$sy psf$y psf$ury psf$lly sub div N psf$sx
psf$sy scale psf$cx psf$sx div psf$llx sub psf$cy psf$sy div psf$ury sub
TR/showpage{}N/erasepage{}N/copypage{}N/p 3 def @MacSetUp}N/doclip{
psf$llx psf$lly psf$urx psf$ury currentpoint 6 2 roll newpath 4 copy 4 2
roll moveto 6 -1 roll S lineto S lineto S lineto closepath clip newpath
moveto}N/endTexFig{end psf$SavedState restore}N/@beginspecial{SDict
begin/SpecialSave save N gsave normalscale currentpoint TR
@SpecialDefaults count/ocount X/dcount countdictstack N}N/@setspecial{
CLIP 1 eq{newpath 0 0 moveto hs 0 rlineto 0 vs rlineto hs neg 0 rlineto
closepath clip}if ho vo TR hsc vsc scale ang rotate rwiSeen{rwi urx llx
sub div rhiSeen{rhi ury lly sub div}{dup}ifelse scale llx neg lly neg TR
}{rhiSeen{rhi ury lly sub div dup scale llx neg lly neg TR}if}ifelse
CLIP 2 eq{newpath llx lly moveto urx lly lineto urx ury lineto llx ury
lineto closepath clip}if/showpage{}N/erasepage{}N/copypage{}N newpath}N
/@endspecial{count ocount sub{pop}repeat countdictstack dcount sub{end}
repeat grestore SpecialSave restore end}N/@defspecial{SDict begin}N
/@fedspecial{end}B/li{lineto}B/rl{rlineto}B/rc{rcurveto}B/np{/SaveX
currentpoint/SaveY X N 1 setlinecap newpath}N/st{stroke SaveX SaveY
moveto}N/fil{fill SaveX SaveY moveto}N/ellipse{/endangle X/startangle X
/yrad X/xrad X/savematrix matrix currentmatrix N TR xrad yrad scale 0 0
1 startangle endangle arc savematrix setmatrix}N end
%%EndProcSet
%%BeginProcSet: color.pro
%!
TeXDict begin/setcmykcolor where{pop}{/setcmykcolor{dup 10 eq{pop
setrgbcolor}{1 sub 4 1 roll 3{3 index add neg dup 0 lt{pop 0}if 3 1 roll
}repeat setrgbcolor pop}ifelse}B}ifelse/TeXcolorcmyk{setcmykcolor}def
/TeXcolorrgb{setrgbcolor}def/TeXcolorgrey{setgray}def/TeXcolorgray{
setgray}def/TeXcolorhsb{sethsbcolor}def/currentcmykcolor where{pop}{
/currentcmykcolor{currentrgbcolor 10}B}ifelse/DC{exch dup userdict exch
known{pop pop}{X}ifelse}B/GreenYellow{0.15 0 0.69 0 setcmykcolor}DC
/Yellow{0 0 1 0 setcmykcolor}DC/Goldenrod{0 0.10 0.84 0 setcmykcolor}DC
/Dandelion{0 0.29 0.84 0 setcmykcolor}DC/Apricot{0 0.32 0.52 0
setcmykcolor}DC/Peach{0 0.50 0.70 0 setcmykcolor}DC/Melon{0 0.46 0.50 0
setcmykcolor}DC/YellowOrange{0 0.42 1 0 setcmykcolor}DC/Orange{0 0.61
0.87 0 setcmykcolor}DC/BurntOrange{0 0.51 1 0 setcmykcolor}DC
/Bittersweet{0 0.75 1 0.24 setcmykcolor}DC/RedOrange{0 0.77 0.87 0
setcmykcolor}DC/Mahogany{0 0.85 0.87 0.35 setcmykcolor}DC/Maroon{0 0.87
0.68 0.32 setcmykcolor}DC/BrickRed{0 0.89 0.94 0.28 setcmykcolor}DC/Red{
0 1 1 0 setcmykcolor}DC/OrangeRed{0 1 0.50 0 setcmykcolor}DC/RubineRed{
0 1 0.13 0 setcmykcolor}DC/WildStrawberry{0 0.96 0.39 0 setcmykcolor}DC
/Salmon{0 0.53 0.38 0 setcmykcolor}DC/CarnationPink{0 0.63 0 0
setcmykcolor}DC/Magenta{0 1 0 0 setcmykcolor}DC/VioletRed{0 0.81 0 0
setcmykcolor}DC/Rhodamine{0 0.82 0 0 setcmykcolor}DC/Mulberry{0.34 0.90
0 0.02 setcmykcolor}DC/RedViolet{0.07 0.90 0 0.34 setcmykcolor}DC
/Fuchsia{0.47 0.91 0 0.08 setcmykcolor}DC/Lavender{0 0.48 0 0
setcmykcolor}DC/Thistle{0.12 0.59 0 0 setcmykcolor}DC/Orchid{0.32 0.64 0
0 setcmykcolor}DC/DarkOrchid{0.40 0.80 0.20 0 setcmykcolor}DC/Purple{
0.45 0.86 0 0 setcmykcolor}DC/Plum{0.50 1 0 0 setcmykcolor}DC/Violet{
0.79 0.88 0 0 setcmykcolor}DC/RoyalPurple{0.75 0.90 0 0 setcmykcolor}DC
/BlueViolet{0.86 0.91 0 0.04 setcmykcolor}DC/Periwinkle{0.57 0.55 0 0
setcmykcolor}DC/CadetBlue{0.62 0.57 0.23 0 setcmykcolor}DC
/CornflowerBlue{0.65 0.13 0 0 setcmykcolor}DC/MidnightBlue{0.98 0.13 0
0.43 setcmykcolor}DC/NavyBlue{0.94 0.54 0 0 setcmykcolor}DC/RoyalBlue{1
0.50 0 0 setcmykcolor}DC/Blue{1 1 0 0 setcmykcolor}DC/Cerulean{0.94 0.11
0 0 setcmykcolor}DC/Cyan{1 0 0 0 setcmykcolor}DC/ProcessBlue{0.96 0 0 0
setcmykcolor}DC/SkyBlue{0.62 0 0.12 0 setcmykcolor}DC/Turquoise{0.85 0
0.20 0 setcmykcolor}DC/TealBlue{0.86 0 0.34 0.02 setcmykcolor}DC
/Aquamarine{0.82 0 0.30 0 setcmykcolor}DC/BlueGreen{0.85 0 0.33 0
setcmykcolor}DC/Emerald{1 0 0.50 0 setcmykcolor}DC/JungleGreen{0.99 0
0.52 0 setcmykcolor}DC/SeaGreen{0.69 0 0.50 0 setcmykcolor}DC/Green{1 0
1 0 setcmykcolor}DC/ForestGreen{0.91 0 0.88 0.12 setcmykcolor}DC
/PineGreen{0.92 0 0.59 0.25 setcmykcolor}DC/LimeGreen{0.50 0 1 0
setcmykcolor}DC/YellowGreen{0.44 0 0.74 0 setcmykcolor}DC/SpringGreen{
0.26 0 0.76 0 setcmykcolor}DC/OliveGreen{0.64 0 0.95 0.40 setcmykcolor}
DC/RawSienna{0 0.72 1 0.45 setcmykcolor}DC/Sepia{0 0.83 1 0.70
setcmykcolor}DC/Brown{0 0.81 1 0.60 setcmykcolor}DC/Tan{0.14 0.42 0.56 0
setcmykcolor}DC/Gray{0 0 0 0.50 setcmykcolor}DC/Black{0 0 0 1
setcmykcolor}DC/White{0 0 0 0 setcmykcolor}DC end
%%EndProcSet
TeXDict begin 40258431 52099146 1000 600 600 (pmt.dvi)
@start /Fa 165[37 43 1[56 43 43 37 33 40 43 33 43 43
53 37 43 23 20 43 43 33 37 43 40 40 43 65[{
TeXBase1Encoding ReEncodeFont}25 59.7758 /Times-Roman
rf /Fb 140[37 25 12[42 101[{TeXBase1Encoding ReEncodeFont}3
74.7198 /Helvetica rf
%DVIPSBitmapFont: Fc cmr10 10 2
/Fc 2 51 df<15301578B3A6007FB812F8B912FCA26C17F8C80078C8FCB3A6153036367B
AF41>43 D<EB0FF0EB7FFE48B57E3903E03FC03907000FE0000E6D7E00186D7E00386D7E
00308048130081007C80B41580A27FA36CC7FCA2121CC81300A25D5DA24A5AA24A5A5D4A
5A4A5A5D4AC7FC143E5C5C5C495A495A49C8FC130E49EB01805B5B491303491400485A48
C7FC00065C000FB6FC5A5A485CB6FCA321387CB72A>50 D E
%EndDVIPSBitmapFont
%DVIPSBitmapFont: Fd cmsy10 10 1
/Fd 1 3 df<0060150600F0150F6C151F007C153E6C157C6C15F86C6CEB01F06C6CEB03
E06C6CEB07C06C6CEB0F806C6CEB1F00017C133E6D5B6D5B90380F81F0903807C3E09038
03E7C06DB45A6D90C7FC147EA214FF497F903803E7C0903807C3E090380F81F049C67E01
3E137C497F497F4848EB0F804848EB07C04848EB03E04848EB01F048C812F8003E157C48
153E48151F48150F00601506282874A841>2 D E
%EndDVIPSBitmapFont
%DVIPSBitmapFont: Fe cmmi10 10 2
/Fe 2 79 df<1760177017F01601A21603A21607160FA24C7EA216331673166316C3A2ED
0183A2ED0303150683150C160115181530A21560A215C014011580DA03007FA202061300
140E140C5C021FB5FC5CA20260C7FC5C83495A8349C8FC1306A25BA25B13381330017016
80EA01F0D807F815FF267FFF80013F13FEB516FF18FE383C7DBB3E>65
D<902603FFF891381FFFF8495E6D6D80D90007030113006FEC007802061670814A6C1560
A26F7EA202186D5C151FA26F7E02304B5A6F7EA282DA60034AC7FCA26F7EA24A6C6C1306
A2828249485DEE3F80A217C049C7001F5B17E0160FA201066E6C5AA217F81603495EEE01
FCA2EE00FE495E17FF177FA2496F5AA2171F137095C8FC01F081EA07FC267FFFC080B56C
14064A140245397DB843>78 D E
%EndDVIPSBitmapFont
%DVIPSBitmapFont: Ff cmsy8 8 1
/Ff 1 3 df<006015C000E01401007014030078EC07806CEC0F006C141E6C5C6C6C5B6C
6C5B6C6C485A6C6C485A90387807806D48C7FCEB1E1E6D5AEB07F86D5A6D5A497E497EEB
0F3CEB1E1E497E496C7E496C7E48486C7E48486C7E4848137848C77E001E80488048EC07
800070EC03C048140100601400222376A137>2 D E
%EndDVIPSBitmapFont
/Fg 135[45 3[45 6[45 9[45 99[{TeXBase1Encoding ReEncodeFont}4
74.7198 /Courier-BoldOblique rf /Fh 135[40 40 2[40 40
2[40 40 40 40 40 40 40 40 40 40 1[40 1[40 1[40 12[40
1[40 1[40 40 40 4[40 1[40 25[40 45[{TeXBase1Encoding ReEncodeFont}25
66.4176 /Courier rf /Fi 133[45 45 1[45 45 45 45 45 45
1[45 45 45 1[45 2[45 45 1[45 45 45 45 1[45 1[45 59[45
35[{TeXBase1Encoding ReEncodeFont}21 74.7198 /Courier-Bold
rf /Fj 133[29 33 37 50 33 42 21 29 29 1[37 37 42 58 21
37 21 21 42 37 25 33 37 33 37 37 25 11[46 42 24[25 37
37 37 37 37 37 37 37 37 37 1[19 6[25 58 35[42 2[{
TeXBase1Encoding ReEncodeFont}43 74.7198 /Times-BoldItalic
rf /Fk 103[45 29[45 45 45 45 45 45 45 45 45 1[45 45 45
45 45 45 45 45 45 45 45 45 45 45 45 45 1[45 9[45 45 45
45 2[45 45 45 45 45 1[45 45 45 45 45 45 45 45 45 2[45
45 1[45 9[45 45 45 45 45 45 1[45 45 45 1[45 4[45 33[{
TeXBase1Encoding ReEncodeFont}59 74.7198 /Courier rf
/Fl 135[29 3[18 1[26 1[33 33 33 48 18 29 1[18 33 2[29
1[29 1[33 11[48 1[33 2[41 1[44 55 5[48 3[44 41 19[17
46[{TeXBase1Encoding ReEncodeFont}23 66.4176 /Times-Italic
rf /Fm 134[33 33 48 33 33 18 26 22 1[33 33 33 52 18 33
18 18 33 33 22 29 33 29 33 29 3[22 1[22 2[48 63 48 48
41 37 44 1[37 48 48 59 41 48 1[22 48 48 37 41 48 44 44
48 6[18 33 33 33 33 33 33 33 33 33 33 18 17 22 17 2[22
22 37[37 2[{TeXBase1Encoding ReEncodeFont}66 66.4176
/Times-Roman rf /Fn 134[33 33 48 33 37 22 26 29 1[37
33 37 55 18 1[22 18 37 33 22 29 37 29 37 33 12[44 37
2[41 52 8[41 4[48 6[22 33 33 3[33 33 33 33 33 1[17 4[22
22 40[{TeXBase1Encoding ReEncodeFont}40 66.4176 /Times-Bold
rf
%DVIPSBitmapFont: Fo cmsy9 9 4
/Fo 4 111 df<126012F812FEEA7F80EA1FE0EA07F8EA01FE38007F80EB1FE0EB07F8EB
01FE9038007FC0EC1FF0EC07FCEC01FF9138003FC0ED0FF0ED03FCED00FFEE3FC0EE0FF0
EE03FCEE00FEA2EE03FCEE0FF0EE3FC0EEFF00ED03FCED0FF0ED3FC003FFC7FCEC07FCEC
1FF0EC7FC04948C8FCEB07F8EB1FE0EB7F80D801FEC9FCEA07F8EA1FE0EA7F8000FECAFC
12F81260CBFCAC007FB712FCB812FEA26C16FC2F3E7AB03C>21 D<EC07E0143FECFE00EB
01F8EB03E0495A130F495AB3A649C7FCA2137E5BEA03F8EA7FE048C8FCEA7FE0EA03F8C6
7E137E7FA26D7EB3A66D7E13076D7EEB01F8EB00FEEC3FE014071B4B7BB726>102
D<127CEAFFC0EA07F0EA01F8EA007C7F133F6D7EB3A66D7EA26D7E6D7E6D7E9038007FC0
EC1FE0EC7FC0903801F800495A495A495AA2495AB3A649C7FC133E5B485AEA07F0EAFFC0
007CC8FC1B4B7BB726>I<126012F0A21278A37EA37EA37EA36C7EA36C7EA26C7EA36C7E
A31378A37FA37FA37FA36D7EA26D7EA36D7EA36D7EA31478A380A380A280A3EC0780A3EC
03C0A3EC01E0A3EC00F0A31578A215301D4B7CB726>110 D E
%EndDVIPSBitmapFont
/Fp 135[50 50 50 50 50 50 50 1[50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 7[50 1[50 50 50 50 50 50 1[50
50 50 2[50 1[50 50 50 1[50 1[50 1[50 12[50 2[50 2[50
50 50 1[50 50 50 4[50 35[{TeXBase1Encoding ReEncodeFont}49
83.022 /Courier rf /Fq 133[37 3[42 1[28 32 3[42 5[23
3[37 46 21[60 78 18[28 8[42 5[47 42 28 28 40[{
TeXBase1Encoding ReEncodeFont}16 83.022 /Times-Bold rf
/Fr 133[32 37 37 55 37 42 23 32 32 1[42 42 42 60 23 37
1[23 42 42 23 37 42 37 42 42 8[51 1[51 60 46 42 51 1[51
60 55 69 46 2[28 1[60 51 51 60 55 51 51 3[56 2[28 42
42 1[42 42 42 1[42 42 1[23 21 28 42[42 2[{TeXBase1Encoding ReEncodeFont}
56 83.022 /Times-Italic rf /Fs 134[60 3[66 40 47 53 1[66
60 66 100 33 2[33 2[40 53 66 53 66 60 14[86 1[73 6[47
7[86 13[60 60 60 49[{TeXBase1Encoding ReEncodeFont}24
119.552 /Times-Bold rf /Ft 134[42 1[58 1[46 1[42 29 2[46
46 1[21 2[21 46 46 1[42 46 1[46 17[50 4[54 16[25 58[{
TeXBase1Encoding ReEncodeFont}17 74.7198 /Helvetica-Bold
rf /Fu 134[33 33 50 33 37 21 29 29 37 37 37 37 54 21
33 1[21 37 37 21 33 37 33 37 37 8[46 62 46 54 42 37 46
54 46 54 50 62 42 2[25 1[54 46 46 54 50 46 46 5[25 25
5[37 37 37 37 37 1[19 25 19 4[25 36[37 2[{TeXBase1Encoding ReEncodeFont}
57 74.7198 /Times-Italic rf /Fv 133[33 37 37 54 37 37
21 29 25 37 37 37 37 58 21 37 21 21 37 37 25 33 37 33
37 33 3[25 1[25 2[54 71 54 54 46 42 50 54 42 54 54 66
46 54 29 25 54 54 42 46 54 50 50 54 5[21 21 37 37 37
37 37 37 37 37 37 37 21 19 25 19 42 1[25 25 25 58 34[42
42 2[{TeXBase1Encoding ReEncodeFont}75 74.7198 /Times-Roman
rf /Fw 134[37 37 1[37 42 25 29 33 1[42 37 42 62 21 42
1[21 42 37 1[33 42 33 42 37 9[75 54 1[50 42 2[46 58 54
71 50 2[29 1[58 1[50 54 54 1[54 18[19 46[{TeXBase1Encoding ReEncodeFont}
37 74.7198 /Times-Bold rf /Fx 104[83 42 1[37 37 24[37
42 42 60 42 42 23 32 28 42 42 42 42 65 23 42 23 23 42
42 28 37 42 37 42 37 3[28 1[28 2[60 78 60 60 51 46 55
1[46 60 60 74 51 60 1[28 60 60 46 51 60 55 55 60 76 37
4[23 42 42 42 42 42 42 42 42 42 42 23 21 28 21 2[28 28
28 5[28 29[46 46 2[{TeXBase1Encoding ReEncodeFont}77
83.022 /Times-Roman rf /Fy 87[33 49[44 50 28 39 39 3[50
4[28 50 2[44 1[44 1[50 11[72 55 6[83 35[33 33 40[{
TeXBase1Encoding ReEncodeFont}17 99.6264 /Times-Italic
rf /Fz 140[39 4[50 1[28 3[50 50 33 44 1[44 1[44 13[55
66 12[61 22[25 46[{TeXBase1Encoding ReEncodeFont}13 99.6264
/Times-Roman rf /FA 134[50 50 72 50 55 33 39 44 1[55
50 55 83 28 55 33 28 55 50 33 44 55 44 55 50 9[100 1[72
66 55 72 1[61 78 1[94 1[78 1[39 78 78 61 66 72 72 66
72 8[50 50 50 50 50 50 50 50 2[25 33 3[33 33 1[83 34[55
55 2[{TeXBase1Encoding ReEncodeFont}57 99.6264 /Times-Bold
rf /FB 138[96 57 1[76 2[86 96 1[48 2[48 96 86 1[76 96
1[96 86 16[105 2[163 77[{TeXBase1Encoding ReEncodeFont}15
172.188 /Times-Bold rf end
%%EndProlog
%%BeginSetup
%%Feature: *Resolution 600dpi
TeXDict begin
%%BeginPaperSize: Letter
letter
%%EndPaperSize
%%EndSetup
%%Page: 1 1
1 0 bop Black Black Black Black 1052 119 a FB(P)m(ortable)44
b(Multithr)m(eading)753 254 y FA(The)26 b(Signal)f(Stack)h(T)-7
b(rick)26 b(F)n(or)e(User)l(-Space)i(Thr)n(ead)h(Cr)n(eation)1567
472 y Fz(Ralf)e(S.)g(Engelschall)1148 595 y Fy(T)-9 b(ec)o(hnisc)o(he)
24 b(Univer)o(sit)1988 596 y(\250)1980 595 y(at)f(M)2172
596 y(\250)2164 595 y(unc)o(hen)h(\(TUM\))1109 718 y
Fx([email protected],)18 b(http://www)-5 b(.engelschall.com)p
Black Black 1811 999 a Fw(Abstract)p Black Black 208
1136 a Fv(This)23 b(paper)h(describes)g(a)g(pragmatic)g(b)o(ut)f
(portable)h(f)o(allback)h(approach)g(for)e(creating)h(and)h
(dispatching)f(between)h(the)e(machine)208 1227 y(conte)o(xts)c(of)g
(multiple)f(threads)h(of)g(e)o(x)o(ecution)h(on)f(Unix)g(systems)g
(that)f(lack)h(a)f(dedicated)i(user)o(-space)f(conte)o(xt)h(switching)f
(f)o(acility)-5 b(.)208 1318 y(Such)22 b(a)g(f)o(allback)h(approach)h
(for)f(implementing)g(machine)g(conte)o(xts)g(is)f(a)g(vital)g(part)h
(of)f(a)g(user)o(-space)h(multithreading)g(en)m(viron-)208
1410 y(ment,)g(if)e(it)h(has)h(to)f(achie)n(v)o(e)h(maximum)g
(portability)g(across)g(a)f(wide)g(range)h(of)g(Unix)f(\003a)o(v)o
(ors.)33 b(The)22 b(approach)i(is)e(entirely)g(based)208
1501 y(on)d(standard)h(Unix)g(system)f(f)o(acilities)g(and)h(ANSI-C)e
(language)i(features)g(and)g(especially)g(does)g(not)f(require)h(an)o
(y)f(assembly)h(code)208 1592 y(or)27 b(platform)h(speci\002c)f(tricks)
g(at)h(all.)48 b(The)27 b(most)h(interesting)g(issue)f(is)g(the)h
(technique)h(of)e(creating)h(the)g(machine)g(conte)o(xt)g(for)208
1684 y(threads,)18 b(which)g(this)f(paper)h(e)o(xplains)h(in)e(detail.)
23 b(The)17 b(described)i(approach)g(closely)f(follo)n(ws)g(the)g
(algorithm)g(as)f(implemented)i(by)208 1775 y(the)h(author)h(for)f(the)
g(popular)h(user)o(-space)g(multithreading)g(library)f
Fu(GNU)f(P)-6 b(ortable)21 b(Thr)m(eads)g Fv(\()p Fu(GNU)e(Pth)p
Fv(,)h([25)q(]\))f(which)i(this)f(w)o(ay)208 1866 y(quickly)f(gained)h
(the)f(status)g(of)g(one)g(of)g(the)g(most)g(portable)h(user)o(-space)f
(multithreading)h(libraries.)208 2007 y Ft(K)o(e)o(yw)o(or)o(ds:)e
Fv(portability)-5 b(,)15 b(multithreading,)i(Unix,)e(POSIX,)f(SUSv2,)h
(ANSI-C,)e(user)o(-space,)j(conte)o(xt)g(creation,)g(conte)o(xt)f
(switch-)208 2099 y(ing,)j(signal)i(handler)m(,)f(stack,)g(mak)o
(econte)o(xt,)h(switchconte)o(xt,)g(sigaltstack,)e(setjmp,)h(longjmp.)
208 2240 y Ft(Pub)o(lishing:)g Fv(Early)f(drafts)f(of)h(this)g(paper)g
(were)g(distrib)o(uted)g(with)f(the)h(GNU)g(Pth)f(distrib)o(ution.)22
b(The)c(\002nal)g(release)g(v)o(ersion)g(w)o(as)208 2331
y(published)i(on)f(the)g(USENIX)f(Annual)h(T)-5 b(echnical)20
b(Conference,)f(June)h(18-23,)g(2000,)f(San)g(Die)o(go,)g(California,)f
(USA.)0 2711 y Fs(1)119 b(Intr)n(oduction)0 2895 y FA(1.1)99
b(Multithr)n(eading)0 3052 y Fx(The)25 b(paradigm)d(of)j(programming)c
(with)k(multiple)g(threads)f(of)0 3152 y(e)o(x)o(ecution)c(\(aka)i
Fr(multithr)m(eading)p Fx(\))f(is)i(already)f(a)h(v)o(ery)e(old)h(one)0
3252 y(and)i(dates)g(back)g(to)g(the)h(decades)f(of)g(programming)c
(with)25 b Fr(co-)0 3351 y(r)l(outines)19 b Fx([2,)g(3].)25
b(P)o(aradoxically)-5 b(,)17 b(the)i(use)h(of)f(threads)g(on)g(Unix)0
3451 y(platforms)g(did)h(not)g(become)f(popular)f(until)i(the)g(early)g
(1990s.)0 3602 y FA(Multithr)n(eading)26 b(Adv)o(antages)0
3728 y Fx(Multithreading)31 b(can)i(pro)o(vide)f(man)o(y)g(bene\002ts)h
(for)g(applica-)0 3828 y(tions)26 b(\(good)f(runtime)g(concurrenc)o(y)
-5 b(,)24 b(parallel)i(programming)0 3927 y(techniques)j(can)h(be)g
(implemented)e(more)i(easily)-5 b(,)32 b(the)e(popu-)0
4027 y(lar)22 b(procedural)d(programming)f(style)k(can)f(be)h(combined)
d(with)0 4127 y(multiple)g(threads)f(of)h(e)o(x)o(ecution,)e
Fr(etc.)p Fx(\))24 b(b)n(ut)c(the)f(most)g(interest-)0
4226 y(ing)25 b(ones)g(are)g(usually)g(performance)d(gains)j(and)f
(reduced)g(re-)0 4326 y(source)17 b(consumption.)k(Because)d(in)g
(contrast)f(to)h(multiprocess)0 4425 y(applications,)e(multithreaded)f
(ones)i(usually)f(require)g(less)i(sys-)0 4525 y(tem)25
b(resources)f(\(mainly)g(memory\))e(and)j(their)f(internal)g(com-)0
4625 y(munication)33 b(part)i(can)g(le)n(v)o(erage)f(from)g(the)i
(shared)e(address)0 4724 y(space.)0 4876 y FA(Multithr)n(eading)26
b(and)g(A)n(pplications)0 5001 y Fx(Ne)n(v)o(ertheless)d(there)h(still)
h(e)o(xist)g(just)g(a)f(fe)n(w)h(real)f(applications)0
5101 y(in)35 b(the)f(free)g(softw)o(are)h(w)o(orld)f(that)g(use)h
(multithreading)d(for)0 5201 y(their)20 b(bene\002t,)g(although)f
(their)h(application)f(domains)h(are)g(pre-)0 5300 y(destined)32
b(for)f(multithreading.)59 b(F)o(or)32 b(instance,)j(the)d(popular)0
5400 y(Apache)38 b(webserv)o(er)g(as)i(of)f(v)o(ersion)f(1.3)h(still)h
(uses)g(a)f(pre-)2025 2895 y(forking)32 b(process)h(model)g(for)h
(serving)f(HTTP)h(requests,)i(al-)2025 2995 y(though)14
b(tw)o(o)i(e)o(xperiments)e(with)j(multithreaded)c(Apache)i(v)n(ari-)
2025 3095 y(ants)22 b(in)g(1996)e(\(with)i Fr(r)o(sthr)m(eads)g
Fx([27)n(]\))g(and)f(1998)f(\(with)i Fr(NSPR)2025 3194
y Fx([31)o(]\))37 b(already)f(sho)n(wed)g(great)h(performance)d
(boosts.)76 b(The)2025 3294 y(same)20 b(applies)g(to)h(man)o(y)e
(similar)h(applications.)2150 3401 y(The)h(reason)g(for)g(this)i
(restraint)e(mainly)g(is)i(that)f(for)f(a)h(long)2025
3500 y(time,)c(multithreading)e(f)o(acilities)j(under)d(Unix)i(were)g
(rare.)24 b(The)2025 3600 y(situation)f(became)f(better)h(after)f(some)
h(v)o(endors)f(lik)o(e)h Fr(Sun)f Fx(and)2025 3699 y
Fr(DEC)f Fx(incorporated)15 b(threading)h(f)o(acilities)j(into)f(their)
g(Unix)f(\003a-)2025 3799 y(v)n(ors)36 b(and)g Fr(POSIX)j
Fx(standardized)c(a)i(threading)e Fr(Application)2025
3899 y(Pr)l(o)o(gr)o(amming)18 b(Interface)g Fx(\(API\))h(\(aka)f
Fr(Pthr)m(eads)g Fx([1]\).)24 b(But)c(an)2025 3998 y(API)e(and)f(a)h
(fe)n(w)f(v)o(endor)f(implementations)f(are)j(not)f(enough)e(to)2025
4098 y(ful\002ll)29 b(the)g(portability)e(requirements)g(of)h(modern)f
(free)i(soft-)2025 4198 y(w)o(are)37 b(packages.)74 b(Here)37
b(stand-alone)f(and)g(really)h(portable)2025 4297 y(multithreading)18
b(en)m(vironments)f(are)j(needed.)2150 4404 y(The)49
b(author)g(collected)h(and)f(e)n(v)n(aluated)g(o)o(v)o(er)g(twenty)2025
4503 y(\(mostly)42 b(user)n(-space\))h(a)n(v)n(ailable)f
(multithreading)f(f)o(acilities)2025 4603 y(for)15 b(Unix)g(systems)h
(\(see)g(T)-7 b(able)16 b(1\),)g(b)n(ut)g(only)e(a)i(fe)n(w)g(of)f
(them)h(are)2025 4703 y(freely)27 b(a)n(v)n(ailable)g(and)g(sho)n(wed)g
(to)h(be)g(really)f(portable.)46 b(And)2025 4802 y(e)n(v)o(en)19
b(the)i(mostly)f(portable)f(ones)h(suf)n(fered)f(from)g(the)i(f)o(act)f
(that)2025 4902 y(the)o(y)31 b(partly)g(depend)f(on)h(assembly)g(code)g
(or)h(platform)e(spe-)2025 5001 y(ci\002c)e(tricks)f(usually)g(related)
g(to)h(the)f(creation)g(and)g(dispatch-)2025 5101 y(ing)d(of)h(the)g
(indi)n(vidual)e(threads.)38 b(This)25 b(means)f(that)h(the)g(num-)2025
5201 y(ber)c(of)h(platforms)f(the)o(y)g(support)f(is)j(limited)e(and)h
(applications)2025 5300 y(which)27 b(are)h(based)g(on)g(these)g(f)o
(acilities)h(are)f(only)f(portable)f(to)2025 5400 y(those)c(platforms.)
29 b(This)22 b(situation)f(is)i(not)f(satisf)o(actory)-5
b(,)21 b(so)h(ap-)p Black 1929 5700 a(1)p Black eop
%%Page: 2 2
2 1 bop Black Black 0 83 a Fx(plication)25 b(authors)g(still)j(a)n(v)n
(oid)d(the)i(use)f(of)g(multithreading)d(if)0 183 y(the)o(y)28
b(w)o(ant)g(to)h(\(or)f(ha)n(v)o(e)g(to\))g(achie)n(v)o(e)f(maximum)g
(portability)0 282 y(for)20 b(their)f(application.)125
387 y(A)25 b(pragmatic)e(and)h(mostly)g(portable)f(f)o(allback)h
(technique)0 486 y(for)d(implementing)f(user)n(-space)h(threads)g(can)h
(f)o(acilitate)g(wider)0 586 y(use)e(of)g(multithreading)e(in)i(free)g
(softw)o(are)g(applications.)0 750 y FA(Ingr)n(edients)26
b(of)f(a)g(Thr)n(ead)0 884 y Fx(A)h(Unix)f(process)f(has)i(man)o(y)e
(ingredients,)h(b)n(ut)g(the)g(most)h(im-)0 983 y(portant)k(ones)h(are)
h(its)g(memory)e(mapping)f(table,)34 b(the)e(signal)0
1083 y(dispatching)18 b(table,)h(the)g(signal)g(mask,)g(the)g(set)h(of)
f(\002le)h(descrip-)0 1183 y(tors)30 b(and)f(the)h(machine)e(conte)o
(xt.)52 b(The)29 b(machine)g(conte)o(xt)f(in)0 1282 y(turn)d(consists)i
(of)e(at)i(least)g(the)f(CPU)h(re)o(gisters)e(including)g(the)0
1382 y(program)18 b(counter)h(and)h(the)h(stack)f(pointer)-5
b(.)25 b(In)20 b(addition,)f(there)0 1482 y(can)28 b(be)f(light-weight)
g(processes)g(\(L)-6 b(WP\))28 b(or)f(threads,)i(which)0
1581 y(usually)g(share)g(all)h(attrib)n(utes)f(with)g(the)h(underlying)
c(\(hea)n(vy-)0 1681 y(weight\))19 b(process)h(e)o(xcept)f(for)h(the)g
(machine)f(conte)o(xt.)0 1845 y FA(K)n(er)o(nel-Space)25
b(vs.)31 b(User)l(-Space)0 1979 y Fx(Those)c(L)-6 b(WPs)28
b(or)f(threads,)h(on)e(a)i(Unix)f(platform)e(classically)0
2078 y(can)34 b(be)g(implemented)e(either)i(in)g(k)o(ernel-space)f(or)g
(in)i(user)n(-)0 2178 y(space.)76 b(When)38 b(implemented)d(in)j(k)o
(ernel-space,)h(one)e(usu-)0 2278 y(ally)22 b(calls)h(them)e(L)-6
b(WPs)23 b(or)e(k)o(ernel)g(threads,)h(otherwise)f(\(user)n(-)0
2377 y(space\))d(threads.)24 b(If)19 b(threads)f(are)h(implemented)d
(by)j(the)g(k)o(ernel,)0 2477 y(the)24 b(thread)g(conte)o(xt)f
(switches)h(are)h(performed)c(by)j(the)g(k)o(ernel)0
2576 y(without)17 b(notice)f(by)h(the)g(application,)f(similar)i(to)f
(the)h(dispatch-)0 2676 y(ing)33 b(of)g(processes.)64
b(If)33 b(threads)g(are)g(implemented)e(in)j(user)n(-)0
2776 y(space,)20 b(the)g(thread)f(conte)o(xt)g(switches)i(are)f
(performed)d(usually)0 2875 y(by)31 b(an)g(application)f(library)g
(without)h(notice)f(by)h(the)h(k)o(ernel.)0 2975 y(Additionally)-5
b(,)39 b(there)e(e)o(xist)h(hybrid)d(threading)h(approaches,)0
3075 y(where)28 b(typically)g(a)h(user)n(-space)g(library)e(binds)i
(one)f(or)g(more)0 3174 y(user)n(-space)19 b(threads)h(to)g(one)g(or)g
(more)f(k)o(ernel-space)g(L)-6 b(WPs.)0 3338 y FA(Thr)n(ead)27
b(Models)0 3472 y Fx(The)h(v)o(endor)d(threading)h(f)o(acilities)j
(under)d Fr(Sun)h(Solaris)p Fx(,)i Fr(IBM)0 3572 y(AIX)p
Fx(,)h Fr(DEC)h(T)-5 b(ru64)31 b Fx(\(formerly)d Fr(DIGIT)l(AL)i(UNIX)k
Fx(or)d Fr(OSF/1)p Fx(\))0 3671 y(and)20 b Fr(SGI)h(IRIX)i
Fx(use)e(a)h Fq(M:N)f Fx(mapping)e([21)o(,)i(30)o(],)g
Fr(i.e)o(.)p Fx(,)f Fq(M)i Fx(user)n(-)0 3771 y(space)33
b(threads)g(are)h(mapped)e(onto)g Fq(N)i Fx(k)o(ernel-space)e(L)-6
b(WPs.)0 3871 y(On)20 b(the)h(other)e(hand,)g Fr(LinuxThr)m(eads)g
Fx([29)o(])i(under)e Fr(GNU/Linux)0 3970 y Fx(uses)f(a)f
Fq(1:1)g Fx(mapping)e(and)i(pure)f(user)n(-space)h(implementations)0
4070 y(lik)o(e)k Fr(GNU)g(Pth)p Fx(,)f Fr(FSU)g(pthr)m(eads)f
Fx(or)i Fr(MIT)f(pthr)m(eads)p Fx(,)g Fr(etc.)26 b Fx(use)20
b(a)0 4170 y Fq(M:1)g Fx(mapping)f([25)n(,)i(22)o(,)f(23)o(].)125
4274 y(From)39 b(no)n(w)g(on)h(we)g(focus)g(on)f(such)h
Fq(M:1)g Fx(user)g(space)0 4374 y(threading)d(approaches,)42
b(where)c(one)h(or)f(more)h(user)g(space)0 4473 y(threads)16
b(are)g(implemented)f(inside)i(a)g(single)f(k)o(ernel)g(space)h(pro-)0
4573 y(cess.)24 b(The)15 b(e)o(x)o(ercise)f(is)i(to)g(implement)e(this)
i(by)e(using)h(standard-)0 4672 y(ized)20 b(Unix)g(system)g(and)g
(ANSI-C)g(language)f(f)o(acilities)i Fr(only)p Fx(.)0
4936 y FA(1.2)99 b(The)26 b(Exer)n(cise)0 5101 y Fx(As)d(we)g(ha)n(v)o
(e)f(mentioned,)e(a)j(thread)e(shares)i(its)g(state)g(with)g(the)0
5201 y(underlying)i(process)j(e)o(xcept)f(for)g(the)h(machine)f(conte)o
(xt.)46 b(So)0 5300 y(the)17 b(major)e(task)i(for)f(a)h(user)n(-space)f
(threading)e(system)j(is)g(to)g(cre-)0 5400 y(ate)k(and)e(dispatch)h
(those)g(machine)f(conte)o(xts.)2150 83 y(In)d(practice,)g(the)h
(second)f(major)g(task)h(it)g(has)g(to)g(do)f(is)i(to)f(en-)2025
183 y(sure)k(that)f(no)h(thread)f(by)g(accident)g(blocks)g(the)h(whole)
f(process)2025 282 y(\(and)25 b(thereby)f(all)i(other)f(threads\).)41
b(Instead)25 b(when)g(an)h(opera-)2025 382 y(tion)j(w)o(ould)f(block,)i
(the)f(threading)e(library)h(should)g(suspend)2025 482
y(only)19 b(the)g(e)o(x)o(ecution)e(of)i(the)g(current)g(thread)f(and)h
(in)g(the)h(mean-)2025 581 y(time)g(dispatch)f(the)h(remaining)e
(threads.)24 b(But)d(this)f(task)g(is)h(out-)2025 681
y(side)30 b(the)h(scope)e(of)h(this)h(paper)e(\(see)h([11)o(])h(for)e
(details)i(about)2025 780 y(this)24 b(task\).)33 b(W)-7
b(e)24 b(focus)f(only)f(on)h(the)g(aspect)g(of)g(machine)e(con-)2025
880 y(te)o(xt)f(handling.)2025 1112 y FA(1.3)99 b(The)26
b(Curse)g(of)e(P)n(ortability)2025 1267 y Fx(Our)18 b(goal)g(of)f(real)
i(portability)d(for)i(a)h(threading)d(system)i(causes)2025
1367 y(some)j(non-tri)n(vial)d(problems)i(which)g(ha)n(v)o(e)g(to)h(be)
g(solv)o(ed.)26 b(The)2025 1467 y(most)f(ob)o(vious)e(one)h(is)i(that)f
(dealing)f(with)h(machine)f(conte)o(xts)2025 1566 y(usually)33
b(suf)n(fers)g(from)f(portability)-5 b(,)35 b(because)d(it)j(is)f(a)g
(highly)2025 1666 y(CPU)18 b(dependent)d(task)i(for)f(which)g(not)h(e)n
(v)o(ery)e(Unix)i(\003a)n(v)n(or)g(pro-)2025 1766 y(vides)25
b(a)g(standardized)e(API.)i(Although)e(such)i(an)g(API)g(w)o(ould)2025
1865 y(be)f(not)h(too)f(hard)f(for)h(v)o(endors)f(to)i(pro)o(vide,)e
(because)h(in)h(prin-)2025 1965 y(ciple)d(it)h(is)g(just)g(a)g(matter)e
(of)h(switching)g(a)h(fe)n(w)f(CPU)h(re)o(gisters)2025
2064 y(\(mainly)c(the)h(program)e(counter)h(and)h(the)g(stack)g
(pointer\).)2025 2201 y FA(Assembly)k(Code)i(Consider)n(ed)g(Harmful)
2025 2319 y Fx(Additionally)-5 b(,)21 b(we)j(disallo)n(w)e(the)h(use)h
(of)e(an)o(y)g(assembly)h(solu-)2025 2418 y(tions)c(or)g(platform)e
(speci\002c)j(tricks,)f(because)f(then)h(the)g(thread-)2025
2518 y(ing)e(system)i(again)d(w)o(ould)h(be)h(only)f(semi-portable,)f
Fr(i.e)o(.)p Fx(,)i(it)h(can)2025 2617 y(be)e(ported)f(to)i
Fq(N)f Fx(platforms)f(b)n(ut)i(on)f(the)g Fq(\(N+1\))p
Fx(th)f(platform)g(one)2025 2717 y(has)28 b(to)g(manually)e(adjust)i
(or)f(e)n(v)o(en)g(e)o(xtend)f(it)i(to)g(w)o(ork)f(there,)2025
2817 y(too.)2150 2916 y(This)e(is)h(usually)f(not)g(acceptable,)h(e)n
(v)o(en)e(if)i(it)g(also)g(mak)o(es)2025 3016 y(solving)20
b(the)h(problems)f(harder)-5 b(.)26 b(At)c(least)f(most)g(of)g(the)g
(kno)n(wn)2025 3116 y(free)26 b(softw)o(are)g(user)n(-space)g
(threading)f(systems)i([22)o(,)f(23)o(,)h(24)o(])2025
3215 y(do)15 b(not)g(restrict)h(themself)e(to)i(this)g(and)f(therefore)
e(are)j(just)g(semi-)2025 3315 y(portable.)24 b(But)c(real)g
(portability)f(should)g(be)h(a)h(major)f(goal.)2025 3589
y Fs(2)119 b(Pr)n(oblem)30 b(Analysis)2025 3791 y FA(2.1)99
b(The)26 b(T)-9 b(ask)25 b(in)g(Detail)2025 3947 y Fx(Our)d(task)h(is)g
(simple)f(in)h(principle:)28 b(pro)o(vide)20 b(an)j(API)f(and)g(cor)n
(-)2025 4046 y(responding)f(implementation)f(for)j(creating)f(and)g
(dispatching)2025 4146 y(machine)15 b(conte)o(xts)g(on)h(which)g(user)n
(-space)g(threads)f(can)h(be)h(im-)2025 4246 y(plemented.)2025
4382 y FA(The)26 b(Pr)n(oposed)g(API)2025 4500 y Fx(In)18
b(detail)g(we)g(propose)f(the)h(follo)n(wing)e Fr(Application)g(Pr)l(o)
o(gr)o(am-)2025 4599 y(mer)o(s)21 b(Interface)f Fx(\(API\))g(for)f(the)
h(machine)f(conte)o(xt)g(handling:)p Black 2120 4749
50 50 v Black 2233 4749 a(A)25 b(data)g(structure)f(of)g(type)h
Fp(mctx)p 3266 4749 25 4 v 29 w(t)g Fx(which)f(holds)h(the)2233
4849 y(machine)19 b(conte)o(xt.)p Black 2120 5001 50
50 v Black 2233 5001 a(A)95 b(function)e(\223)p Fq(v)o(oid)h
Fp(mctx)p 3248 5001 25 4 v 29 w(create\(mctx)p 3827 5001
V 28 w(t)2233 5101 y(*)p Fr(mctx)p Fx(,)26 b Fq(v)o(oid)g
Fp(\(*)p Fr(sf)p 2825 5101 V 30 w(addr)r Fp(\)\()p Fq(v)o(oid)e(*)p
Fp(\),)i Fq(v)o(oid)g Fp(*)p Fr(sf)p 3742 5101 V 30 w(ar)m(g)p
Fx(,)2233 5201 y Fq(v)o(oid)c Fp(*)p Fr(sk)p 2531 5201
V 30 w(addr)p Fx(,)g Fq(size)p 2891 5201 V 30 w(t)h Fr(sk)p
3041 5201 V 30 w(size)p Fp(\))p Fx(\224)g(which)g(creates)f(and)2233
5300 y(initializes)17 b(a)h(machine)e(conte)o(xt)f(structure)h(in)i
Fr(mctx)f Fx(with)2233 5400 y(a)25 b(start)g(function)e
Fr(sf)p 2825 5400 V 31 w(addr)p Fx(,)i(a)g(start)h(function)d(ar)o
(gument)p Black 1929 5700 a(2)p Black eop
%%Page: 3 3
3 2 bop Black Black Black 0 3 3864 4 v 0 2441 4 2439
v 68 642 a Fw(P)o(ackage)553 642 y
gsave currentpoint currentpoint translate 45 neg rotate neg exch neg
exch translate
553 642 a Fw(Genesis)553
642 y
currentpoint grestore moveto
553 642 a 744 642 a
gsave currentpoint currentpoint translate 45 neg rotate neg exch neg
exch translate
744 642 a Fw(Latest)19 b(V)-7
b(ersion)744 642 y
currentpoint grestore moveto
744 642 a 1010 642 a
gsave currentpoint currentpoint translate 45 neg rotate neg exch neg
exch translate
1010 642 a Fw(Implementation)18
b(Space)1010 642 y
currentpoint grestore moveto
1010 642 a 1404 642 a
gsave currentpoint currentpoint translate 45 neg rotate neg exch neg
exch translate
1404 642 a Fw(Thr)o(ead)g
(Mapping)1404 642 y
currentpoint grestore moveto
1404 642 a 1562 642 a
gsave currentpoint currentpoint translate 45 neg rotate neg exch neg
exch translate
1562 642 a
Fw(Acti)o(v)o(e)h(De)o(v)o(elopment)1562 642 y
currentpoint grestore moveto
1562 642
a 1703 642 a
gsave currentpoint currentpoint translate 45 neg rotate neg exch neg
exch translate
1703 642 a Fw(Experimental)f(State)1703
642 y
currentpoint grestore moveto
1703 642 a 1844 642 a
gsave currentpoint currentpoint translate 45 neg rotate neg exch neg
exch translate
1844 642 a Fw(Open)g(Sour)o(ce)1844
642 y
currentpoint grestore moveto
1844 642 a 1985 642 a
gsave currentpoint currentpoint translate 45 neg rotate neg exch neg
exch translate
1985 642 a Fw(Pthr)o(ead)g(API)1985
642 y
currentpoint grestore moveto
1985 642 a 2126 642 a
gsave currentpoint currentpoint translate 45 neg rotate neg exch neg
exch translate
2126 642 a Fw(Pthr)o(ead)g(Shar)o(ed)g
(Memory)2126 642 y
currentpoint grestore moveto
2126 642 a 2267 642 a
gsave currentpoint currentpoint translate 45 neg rotate neg exch neg
exch translate
2267 642 a Fw(Nati)o(v)o(e)i
(API)2267 642 y
currentpoint grestore moveto
2267 642 a 2408 642 a
gsave currentpoint currentpoint translate 45 neg rotate neg exch neg
exch translate
2408 642 a Fw(Nati)o(v)o(e)g(API)
e Fo(\025)h Fw(Pthr)o(ead)f(API)2408 642 y
currentpoint grestore moveto
2408 642 a
2550 642 a
gsave currentpoint currentpoint translate 45 neg rotate neg exch neg
exch translate
2550 642 a Fw(Nati)o(v)o(e)h(API)g(is)f(Pthr)o(ead)g(API)
2550 642 y
currentpoint grestore moveto
2550 642 a 2765 642 a
gsave currentpoint currentpoint translate 45 neg rotate neg exch neg
exch translate
2765 642 a Fw(Pr)o(eempti)o(v)o(e)h
(Scheduling)2765 642 y
currentpoint grestore moveto
2765 642 a 2906 642 a
gsave currentpoint currentpoint translate 45 neg rotate neg exch neg
exch translate
2906 642
a Fw(P)o(ortability)2906 642 y
currentpoint grestore moveto
2906 642 a 3360 642 a
gsave currentpoint currentpoint translate 45 neg rotate neg exch neg
exch translate
3360 642 a Fw(Assembly)f(Code)3360 642 y
currentpoint grestore moveto
3360 642 a 3509
642 a
gsave currentpoint currentpoint translate 45 neg rotate neg exch neg
exch translate
3509 642 a Fw(SysCall)g(Wrap.)3509 642 y
currentpoint grestore moveto
3509 642
a 47 673 3658 4 v 68 737 a Fv(gnu-pth)254 b(1999)43 b(1.3.5)117
b(user)270 b(n:1)63 b(yes)42 b(no)67 b(yes)42 b(yes)g(no)67
b(yes)42 b(yes)h(no)141 b(no)67 b(full/mcsc+sjlj)42 b(no)75
b(partly)68 820 y(cmu-l)o(wp)221 b(1984)43 b(1.4)173
b(user)270 b(n:1)63 b(yes)42 b(no)67 b(yes)42 b(no)67
b(-)116 b(yes)42 b(yes)h(partly)e(no)67 b(semi/\002x)o(ed:8)86
b(yes)50 b(no)68 903 y(fsu-pthread)146 b(1992)43 b(3.13)136
b(user)270 b(n:1)63 b(no)k(no)g(yes)42 b(yes)g(no)67
b(no)g(-)117 b(-)190 b(yes)42 b(semi/\002x)o(ed:6)86
b(yes)50 b(yes)68 986 y(mit-pthread)137 b(1993)43 b(1.8.9)117
b(user)270 b(n:1)63 b(no)k(no)g(yes)42 b(yes)g(no)67
b(no)g(-)117 b(-)190 b(yes)42 b(semi/\002x)o(ed:17)49
b(yes)h(yes)68 1069 y(ptl)406 b(1997)43 b(990622)h(user)270
b(n:1)63 b(no)k(no)g(yes)42 b(yes)g(no)67 b(no)g(-)117
b(-)190 b(yes)42 b(semi/\002x)o(ed:10)49 b(yes)h(yes)68
1152 y(linuxthreads)117 b(1997)43 b(2.1.2)117 b(user+k)o(ernel)43
b(1:1)63 b(yes)42 b(no)67 b(yes)42 b(yes)g(no)67 b(no)g(-)117
b(-)190 b(yes)42 b(semi/\002x)o(ed:5)86 b(yes)50 b(yes)68
1235 y(uthread)262 b(1998)43 b(3.4)173 b(user)270 b(n:1)63
b(yes)42 b(no)67 b(yes)42 b(yes)g(no)67 b(no)g(-)117
b(-)190 b(yes)42 b(semi/\002x)o(ed:2)86 b(yes)50 b(yes)68
1318 y(cthread)266 b(1991)43 b(991115)h(user)270 b(n:1)63
b(no)k(no)g(yes)42 b(no)67 b(-)116 b(yes)42 b(yes)h(no)141
b(no)67 b(semi/\002x)o(ed:8)86 b(yes)50 b(yes)68 1401
y(openthreads/qt)d(1996)c(2.0)173 b(user)270 b(n:1)63
b(no)k(no)g(yes)42 b(no)67 b(-)116 b(yes)42 b(no)68 b(no)141
b(no)67 b(semi/\002x)o(ed:9)86 b(yes)50 b(no)68 1484
y(rt++/qt)276 b(1996)43 b(1.0)173 b(user)270 b(n:1)63
b(no)k(no)g(yes)42 b(no)67 b(-)116 b(yes)42 b(yes)h(no)141
b(no)67 b(semi/\002x)o(ed:9)86 b(yes)50 b(no)68 1567
y(rsthreads)216 b(1996)43 b(980331)h(user)270 b(n:1)63
b(no)k(yes)42 b(yes)g(no)67 b(-)116 b(yes)42 b(no)68
b(no)141 b(no)67 b(semi/\002x)o(ed:9)86 b(yes)50 b(no)68
1650 y(pcthread)229 b(1996)43 b(1.0)173 b(user)270 b(n:1)63
b(no)k(yes)42 b(yes)g(yes)g(no)67 b(no)g(-)117 b(-)190
b(yes)42 b(semi/\002x)o(ed:1)86 b(yes)50 b(no)68 1733
y(bbthreads)196 b(1996)43 b(0.3)173 b(k)o(ernel)209 b(1:1)63
b(no)k(yes)42 b(yes)g(no)67 b(-)116 b(yes)42 b(no)68
b(-)190 b(yes)42 b(semi/\002x)o(ed:1)86 b(yes)50 b(no)68
1816 y(jkthreads)212 b(1998)43 b(1.2)173 b(k)o(ernel)209
b(1:1)63 b(no)k(yes)42 b(yes)g(no)67 b(-)116 b(yes)42
b(no)68 b(-)190 b(yes)42 b(semi/\002x)o(ed:1)86 b(yes)50
b(no)68 1899 y(nthreads)233 b(1997)43 b(970604)h(user)270
b(n:1)63 b(no)k(yes)42 b(yes)g(no)67 b(-)116 b(yes)42
b(no)68 b(-)190 b(no)67 b(semi/\002x)o(ed:9)86 b(yes)50
b(partly)68 1982 y(re)o(xthreads)176 b(1993)43 b(930614)h(user)270
b(n:1)63 b(no)k(yes)42 b(yes)g(no)67 b(-)116 b(yes)42
b(no)68 b(-)190 b(no)67 b(semi/\002x)o(ed:4)86 b(yes)50
b(no)68 2065 y(coro)353 b(1999)43 b(1.0.3)117 b(user)270
b(n:1)63 b(no)k(yes)42 b(yes)g(no)67 b(-)116 b(yes)42
b(no)68 b(-)190 b(no)67 b(semi/\002x)o(ed:1)86 b(yes)50
b(no)68 2148 y(greenthreads)105 b(1995)43 b(1.2)173 b(user)270
b(n:1)63 b(no)k(no)g(no)g(no)g(-)116 b(yes)42 b(yes)h(-)190
b(yes)42 b(full/mcsc)176 b(no)75 b(no)68 2231 y(solaris-pthread)42
b(NN)83 b(2.7)173 b(user+k)o(ernel)43 b(n:m)f(yes)g(no)67
b(no)g(yes)42 b(yes)g(yes)g(yes)h(no)141 b(yes)42 b(NN)346
b(NN)41 b(yes)68 2314 y(tru64-pthread)80 b(NN)j(5.0)173
b(user+k)o(ernel)43 b(n:m)f(yes)g(no)67 b(no)g(yes)42
b(yes)g(no)67 b(no)h(no)141 b(yes)42 b(NN)346 b(NN)41
b(yes)68 2397 y(aix-pthread)146 b(NN)83 b(4.3)173 b(user+k)o(ernel)43
b(1:1)63 b(yes)42 b(no)67 b(no)g(yes)42 b(yes)g(no)67
b(no)h(no)141 b(yes)42 b(NN)346 b(NN)41 b(yes)p 3860
2441 4 2439 v 0 2444 3864 4 v 0 2532 a Fn(T)-6 b(able)18
b(1:)67 b Fm(Summary)20 b(of)h(e)n(v)n(aluated)j(multithreading)g
(packages)f(and)e(some)g(of)f(their)i(determined)h(characteristics.)36
b(Notice)22 b(that)g(mostly)f(all)h(packages)g(contain)295
2600 y(assembly)17 b(code)h(and)g(are)g(just)f(semi-portable,)j
Fl(i.e)o(.)p Fm(,)c(the)o(y)i(support)g(only)g(a)f(\002x)o(ed)g(set)g
(of)g(platforms)i(and)e(do)g(not)h(automatically)j(adjust)d(for)f(ne)n
(w)h(ones.)p Black 208 2864 a Fr(sf)p 268 2864 25 4 v
30 w(ar)m(g)p Fx(,)36 b(and)d(a)h(stack)f(starting)g(at)h
Fr(sk)p 1343 2864 V 30 w(addr)p Fx(,)i(which)d(is)208
2963 y Fr(sk)p 282 2963 V 30 w(size)21 b Fx(bytes)f(in)g(size.)p
Black 95 3115 50 50 v Black 208 3115 a(A)i(function)f(\223)p
Fq(v)o(oid)h Fp(mctx)p 1006 3115 25 4 v 30 w(save\(mctx)p
1486 3115 V 28 w(t)h(*)p Fr(mctx)p Fp(\))p Fx(\224)208
3215 y(which)j(sa)n(v)o(es)i(the)g(current)e(machine)g(conte)o(xt)g
(into)i(the)208 3314 y(machine)19 b(conte)o(xt)g(structure)g
Fr(mctx)p Fx(.)p Black 95 3466 50 50 v Black 208 3466
a(A)78 b(function)e(\223)p Fq(v)o(oid)i Fp(mctx)p 1173
3466 25 4 v 30 w(restore\(mctx)p 1803 3466 V 27 w(t)208
3566 y(*)p Fr(mctx)p Fp(\))p Fx(\224)40 b(which)g(restores)g(the)h(ne)n
(w)f(machine)f(con-)208 3666 y(te)o(xt)18 b(from)g(the)h(machine)e
(conte)o(xt)h(structure)g Fr(mctx)p Fx(.)24 b(This)208
3765 y(function)29 b(does)i(not)g(return)f(to)h(the)h(caller)-5
b(.)58 b(Instead)31 b(it)208 3865 y(does)18 b(return)g(at)i(the)f
(location)g(stored)f(in)i Fr(mctx)f Fx(\(which)g(is)208
3964 y(either)d Fr(sf)p 474 3964 V 30 w(addr)i Fx(from)e(a)h(pre)n
(vious)f Fp(mctx)p 1415 3964 V 29 w(create)g Fx(call)208
4064 y(or)j(the)i(location)e(of)h(a)g(pre)n(vious)f Fp(mctx)p
1365 4064 V 29 w(save)h Fx(call\).)p Black 95 4216 50
50 v Black 208 4216 a(A)95 b(function)e(\223)p Fq(v)o(oid)h
Fp(mctx)p 1223 4216 25 4 v 29 w(switch\(mctx)p 1802 4216
V 28 w(t)208 4316 y(*)p Fr(mctx)p 420 4316 V 29 w(old)p
Fx(,)19 b Fp(mctx)p 796 4316 V 29 w(t)h(*)p Fr(mctx)p
1102 4316 V 30 w(ne)o(w)p Fp(\))p Fx(\224)f(which)g(switches)208
4415 y(from)59 b(the)i(current)e(machine)g(conte)o(xt)h(\(sa)n(v)o(ed)f
(to)208 4515 y Fr(mctx)p 370 4515 V 29 w(old)28 b Fx(for)e(later)g
(use\))g(to)g(a)h(ne)n(w)f(conte)o(xt)f(\(restored)208
4615 y(from)c Fr(mctx)p 554 4615 V 30 w(ne)o(w)p Fx(\).)31
b(This)22 b(function)f(returns)g(only)h(to)h(the)208
4714 y(caller)39 b(if)h Fp(mctx)p 728 4714 V 30 w(restore)f
Fx(or)g Fp(mctx)p 1456 4714 V 29 w(switch)h Fx(is)208
4814 y(again)19 b(used)h(on)f Fr(mctx)p 846 4814 V 30
w(old)p Fx(.)0 5045 y FA(2.2)99 b(T)-9 b(echnical)26
b(P)n(ossibilities)0 5201 y Fx(Poking)18 b(around)f(in)i(the)f
(references)g(of)g(the)h(ANSI-C)g(language)0 5300 y(reference)36
b(and)i(the)g(Unix)f(standards)g(sho)n(w)h(the)g(follo)n(wing)0
5400 y(functions)19 b(on)h(which)f(an)h(implementation)e(can)i(be)g
(based:)p Black 2120 2864 50 50 v Black 2233 2864 a(There)55
b(is)h(the)g Fp(ucontext)p Fx(\(3\))e(f)o(acility)i(with)g(the)2233
2963 y(functions)34 b Fp(getcontext)p Fx(\(3\),)j Fp(makecontext)p
Fx(\(3\),)2233 3063 y Fp(swapcontext)p Fx(\(3\))31 b(and)j
Fp(setcontext)p Fx(\(3\))e(which)2233 3162 y(conform)21
b(to)j(the)g Fr(Single)f(Unix)h(Speci\002cation)p Fx(,)e(V)-9
b(ersion)2233 3262 y(2)38 b(\()p Fr(SUSv2)e Fx([20)o(],)42
b(aka)c Fr(Unix95/98)p Fx(\).)76 b(Unfortunately)2233
3362 y(these)16 b(are)g(a)n(v)n(ailable)f(on)h(modern)e(Unix)h
(platforms)g(only)-5 b(.)p Black 2120 3625 V Black 2233
3625 a(There)87 b(are)h(the)h Fp(jmp)p 3051 3625 25 4
v 29 w(buf)f Fx(based)g(functions)2233 3724 y Fp(setjmp)p
Fx(\(3\))29 b(and)h Fp(longjmp)p Fx(\(3\))f(which)i(conform)d(to)2233
3824 y(ISO)41 b(9899:1990)c(\(ISO-C\))k(and)f(the)h Fp(sigjmp)p
3727 3824 V 29 w(buf)2233 3924 y Fx(based)71 b Fp(sigsetjmp)p
Fx(\(3\))f(and)i Fp(siglongjmp)p Fx(\(3\))2233 4023 y(functions)17
b(which)h(conform)f(to)i(IEEE)f(Std1003.1-1988)2233 4123
y(\()p Fr(POSIX)t Fx(\),)f(and)j Fr(Single)f(Unix)h(Speci\002cation)p
Fx(,)d(V)-9 b(ersion)19 b(2)2233 4222 y(\()p Fr(SUSv2)j
Fx([20)o(],)j(aka)f Fr(Unix95/98)p Fx(\).)35 b(The)24
b(\002rst)h(tw)o(o)g(func-)2233 4322 y(tions)17 b(are)h(a)n(v)n
(ailable)f(really)h(on)f(all)h(Unix)g(platforms,)f(the)2233
4422 y(last)k(tw)o(o)f(are)g(a)n(v)n(ailable)g(only)f(on)h(some)g(of)g
(them.)2233 4603 y(On)h(some)h(platforms)e Fp(setjmp)p
Fx(\(3\))g(and)i Fp(longjmp)p Fx(\(3\))2233 4703 y(sa)n(v)o(e)45
b(and)h(restore)f(also)h(the)f(signal)h(mask)f(\(if)h(one)2233
4802 y(does)e(not)g(w)o(ant)g(this)h(semantics,)50 b(one)44
b(has)h(to)f(call)p 2233 4902 V 2257 4902 a Fp(setjmp)p
Fx(\(3\))36 b(and)p 2854 4902 V 67 w Fp(longjmp)p Fx(\(3\))g(there\))g
(while)i(on)2233 5001 y(others)23 b(one)h(has)g(to)g(e)o(xplicitly)g
(use)g(the)g(superset)g(func-)2233 5101 y(tions)36 b
Fp(sigsetjmp)p Fx(\(3\))f(and)h Fp(siglongjmp)p Fx(\(3\))e(for)2233
5201 y(this.)115 b(In)50 b(our)f(discussion)h(we)g(can)g(assume)g(that)
2233 5300 y Fp(setjmp)p Fx(\(3\))40 b(and)j Fp(longjmp)p
Fx(\(3\))d(sa)n(v)o(e)j(and)f(restore)2233 5400 y(the)36
b(signal)f(mask,)40 b(because)35 b(if)h(this)h(is)g(not)e(the)h(case)p
Black 1929 5700 a(3)p Black eop
%%Page: 4 4
4 3 bop Black Black 208 83 a Fx(in)46 b(practice,)53
b(one)46 b(easily)h(can)f(replace)g(them)g(with)208 183
y Fp(sigsetjmp)p Fx(\(3\))41 b(and)i Fp(siglongjmp)p
Fx(\(3\))e(calls)k(\(if)208 282 y(a)n(v)n(ailable\))30
b(or)h(\(if)g(not)g(a)n(v)n(ailable\))f(emulate)h(the)g(miss-)208
382 y(ing)d(functionality)g(manually)f(with)j(additional)e
Fp(sig-)208 482 y(procmask)p Fx(\(2\))j(calls)i(\(see)h
Fp(pth)p 1245 482 25 4 v 29 w(mctx.c)f Fx(in)g Fr(GNU)208
581 y(Pth)20 b Fx([25)n(]\).)p Black 95 739 50 50 v Black
208 739 a(There)37 b(is)i(the)f(function)e Fp(sigaltstack)p
Fx(\(2\))f(which)208 839 y(conforms)f(to)j(the)g Fr(Single)f(Unix)h
(Speci\002cation)p Fx(,)h(V)-9 b(er)n(-)208 938 y(sion)34
b(2)g(\()p Fr(SUSv2)f Fx([20)n(],)38 b(aka)c Fr(Unix95/98)p
Fx(\))e(and)i(its)h(an-)208 1038 y(cestor)25 b(function)f
Fp(sigstack)p Fx(\(2\))f(from)h Fr(4.2BSD)p Fx(.)g(The)208
1137 y(last)d(one)e(e)o(xists)i(only)e(on)h Fr(BSD)p
Fx(-deri)n(v)o(ed)d(platforms,)i(b)n(ut)208 1237 y(the)g(\002rst)h
(function)e(already)h(e)o(xists)h(on)f(all)h(current)e(Unix)208
1337 y(platforms.)0 1571 y FA(2.3)99 b(Maximum)25 b(P)n(ortability)f
(Solution)0 1726 y Fx(The)44 b(maximum)e(portable)h(solution)g(ob)o
(viously)f(is)j(to)f(use)0 1826 y(the)j(standardized)f
Fp(makecontext)p Fx(\(3\))e(function)i(to)h(cre-)0 1926
y(ate)k(threads)f(and)g Fp(switchcontext)p Fx(\(3\))e(or)i
Fp(getcon-)0 2025 y(text)p Fx(\(3\)/)p Fp(setcontext)p
Fx(\(3\))18 b(to)23 b(dispatch)e(them.)31 b(And)22 b(actu-)0
2125 y(ally)h(these)f(are)h(the)f(preferred)f(functions)g(modern)f
(user)n(-space)0 2224 y(multithreading)25 b(systems)k(are)e(using.)48
b(W)-7 b(e)29 b(could)e(easily)h(im-)0 2324 y(plement)20
b(our)g(proposed)f(API)i(as)g(follo)n(wing)e(\(all)i(error)f(checks)0
2424 y(omitted)f(for)h(better)g(readability\):)p Black
Black 0 2561 a Fk(/*)63 b Fj(mac)o(hine)19 b(context)g(data)g
(structure)44 b Fk(*/)0 2635 y Fi(typedef)g(struct)f
Fk(mctx_st)h Fo(f)179 2710 y Fk(ucontext_t)f(uc;)0 2785
y Fo(g)i Fk(mctx_t;)0 2934 y(/*)63 b Fj(sav)o(e)20 b(mac)o(hine)e
(context)45 b Fk(*/)0 3009 y Fi(#define)f Fk(mctx_save\(mctx\))e
Fo(n)179 3084 y Fk(\()p Fi(void)p Fk(\)getcontext\(&\(mctx\)->uc\))0
3233 y(/*)63 b Fj(restore)20 b(mac)o(hine)e(context)45
b Fk(*/)0 3308 y Fi(#define)f Fk(mctx_restore\(mctx\))d
Fo(n)179 3383 y Fk(\()p Fi(void)p Fk(\)setcontext\(&\(mctx\)->uc\))0
3532 y(/*)63 b Fj(switc)o(h)18 b(mac)o(hine)h(context)45
b Fk(*/)0 3607 y Fi(#define)f Fk(mctx_switch\(mctx_old,mctx_new\))39
b Fo(n)179 3681 y Fk(\()p Fi(void)p Fk
(\)swapcontext\(&\(\(mctx_old\)->uc\),)g Fo(n)986 3756
y Fk(&\(\(mctx_new\)->uc\)\))0 3906 y(/*)63 b Fj(create)20
b(mac)o(hine)e(context)45 b Fk(*/)0 3980 y Fi(void)f
Fk(mctx_create\()179 4055 y(mctx_t)g(*mctx,)179 4130
y Fi(void)g Fk(\(*sf_addr\)\()p Fi(void)f Fk(*\),)h Fi(void)g
Fk(*sf_arg,)179 4204 y Fi(void)g Fk(*sk_addr,)g(size_t)g(sk_size\))0
4279 y Fo(f)179 4429 y Fk(/*)64 b Fj(f)o(etc)o(h)18 b(current)g
(context)45 b Fk(*/)179 4503 y(getcontext\(&\(mctx->uc\)\);)179
4653 y(/*)64 b Fj(adjust)18 b(to)h(new)f(context)45 b
Fk(*/)179 4728 y(mctx->uc.uc_link)491 b(=)44 b(NULL;)179
4802 y(mctx->uc.uc_stack.ss_sp)176 b(=)44 b(sk_addr;)179
4877 y(mctx->uc.uc_stack.ss_size)86 b(=)44 b(sk_size;)179
4952 y(mctx->uc.uc_stack.ss_flags)d(=)j(0;)179 5101 y(/*)64