Proceedings of the 6th International Workshop on Plan 9

October 20— 21, 2011 Universidad Rey Juan Carlos Fuenlabrada, Madrid, Spain

Dennis Ritchie, in memoriam.

Without his brilliant work, none of this would have been possible.

He is still an inspiration to all of us.

Organization Program Committee Francisco Ballesteros, Lsub, URJC Sape Mullender, (PC chair) Gorka Guardiola, Lsub, URJC Francisco Ballasteros, Lsub, URJC Sergio de Mingo, Lsub, URJC Brantley Coile, Coraid Inc. Erik Quanstrom, IWP9.org Charles Forsyth, Vita Nuova, Ltd. Enrique Soriano, Lsub, URJC Jeff Napper, Bell Labs

Participants

Francisco J. Ballesteros [email protected] Federico G. Benavento [email protected] Axel Belinfante [email protected] Nicolas Bercher [email protected] Ernesto A. Celis de la Fuente [email protected] Brantley Coile [email protected] David du Colombier [email protected] Andrés Domínguez [email protected] Vincent Douzal [email protected] Bruce Ellis [email protected] Brett Estrade [email protected] Noah Evans [email protected] Charles Forsyth [email protected] Jesús Galán López [email protected] Nick Gawronski [email protected] Gorka Guardiola [email protected] Pedro Hernandez Jr. [email protected] Latchesar Ionkov [email protected] Lucas [email protected] Stephen Jones [email protected] Eric Jul [email protected] Matt Lawless [email protected] Cinap Lenrek [email protected] Christoph Lohmann [email protected] Mathieu Lonjaret [email protected] Hugo Marcelo Rivera [email protected] Richard Miller [email protected] Sergio de Mingo Gil [email protected] Christian Mongeau [email protected] Sape Mullender [email protected] Jeff Napper [email protected] Erik Quanstrom [email protected] Jan Sacha [email protected] Nima Sahranshin Samani [email protected] Henning Schild [email protected] James Schneider [email protected] Brendon Schumacker [email protected] Frédéric Da Silva [email protected] Steve Simon [email protected] Enrique Soriano [email protected] Ataliba Teixeira [email protected] Roy Williams [email protected] Jeff Woodall [email protected]

Foreword

This book contains the proceedings for the Sixth International Workshop on Plan 9, IWP9. It was held on the 20th and 21st of October of 2011 at ETSIT, Rey Juan Carlos University. We, the organizing committee are proud of hosting this workshop again. Back in 2005 when we hosted the first one, we did not imagine it would continue for so long, getting to be the meeting point for the Plan 9 and Inferno communities.

The workshop includes a tutorial by Sape Mullender on the important topic of performance evaluation. There is also a panel discussing news from new systems and ports, new sprouts coming out of Plan 9 an Inferno: nix, osprey and new ports of inferno. A lot of work has been going recently into these new systems and furthering the reach of the Plan 9 approach.

This workshop was organized by the Systems Lab, a group in the Systems and Communications Group (GSYC, URJC), and Erik Quanstrom. It would have not been possible without the financial and logistical support1 from Rey Juan Carlos University and the Comunidad Autónoma de Madrid, which we would like to thank as well.

We would like to thank Sape Mullender, Brantley Coile, Charles Forsyth, and Jeff Napper for being in the Program Committee. We also thank the original writers of Plan 9 and Inferno for their insight and the great job they did designing and programming this wonderful system and the community of people around the world who keep contributing to it.

Proceeding updates and an online version of this book are available at the website http://iwp9.org.

The Organizing Committee:

Francisco J. Ballesteros Gorka Guardiola Sergio de Mingo Erik Quanstrom Enrique Soriano

This workshop is supported in part by Spanish CAM grant S2009/TIC-1692

Table of Contents

From natural hazards to the outer space and to Plan 9 ...... 1 Vincent Douzal, Nicolas Bercher, and David du Colombier

Gostor: Storage beyond POSIX ...... 11 Latchesar Ionkov

Revisiting User-Level Networking...... 17 Jan Sacha, Jeff Napper, Henning Schild, and Sape Mullender

Acid your ARM ...... 25 Gorka Guardiola Múzquiz

FTP-like Streams for the 9P File Protocol ...... 35 John Floren

To Stream Or Not To Stream ...... 45 Jeffrey Sickel

Appendix: Work in Progress ...... 59

A Bluetooth Protocol Stack for Plan 9 …………………………………………………... 61 Richard Miller

A Plan 9 C Toolchain for the Altera Nios2 Processor …………………………………. 63 Richard Miller

IX: A File Protocol for NIX …………………………………………………………………... 65 Francisco J. Ballesteros

Dfs – A WebDav filesystem client ………………………………………………………… 71 Steve Simon

Wsys(4): hosted window system ………………………………………………………….. 75 Jesús Galán López

Tutorials, Panels, and Workshops

• Tutorial: Measuring Performance. Sape Mullender.

• Panel: News from new systems: osprey, inferno-ports, and nix. Sape Mullender, Charles Forsyth, Francisco Ballesteros

• Workshop: Hellaphone. John Floren

• Workshop: Jtag. Gorka Guardiola

From natural hazards to outer space and to Plan 9

Vincent Douzal, Cemagref, UMR Tétis, Montpellier [email protected] Nicolas Bercher [email protected] David du Colombier [email protected] build date: 2011−10−13 22:30

ABSTRACT

)" E"B%H'=JE%" IOIJA' B%H I?D%/=H/O M%H1 %" "=JKH=/ D=3=H@I ?=//I B%H JDA @AIEC" %B = ?%'FKJAH IOIJA' B%H JH="I'EIIE%" %B E"B%H'=JE%" %LAH LAHO /%"C FAHE%@I8 ="@ B%H JH=?A=>E/EJO: )" =>IJH=?J ="=/OIEI ID%MI JD=J JDAIA HAGKEHA< 'A"JI =HA @K=/ J% JDA BK"@='A"J=/ GKAIJE%" %B =IIEIJE"C JDA ?%C"EJELA =?JEL< EJO %B = KIAH KIE"C ANJAH"=/ 'A'%HEAI8 MDE?D HA=?DAI = LAHO CA"AH=/ I?%FA: 6DA I%/KJE%"I ID%K/@ >A E'F/A'A"JA@ =J JDA %FAH=JE"C IOIJA' /ALA/8 '=E"/O JDA BE/A IOIJA'8 ="@ 2/="@'ߣI BE/A IOIJA'I ="@ %JDAH FH%FAHJEAI '=1A EJ JDA I%K"@AIJ >=IA B%H%KHM%H1: 9A FHAIA"J %KHH%=@D'=FB%H@ALA/%F'A"J:

1. Introduction: the case of a computer system for scholarship on natural hazards 9A MAHA HAGKAIJA@ J% @AIEC" =" E"B%H'=JE%" IOIJA' IKFF%HJE"C I?D%/=H/O M%H1 %" "=JKH=/ D=3=H@I: 1J GKE?1/O =FFA=HA@ JD=J =// LEIE>/A8 '=E"IJHA=' IOIJA'I I%HA/O /=?1A@ I%'A ?%HA FH%FAHJEAI8 JDKI E"?KH=>/O @EIGK=/EBOE"C JDA'8 "%J=>/O E" JDAEH HA/=JE%" J% JE'A: 9A JDAHA< B%HA ?%"IE@AHA@ = '%HA BK"@='A"J=/ FH%>/A'F >KE/@E"C JDA "A?AII=HO B%K"@=JE%"I %B = IOI< JA' J% M%H1 %" "=JKH=/ D=3=H@I: -=H/O %"8 EJ >A?='A %>LE%KI JD=J '="O HAGKEHA'A"JI B%H JDA IOIJA' MAHA "%J IFA?EBE? J% JD=J BEA/@: -LA" I%8 ߢ"=JKH=/ D=3=H@Iߣ FH%LE@AI = C%%@ ?%"< ?HAJA AN='F/A J% CKE@A JDA @AIEC": .%H AN='F/A8 EJ "=JKH=//O E"L%/LAI ?A"JKHOD/%"C @KH=< JE%"I8 MDE?D D=I IEC"EBE?="J E'F/E?=JE%"I B%H JDA @AIEC": .KHJDAH'%HA8 >O JDAEH "=JKHA8 JDA "=JKH=/ ALA"JI JD=J ME// B%H' JDA @=J= HA?%H@I =HA K"FHA@E?J=>/A8 ="@ JDAEH "=JKHA %BJA" FHA< ?/K@AI '=1E"C FHA?EIA %>IAHL=JE%"I =J JDA JE'A: +HK?E=/ @=J= =HHELAI K"B%H'=JJA@ BH%' A"@="CAHA@ FAHI%"I: J=JAH8 DEIJ%HE="I ME// @A/LA E"J% =H?DELAI8 IEBJE"C ?A"JKHEAID%/@ BE/AI8 IAA1E"C J% HA?%"IJHK?J ALA"JI: 6D=J EI AN=?J/O JDA FH%?AII MA M="J J% =IIEIJ: 6DA ?%"JANJ %B JDA HA?%"IJHK?JE%" %H E"LAIJEC=JE%" '=JJAHI J%%: .%H AN='F/A8 EB JDA M%H1 EI ?%"JH=?JK=/ EJ 'ECDJ >A >H%KCDJ >AB%HA = KK@CA B%H =H>EJH=JE%"8 MDE?D M%K/@ FH%?AA@ >O HAJH=?E"C EJI I%KH?AIL IE'E/=H/O8 = I?EA"JEIJ %H I?D%/=H 'ECDJ "AA@ J% HAJH=?A =HCK'A"JI '=@A A=H/EAH >O %JDAHI8 ="@ ?DA?1 HAIK/JI: M" >AD=/B %B JDA A=H/EAH =KJD%H %B ="O ?%"?/KIE%"8 %"A ID%K/@ >A =>/A8 FH%L=>/O8 J% HALAHJ J% JDA AN=?J IJ=JA %B E"B%H'=JE%" DA D=@ HA?%H@A@ =J = CELA" @=JA8 ="@ FAHB%H' =C=E" JDA I='A FH%?AIIE"C IJAFI: 6DKI8 @=J= ?%//A?JA@ J%@=O 'ECDJ IJE// >A HAGKEHA@ E" = HA'%JA BKJKHA: .%H M%H1E"C %" "=JKH=/ D=3=H@I MA IAA = "AA@ J% @AIEC" =" E"B%H'=JE%" IOIJA' B%H JDA "ANJ # OA=HI 6D=J /A=@I KI J% JDA GKAIJE%"F MD=J EI E"L=HE="J %LAHIK?DJE'A I?=/AIQ 6DA ߢߢI?EA"?AI %B JH=?AIߣߣ ߞ DEIJ%HO8 =H?D=A%/%CO8 F=/A%"J%/%CO8 CA%/%CO8 ?%I'%/%CO %" ߢߢ'A'%HEAI %B JDA M%H/@ =>%KJ EJIA/Bߣߣ8 JDA "%M B=IDE%"=>/A B%HA"IE? 'A@E?E"A ߞ =// ID=HA JDA AIIA"JE=/ IJHK?JKHA %B = F%/E?A E"LAIJEC=JE%": 6DEI DE"JI JD=J8 MDA" JDE"1E"C %" I?=/AI %B ?A"JKHEAI8 ="O @AIEC" ME// >A J%J=//O K"IFA?EBE? J% ="O F=HJE?K/=H =FF/E?=JE%" @%'=E": 6H=?A< =>E/EJO EI JDA 1AO A/A'A"J J% HAFH%@K?E>E/EJO E" I?EA"?A: JAJ KI AIJ=>/EID JD=J JM% GKAIJE%"I

1 =HA @K=/ E" JDA '=JDA'=JE?=/ IA"IA JDAO =HA JM% IE@AI %B JDA I='A ?%E"F : 6DA LAHO /%"CDJAH' JH="I'EIIE%" %B 1"%M/A@CA AIJ=>/EIDA@ %" @ECEJ=/ 'A'%HEAI: : 6DA =>I%/KJA/O 'E"E'=/ BK"?JE%"=/EJEAI = ?%'FKJAH ID%K/@ BK"@='A"J=//O FH%LE@A B%H IKIJ=E"E"C8 =IIEIJE"C = KIAHE"DEI?%C"EJELA =?JELEJO: )// JDA KIK=/ =IIK'FJE%"I B%H @AIEC"E"C =" E"B%H'=JE%" IOIJA' =HA IMAFJ =IE@A >O @KH=< JE%": 5F=?A ?%%H@E"=JAI =HA J=1A" =I =" E"L=HE="J E"@AN E" CA%CH=FDE?=/ E"B%H'=JE%" IOI< JA'I8 >KJ IF=?A IDHE"1I %H ANF="@I @KHE"C IAEI'E? ALA"JI: +%"JE"A"JI @HEBJ: +%"?AFJI AL%/LA: J="CK=CAI ?D="CA: W% =FF/E?=JE%" ߢߢ%"J%/%COߣߣ ?%K/@ >A ANFA?JA@ J% /=IJ8 %"/O LAHO =>IJH=?J ?%"?AFJI: M"A ?=""%J A"LEI=CA = @=J= '%@A/ E" JDA KIK=/ IA"IA B%H = LAHO /%"CD JAH' HAF%IEJ%HO: 0A"?A = LAHO /%"CDJAH' @=J=>=IA ID%K/@ >A ?%'F/AJA/O =C"%IJE? J% JDA 1E"@%B @=J= EJ ME// IJ%HA8="@D=LA "%@=J= '%@A/ =J =//:

2. Into outer space: An abstract analysis, for the essentials of the structure of an external memory system MKH '%@A/ %B JDA IOIJA' ?=" >A ANFHAIIA@ LEIK=//O >O .ECKHA : 6DA ! F=HJ @AFE?JI %KH ANF="@E"C K"ELAHIA K"B%/@A@ E" IF=?ADJE'A8 E" = M=O IJ="@=H@ E" FDOIE?I IE"?A YE"1%MI1E: 6DA M%H/@ =J = CELA" F%E"J E" JE'A " EI = I/E?A %B IF=?ADJE'A8 HAFHAIA"JA@ =I = 8A"" @E=< CH='F JDA IAJ %B FAH?AFJE>/A ALA"JI =J ": *O ?%"IJHK?JE%"8 ALA"JI =HA BENA@ F%E"JIF K"?D="C< E"C8E"L=HE="J A"JEJEAI: 6DA =HH%M %B JE'A " EIEHHALAHIE>/A:

Figure 1. The whole article can be considered an extended legend to this diagram for the abstract setting of our design. The idea of including α in the form of a Minkowskian diagram was inspired by Schueler’s remarkable paper[17]. 6M% "%J=>/A 1E"@I %B ALA"JI =HA ID%M"F JD%IA /A=LE"C /%"CD/=IJE"C JH=?1I = B%IIE/8 = B%%J< FHE"J =FFA=H /E1A JK>AI8 ="@ JD%IA MDE?D @%"ߣJ /E1A = FAHBK'A IFH=O: M>IAHLE"C = I/E?A %B

2 = JK>A E'F/EAI =" ALA"J E" HAJH%IFA?J8 EB %"/O %"A D=I JDA =>E/EJO J% E"JAHFHAJ JH=?1I8 ="@ JH=?AI: MJDAHMEIA F=IJ ALA"JI=HA /%IJ: 1B MA =HA J% ?=FJKHA B=?JI =>%KJ ALA"JI E" #8 MA "AA@ J% J=1A JDAEH E'=CA K"@AH = CELA" HA/=JE%"8 E" JDA IA"IA %B IAJ JDA%HO: )" E'=CA E" JDA B%H' %B = IAHEAI %B IO'>%/I EI JDA ?%"< LA"EA"J M=O J% FKJ JDE"CI E" MHEJE"C8 E"J% =" ANJAH"=/ 'A'%HO: 6DEI HA/=JE%" BH%' ALA"JI J% ?=JAC%HEAI ="@ ALA"JK=//O IO'>%/I J=1AI L=HEA@ B%H'I8 I%'A =HA JAH'A@ FAH?AFJE%"8 '%@< A//E"C8'A=IKHA'A"J8%HALA"@=J=>=IA B%H'BE//E"C: 4A?%H@E"CI%B JDAIA =IIEC"'A"JI ?%'A E"IAGKA"?A =/%"C= JE'A /E"A: 6DA ! ="@ # F=HJI @EIF/=O =" E"LEJE"C IO''AJHO: 5E"?A ALA"JI =HA BENA@ JDE"CI8 I% ID%K/@ >A JDAEH E'=CAIF MHEJJA" %"?ADB%HD=//8 "ALAH =/JAHA@ =C=E": 1'=CAI8 EB JDAO =HA J% F/=O JDAEH H]/A8 'KIJ >A MHEJJA" %" /=IJE"C8 E''KJ=>/A ANJAH"=/ 'A'%HEAIߞJK>AI: -NJAH"=/ 'A'%HEAI =?J =I 'AII=CAIL JDAO %BBAH J% F=HJEAI %B = ?%"JH=?J JDA ?H%IID?DA?1E"C =>E/EJEAI JD=J =HA AIIA"JE=/ J%JDAEHKIA8/E1A JDA FDOIE?=/ J%1A"I%B WA%/EJDE?=??%K"JE"CIOIJA'I^ $`: 6DA MD%/A FKHF%IA %B JDA @E=CH='ߣI # EI J% >HA=1 IO''AJHO MEJD ! %" JE'AL K"/E1A "8 J EI HALAHIE>/AF EJ ?=" >A JH=LA//A@ KF ="@ @%M": 6DA E'F%IIE>/A '%JE%" >=?1 ="@ B%HJD %" " EI HAF/=?A@>O= '%JE%"E"IF=?A8>AJMAA"FHAIAHLE"CJK>AI%B 'A'%HOE"@ANA@>OJ: 6%CAJDAH MEJD t8 = KIAH 1, uid8 ="@ = K"EGKA HAF%IEJ%HO "='A host8 B%H' JDA JHEF/AJ 1, %B = HA?%H@: 6DAIA =HA JDA %"/O 'AJ=@=J= A/A'A"JI CK=H="JAA@ J% =FFA=H B%H ALAHO HA?%H@: M>LE%KI/O8JDAO=HA IJHE?J/OE"JAH"=/ J%JDA HA?%H@E"CIOIJA': W%JA JD=J JDA '=?DE"A HAFHAIA"J=JE%" B%H J @%AI "%J D=LA J% IJ=HJ =J JDA DOF%JDAJE?=/ %HE< CE" %B " B%H JDA K"ELAHIAF =" =HJEBE?E=/ AF%?D EI A"%KCD8 IK?D =I '% E" 7"EN JE'A8 %H JDA '%HA HA?A"J @=JA %B AIJ=>/EID'A"J %B JDA HAF%IEJ%HO: 6DA IJ=JA@ @=JAI %B ALA"JI =HA J% >A MHEJJA" E" JDA HA?%H@I JDA'IA/LAI8 KIE"C B%H " = ?=/A"@=H HAFHAIA"J=JE%"8 J% MDE?D '=?DE"A JE'A 'KIJ "=JKH=//O >A ?%""A?JA@ MEJD JD=J ?%""A?JE%" @AF%IEJA@ FAHE%@E?=//O E" HA?%H@I: 2%E"JE"C J% ?%I'E?8 CA%/%CE?=/8 F=/A%"J%/%CE?=/ HA'%JA ALA"JI %" " EI @%"A >O ߢߢE"@K?JELA HABAHH=/ߣߣ8 JDH%KCD = JDA%HAJE?=/ ?%"IJHK?J: .%H AN='F/A8 ?%"IE@AH JDA ?D=E" %B DOF%JDAIAI ="@ FH%?AIIAI E"L%/LA@ E" ?=H>%"D " @=JE"C =" =HJEB=?J =I "8e# OA=HI >AB%HA FHA< IA"J8MDE?DE"ABBA?J >KE/@I = LEHJK=/ JE'A =HH%M: 5E'E/=H/O8 @AI?HEFJE%" %B MDAHA ALA"JI J=1A F/=?A EI "%J FHE'=HO8 >KJ IA?%"@=HOL EJ EI %B ?%KHIA %B E'F%HJ="?A8 >KJ ?=""%J >A A"B%H?A@ E"JDA HA?%H@I: Y=?DE"A JE'A J EI JDA %"/O %HC="EIE"C @E'A"IE%" %B JDA HAF%IEJ%HO: 1J EI = IE'F/A %H@AH8 ANFHAIIE"C JDA E"JHE"IE? ߢIAGKA"JE=/EJOߣ %B ="O IK>KA?JELA ANFAHEA"?A: 5AGKA"JE=/EJO EI JDA %"/O IJHK?JKHA E"DAHA"J J% JDA IOIJA' >O @AIEC": 1J EI JDA %"/O E"@EIFA"I=>/A ="@ K"=L%E@< =>/A IJHK?JKHA JD=J ID%K/@ F%IIAII =" ANJAH"=/ 'A'%HO IOIJA'8 =I HAB/A?JA@ >O JDA @E=< CH='L="@"%%JDAHIJHK?JKHA ID%K/@>A FKJ E"MEJD%KJ D=H': )" A/A'A"J=HO ?%C"EJELA %FAH=JE%" ?%"IEIJI E" FE?1E"C JM% =H>EJH=HO 'A'%HEAI8 ANFAHEA"?A@ =J ="O JE'AI8 ="@ HA/=JE"C JDA' E" I%'A '=""AH: 6DAHA>O B%H E"IJ="?A =" E"IEC"EBE?="J ALA"J E" ?DE/@D%%@ IK@@A"/O '=1AI IA"IA E" JDA /ECDJ %B = HA?A"J HA=@E"C: 4A/=JE"C JM% ALA"JI EI @%"A E" ! >O HABAHHE"C J% JDAEH HA?%H@I: 1" =" ! HA?%H@8 HABAHHE"C J% = F=IJ HA?%H@ EI J% %FA" = view %" EJF = CA"AH=/EI=JE%" %B MD=J = @EHA?J%HO FH%LE@AI %" KIK=/ BE/A IOIJA'I: ) LEAM ?=" C=JDAH =H>EJH=HO HA?%H@I8 ?%''A"J JDA' BHAA/O8 IKFF%HJ =?JE%" %" F=HJI %B EJI ?%"IJEJKA"J BE/AI JDH%KCD I?HEFJI8 ="@ E"?/K@A LEIK=/EI=JE%" ="@ KIAH E"JAH=?JE%" B=?E/EJEAI: ) LEAM ?%K/@ =/I% >A KIA@ B%H E"IJ="?A J% FH%LE@A ="%JDAH KIAH MEJD LEIE>E/EJO ="@ HECDJI %B =??AIIE"C = CELA" IAJ %B BE/AI8 %H J% @EIF/=O IALAH=/ F=HJI %B BE/AI =I = IE"C/A >%@O: 9A IAA DAHA JDA @A'="@B%H= ?%'FKJAH/="CK=CA J%ANFHAIIIK?DLEAMI: ,E=CH='I # ="@ ! HAFHAIA"J MA// JDA FH%CHAII %B8 I=O8 =" DEIJ%HE="ߣI JH=KA?J%HO JDH%KCD =" =H?DEL=/ ?%HFKI8 '=1E"C HA?%H@I8 HA?%"IE@AHE"C JDA'8 LEAME"C JDA' =HH="CA@ E" ="O %H@AH DA /E1AI: Y%HA >H%=@/O8 EJ HAFHAIA"JI =" E"LAIJEC=JE%" E" ="O ߢߢI?EA"?A %B JH=?AIߣߣ8 ="@ ALA" '%HA CA"AH=//O8 JDA =?GKEIEJE%" %B 1"%M/A@CA =/%"C = /EBA/E"A8 E" = /E"A=H IK??AIIE%" %B A"?%K"JAHI %B FA%F/A8 IEJK=JE%"I8 >%%1I8 AJ?:8 =// '=H1E"C ALA"JI E" JE'A: )J =" =>IJH=?J /ALA/ =// JDAIA FH%?AIIAI =HA B%H'=//O E@A"JE?=/F # ="@ ! ?=FJKHA >%JD I%'A AIIA"JE=/I %B ?%C"EJELA =?JELEJO ="@ %B =" ANJAH"=/ 'A'%HO IOIJA' B%H ANF="@E"C8 =KC'A"JE"C ?%C"EJE%":

3 ) IDEFߣI /%C >%%1 EI = FAHBA?J ?D=H=?JAHEI=JE%" %B = /EBA/E"A8 EJ HAB/A?JI E" EJI IAGKA"JE=/ HA?%H@I JDA IDEFߣI "=LEC=JA@ JH=KA?J%HO =H%K"@ JDA IA=8 ="@ EJI ?%"KK"?JE%" MEJD IEC"EBE?="J ALA"JI =J A=?D JE'A ="@ F/=?A: 6DA ?%HHAIF%"@E"C >=IE? E"B%H'=JE%" IOIJA' =H?DEJA?JKHA EI JD=J %B = ?%'FKJAHEIA@/%C>%%1: MKH @AIEC" 'E"E'=//O E'F/EAI JM% ?%'F%"A"JI8 = /E"A=H8 IAGKA"JE=/ BE/A IOIJA'8 IJHE?J/O ߢMHEJA %"?Aߣ8 ="@ = /="CK=CA J% ANFHAII BHAA ?%''A"JI8 HABAHA"?AI J% HA?%H@I8 ="@ E"L%1A =H>EJH=HOI?HEFJI%"HA?%H@I:

3. Long−haul message passing into the future: the need for a corpus )"O MHEJE"C EI = 'AII=CA IA"J E"J% JDA BKJKHA EB %"/O J% %"AIA/B: ) 'AII=CA '=1AI IA"IA >A?=KIA %B = ?%"LA"JE%"8 = ?%"JH=?J >AJMAA" F=HJEAI: 1B 'O ?%//=>%H=J%H L%E?AI ߢߢ" ߣߣ %LAH =" ANFAHE'A"J=/ AGKEF'A"J8 JD=J ?=" >A = FAHBA?J/O GK=/EBEA@ FEA?A %B @=J= >AJMAA" KI: M" JDA %JDAH D="@ =" EI%/=JA@ BE/A ?%"J=E"E"C ߢߢ" ߣߣ '=1AI IA"IA J% "% %"A: )CHAAE"C %" = CELA" FH%J%?%/ =//%MI = 'AII=CA J% =?DEALA EJI E"JA"@A@ FKHF%IA8 ?=HHOE"C 'A="E"C8 ="@ EI ?=//A@ E"JAH%FAH=>E/EJO: )FF/E?=JE%"I =CHAAE"C %" = BE/A B%H'=J =?DEALA I%D?=//A@ JA?D"E?=/ E"JAH%FAH=>E/EJO: +%"B%H'E"C J% ID=HA@ %"J%/%CEAI =//%MI I%D?=//A@ IA'="JE? E"JAH%FAH=>E/< EJO: *O ?%"JH=IJ8 'AII=CAI >AJMAA" DK'="I D=LA "% IJ=JE? IA'="JE?IL JDAO 'KIJ >A IK>< 'EJJA@ J% E"JAHFHAJ=JE%"8 KKIJ =I ="O JH=?1 HAGKEHAI JDA I1E// J% E"JAHFHAJ EJ J% HALA=/ = F=IJ ALA"J: 1"JAHFHAJ=JE%" "AA@I J% 1"%M JDA IKHH%K"@E"C ?%"JANJ %B JDA 'AII=CA8 = /=HCAH ?%"< JANJ MEJD?K/JKH=/ @EIJ="?A: .%H @=J=8 JD=J ?%"JANJ EI JDA corpusF = IK>IJ="JE=/ >%@O %B E"B%H'=JE%" MEJD E"JAH"=/ ?/%IKHA ="@ =@@EJE%"=/ ?%""A?JE%"I J% %KH FHAIA"J M%H/@8 A"%KCD JD=J MA ?=" E"JAHFHAJ = CELA" EJA': 6DA BKHJDAH E"J% JDA BKJKHA = 'AII=CA EI IA"J8 JDA '%HA EJ "AA@I = MD%/A ?%HFKI %B @%?K'A"JI =I = ?%"JANJ J% ?%"LAO IA"IA8 >A?=KIA E"JAHFHAJE"C JDA 'AII=CA E'F/EAI HA?%"< IJHK?JE%" %B JDA MD%/A IA"@AHDHA?AELAHDJH="I=?JE%"D'%JEL=JE%" IAJJE"C: 2H%J%?%/I ="@ ?%"< LA"JE%"I8 ="@ ?K/JKH=/ L=/KAI AL%/LA: 5?HEFJI CAJ B%HC%JJA"8 ="@ %"/O MDA" = IK>IJ="JE=/ ?%HFKI %B ?%""A?JE%"I8 MEJD A"%KCD ?/%IKHA EI =L=E/=>/A ?=" JDAO >A @A?EFDAHA@8 =I MEJD -COFJE="I DEAH%C/OFDI %H JDA Y=O= I?HEFJ: 1J B%//%MI JD=J = ?%HFKI EI JDA >AIJ >=IEI %B JHKIJ: 1"JAH"=/ ?/%IKHA A=IAIB%HCAHO@AJA?JE%": 6H=?A=>E/EJOEI= B=EH>=IEIB%HHAFKJ=JE%": 6DA ,M1 IOIJA' @%?K'A"J=JE%" ^!` =IIAHJI JD=J '="=CE"C @=J= E'F/EAI '="=CE"C HA/=JE%"< IDEFI >AJMAA" A"JEJEAIF ) D=I JDA HA/=JE%"IDEF * J% +: .%H E"IJ="?A8 ߢߢ)/>AHJ +='KI EI JDA MHEJAH %B J= +DKJAߣߣ8 =" ANFHAIIE%" JD=J @EHA?J/O '=FI E"J%8 I=O8 4,.: 2H%LA"="?A ID%K/@ "%J >A %'EJJA@F MD% I=E@ JD=J8 ="@ MDA": 4A/=JE%"IDEFI >AJMAA" A"JEJEAI EI %BJA" ?=//A@ 'AJ=@=J=: ) ?%HFKI EI ߢߢANJHA'A 'AJ=@=J=ߣߣ: +/A=H/O ="O HA?%H@ E" %KH HAF%IEJ%HO EI 'AJ=@=J= J% ="O %JDAH %"A EJ HABAHA"?AI8 ="@ ?%"LAHIA/O: -LA" '%HA I%8 ="O IAJ %B ?%"JA'F%H=HO HA?%H@I =HA E'F/E?EJ/O >KJ IJH%"C/O ?%""A?JA@ KKIJ >O >AE"C ?/%IA E" JE'AF = .HAK@E=" I/EF8 %H ALA" =" A'FJO HA?%H@8 ?=" ?%"LAO 'A="E"C KKIJ BH%' EJI F%IEJE%" =BJAH =" %JDAHMEIA K"HA/=JA@ HA?%H@:

4. Contrasting with current architectures: enforced order )// ?KHHA"J IOIJA'I B%H?A @=J= E"J% = 2H%?HKIJA=" >A@ %B =H>EJH=HO %H@AHI8 K/JE'=JA/O @EIJ%HJ< E"CEJ J%JDA F%E"J %B @ABA=JE"CEJIKIA8="@ALA"%>IJHK?JE"CEJIA"JAHE"CJDA @=J= IOIJA': +KHHA"J BE/A IOIJA'I E"IEIJ MA =HH="CA BE/AI E" = DEAH=H?DO: 6DKI MA JHO J% ANFHAII IA'="< JE?I E" = DEAH=H?DO: 0%M /%"C ?=" = DEAH=H?DO8 D%MALAH ?=HABK//O @ALEIA@8 =??AFJ "AM IK>< KA?JI MEJD%KJ >HA=1E"CQ )/I%8 'K?D J%% %BJA"8 = BE/A ID%K/@ /ACEJE'=JA/O >A E" JM% @EBBAHA"J F/=?AI: J=HCA /E>H=HEAI ?%"BH%"J JDA I='A @E/A''= ^ &`8 MDA" JM% OAJ K"HA/=JA@ @EI?E< F/E"AI8 HA'%JA E" ?/=IIEBE?=JE%" ="@ FDOIE?=/ =HH="CA'A"J CELA >EHJD J% = ?%'F/AJA/O "AM %"A: 6DA "AC=JELA ?%"IAGKA"?AI %B E'F%IE"C =H>EJH=HO %H@AH %" @=J= MDAHA EJ @%AI "%J >A/%"C F%EI%"%KI/O FAHL=@A ALAHO J=I1: ) BE/A IOIJA' DEAH=H?DO =/I% ?=""%J CH%M E"@ABE< "EJA/O MEJD%KJ HAGKEHE"C B%HAEC" 'A?D="EI'I8 IK?D =I /%CE?=/ L%/K'AI: *O ?%"JH=IJ8 %KH /E"< A=HIAGKA"?A %B HA?%H@I"=JKH=//OIF/EJIKFE"=HJE?/AI="@ANJA"@IA=IE/O >O =@@E"C 'A'%HO

4 @ALE?AI: .%HJDA I='A HA=I%"I8EJ /A"@IEJIA/B MA// J%F=H=//A/EI': 4A/=JE%"=/ @=J=>=IAI IE'E/=H/O B%H?A @=J= E"J% JDA HA/=JE%"I %B = CELA" @=J= '%@A/: ,E=CH=' # ID%MID%M = LAHO/%"CDJAH'@=J=>=IA ?=">A =C"%IJE?J%JDA 1E"@%B @=J= EJ ME// IJ%HA8>O HA@K?E"CJ%= IE"C/A J=>/A MEJD1AO uid, host, t: 0A"?A "%@=J=>=IA IOIJA' EI "AA@A@8 KKIJ = BE/A IOIJA': 1B O%K @% M="J = @=J=>=IA8 D%MALAH8 JDAHA EI "% @EBBE?K/JO E" FAHE%@E?=//O IJ%H< E"C EJI ?KHHA"J IJ=JA ="@ /%C E"IE@A = HA?%H@: ) @=J=>=IA '%@A/ I%'AMD=J IKFF%IAI EJ AND=KIJIJDA F%IIE>E/EJEAI%B MD=J ME// D=LA J%>A HA?%H@A@E"JDA BKJKHA: .%H?E"C E"=FFH%FHE=JA %H@AH8 ?KHHA"J IOIJA'I '=1A EJ @EBBE?K/J J% =??%''%@=JA HA=//O "AM ?%"?AFJI: 9D=J FH%J%?%/I8 MD=J ?%"LA"JE%"I ME// >A @A'="@A@ E" JDA BKJKHA8 MA ?=""%J B%HAIAA ="@'KIJ "%J FHAKK@CA: 6DA ?%'FKJAH IOIJA' %KJ/E"A@ E" JDA @E=CH=' ߞ = ?%'FKJAH >AE"C =@'A'%HO MEJD =" A"CE"A J% FH%?AII @=J= ߞ HAJ=E"I %"/O JDA 'E"E'K' "A?AII=HO J% IKFF%HJ ?%C"EJELA =?JELEJO8 ="@=//%M JH="I'EIIE%"%B 1"%M/A@CA E"J%JDA @EIJ="J BKJKHA:

5. Storing files as the privileged digital abstraction 9D=J @ECEJ=/ =>IJH=?JE%" ID%K/@ MA '=1A =??AIIE>/A J% JDA KIAHQ .E/AI =HA =/'%IJ K"ELAH< I=//O =L=E/=>/A8 MA// K"@AHIJ%%@8 ="@ K"EB%H'/O KI=>/AF JDAO D%/@ ALAHOJDE"C: 9A BAA/ MA =/I% ?=""%J =L%E@ BE/A DEAH=H?DEAI8 >A?=KIA '%IJ IOIJA'I FHAIA"J JDA'IA/LAI E" JD=J B%H' ="@ ?=" %"/O >A KIA@ E" JD=J M=O: )??AFJE"C DEAH=H?DEAI @%AI not 'A=" B%H?E"C ALAHOJDE"C E"J%DEAH=H?DEAIFEJ EI%"/O= B=?E/EJO%BBAHA@/%?=//OE"= HA?%H@: 6DA E"JA"@A@ /E"A=H8 IAGKA"JE=/ BE/A IOIJA' KIAI 8A"JE ^ ` =I >/%?1 IJ%H=CA /=OAH: 7"E?%@A EI JDA A"?%@E"C %B ?D%E?A8 MEJD EJI K"ELAHI=/ I?%FA ="@ IJHE?J IJ=>E/EJO FHE"?EF/A8 ?%"IEIJA"J MEJD%KH?%"?AH":

6. Correcting errors without hard update, and the generality of references 4AGKEHE"C JH=?A=>E/EJO D=I = @H=IJE? ?%"IAGKA"?AF IE"?A KF@=JE"C ?%"JH=@E?JI JH=?A=>E/EJO8 E" %KH IOIJA' O%K ?=" "AEJDAH AH=IA "%H ?D="CA ="O @=J=8 %"?A HA?%H@A@: .ECKHA@ E//KIJH=JAI JD=J JH=?A=>E/EJO EI =" E"JACH=/ F=HJ %B ?%C"EJE%"8 E"IAF=H=>/A BH%' EJ8 ="@ JD=J E" JDEI @AIEC" = ?%HHA?JE%" EI E'F%IIE>/A8 >A?=KIA JDA F=IJ ?=""%J >A ?D="CA@: 5E'E/=H/O8 = D=H@ KF@=JA %FAH=JE%"8 >O HAMHEJE"C @=J= E" F/=?A8 M%K/@ ?%"JH=@E?J JDA AIIA"JE=/ BK"?JE%" %B = 'A'%HO IOIJA': 1"IJA=@8 %"A '=O IFA?EBO = LEAM MEJD =H>EJH=HO JH="IB%H'=JE%"I J% =FF/O J% ="O FHA< LE%KI HA?%H@: /ELA" JDEI 'A?D="EI'8 '%IJ %FAH=JE%"I >A?%'A IKHFHEIE"C/O IE'F/A8 >A?=KIA ALAHOJDE"C MHEJJA" EI E''KJ=>/AL JDKI8 EB I%'AJDE"C M%H1I J%@=O8 EJ ME// M%H1 B%HALAH: 5KF< F%IA JD=J "A?AII=HO D=H@M=HA =H?DEJA?JKHAI ?=" >A A'K/=JA@ %H LEHJK=/EIA@: 6DAHA EI "% F%JA"JE=/ B%H ߢE"?%"IEIJA"J KF@=JAIߣ MDA"KF@=JE"CDE"DF/=?A EI=L%E@A@F/=OAHI="@/=OAHI%B ?%''A"JI '=O %LAH/=O %"A ="%JDAH8 ALA" ?%"JH=@E?JE"C A=?D %JDAH8 >KJ MEJD%KJ E"?%"IEI< JA"?O: -LA" '%HA E'F%HJ="J8 JE'A J EI HALAHIE>/A8 >O >KE/@E"C IKEJ=>/A LEAMI: 2/=" ' EI = /ELE"C @A'%"IJH=JE%" %B JDA I%K"@"AII %B IKFFHAIIE"C KF@=JA8 =J = ?AHJ=E" /ALA/8 E" EJI '=E" BE/A IOIJA'8 =//%ME"C JDA yesterday ?%''="@ J% /%%1 E"J% JDA IOIJA'ߣI F=IJ: 1" DEI ߢߢ,A>KC< CE"C >=?1M=H@I E" JE'Aߣߣ8 *E/ JAMEI ^&` =/I% ID%MI JDA F%MAH %B HALAHIE>/A JF >O HA?%H@E"C ALAHO IJ=JA ?D="CA E" JDA HK" %B = FH%CH='8 O%K ?=" "=LEC=JA JDA K"B%/@E"C %B ALAHO >EJ %B E"B%H'=JE%" JD=J 'ECDJ >A KIABK/ KKIJ =I =// ALA"JI E" ! ?%LAH =// JDA F%IIE>/A I%KH?AI %B E"B%H'=JE%"8B%HALAH:

7. Letting the user unobtrusively express his own order and trace it at desired detail ) IE"C/A HABAHA"?A 'A?D="EI'8 =J JDA /ALA/ %B HA?%H@I8 =??%K"JI B%H ?EJ=JE%"8 GK%J=JE%"8 =""%J=JE%"8?%''A"J8%HANJH=?JE"C@=J= J%BAA@E"J%= FH%?AII: )// JDA ANFHAIIA@ %H@AH8 =// JDA IJHK?JKHA EI B%H'A@ MEJDE" HA?%H@I AIFA?E=//O =I LEAMI8 AN?AFJ B%H JDA K"=L%E@=>/A JA'F%H=/ IAGKA"JE=/EJO: 1J EI JDA %"/O F/=?A B%H L=HE=JE%"8 ="@ EJ CELAI ?%'F/AJA BHAA@%'F =H>EJH=HO IJHK?JKHAI ?=" >A ANFHAIIA@: +KHHA"J IOIJA'I JA"@ J%

5 'EN F/=?AI MDAHA %H@AH EI ANFHAIIA@8 ="@ '=E"J=E" = ?%"BKIE%" >AJMAA" IJ=JE"C ߢߢ1" 'O FHAIA"J %FE"E%"8 JDEI FEA?A %B E"B%H'=JE%" EI E"?%HHA?J8 >A?=KIA IK?D ="@ IK?Dߣߣ8 ="@ JDA KHCA J% HAMHEJA JDA F=IJ: 6DEI =FFH%=?D EI H=JDAH @EBBAHA"J BH%' 'K?D M%H1 %" BE/A IOIJA'I MEJD IA'="JE? ?%"?AH" ^#`8 JD%KCD "%J "A?AII=HE/O E"?%'F=JE>/A MEJD EJ: 4ABAHA"?A ="@ =""%J=JE%"8 "%J KF@=JE"C E" F/=?A8 EI JDA CA"AH=/ ?=IA8 ="@ =FFH%FHE=JA J% JH=?A=>E/EJO: 6DA AIIA"JE=/ JDE"C EI J% /AJ JDA KIAH IFA?EBO DEI %M" %H@AH8 H=JDAH JD=" E'F%IA =" =H>EJ=HO %"A8 ="@J%A"IKHA JH=?A=>E/EJOE"= "%"%>JHKIELA M=O: 1" ?%C"EJE%"8 IA/A?JA@ ALA"JI =HA HA?%H@A@8 ="@ IJHK?JKHA@ E"J% %"AߣI %M" %H@AH: 5%'A ALA"JI =HA /ABJ @%H'="J8 I%'A =HA ?%"JE"K%KI/O HA=?JEL=JA@ ="@ HAKIA@8 >KJ BAM EB ="O =HA J%J=//O B%HC%JJA": +%C"EJELA FIO?D%/%CO ="@ FAH?AFJE%" JDA%HEAI ?%"IEIJA"J/O IAA JDA M%H/@ =I = ?D=%I ߞ E" JDA IA"IA JD=J EJI IJHK?JKHA EI B%HAEC" ߞ JD=J A=?D IK>KA?J EI ?D=//A"CA@ J% %HC="EIA8 J% HA"@AH ?%"IEIJA"J B%H DE'IA/B: 6DA ?D=%I M=I HAFHAIA"JA@ E" .ECKHA >O =" ='%HFD%KI IAJ E" !: 9DA" HAFHAIA"JA@ E" =" ANJAH"=/ 'A'%HO8 JD=J %HC="EI=JE%" EI =/I% FAHI%"=/: 6DA LAHO"=JKHA %B = FAHI%"=/ M%H1 EI J% E'F%IA %"AߣI %M" %H@AH %" JDE"CI: /A"AH=JE%"I %B DEIJ%HE="I ?=" B%//%M %"A ="%JDAH M%H1E"C %" JDA I='A ?%HFKI MEJD%KJ HAFA=JE"C JDA'< IA/LAIL E" JDEI JOFA %B I?D%/=HIDEF JDA AIIA"JE=/ ?%"JHE>KJE%" %B A=?D EI %BBAHE"C DEI %M" '%@A/ J% E"JAHFHAJ @=J=8 H=JDAH JD=" IE'F/O =FF/OE"C = >%HH%MA@ '%@A/: .%H AN='F/A8 '="O I?D%/=HI HA%HC="EIA JDAEH >%%1IDA/LAI B%H JDAEH ?KHHA"J FH%KA?J8 ="@ M%H1AHI %BJA" 1AAF= IA/A?JE%"%B >%%1I%HF=FAHI=J D="@8%"= @AI1: 6DA @A?EIE%" %B MD=J J% HAJ=E" EI = HA?KHHE"C %"A8 ="@ =// J%% A=IO J% %LAH/%%1: .%H AN='< F/A8 O%K HA?AELA = 5E>O//E"A A'=E/ MEJD = 74J ߢߢANF/=E"E"C EJ =//ߣߣ: 6DA A'=E/ M=I =H?DELA@8 >KJ OA=HI /=JAH EJ "% /%"CAH '=1AI IA"IA IE"?A O%KH IA"@AH B%HC%J J% I=LA JDA M%H/@ IE'K/< J="A%KI/O8 ="@ JDA 74J L="EIDA@: 1B = HABAHA"?A EI HA=//O KIABK/8 EJI "='A =/%"A ?=" @% "%JDE"CFI%'AJDE"C'KIJ >A HAJ=E"A@%B EJI?%"JA"J: 5% B=H MA D=LA JHA=JA@ JDA =H?DEJA?JKHA @EIF/=OA@ E" JDA @E=CH=' =I A"JEHA/O @AL%JA@ J% = FAHI%"=/ HAF%IEJ%HO: *KJ IE"?A JDA IJHK?JKHA MEJD EJI JHEF/AJ 1, EI =>I%/KJA/O 'E"E'=/8 EJ EI "%J IKHFHEIE"C JD=J EJ ANJA"@I I'%%JD/O J% = ?%//A?JELA KIA: 6DAHA EI "% %FAH=JE%"=/ C=F >AJMAA" FAHI%"=/ ="@ ?%//A?JELA M%H1 E" JDEI =H?DEJA?JKHA: 6DA HAIK/J %B ?%"JA'F%H=HO %H @A/=OA@ =""%J=JE%"I EI = B=EH/O JD%H%KCD HA?%H@ %B JDA ?%C"EJELA E"JAH=?JE%" %B KIAHI: 7IAHI ?=" KIA JDA I='A HAF%IEJ%HO E"@AFA"@A"J/O MEJD%KJ D=H'8 EB JDAO MEID: 6DAHA EI E" FHE"?E< F/A "% %>IJ=?/A J% = LAHO /=HCA "K'>AH %B KIAHI: -NF%HJE"C JDA JH=?A %B = HA?%H@ EI A=IO8 >O ?=FJKHE"C =// JDA ?=I?=@A %B @AFA"@A"?EAI MDE?D ?=" >A LAHO /=HCA EB = LEAM I=OI8 B%H E"IJ="?A8JD=J EJ @EI?=H@A@LAHO'="OHA?%H@IB%HHA=I%"IEJ ANJA"IELA/OANF%IAI=I KKIJEBE?=< JE%"I: 4A?%H@I BH%' @EBBAHA"J HAF%IEJ%HEAI ?=" A=IE/O >A 'ENA@ ="@ @EIA"J="C/A@: 6DA write once, IAGKA"JE=/ IJHK?JKHA '=1AI EJ A=IEAH J% @% @EIJHE>KJA@ HAF/E?=JE%": *=?1/E"1I =HA A=IO J% BE"@ MEJD =" E"@AN8 'K?D =I JDA MA> EI E"@ANA@ B%H IA=H?D A"CE"AI: 6DA E"@AN ?=" CH%M E"?HA'A"J=//O8="@>A HA?%H@A@KKIJ =I="O%JDAH@=J=: 0=LE"C =// JDA IJHK?JKHA ANFHAIIA@ E" HA?%H@I D=I =" E'F%HJ="J ?%"IAGKA"?A %" JDA KIA %B "='AI: W='AI CELA" =J JDA >EHJD %B =" %>KA?J =HA E'F%HJ="J8 B%H BE/AI =I MA// =I B%H L=HE=>/A "='AI E" FH%CH='I: *KJ "AM "='AI =HA ?=//A@ B%H MDA" C%E"C E"J% B%HAEC" /="CK=CAI %H IJ=OE"C E" JDA I='A F/=?A8 M=EJE"C /%"C A"%KCD: 4ABAHA"?AI ="@ LEAMI =//%M "='E"C8 =IIEC"E"C "='AI =FFH%FHE=JA J% JDA ?KHHA"J KIA B%H = BE/A8 = IAJ %B BE/AI %H F%HJE%" %B = BE/A8 %H = IAJ %B F%HJE%"Iߪ ="O @AI?HE>=>/A IJHK?JKHA: 8EAMI %FA" JDA F%IIE>E/EJO %B = K"EBOE"C "='AIF=?A JD=J ?%K/@ IJ="@ B%H ?A"JKHEAI8 AL%/LE"C >KJ =/M=OI K/JE'=JA/O HABAHHE"C J% JDA I='A %HECE"=/ ?%//A?JE%" %B @=J=: iKIJ =I MA D=LA IAA" JD=J 'AJ=@=J= HA/=JE"C JM% HA?%H@I EI >O "=JKHA =/M=OI =" =BJAHJD%KCDJ8 =FFH%FHE=JA "='AI8 MDE?D =HA KKIJ = F=HJE?K/=H JOFA %B 'AJ=@=J=8 =HA %BJA" B%K"@ >A/=JA@/O: ) "AM M=O J% view JDE"CI EI %BJA" = "AM M=O J% "='A JDA': +AHJ=E" "='AI ?%'A J% >A =??AFJA@ =I /=>A/I8 MDE?D HAIJH=E"I >%JD JDA FH%/EBAH=JE%" %B "='AI ="@ JDA ?%'F/ANEJO %B JDAEH HA/=JE%"IDEFI: ) IO"JDAJE? LEAM ?=" =/I% ?KJ >=?1 ?%'F/ANEJO:

6 8. More on personal vs. central repositories 6DAHA EI '%HA J% KKIJEBO FAHI%"=/ HAF%IEJ%HEAI: ߢߢ1"B%H'=JE%" A'FEHAIߣߣ8 MDAHA @=J= IJ%HAI =HA '%HA ="@ '%HA ?%"?A"JH=JA@8 ?=""%J >A >/E"@/O HA/EA@ %" =I ANJAH"=/ 'A'%HEAI8 D%M< ALAH IA/BD?%"BE@A"J JDAEH IA?KHEJO8 %H D%MALAH %FA" JDAEH IOIJA'I: )"O JA?D"E?=/ %HC="EI=< JE%" ?=" >HA=1: W=JKH=/ D=3=H@I /KH1: -'FEHAI >O @ABE"EJE%" =HA IK>KA?J J% H=@E?=/ @A?E< IE%"I: 1J EI HAF%HJA@ JD=J 3E" 5DE 0K="C8 JDA BEHIJ A'FAH%H %B +DE"=8 D=@ =// ANEIJE"C >%%1I "%J ?%'F/OE"C MEJD 3E" DEIJ%HE="I >KH"A@ MEJD AN?AFJE%"I B%H = BAM IFA?E=/ BEA/@I8 ="@ /=JAH >KHEA@ =/ELA I?D%/=HI MD% AEJDAH IJE// %M"A@ JD%IA >%%1I %H IJE// D=@ JDA' E" 'E"@ ="@ ?%K/@ IFHA=@ JDAEH E@A=I: 6DA /E>H=HO =J )/AN="@HE= M=I @AIJH%OA@: 1"B%H'=JE%" A'FEHAI J%@=O =HA "%J E" = @EBBAHA"J F%IEJE%": 1" 'E@ )FHE/  8 /%%C/A =""%K"?A@ JD=J %" ' )FHE/8  8 BE/AI D%IJA@ %" /%%C/A 8E@A% M%K/@ "% /%"CAH F/=O8 ="@ ?%'F/AJA/O IDKJ @%M" JDA IAHLE?A %" ! Y=O ^ `8 JDKI @EIFH%LE"C JD%IA MD% FH%'%JA@ LE@A% ID=HE"C =I =" =H?DEL=/ I%/KJE%": 7IAHI8 EB IJE// =/ELA8 D=@ JD=J ID%HJ JE'A J% DA=H =>%KJ JDA IDKJ@%M"8 ="@ GKE?1/O@%M"/%=@JDAEHBE/AI=C=E"8>A?=KIA "%=H?DELAIMAHA J%>A 1AFJ: 1" JDA I='A LAE"8 '="O E"EJE=JELAI %B @=J= FHAIAHL=JE%" =HA B%?KIA@ %" /=HCA @=J= IAJI ^%`: )'%"C '="O HA=I%"I8 /=HCA FH%KA?JI '=1A EJ A=IEAHJ%=JJH=?J BK"@I8="@J%E'F%IA %"JDAEH KIAHI ?%"IJH=E"E"C JA?D"E?=/ ?D%E?AI J% A=IA =@'E"EIJH=JE%": *KJ JDA FH%>/A' EI =?JK=//O J% ?=FJKHA FA%F/AߣI M%H1 JDA M=O JDAO M%H1F JD=J EI8 D%M JDAO E"JAH=?J MEJD @=J=: )"O %"A IAA1E"C J%@=O B%H = /%"CDJAH' @ECEJ=/ FHAIAHL=JE%" I%/KJE%" %" = FAHI%"=/ >=IEI EI /ABJ MEJD< %KJ = I%/KJE%"8 ALA" MEJD%KJ 'A"JE%"E"C JDA E"=>E/EJO HA=//O J% =@@HAII JDA ?%"?AH" B%H FHAIAHL=JE%" E" ALAHO@=O =?JELEJO: *KJ FHAIAHL=JE%"8 =H?DELE"C8 ?=""%J >A =" =BJAHJD%KCDJ8 =// JDA '%HA I% E" JDA @ECEJ=/ M%H/@: 6DA DEIJ%HO %B I?EA"?A JA=?DAI KI JD=J JDA '%IJ IKH< FHEIE"C >HA=1JDH%KCDI ?%'A BH%' JDA '%IJ K"ANFA?JA@ ?%"@EJE%"I8 ="@ JDAO =HA >O "=JKHA E'F%IIE>/A J% FHA@E?J: 1B MA M="J J%?=FJKHA JDA'8MA "AA@= I%/KJE%"J%D="@: YA="MDE/A8 = DKCA ='%K"J %B 1"%M/A@CA EI ?%"JE"K%KI/O >AE"C >KE/J >O D%IJI %B E"@ELE@K=/ HAIA=H?DAHI =H%K"@ '="O I'=//8 L=/K=>/A @=J= IAJI: 6DA" I%'A @=O I?EA"JEIJI HAJEHA8 ="@ JDA JH=?AI %B JDAEH 1"%M/A@CA HAJEHA MEJD JDA': )"@ EJ EI "%J K"?%''%" JD=J = BAM '%"JD =BJAH IK>'EJ< JE"C= F=FAH8JH=?AI%B D%M J%HAFH%@K?A JDA HAIK/JI=HA /%IJ ^ `: 1" JDA I?EA"JEBE? BEA/@8 MA MEJ"AII E" FH=?JEIA JD=J JDA '%HA ?%'FKJAHI >A?%'A E"JE'=JA =J ALAHO IJ=CA %B = I?EA"JEIJߣI M%H18 JDA /AII = CELA" FEA?A %B M%H1 >A?%'AI HAFH%@K?E>/A8 MDAHA=I MA 'ECDJ ANFA?J JDA AN=?J ?%"JH=HO: 6DA ?HAAFE"C %B E"IJ="J 'AII=CE"C E"J% I?E< A"JEBE? M%H18 ="@ JDA %??=IE%"=/ L="EIDE"C %B @=J= %" JDA 9A>8 ?D=//A"CA '%HA ="@ '%HA %"AߣI =>E/EJO J% ?=FJKHA JDA' ABBE?EA"J/O8 ="@ J% HAJ=E" =FFH%FHE=JA E'=CAI %B JDA' J% '=1A JDA'KI=>/A =IHA/E=>/A HABAHA"?AI: *O HA=@E"C = "%LA/8 %"A ?=" ANFAHEA"?A I%'A%"A A/IAߣI I/E?A %B /EBA8 MEJD%KJ D=LE"C J% =?JK< =//O /ELA EJ: *O >%HH%ME"C I%'A%"A A/IAߣI /E>H=HO8 %"A ?=" M=J?D JDH%KCD DEI ?K/JKH=/ ME"< @%M: *O >%HH%ME"C I%'A%"A A/IAߣI HAF%IEJ%HO8 %"A ?=" C% ALA" BKHJDAH8 MEJD JDA ?D%E?A %B KK'FE"C J% ?%"?/KIE%"I8 ="@ >=?1JH=?1E"C BHAA/O J% JDA I%KH?AI8 "A=H/O M=/1E"C >O JDA IJHA=' %B JD%KCDJI %B = B%HAHK""AH: 6DA FH%KA?JA@ IOIJA'8 IAHLE"C =I = CA"AH=/ @ECEJ=/ /=>< %H=J%HO "%JA>%%18 M%K/@ CELA JD=J E"?HA@E>/A =>E/EJO J% B%//%M E" I%'A%"AߣI B%%JIJAFI: 1B MA M="J J% ߢߢ?/E'> %" JDA ID%K/@AHI %B CE="JIߣߣ8 MA 'KIJ >A =>/A BEHIJ J% B%//%M E" JDAEH B%%J< IJAFI E" JDAEH JH=?1I: 9A =HCKA JD=J MA ?AHJ=E"/O "AA@ I%/E@8 FH%L=>/A personal @ECEJ=/ 'A'%HOIOIJA'IJD=J =HA A=IOJ%'="=CA:

9. Implementing a linear (sequential), write once file system 6DEI IA?JE%" EI ALA" '%HA = ?=// B%H ?%''A"JI JD=" JDA HAIJ %B JDEI F=FAH: 1J ID%K/@ "%M >A %>LE%KIJD=J ="=@=FJ=JE%"%B .%IIE/ ^ `HA=?DAIJDA IFA?EBE?=JE%"MA =E'=J: 6DAHA ME// >A8 IE@A >O IE@A8 = KIAHߣI M%H1IF=?A D%'A @EHA?J%HO J%CAJDAH MEJD JDA IAJ %B BE/AI "A?AII=HO J% >%%J JDA %FAH=JE"C IOIJA' E"J% = F=HJE?K/=H8 BK"?JE%"=/ IJ=JA8 ="@ = IFA< ?EBE?@AF%IEJ =HA= E" MDE?D J% FKJ BE/AI %H @EHA?J%HEAI JD=J ME// >A?%'A = HAF%IEJ%HO HA?%H@ >O = I%HJ %B on−trigger FH%'FJA@ I"=FID%J FH%?AII JD=J >KE/@I = IFA?EBE? 8=? BE/A MEJD JDA =JJ=?DA@ JHEF/AJ uid, host, t: ) JOFE?=/ J M%K/@ >A =" E"JACAH ?%K"J BH%' =" =H>EJH=HO

7 %HECE"8 ?%"LAHJE>/A E" ?=/A"@=H JE'AL "%JA JD=J B%H E"IJ="?A $"@>EJ =J = "="%IA?%"@ HAI%/K< JE%"HAFHAIA"JI=>%KJ #&"OA=HI: 8A"JE "AA@"%J >A ?D="CA@: 1J EI KF J% JDA KIAH J% @AJAH'E"A JDA ?DK"1I %B @=J= A:C:8 = MD%/A @EHA?J%HO %H '="O IAF=< H=JA BE/AI JD=J =HA J% >A?%'A HA?%H@IL JDA '=E" H=JE%"=/A EI DEI %M" ?%"LA"EA"?A: 6DA IA'="JE?I %B ߢC=JDAHE"C BE/AIߣ E"EJE=//O EI "%J F=HJE?K/=H/O IJH%"C ="@ EI /E1A/O J% >A IF/EJ E"J% '%HA IFA?EBE?IAJIE"JDA BKJKHA: -LA"JK=//O =// JDA BE/AI =HA B%K"@ E" JDA HAF%IEJ%HO: 1J IAA'I JD=J JDA "%JE%" %B = D%'A @EHA?J%HO EI "A?AII=HO J% D%/@ =J /A=IJ = /EIJ %B '=E"J=E"A@ LEAMI %" MD=J 'O M%H1 D=I >AA" I% B=H8 %H MD=J 'O M%H1F/=?A "%M EI: *KJ E" B=?J8 = IE"C/A LEAM EI A"%KCD8 ="@ FAHD=FI ANFAHEA"?A ME// ID%M JD=J JDA @EIJE"?JE%" %B = D%'A EI K""A?AII=HO ="@ EJ IKBBE?AI J% BAJ?D JDA /=IJ FAHI%"=/ LEAM BH%'JDA HAF%IEJ%HO:) LEAM 'ECDJ =/I%=//%M BAJ?DE"C=// JDA >E"@E"CI "AA@A@ J% >%%J = F=HJE?K/=H %FAH=JE"C IOIJA' IJ=JA ="@ BE/A IOIJA' ?%"BECKH=JE%": )I = HAIK/J8 %"/O = JH="IEA"J M%H1IF=?A MDAHA ?KHHA"J M%H1 J=1AI F/=?A 'ECDJ >A A"%KCD: +=?D< E"C JD=J M%H1IF=?A8 J% D=LA EJ =J D="@ E''A@E=JA/O MDA" %"A HAJKH"I J% JDA '=?DE"A8 EI ?/%IA J%D=LE"C= D%'A @EHA?J%HO: MB ?%KHIA I%'A >%%JIJH=F EI HAGKEHA@ J% BEHIJ ANF/%HA A"%KCD %B JDA HAF%IEJ%HO J% >A =>/A J% /%=@ ="@ KK'F E"J% ="%JDAH '=?DE"A: 0=LE"C JDA BK// D=H@M=HADI%BJM=HA IJ=?1 =L=E/=>/A EI JDA @ABE"EJELAߞJDA best possibleߞ?%"@EJE%" B%H =//%ME"C = KIAH J% E"JAH=?J MEJD = CELA" BE/A BK//O: .%H FHAIAHL=JE%" FKHF%IAI8 ?%"BE"E"C JDA '=E" M%H1 E"IE@A = LEHJK=/ '=?DE"A =//%MI I=LE"C ="@ HAIJ%HE"C JD=J ?%'F/AJA D=H@M=HADI%BJM=HA IJ=?1: Y%IJ %B JDA M%H1 ID%K/@ K"B%/@ %" JDA HAF%IEJ%HO8 >KJ @AJAH'E"E"C D%M 'K?D I% EI HA=I%"=>/A8 IJE// "AA@I J% >A @AJAH'E"A@>OANFAHE'A"J: 6DA IAGKA"JE=/ HA?%H@ IJHK?JKHA 'A="I JD=J ?KJJE"C = /=HCA HAF%IEJ%HO E"J% IJHEFAI =I EJ CH%MI J% DKCA IE3AI EI A=IO: 2=H=//A/ =??AII EI JDA" F%IIE>/A8 MDE?D ?%"LAHIA/O HAIK/JI E" @KF/E?=JE"CI%'A >/%?1I8MEJD="E"@AFA"@A"J 8A"JE B%HA=?DIJHEFA: 9A =IIK'A EJ EI %H ME// >A F%IIE>/A J% '%"EJ%H 'A@E= 'A'%HEAI B%H @ACH=@=JE%" MDE?D EI A=IA@ %" = 8A"JED>=IA@ IJ%H=CA IOIJA'8 ="@ 'ECH=JA JDA' =??%H@E"C/O8 JDKI A"IKHE"C ?%"< JE"KA@ =??AII J% JDA >EJI %B = BE/A: Y="O ?%FEAI =/I% '=1A @=J= I=BAH ^ !`: 9A//DJH=?A@8 M%H1=>/A8 ?%'FKJ=>/A ?%HF%H= =I F/=""A@ DAHA ME// K"@%K>JA@/O >A >AJJAH ?="@E@=JAI B%H JDA ABB%HJ:

10. A language for the elementary interaction and its text editor 4ABAHA"?AIߞDOFAH/E"1Iߞ=HA ANFHAIIA@ =I JANJ8 F%E"JE"C J% = HA?%H@ >O = JHEF/AJ KE@8 D%IJ8 J8 ="@ = F%IEJE%": 1" = JANJ BE/A8 = F%IEJE%" EI = IE'F/A E"JACAH EB O%K ?%K"J E" ?D=H=?JAHI8 @EBBAHA"J BH%' >OJAI E" 76.D&8 >KJ IAC'A"JI %B JANJ ?=" >A /%?=JA@ >O ="O %JDAH 'A="8 /E1A = IJHE"C IA=H?D8 = HACANF8 %H KIE"C JDA F=JJAH"I ="@ HACE%" E"JAHL=/I %B ߢߢ/ECDJMAECDJ IJHK?JKHA@ JANJ FH%?AIIE"Cߣߣ ^'`: 4A'A'>AH JD=J EB = IJHE"C IA=H?D /A=@I K"='>ECK%KI/O J% = F%IEJE%"8 EJ ME// =/M=OI8 IE"?A BE/AI @%"ߣJ ?D="CA: 1" =" E'=CA %H %JDAH IFA?E=/ B%H'=JI8 =FFH%FHE=JA /%?=J%HI'KIJ >A KIA@: )I = 'E"E'=/ ABB%HJ E'F/A'A"J=JE%" MA KIA -'=?Iߣ MHC '%@A BH%' = JE"KN IOIJA': MHC EI = CA"AH=/ FKHF%IA J%%/ ="@ = ?%%H@E"=JA@ /ECDJ IO"J=NE"F/=E"JANJ BE/AIB%H1AAFE"C"%JAI8 %KJ/E"E"C JANJ8 E"JAH"=/ ="@ ANJAH"=/ /E"1I8 E"?/K@E"C I%KH?A ?%@A >/%?1I ="@ AL=/K=JE"C JDA'8 ="@ ?%"LAHJE"C JDA' E"J% I%KH?A BE/AI KIE"C JDA "%MA> ?%"LA"JE%" %B /EJAH=JA FH%< CH=''E"C ^$`: -NF%HJI J% L=HE%KI B%H'=JI E"?/K@E"C J=6A: =HA A=IO8 EJ =/I% ?%'AI MEJD '="O KIABK/ B=?E/EJEAI =I JE'AIJ='FE"C ="@ ?=/A"@HE?=/ ?=/?K/=JE%"II%KIABK/ J%DEIJ%HE="I8 =CA"@= LEAMI8 J=CCE"C8 '=E"J=E"E"C J%D@% /EIJI8 LAHO BEJ B%H FH%KA?J F/=""E"C ="@ FAHBA?J B%H 1AAFE"C = /%C >%%18 ="@ =J JDA '%'A"J8 J% CELA = BAA/E"C %B MD=J ?%K/@ >A JDA M%H1 %" = /%C>%%1 IJHK?JKHA: 6DA =E' =J JDEI IJ=CA EI J% @% JDA M%H1 '=E"/O BH%' = JE"KN E"IJ=//=JE%"8 MEJD CHA=J KIA %B -'=?I MA 1"%M MA =HA E" = IJ=JA %B IE"8 >KJ EJ ?%'FA"I=JAI B%H '="O C=FI %B E"JACH=JE%" >AJMAA" JDA %FAH=JE"C IOIJA' ="@ EJI ME"@%MI: )// JDA HAF%IEJ%HO EI 1AFJ %" BE/A IOIJA'I K"@AH 2/="@': WA=H/O =// JDA B=?E/EJEAI MA "AA@ =HA FHAIA"J K"@AH -'=?I8 %H %JDAHMEIA

8 HA/=JELA/O A=IO J% @ALA/%F: +%''="@I /E1A BE"@D@EHA@ %H BE"@DCHAFD@EHA@ E" -'=?I ?=" CELA KIAHI = C%%@ E"JKEJE%" %B MD=J = LEAM 'ECDJ >A8 E" CA"AH=/8 ="@ %B JDA F%MAH %B JANJ '="EF< K/=JE%": 6DAHA =HA8 D%MALAH8 AN?EJE"C FH%IFA?JI E" = ?%'>E"=JE%" %B BA=JKHAI BH%' )?'A ="@-'=?I8K"@AHJDA 2/="@'"='AIF=?A: JE"KN EI "%J J%% AN%JE? B%H = BK//ODB/A@CA@ A"LEH%"'A"J B%H = /=HCA IAJ %B F%JA"JE=/ KIAHI8 ="@ EI >A?%'E"C 2/=" 'J='A@: 1J EIHA=/EIJE?"%J J%ANFA?J FA%F/A J%IDEBJ BH%'JDAEHD=>EJI8 AIFA?E=//O EB MA /%%1 '%HA ME@A/O B%H BKJKHA KIAHI8 AIFA?E=//O E" JDA DK'="EJEAI %H %JDAH BEA/@I ߢߢB%HAEC"ߣߣ J% ?%'FKJAH I?EA"?A8 J% ANFAHE'A"J MEJD JDA IOIJA': M"A %B JDA K/JE'=JA FKHF%IAI EI J% >A =>/A J% JA'FJ KIAHI %B ="O %FAH=JE"C IOIJA' MEJD = B=?E/EJO B%H JH=?A=>E/EJO JD=J 'E/@/O ?D="CAI JDAEH D=>EJI8 JD%KCD E"ALEJ=>/O I%'A IOIJA'I ME// %BBAH = HAIK/J MEJD H%KCDAHA@CAIJD="%JDAHI: 6DEI?%'>E"=JE%" MA =E' =J %BBAHI JDA /A=IJDABB%HJ F=JD J% = 'E"E'=/ M%H1E"C E"IJ=//=JE%" %B MD=J EI 'A="J =I = CA"AH=/ FKHF%IA A"LEH%"'A"J8 =I IA='/AII =I F%IIE>/A BH%' FH%CH='< 'E"C J% ?%''%" KIA: 1J EI @EBBE?K/J ="@ KIA/AII J% JHO J% B%HAIAA MD=J KI=CA F=JJAH"I ME// A'AHCA8 ="@ "%JDE"C ?=" HAF/=?A D="@ID%" ANFAHEA"?A: .%H E"IJ="?A8 MDAJDAH JDAHA ID%K/@ >A I%'A I%HJ %B HAIAHLA@ 1AOM%H@ J% IJ=JA ߢߢ6DEI EI = ?%HHA?JE%"ߣߣ EI /ABJ %FA"8 JD%KCD E"JKEJE%" IKCCAIJI JD=J MA %KCDJ J% =L%E@ EJF FH%FAH ?%'FKJAH IA'="JE?I ?=" HAIE@A E" JDA HAF%IEJ%HOߣI I?HEFJI8 ="@ BE"A DK'=" IA'="JE?I ?=" >A MHEJJA" =I IK>J/O =I F%AJHO8 E" =" =??%'F="OE"C ?%''A"J: )"@ "=JKH=/ /="CK=CAI AL%/LAߪ JA=LE"C JDA IOIJA' ME@A/O %FA"J%'K/JE/E"CK=/EI'J%@=O8EIJ%'=1A EJ HA=@OJ%B=?A JDA BKJKHA:

11. Concluding remarks 6DEI F=FAH EI =" =JJA'FJ J% @ABE"A ="@ KKIJEBO JDA @AIEC" %B = @ECEJ=/ IOIJA' B%H JH=?A=>E/EJO %" = LAHO /%"C JAH': 9A D=LA BA/J "A?AII=HO J% FHAIA"J =" ="=/OIEI E" LAHO =>IJH=?J JAH'I8 =NE%'=JE? E" IFEHEJ8 ="@ J% ?%""A?J A=?D =IFA?J MEJD E//KIJH=JE%"I BH%' = /=HCA H="CA %B ?K/< JKH=/ BEA/@I: 1J =FFA=HI JD=J A'>H=?E"C ?A"JKHEAI ?%"IEIJA"J/O /A=@I KI J% I%'A BK"@='A"< J=/I %B ?%C"EJE%" ="@ ?K/JKH=/ DAHEJ=CA8 ="@ FAHD=FI F=H=@%NE?=//O J% JDA 'E"KJA @AJ=E/I %B @=ODJ%D@=OM%H1: -=H/O %"8 JDEI @E=C"%IEI /A@ %"A %B KI J% IAA1 = I%/KJE%" E" %FAH=JE"C IOIJA' I%BJM=HA HAIA=H?D8 ="@ 2/="@' A'AHCA@ =I = FH%IFA?J: )BJAH =//8 =" %FAH=JE"C IOIJA' EI = IAJ %B FH%< CH='I JD=J '=1A EJ A=IO B%H ?%'FKJAH KIAHI ="@ FH%CH=''AHI J% @% JDAEH K%> ^ "`: 9A D%FA MA D=LA HA=?DA@ = I%K"@8 ?%"LE"?E"C %KJ/E"A8 ="@ E@A"JEBEA@ I%'A E'F%HJ="J AIIA"< JE=/I %B M%H1E"C MEJD = ?%'FKJAH ="@ %JDAH I%HJI %B 'A'%HO @ALE?AI: MJDAHI ID%K/@ =FFA=H E" JDA FH%?AII %B ANFAHE'A"JE"C MEJD = BEHIJ E'F/A'A"J=JE%" %B JDA IOIJA': 9A D%FA JD=J JDA @AIEC" EI ?/A=H8 'E"E'=/ ="@ MA//D/=OAHA@ A"%KCD JD=J MA ?=" ?%FA MEJD IK?D IKHFHEIAI: MKH BEH' >A/EAB EI JD=J JDAHA EI = B=L%KH=>/A8 AN?/KIELA "E?DA F%IEJE%" B%H 2/="@' %" JDEI J%FE?8BH%'MDAHA ?%K/@A'AHCA %FF%HJK"EJEAIJ%IFHA=@/E1A = LEHKI: 9A IK>'EJ JD=J HAB/A?< JE%"J%JDA 2/="@'?%''K"EJO:

12. Acknowledgement 9A JD="1 ,=""O J% 5AA" ="@ )@HE=" +KIJAH B%H HALEAME"C A=H/O IJ=CAI %B JDEI F=FAH8 6HEIJ=" )//%KEI B%H DEI ?%''A"J=HEAI %" JDA BECKHA: 9A =HA ANJHA'A/O CH=JABK/ J% +D=H/AI .%HIOJD MD%L%/K"JAAHA@I%'A A@EJE"C8="@A"@A@KFMEJD= '=IJAH/OHAMHEJA: 9A B%K"@ %KH M%H@I8 JH="I/%?=JA@KKIJ E"JDA HECDJ F/=?A: 9A =HA K"B=EH"%J J%?%K"J DE'=I="=KJD%H:

References ^ ` Y=H1 *H%M": Archivists step in as Google Video shuts down for good. DJJFFllMMM:MEHA@:?%:K1l"AMIl=H?DELAl  D"l &lC%%C/ADLE@A%DJAH'E"=JE%"8 & )FHE/  : ^ ` i: *: *K?1DAEJ8 ,: J: ,%"%D%: WaveLab and Reproducible Research. ,AFJ: %B 5J=JEIJE?I8

9 5J="B%H@7"ELAHIEJO86A?D:4AF:"%"8 ''#: ^!` ,M1 .=?JIDAAJ: Managing Data Relationships Using DOI® Resolution, Version 1.0. DJJFFllMMM:@%E:%HClB=?JIDAAJIlY="=CE"C,=J=4A/=JE%"IDEFI:DJ'/8 6DA 1"JAH"=JE%"=/ ,M1 B%K"@=JE%"8=??AIIA@M?J%>AH !8  : ^"` YE?D=A/ .=?J%H8 m=/'=" YAJD8 ,=/EJ W=%H8 MD=@ 4%@AD8 iK/E=" 5=JH=": Object Storage: The Future Building Block for Storage Systems, a position paper. 1"F FH%?AA@E"CI %B JDA 5A?%"@ 1"JAH"=JE%"=/ 1--- 5O'F%IEK' %" -'AHCA"?A %B //%>=//O ,EIJHE>KJA@ ,=J=8 iK"A 'D "8 #85=H@E"E=81J=/O: ^#` ,=LE@ m: /EBB%H@8 2EAHHA i%KLA/%J8 Y=H1 ): 5DA/@%"8 i='AI 9: Mߣ6%%/A8 iH: Semantic file systems. 1"F 2H%?AA@E"CI %B JDA !JD )+Y IO'F%IEK' %" MFAH=JE"C IOIJA'I FHE"?EF/AI8 M?J%>AH8 '' : ^$` ,%"=/@ -: m"KJD: Literate programming. +5J1 JA?JKHA "%JAI8 %8 +A"JAH B%H JDA IJK@O %B /="CK=CA ="@E"B%H'=JE%"85J="B%H@8+=/EB%H"E=875)8 '' : ^%` mO%"CD0% JAA8 M/ELAH 5/=JJAHO8 4E?D="C JK8 :E=% 6="C8 8E?J%H Y?+H=HO: The state of the art and practice in digital preservation. i%KH"=/ %B HAIA=H?D %B JDA W=JE%"=/ E"IJEJKJA %B IJ="@=H@I="@JA?D"%/%CO8 %8 8  8FF:'!DD $: ^&` *E/ JAMEI: Debugging backwards in time. 1"F 2H%?AA@E"CI %B JDA .EBJD E"JAH"=JE%"=/ M%H1ID%F %" =KJ%'=JA@ ="@ =/C%HEJD'E? @A>KCCE"C )),-*7/8 /DA"J8 *A/CEK'8 5AFJA'< >AH8 !8 YE?DEA/ 4%"IIA=8 m%A" ,A *%II?DAHA -@I:8 FF: #D !#: DJJFFll=HNEL:%HClF@Bl?I:5-l!  $8^  D D "6DK: F &`: ^'` 4%>AHJ +: YE//AH8 *H=@ ): YOAHI: Lightweight Structured Text Processing. 1"F 2H%?AA@< E"CI %B JDA ''' 75-W1: )""K=/ 6A?D"E?=/ +%"BAHA"?A8 iK"A $D 8 '''8 Y%"JAHAO8 +=/EB%H< "E=875)8FF: ! D "": ^ ` 5A=" 3KE"/="8 5A=" ,%HM=H@: Venti: A new approach to archival data storage. 1" .)56 ߢ F 2H%?AA@E"CI %B JDA IJ 75-W1: +%"BAHA"?A %" .E/A ="@ 5J%H=CA 6A?D"%/%CEAI8 F=CA %8 *AH1A/AO8+)875)8  :75-W1:)II%?E=JE%": ^ ` 5A=" 3KE"/="8 iE' Y?mEA8 4KII +%N: Fossil, an archival file server. 2/="@' KIAHߣI '="< K=/8L%/K'A 8B%KHJDA@EJE%"8  : ^ ` 5A=" 4DA=8 4KII +%N8 )/AN 2AIJAHAL: Fast, inexpensive content−addressed storage in Foundation. 1"F 2H%?AA@E"CI %B JDA 75-W1: )""K=/ 6A?D"E?=/ +%"BAHA"?A &8iK"A D %8 *%IJ%"8Y=II=?DKIAJJI875)8FF: "!D #$ ^ !` ,=LE@ 5:0: 4%IA"JD=/: LOCKSS: Lots Of Copies Keep Stuff Safe. 2HAIA"JA@ J% JDA W156 ,ECEJ=/ 2HAIAHL=JE%"1"JAH%FAH=>E/EJO.H='AM%H1 9%H1ID%F8Y=H?D 'D! 8  : ^ "` iAH%'A 0: 5=/J3AH8 Y: .H="I m==ID%A1: Principles of Computer System Design: An Introduction. Y%HC="m=KB'="8*KH/E"CJ%"8Y)875)8 ': ^ #` /A%HCA 5="J=O="=: Reason in common sense. ,%LAH 2K>/E?=JE%"I8 1"?: WAM ;%H18 '& BEHIJ FK>/EIDA@>O+D=H/AI5?HE>"AHߣI5%"I8 '#: ^ $` ,A"EIA 5?D'="@JD*AIIAH=J: Before writing, volume 1, from counting to cuneiform. 7"ELAHIEJO%B 6AN=I2HAII8)KIJE"86AN=I875)8 '' : ^ %` *A"DYE?D=A/ 5?DKA/AH: Update reconsidered. 1"F )H?DEJA?JKHA ="@ '%@A/I E" @=J= >=IA '="=CA'A"JF FH%?AA@E"CI %B JDA 1.12 ?%"BAHA"?A %" '%@A//E"C E" @=J= >=IA '="=CA'A"J IOIJA'I WE?A8 .H="?A8 !DD% i="K=HO '%%: /:oY: WEKIIA"8 -@:8 W%HJD 0%//="@8 )'IJAH< @='8 '%%8FF: "'D $": ^ &`6:4:5?DA//A">AHC: The management of archives. +%/K'>E= 7"ELAHIEJO2HAII8 '$#:

10 Gostor: Storage beyond POSIX

Latchesar Ionkov Los Alamos National Laboratory∗ [email protected]

ABSTRACT Gostor is an experimental platform for testing new file storage ideas for post POSIX usage. Gostor provides greater flexibility for manipulating the data within the file, including inserting and deleting data anywhere in the file, creating and removing holes in the data, etc. Each modification of the data creates a new file. Gostor isn’t constrained by organizing the files in hierarchical structures, or identifying them with strings. Thus Gostor can be used to implement standard file systems as well as experimenting with new ways of storing and accessing users’ data.

1. Introduction Currently there are two popular ways of storing data – hierarchical file systems, and relational databases. The hierarchical file systems consist of files (arrays of bytes) that have names. The files are grouped in directories which can be members of other directories. In order to access a file, one needs to know the path, i.e. the list of directories from root of the file system. Files data can be overwritten, but new data can be added only at the end of the file. Most of the popular file systems support the POSIX (or similar) set of file operations [2]. Relational databases enforce strong structure on the stored data, by enforcing it to be fitted in a set of tables. The data can be accessed by using the SQL language. Relational databases provide better consistency and concurrency guarantees. They are hard to install and maintain, often requiring professional database administrator in order to achieve reasonable performance. There have been many attempts to introduce the benefits of databases to file systems, such as transactions, snapshots, etc. Even though some popular file systems support snapshots and versioning, creating and manipulating snapshots is not part of the standard file operations. In many cases, especially with scientific datasets, extending files only at the end is too restric- tive. To avoid the limits, some scientific data formats, like HDF [1] re-implement most of the file system data structures in the file. There are some attempts to go beyond both hierarchical naming of files as well as relaxation on the restrictions on how the content of the files can be modified. hFAD [4] allows data to be inserted and deleted at any place in the file. It also removes the dependency on file names when accessing the files and allows adding tags that describe the content of the files. Most of the attempts to change the way data is stored and accessed are built on top of standard file systems or databases. Gostor is a low-level storage system that provides consistent way of manipulating arrays of bytes, providing both versioning support as well as ability to insert, delete and modify data anywhere within the array. It also allows insertion and removal of holes in the array. Gostor avoids the issues with hierarchical file names by not supporting them. All files in Gostor are immutable and can be accessed by a 64-bit ID that is returned when they are created. Files are created by cloning already existing files and modifying some of file’s data.

∗LANL publication: LA-UR-11-11422

11 2. Gostor Architecture 2.1. Files A file in Gostor is an immutable string of bytes. Regions of file where data haven’t been written are holes in the file. They are not stored and don’t use disk space. Reading from a hole region returns zeroes. Afileisidentifiedwitha64-bitintegercalledfileID.ThefileIDmaychangeduringthelife span of the file. If the fileID is changed, Gostor guarantees that all references to the old fileID within the storage will be modified, and that the old fileID can be used until they are specifically discarded, or the connection to Gostor is closed. There is no guarantee that a fileID retrieved during previous connection will still be valid when a new connection is established. File with fileID 0 always points to a zero-length file, and cloning it is how new files are created. 2.2. Data Content Types When reorganizing the disk space, Gostor needs to know if any of the files contain references to other files. For that reason all data stored is assigned data content type.Whenwriting data to files, the user can specify whether the data contains references to other files. Because data type is specified by write, there is no restriction for the whole file to have the same data content type. Gostor can coalesce content of data written by multiple writes as long as it is sequential and of the same type. When data is read, Gostor returns only data of the same content type. Currently there are only two data types available to the user: Data Type Description BTData Data that doesn’t contain any fileIDs BTDir File content with only fileIDs Gostor defines additional data content types that are used internally to implement the file layout. Gostor allows up to 32 thousand data types defined, but currently doesn’t provide operations in the protocol for creating new data types. Extensions to Gostor (such as file systems) can use an internal API. 2.3. Operations 2.3.1. Read read(file, offset uint64, buf []byte) (count int, dtype uint16, err os.Error)

The read function reads up to length of the buf array bytes from the specified file, starting from the specified offset and stores it in the buf array. It returns the number of bytes returned as well as the data content type of the data. If an error occurs while reading, err contains the error. Read can return less than len(buf) bytes in two cases – if there is no more data in the file (i.e. offset + len(buf) is greater than the file’s size), or if the data in the file has mixed data content types.

2.3.2. Write write(file, soffset, eoffset uint64, count uint32, data []byte, dtype uint16) (newfile uint64, err os.Error)

Because Gostor files are immutable, each write operation creates a new file. It receives an existing file as argument, clones its content, applies the changes of the data content and returns the fileID of the newly created file.

12 The write call is used to do any modifications to a file. It replaces the data currently located between offsets (soffset, eoffset) with count bytes containing the data from the data array. If the length of the data array is less than count, a hole is created at the end of the region. Table 1 shows examples on how the write operation can be used to modify the data.

Operation Description write(.., 10, 10, 100, data,..) Insert 100 bytes of data at offset 10 write(.., 10, 10, 100, nil,..) Insert 100 byte hole at offset 10 write(.., 10, 110, 0, nil,..) Delete 100 bytes of data starting at offset 10 write(.., 10, 110, 100, data,..) Overwrite 100 bytes of data starting at offset 10 Table 1: Examples on data modifications using write

2.3.3. Size size(file uint64) (size uint64, err os.Error)

Returns the size of the specified file.

2.3.4. Forget forget(file uint64)

Informs Gostor that the user is no longer going to use the file with the specified fileID. If there are no more references to the file, it may be garbage-collected. 3. Current Implementation Gostor is implemented in Go. Currently it is approximately 2000 lines of code. 3.1. Segments and Blocks Gostor uses log-structured data layout, similar to the ones used in log-structures file systems [3]. The disk space is divided into segments, and the segments are kept in a doubly-linked list. The segments can be free, full,oractive.Thereisonlyoneactivesegmentatatime.All new data is appended at the end of the active segment. Once the segment is full, it is marked as “full” and the next segment in the list is set as active. The space within the segments is not divided into fixed-size chunks. Each segment consists of a number of variable-sized blocks. Each block can be up to 216 bytes long (including the header). The header of the block contains its size as well as the type of the data it contains (data content type). The blocks always start at an even offset. Figure 1 shows the physical layout of the segments and the blocks. 3.2. Files Gostor uses modification of Btrees to describe files. Blocks at level 0 contain the data of the file. Blocks at level 1 contain entries to the data blocks at level 0, and so forth. Because Gostor allows insertion of data anywhere in a file, offsets to data are not constant and can’t be stored in the intermediate Btree blocks. Instead, each Btree entry contains the size of the data it describes. Normally the Btree blocks are fixed size and waste some space when there are not enough entries. Because of the log-structured layout used by Gostor, the Btree representation we use is compact and doesn’t waste any disk space. The fileID of a file is the offset (relative to the beginning of the disk) of the block describing the root of the file Btree. This approach simplifies the implementation of Gostor and avoids a level of indirection, that is common to inode based systems. 13

Figure 1: Gostor Disk Layout

Figure 2 shows an example of a file with fileID 348. The file’s Btree has tree levels. The first entry in the root block points to block 388 and defines that that block describes the first 1100 bytes of the file. Block 388 has two entries, one is 700 bytes long and the data is stored in block 500. The second entry describes 400-byte long hole (the block is 0). Figure 2 also shows how the file blocks are laid out in a segment. 3.3. Operations The write operation uses the specified file’s Btree as a base for the Btree of the newly created file. It creates new blocks for a sub-tree of the file, up to the new file’s root block. While building a new tree, Gostor tries to coalesce neighboring blocks if their size is less than the allowed size (216 bytes for level 0 blocks and 8192 bytes for intermediate blocks). Gostor fills up the intermediate blocks with entries left-to-right so the rightmost affected block on the level is left unfilled. This approach is optimized for the most-frequently use case when data is appended at the end of the file. Figure 3 shows the layout of the data when operation write(340, 700, 700, 162, data) is performed on the file shown on Figure 2. The operation inserts 150 bytes of data at offset 700 and a 12 byte hole. Gostor coalesces the hole with the already existing one, so no new entry for the hole is created. 3.4. Garbage Collection Each write operation in Gostor creates a new file with a new root block, some intermediate Btree blocks as well as some data blocks. In most cases, once the new file is created, the old file is no longer useful and the blocks that belong only to it should be recycled. Gostor has knowledge of all references to blocks stored in it. It also keeps track of the blocks that the user is using at the moment. Forget operation should be called if the user no longer cares about a block. Having information which blocks are still in use allows Gostor to reclaim the space that is no

14

Figure 2: Btree and Segment Representation of a File

Figure 3: Btree and Segment Representation of a file after write operation

longer accessible. Currently Gostor supports only in-memory garbage collection. When a block is stored in Gostor, it is added to an in-memory list of data to be written to the disk. The data is kept in the memory for some time, giving it a chance to get obsoleted by subsequent changes to the list of live files.

15 When the user is no longer going to use a reference to a block, the forget command should be used to update Gostor’s knowledge of what data is regarded as live by the user. Currently Gostor supports only in-memory garbage collection. Once the data is committed to the disk, it can’t be removed. Writing a garbage collector for the on-disk data is planned as future work. 3.5. Committing Blocks to Disk When a block is stored in Gostor, it is not written to the disk right away. In most cases, the data in the block will be obsoleted soon by subsequent call and premature write to the disk would be wasteful. Gostor keeps the blocks in memory for some time to allow the data to be made obsolete. Gostore doesn’t have knowledge what blocks will be actually stored on disk and therefore can’t assign disk offsets for the blocks before they are actually committed. Instead, Gostor returns temporary offsets that can be used to access the data, or store references to the block in Gostor. Before committing the data on disk, Gostor runs the garbage collector to free all blocks that are no longer live. Then it assigns disk offsets to the remaining blocks, and updates the temporary offsets stored in the blocks to the permanent ones. It can do that because it has knowledge of whether a block contains references to other blocks. Once the references are updated, the blocks are stored on the disk. The temporary offsets can be used until they are “forgotten”. 4. Future Work The current Gostor implementation doesn’t have garbage collector that can reclaim data al- ready written to the disk. There are plans for implementing copying, generational garbage collector that crawls through the existing data and copies the reachable blocks into new seg- ments. Because of the high penalty of reading all existing data, the future implementation might be modified so it segregates blocks that contain references to other blocks in separate segments. Once the Gostor prototype is stable enough, we plan to implement conventional hierarchical file system on top of it, as well as experiment with porting existing formats (HDF5) for scientific data on top of it. References [1] HDF Hierarchical Data Format. http://www.hdfgroup.org. [2] System Application Program Interface (API) [C Language].Informationtechnology— Portable Operating System Interface (POSIX). 1990. [3] Mendel Rosenblum and John K. Ousterhout. The design and implementation of a log- structured file system. SIGOPS Oper. Syst. Rev.,25:1–15,September1991. [4] Margo Seltzer and Nicholas Murphy. Hierarchical file systems are dead. In Proceedings of the 12th conference on Hot topics in operating systems,HotOS’09,pages1–1,Berkeley, CA, USA, 2009. USENIX Association.

16 17 18 ∗ ∗

∗ ∗

∗ ∗

∗ ∗

∗ ∗

19 D (B,V ) D & B = V &

20 21 22 100 100

10 10

(microseconds) 1 (microseconds) 1

0.1 0.1 acl1 acl1_100acl1_10Kacl1_1Kacl1_5Kfw1 fw1_100fw1_10Kfw1_1Kfw1_5Kipc1 ipc1_100ipc1_10Kipc1_1Kipc1_5K acl1 acl1_100acl1_10Kacl1_1Kacl1_5Kfw1 fw1_100fw1_10Kfw1_1Kfw1_5Kipc1 ipc1_100ipc1_10Kipc1_1Kipc1_5K

Trace Trace

23 24 Acid your ARM

Gorka Guardiola Múzquiz Laboratorio de Sistemas Universidad Rey Juan Carlos [email protected] 9/1/2011

ABSTRACT

9A D=LA @ALA/%FA@ jtagfs8 = FH%J%?%/ IJ=?1 ="@ BE/AIOIJA' MDE?D A"=>/AI /ELA @A>KCCE"C %B =" )4Y '=?DE"A KIE"C =?E@: 1J =??AIIAI JDA D=H@M=HA JDH%KCD = i6)/ E"JAHB=?A8 FH%LE@E"C "AM M=OI %B @A>KCCE"C MDE?D @EII%/LA JDA >%K"@=HEAI >AJMAA" JDA 1AH"A/8 KIAH IF=?A ="@ JDA /%=@AH ="@ CELAI @EHA?J =??AII J% JDA D=H@M=HA: )J JDA I='A JE'A =?E@ FH%LE@AI DECD /ALA/ =>IJH=?JE%"I J% E"JAHFHAJ JDA HAIK/JI ="@ =KJ%'=JA JDA @A>KCCE"CFH%?AII:

Introduction i6)/ EI = IJ="@=H@ B%H >%K"@=HO I?=""E"C8 = 'AJD%@ B%H JAIJE"C @ECEJ=/ ?EH?KEJI >O 'A="I %B = IDEBJ HACEIJAH >%K"@=HO I?=" IDEBJ HACEIJAH %H *54: 6DA *54 EI KIA@ J% @HELA JDA E"FKJI ="@ %KJFKJI %B @EBBAHA"J F=HJI %B JDA ?EH?KEJ: M" A=?D IK>?EH?KEJ JDA *54 EI ?%"< JH%//A@ >O = 6)2 6AIJ )??AII 2%HJ8 KIA@ J% JH="ILAHIA JDA IJ=JAI %B JDA *54 %" A=?D JE?1 %B JDA ?/%?18 /%=@ EJ ="@ IAJ EJI ?%""A?JE%"I J% JDA FE"I8 E"FKJ ="@ %KJFKJ L=/KAI %B JDA ?EH?KEJ: M" ?%'F/AN @ECEJ=/ ?EH?KEJI8 /E1A = 'E?H%FH%?AII%H8 JDA *54 ?=" >A KIA@ J% ?%"< JH%/ IAF=H=JA/O ="@ JAIJ @EBBAHA"J IK>?EH?KEJI >O BAA@E"C EJ @EBBAHA"J ?D=E"I = IAGKA"?A %B >EJI: 9DE/A @A>KCCE"C I%'A @HELAHI E" JDA 5DAAL=F/KC8 EJ ?='A J% %KH =JJA"JE%" JD=J JDA )4Y ?%HAI D=LA = MA// @%?K'A"JA@i6)/E"JAHB=?A ^ `: .KHJDAH'%HA8JDA ?D=E"IJ%?%"JH%/ =// %B JDA '%@A/I =HA LAHO IE'E/=H8 MEJD %"/O I'=// @EBBAHA"?AI >AJMAA" JDA': 6DA 'E?H%FH%< ?AII%H E"?/K@AI = 6)2 ?%"JH%//AH ="@ I%'A ANJH= @A>KCCE"C D=H@M=HA =I F=HJ %B JDA '=?H%?A// ?=//A@ -'>A@@A@ 1+- ^$` %H -'>A@@A@ 1+-D46 ^%` @AFA"@E"C %" JDA F=HJE?K/=H '%@A/: 6DA i6)/ E"JAHB=?A FH%LE@AI =??AII BH%' =" ANJAH"=/ ANJAH"=/ '=?DE"A J% @EBBAH< A"J F=HJI %B JDA 'E?H%FH%?AII%H: 6DH%KCD i6)/ JDA @A>KCCAH ?=" '=1A JDA FH%?AII%H A"JAH @A>KC '%@A8 MHEJA @EHA?J/O J% JDA FH%?AII%H HACEIJAHI8 E"KA?J E"IJHK?JE%"I MEJD BK// =??AII J% JDA D=H@M=HA ="@ HAIJ=HJ JDA FH%?AII%H "% '=JJAH EJI IJ=JA: .KHJDAH'%HA8 I%'A '=?DE"AI /E1A JDA 5DAAL=F/KC ?%"J=E" = ?DEF MDE?D E" =@@EJE%" J% FH%LE@E"C =??AII J% JDA IAHE=/ F%HJ %" JDA '=?DE"A D=I = IK>?EH?KEJ =>/A J% E"JAH=?J MEJD JDA 6)2 ?%"< JH%//AHI %" JDA >%=H@ ="@ JDA 'E?H%FH%?AII%H8 '=1E"C JDA' =??AIIE>/A JDH%KCD 75*: 6DEI ?DEF8 ?=//A@ )W ! +D ^"` 8 EI = ?%''="@ FH%?AII%H MDE?D ?=" @HELA ="O 1E"@ %B IAHE=/ E"JAHB=?A =?J =I =" Y255- %H YK/JED2H%J%?%/ 5O"?DH%"%KI 5AHE=/ -"CE"A: 1J ?=" =/I% M%H1 =I="Y+7 D%IJ >KIA'K/=J%H:9A ME// >A KIE"CEJ =I =" Y255-8 I% MA ME// KKIJ ?=// EJ Y255-BH%'"%M %":

25 )// JDEI ?=F=>E/EJEAI 'A=" JD=J MEJD JDA =FFH%FHE=JA I%BJM=HA EJ EI F%IIE>/A J% @A>KC JDA 1AH"A/ D=LE"C B=?E/EJEAI =1E" J% JD=J =L=E/=>/A %" IFA?E=/ @ALA/%F'A"J >%=H@I MDE/A =J JDA I='A JE'A HK""E"C HACK/=H FH%@K?JE%" 1AH"A/I: 1J EI ALA" F%IIE>/A J% @A>KC IE'K/J="A< %KI/O JDA 1AH"A/8 KIAH IF=?A ="@ JDA /%=@AH8 L="EIDE"C JDA BH%"JEAHI ="@ FH%LE@E"C BK// =??AII J% JDA D=H@M=HA: 6DA FH%>/A' EI JD=J JDA =FFH%FHE=JA I%BJM=HA @E@ "%J ANEIJ: 6DA I%BJM=HA MA D=LA D=@ =??AII J% D=I I%'A /E'EJA@ @A>KCCE"C ?=F=>E/EJEAI JDH%KCD C@> %H @EHA?J =??AII J% JDA D=H@M=HA: 2%HJE"C ANEIJE"C I%BJM=HA J% 2/=" '8 MDE/A >AE"C '%HA ?%'F/E?=JA@ JD=" MHEJE"C EJ BH%' I?H=J?D M%K/@ D=LA >AA" "%J A"%KCD >A?=KIA %B JDA @AFA"@A"?EAI MEJD C@> ="@ EJI /=?1 %B CA"AH=/EJO E" JDA E"JAHB=?AI EJ %BBAHA@: JALAH=CE"C %" ^ "` ="@ MEJD =" =FFH%=?D IE'E/=H J% rdbfs" ^ ` >KJ MEJD = JMEIJ8 MA D=LA @ALA/< %FA@ = CA"AH=/ FKHF%IA = ?%'F/AJA FH%CH=''=>/A @A>KCCE"C E"JAHB=?A B%H JDA )4Y '=?DE"AI8FH%LE@E"CBK// =??AIIJ%JDA D=H@M=HA:

JTAG basics -=?D i6)/ ?=F=>/A @ALE?A D=I = "K'>AH %B 6)2I ?%""A?JA@ E" IAHEAI %H E" F=H=//A/: -=?D 6)2 "%H'=//O D=I B%KH E"FKJI8 6+Jm8 6Y58 6,1 ="@ 6,M8 ?%""A?JA@ =I EI ID%M" E" .ECKHA :

DR

CORE LOGIC

IR

TAP

TDITMS TCLK TDO Figure 1: Jtag enabled device M" A=?D 6+Jm @%M" A@CA JDA IOIJA' '=O IDEBJ JDA L=/KA E" 6,1 ="@ IDEBJ %KJ JDA L=/KA J% 6,M @AFA"@E"C %" JDA IJ=JA %B JDA IJ=JA '=?DE"A %B JDA 6)28 @AFE?JA@ %" .ECKHA 8 MEJD JDA JH="IEJE%"I ?%"JH%//A@ >O JDA L=/KA E" JDA 6Y5 E"FKJ: 6DAHA =HA JM% IDEBJ HACEI< JAHI "%H'=//O ?%""A?JA@ E" F=H=//A/8 JDA @=J= HACEIJAH ,4 ="@ JDA E"IJHK?JE%" HACEIJAH 14: 6DA ,4 EI JDA *548 ="@ JDA 14 ?%"JH%/I MD=J D=FFA"I: 9DE?D %B JDA' EI ?%""A?JA@ J% 6,1 ="@ 6,M @AFA"@I %" JDA IJ=JA %B JDA 6)2 ?%"JH%//AH MDE?D =/I% IAJI MDA" JDA E"IJHK?JE%"I%HJDA @=J= IJ=HJ >AE"C=?JELA ="@?%""A?JA@J%JDA ?DEFI%HJDA %KJFKJ FE"I: 6)2 ?%"JH%//AHI ?=" >A ?D=E"A@ E" IAHEAI8 MEJD JDA @=J= HACEIJAHI ="@ JDA E"IJHK?JE%" HAC< EIJAHI ?%"?=JA"=JA@: 6DAHA EI =" E"IJHK?JE%" J% @EI=>/A = ?%"JH%//AH MDE?D ?=" ABBA?JELA/O JKH"%BB %"A ?%"JH%//AHI%JD=J @=J= ?=">A IDEBJA@E"IAF=H=JA/O:

26 6AIJDJ%CE?D4AIAJ

 4K"D6AIJl1@/A 5A/A?JD,4 5?=" 5A/A?JD14 5?="    +=FJKHAD,4 +=FJKHAD14   5DEBJD,4 5DEBJD14   -NEJ D,4 -NEJ D14   2=KIAD,4 2=KIAD14   -NEJ D,4 -NEJ D14   7F@=JAD,4 7F@=JAD14

 

Figure 2: JTAG TAP state machine, input is TMS 5%'AJE'AI ?%"JH%//AHI =HA =/I% ?D=E"A@ E" F=H=//A/ MDAHA JDAHA =HA @EBBAHA"J ?D=E"I ="@ =" E"IJHK?JE%" EI KIA@ B%H ?D=E" IA/A?JE%": .%H AN='F/A JDEI =FFH%=?D EI J=1A" >O JDA )4Y J% IA/A?J >AJMAA" JDA @EBBAHA"J ?EH?KEJ '%@K/AI: -=?D ?D=E" FH%LE@AI = /A"CJD B%H JDA E"IJHK?JE%"HACEIJAH="@JDA @=J= HACEIJAH: 6DA E"IJHK?JE%"I IKFF%HJA@ >O JDA 14 '=O L=HO ='%"C '%@A/I MEJD I%'A %B JDA' >AE"C '="@=J%HO: .%H '%HA @AJ=E/I %" JDEI8 IAA JDA i6)/ ^ `8 JD%KCD JDA @AJ=E/I %B MD=J EI E'F/A'A"JA@ ="@ MD=J E"IJHK?JE%"I =HA IKFF%HJA@ =HA =?JK=//O @AJ=E/A@ E" JDA )4Y '="< K=/I: 6DA E"IJHK?JE%"I IKFF%HJA@ >O =// )4Y '=?DE"AI =HA JDAHA =HA I%'A 'E"%H @EBBAHA"?AI E"IA'="JE?IF ࢫ5+)WpWEIKIA@J%E"FKJ = ?D=E""K'>AH: ࢫ1W6-56EIKIA@J%IAJ JDA ?D=E""K'>AHE"FKJ MEJD5+)WpW: ࢫ1,+M,-EIKIA@J%@AJA?J JDA ?DEF="@FKJI= IFA?E=/ 1, L=/KA E"JDA ,4: ࢫ*;2)55@EI=>/AIJDA 6)28FKJJE"C= >EJ IDEBJ HACEIJAH>AJMAA"E"FKJ ="@%KJFKJ: ࢫ4-56)46HAIJ=HJIJDA FH%?AII%H=BJAHEJ A"JAHA@@A>KCIJ=JA:

Architecture of jtagfs .ECKHA !@AFE?JIJDA =H?DEJA?JKHA B%HJDA jtagfs: 6DA BEHIJ F=HJ MDE?D "AA@A@ J% >A E'F/A'A"JA@ M=I JDA =??AII J% JDA Y255- E" JDA .6,1 ?DEF: 6DAHA M=I =/HA=@O F=HJE=/ IKFF%HJ B%H JDA .6,1 ?DEF E" usb/serial" B%H '%HA @AJ=E/I IAA ^ ` ="@ ^ `: 9A ?%'F/AJA@ JDA IKFF%HJ B%H JDA .6,1 ?%"BECKH=JE%" FH%J%?%/8 >KJ 1AFJ JDA Y255- IKFF%HJ EJIA/B %KJIE@A %B EJ: 6DA usb/serial EI =/HA=@O ?%'F/E< ?=JA@ A"%KCD: 9A IAJ JDA KI> IAHE=/ ?DEF MEJD JDA 'E"E'K' F%IIE>/A ?%"BECKH=JE%" IAJ JDA E"JAHB=?A J% >A Y255- ="@ JDA /=JA"?O JE'AH ="@ '=@A EJ IAHLA = BE/A ?=//A@ KJ=C MDE?D IAHLAI =I ?%"@KEJ J% ?%''K"E?=JA JDH%KCD EJ: 6DA jtagfs KIAI JDEI BE/A J% IA"@ ?%''="@IJ%JDA Y255-:

27 USB BUS

USB STACK FTDI CHIP usb/serial MPSSE

serial jtag jtag file uart

JTAG mpsse assembler mpsse jmedium ICE jtag state machine driver

ice chains

CORE arm context

jtagfs

ARM SOC /proc interface

ARM MACHINE (DEBUGGEE) PLAN 9 TERMINAL (DEBUGGER)

Figure 3: Jtagfs architecture 6DA "ANJ /ALA/ %B =>IJH=?JE%" EI JDA JMedium8 = @=J= JOFA ="@ = IAJ %B %FAH=JE%"I MDE?D =>IJH=?JI JDA @AJ=E/I %B JDA @HELAH B%H JDA i6)/: .%H "%M8 MA KIA =" Y255- E'F/A'A"J=< JE%" B%H JDA JMedium8 >KJ %JDAHI '=O >A E'F/A'A"JA@ E" JDA BKJKHA: 7IE"C EJ8 MA KKIJ @HELA JDA 6,18 6,M8 6Y5 MEJD HAIFA?J J% JDA 6+Jm: 6DA E"JAHB=?A KIAI >KBBAHE"C ="@ J=1AI E" =??%K"J JDAHA '=O >A '%HA JD=" %"A 6)2 ?%""A?JA@ E" IAHEAI8 JD%KCD =// >KJ %"A JDA ?KHHA"J 6)2 >AE"C@HELA@=HA @EI=>/A@: 9A =/I% MH%JA = IJ=JA '=?DE"A @HELAH8 MDE?D CELA" =" %HECE" IJ=JA ="@ = @AIJE"=JE%" IJ=JA ?=/?K/=JAI JDA 'E"E'K' @EIJ="?A F=JD >AJMAA" JDA': /ELA" JDA "K'>AH %B IJ=JAI8 = IJ=JE? J=>/A ?%K/@ >A FHA?=/?K/=JA@ J% @% JDEI MDA" ?%'FE/E"C8 >KJ EJ M=I "%J @%"A B%H IE'F/E?EJO8 CELA" JD=J '%IJ %B JDA JE'A EI IFA"J M=EJE"C B%H JDA 75* ?%''K"E?=JE%"I ="O< M=O: 6DA "ANJ /ALA/ EI JDA 1+- ?D=E"I /=OAH8 MDE?D J=1AI ?=HA %B JDA IJH="CA >EJ A"@E=""AII %B JDA i6)/ ?D=E"I %" JDA )4Y I%'A %B JDA ?D=E"I =HA >EJ %H@AH E"LAHJA@ ="@ >OJA IDKB< B/A@8 ="@ ?%"LAHJI >AJMAA" JD=J A"@E=""AII ="@ JDA /%?=/ @A>KCCAH '=?DE"A >OJA %H@AH: *KE/J %" J%F %B JDA 1+- ?D=E"I8 JDAHA EI = /ALA/ MDE?D E"JAH=?JI MEJD JDA )4Y FH%?AII%H8 '=1E"C EJ A"JAH ="@ ANEJ @A>KC '%@A8 I=LE"C ="@ HAIJ%HE"C JDA HACEIJAHI ="@ E"KA?JE"C E"IJHK?JE%"I: .E"=//O8 = proc! E"JAHB=?A ANF%HJI JDA FH%?AII%H HACEIJAHI E" = '=""AH IE'E/=H J% rdbfs": ) I'=// /E>H=HO B%H =?E@ ="@ = /EJJ/A '%@EBE?=JE%" J% attachproc E" JDA mach  /E>H=HO J% '=1A JDA 1AH"A/ HACEIJAHI BE/A8 kregs8 MHEJ=>/A '=1AI EJ F%IIE>/A J% IMEJ?D'%@AI="@'="EFK/=JA JDA FH%?AII%H=J ME// BH%'=?E@:

28 Driving the MPSSE 6DA Y255- EJIA/B EI GKEJA = ?%'F/AN @ALE?A MDE?D ?=" @HELA ="O 1E"@ %B IAHE=/ E"JAHB=?A: 1J EI FH%CH=''A@ JDH%KCD = I'=// '=?DE"A /="CK=CA MDE?D ?=" %KJFKJ >EJI E" @EBBAHA"J >EJ A"@E=""AII8 @HELE"C 6Y58 6,1 ="@ 6,M %" @%M" %H KF 6+Jm A@CAI: 9A IJ=HJA@ %KJ< FKJJE"C JDA '=?DE"A ?%''="@I @EHA?J/O8 >KJ8 IFA?E=//O MDE/A @A>KCCE"C EJ M=I GKEJA ?%'F/AN J% 1AAF JH=?1 %B =// JDA @AJ=E/I %B JDA Y255-: 9A A"@A@ MHEJE"C = I'=// =IIA'< >/AH B%H JDA Y255- E"IJHK?JE%"I8 MDE?D MA ?=//A@ ma ="@ =IIA'>/E"C JDA' %" JDA B/O: Ma EI = C%%@ "='A >A?=KIA MA ME// "ALAH HA=//O D=LA .m %>KA?J BE/AI B%H MDE?D JDA /AJJAH ' EI =/HA=@O J=1A"8 I% JDAHA ME// "%J >A ="%JDAH =IIA'>/AH MEJD JDEI "='A8 =J /A=IJ E" 1A"??: )"AN='F/A %B JDA E"IJHK?JE%"I?=">A IAA""ANJF DataIn EdgeDown LSB 3 DataIn EdgeDown LSB B3 DataOutIn EdgeDown EdgeUp LSB 3 0x42 0x34 0x56 DataOutIn EdgeDown EdgeDown LSB 3 @ DataOutIn EdgeDown EdgeUp LSB B3 0x42 DataOutIn EdgeDown EdgeDown LSB B3 @ TmsCsOut EdgeDown MSB B0x7 0x7 TmsCsOut EdgeDown LSB B7 0x7 TmsCsOutIn EdgeDown EdgeUp LSB B0x7 0x7 MCURd 0x34 WaitIOHigh AdaptClkDisab Div5ClkEnab Loop SetBitsL 0x32 0x34 MSB ="@ LSB 'A=" '%IJ ="@ /A=IJ IEC"EBE?="J >EJ BEHIJ8 *WW 'A="I = "K'>AH %B >EJI MDAHA=I JDA ?%K"J >O EJIA/B 'A="I = "K'>AH %B >OJAI ="@ ( EI KIA@ =I = F=H='AJAH MDA"=IIA'>/E"C%"JDA B/O=I= F/=?AD%/@AHB%HJDA @=J= F=IIA@=I="%JDAHF=H='AJAH: )IIA'>/E"C%"JDA B/OD=IFH%LA@J%>A = LAHOC%%@=FFH%=?DB%H@A>KCCE"C ="@ JAIJE"C8 FH%LE@E"C = /%M /ALA/ I"EBBE"C E"JAHB=?A: 1" JDA BEHIJ FH%J%JOFA8 MA D=H@?%@A@ JDA L=/KAI KIE"C ?%"IJ="JI ="@ I%'A BK"?JE%"I: -=?D JE'A MA B%K"@ = >KC E" %KH E"JAHFHAJ=JE%" %B JDA Y255- E"IJHK?JE%"I8 MA D=@ J% BEID >KCI %" ALAHO F/=?A MDAHA JDAO D=FFA"A@: )/I%8 JDA =IIA'>/AHEJIA/B '=O>A KIABK/ B%H%JDAH=FF/E?=JE%"IKIE"CJDEI?DEF B%H @HELE"C %JDAH B%HAN='F/A 521E"JAHB=?AI:

ICE chain support 6DAHA =HA IALAH=/ ?D=E"I %" A=?D )4Y '=?DE"A8 MDE?D FH%LE@A =??AII J% @EBBAHA"J ?=F=< >E/EJEAI %B JDA ?DEF:6DAHA =HA 'E"%H@EBBAHA"?AI='%"CJDA'8="@I%'A %B JDA ?D=E"I=HA FHAIA"J %"I%'A ?DEFI="@"%J %"%JDAHI:9A D=LA E"JAH=?JA@'=E"/OMEJDJDHAA ?D=E"I: +D=E" 8 EI KIA@ J% E"KA?J E"IJHK?JE%"I J% JDA )4Y ?%HA: 5FA?E=/ ?=HA "AA@I J% >A J=1A" MEJD JDA ?/%?1: *=IE?=//O8 MDA" JDA FH%?AII%H EI E" @A>KC '%@A MDE?D EI MDA" =" E"IJHK?JE%" ?=" >A BA@ J% JDA ?%HA EJ HK"I %" = I/%MAH ?/%?1: )I = ?%"IAGKA"?A8 MDA"< ALAH =" E"IJHK?JE%" J% E"JAH=?J MEJD ANJAH"=/ D=H@M=HA8 /E1A 4)Y %H = FAHEFDAH=/8 "AA@I J% >A ANA?KJA@8 JDA FH%?AII%H 'KIJ HK" EJ KIE"C JDA B=IJAH ?/%?1: 6DA" EJ B=//I >=?1 J% JDA I/%M ?/%?1 @HELE"CJDA @A>KC'%@A: +D=E" 8 EI KIA@ J% =??AII JDA @A>KC HACEIJAHI8 '%IJ %B MDE?D ?=" >A =??AIIA@ "%H'=//O BH%' E"IE@A JDA ?%HA: 6DEI HACEIJAHI A"=>/A D=H@M=HA LA?J%H ?=J?DE"C A"JAH @A>KC %" =" AN?AFJE%"8 E"?/K@E"C HAIAJ8 >HA=1F%E"JI A"JAHE"C @A>KC '%@A >=IA@ %" =" =@@HAII >AE"C ANA?KJA@ ="@ M=J?DF%E"JI A"JAHE"C @A>KC '%@A >=IA@ %" =" =@@HAII >AE"C HA=@ %HMHEJJA"="@E"IJ="J/OA"JAHE"C="@ANEJE"C@A>KC'%@A:

29 9DE/A ?D=E" ="@ ?D=E" =HA MA// @%?K'A"JA@ ="@ IAA' J% >A JDA I='A %" =// JDA /=J< AIJ )4Y ?%HAI8 +D=E" #8 MDE?D FH%LE@AI =??AII J% JDA YY78 IAA'I L=HO '%HA BH%' '%@A/ J% '%@A/: .H%' MD=J MA D=LA IAA"8 JDAHA =HA JM% B='E/EAI %B )4Y MEJD HAIFA?J %B +D=E" #8 JDA )4Y % B='E/O ="@ JDA )4Y ' B='E/O: 1" ="O ?=IA8 MA ?%K/@ "%J '=@A +D=E" # M%H1 %" JDA BAH%?A%"8 I% E"IJA=@ MA D=LA FKIDA@ MCR ="@ MRC E"IJHK?JE%"I: 6DEI =FFH%=?D EI '%HA F%HJ=>/A ="@ MEJD%KJ ="O @H=M>=?1I: 7IE"C JDA' MA =@@A@ JDA YY7 IJ=JA J% JDA %>IAHL=>/A IJ=JA %B JDA FH%?AII%H: 6DEI IJ=JA EI HA=@ %"/O =J JDA '%'A"J8JD%KCDJDEI?="?D="CA E"JDA BKJKHA:

ARM interaction 6DA )4Y FH%?AII%H E"JAH=?JE%" ?%@A D=I JM% @EBBAHA"J /ALA/I: .%H AN='F/A8 JDAHA EI = BK"?JE%"8 ARMgofetch KIA@ J% E"KA?J =" E"IJHK?JE%" E"J% JDA ?%HA: 6DEI E"IJHK?JE%" EI FKIDA@ E"J% JDA FEFA/E"A ="@ C%AI JDH%KCD JDA BELA IJ=JAI BAJ?D8 @A?%@A8 ANA?KJA8 =??AII =" MHEJA>=?1: )J JDEI /ALA/8 %"A D=I J% >A ?=HABK/ MD=J IJ=JA JDA FEFA/E"A B%H JDA E"IJHK?JE%" EI B%H: 6% =>IJH=?J JDA FEFA/E"A MA MH%JA I%'A %JDAH BK"?JE%"I B%H AN='F/A ARMgetexec ="@ ARMsetexec  MDE?D IDEBJ E" JDA E"IJHK?JE%"8 E"KA?J WM2I ="@ HA=@ ="@MHEJA JDA @=J= MDA" JDA FEFA/E"A EI E" JDA HECDJ IJ=JA: 6DAO =/I% '=1A IKHA JD=J =BJAH JDA FEFA/E"A EIBK// K"JE/ JDA E"IJHK?JE%"BE"EIDAI: 9A B%K"@ JD=J JDA /EJ'KI JAIJ J% BE"@ MDAJDAH JDA MD%/A IOIJA' M%H1I EI EB JDA FH%?AII%H EI =>/A J% HK" =C=E" =BJAH C%E"C E"J% @A>KC '%@A: )// JDA ?%"JANJ B%H JDA )H' "AA@I J% >A FAHBA?J: 1" JDEI HAIFA?J8 MA B%K"@ JM% @EBBE?K/JEAI MDE/A E'F/A'A"JE"C jtagfs: 6DA BEHIJ %"A EI JD=J ALA" EB JDA 2+ @%AI "%J "AA@ J% ?D="CA8 JDA FH%?AII%H ME// "%J IJ=HJ EB JDA HACEIJAH EI "%J MHEJJA" J%: 6DA IA?%"@ @EBBE?K/JO8 EI JD=J E"JAHHKFJI "AA@ J% >A @EI< =>/A@ MDE/A E" @A>KC '%@A: 1B JDAO =HA "%J @EI=>/A@8 >=@ JDE"CI ME// D=FFA": )" E"JAH< AIJE"C ?%"IAGKA"?A %B JDEI EI JD=J EB MDE/A E" @A>KC '%@A I%'AJDE"C E'FH%FAH EI @%"A8 /E1A =??AII = "%" '=FFA@ =@@HAII8 MDA" MA IJ=HJ JDA FH%?AII%H =C=E"8 =" E"JAHHKFJ ME// BEHA JD=J ME// '%IJ FH%>=>/O?H=IDJDA IOIJA':

Endianness -"@E=""AII E" JDA i6)/ EI JHE?1O: 6DAHA =HA JM% E"JAHB=?AI8 JDA proc! %" %"A IE@A ="@ JDA i6)/ %" JDA %JDAH IE@A ="@ >%JD "AA@ J% >A D%"%HA@: 6DA proc! E"JAHB=?A ID%K/@ >A E" )4Y A"@E=""AII /EJJ/A A"@E=" %" 2/=" '8 MDAHA=I JDA i6)/ D=I IFA?E=/ >EJ %H@AH< E"C8 MDE?D EI @EBBAHA"J B%H ALAHO ?D=E"8 >KJ =J JDA I='A JE'A JDA /EJJ/A A"@E=""AII %B JDA )4Y "AA@I J% >A HAIFA?JA@: 6DA =FFH%=?D MA D=LA J=1A" EI JD=J JDA HACEIJAHI8 MDE?D "AA@ J% >A '%@EBEA@ >O KJ=CBI =HA JH="I/=JA@ J% D%IJ %H@AH =J JDA E"JAHB=?A  proc! ="@ ?D=E" E"JAHB=?A: M" JDA %JDAH D="@8 %JDAH @=J= F=IIAI JDH%KCD MEJD%KJ C%E"C E"J% D%IJ %H@AH:

Filesystem 6DA IJ="@=H@ FH%? BE/AIOIJA' EI KIA@ J% ANF%HJ FH%?AIIAI: 6DA '%@A/ M=I ANJA"@A@ >O rdbfs" ="@ JDA −k B/=C B%H =?E@ J% FH%LE@A =??AII J% JDA IAC'A"JI ="@ HACEIJAHI %B = HK""E"C 1AH"A/: Jtagfs ANJA"@I JDEI '%@A/ ALA" BKHJDAH8 ANF%HJE"C '%HA HACEIJAHI E" F=HJE?K/=H ANF%HJE"C JDA YY7 HACEIJAHI ="@ '=FFE"C 'A'%HO %KJIE@A %B JDA IAC'A"JI %B JDA >E"=HO: 6DA YY7 HACEIJAHI ?=" >A =??AIIA@ KIE"C JDA regs BE/A8 KKIJ =BJAH JDA Ureg ="@ B/%=J< E"C F%E"J HACEIJAHI EB JDAHA =HA ="O: 6% J=1A =@L="J=CA %B JDA'8 JDA KJ=C =?E@ /E>H=HO KIAI JDA K"@%?K'A"JA@ map >KE/JE" B%H =?E@ J% ANJA"@ JDA HACEIJAH '=F: 6DEI =FFH%=?D '=1AI EJ F%IIE>/A8 MDA" JDA FH%?AII%H EI IJ%FFA@8 J% =??AII JDA 'A'%HO

30 '=FFA@YY7 HACEIJAHIBH%'MEJDE"=?E@: 6DA %JDAH ANJA"IE%" E'F/A'A"JA@ EI JD=J JDA =?E@ /E>H=HO =/I% KIAI map() J% ANJA"@ JDA 'A'%HO '=FFA@ B%H JDA @=J= IAC'A"J J% =// JDA 'A'%HO IJ=HJE"C BH%' mr-4M: 6DEI =FFH%=?D /AJI KI =??AII 'A'%HO %KJIE@A JDA 1AH"A/ IAC'A"JI8 /E1A Mach ="@ JDA F=CA J=>/AI: 6D="1I J% JDAIA ANJA"IE%"I8 MEJD LAHO /EJJ/A ?%@A8 EJ EI F%IIE>/A JH="I/=JA BH%' LEHJK=/ =@@HAIIAIJ%FDOIE?=/ =@@HAIIAI>O/%%1E"CJDA'KFE"JDA ?KHHA"J F=CA J=>/A:

Debugging ,A>KCCE"C JDA jtagfs M=I = ?D=//A"CE"C =?JELEJO: 4K""E"C MEHAID=H1 K"@AH /E"KN J% ?=FJKHA JDA 75* @E=/%C %B MFA"M+, FH%LA@ E"L=/K=>/A E" JDA BEHIJ IJ=CAI8 IFA?E=//O J% K"@AHIJ="@ JDA BE"AH F%E"JI %B JDA JE'E"C %B JDA IJ=JA '=?DE"A ="@ >EJ A"@E=""AI MDE?D EIK"?/A=HE"JDA @%?K'A"J=JE%"8ALA"MEJDJDA =FF/E?=JE%""%JA ?/=HEBOE"CEJ ^#`: )"%JDAH JDE"C MA B%K"@ E"L=/K=>/A M=I JDA LAH>%IEJO B/=C ?%"JH%//A@ >O = @EBBAHA"J ?D=H< =?JAH =J A=?D /ALA/ %B =>IJH=?JE%"8 IE'E/=H J% MD=J JDA ?%'FE/AHI @% E" 2/=" ' MEJD JDA /%MAIJ FHE"JE"C JDA Y255- =IIA'>/O ="@ JDA DECDAIJ FHE"JE"C JDA )4Y ?%"JANJ MDA" A"JAHE"C ="@ ANEJE"C @A>KC '%@A: Jtagfs ?=" FHE"J ="O %B EJI /ALA/I %B E"JAH=?JE%"8 MDE?D'=1AIEJ IE'F/A J% @A>KC "AM @ALE?AI ="@ ?=" >A E"JAHAIJE"C B%H ="O%"A ME//E"C J% 1"%M '%HA =>%KJ i6)/ %" JDA )4Y8 MDE?D D=I I%'A @=H1 ?%H"AHI ="@ H%KCDA@CAIIFA< ?E=//OJDA >EJ %H@AHE"C%HJDA JE'E"C%B JDA IJ=JA '=?DE"A:

Experience 9DE/A EJ EI I/%M MDA" HA=@E"C %H MHEJE"C >EC ='%K"JI %B @=J=8 '%IJ/O >A?=KIA %B JDA H%K"@JHEF %B JDA 75* FH%J%?%/8 EJ EI IJE// GKEJA KI=>/A B%H HACK/=H @A>KCCE"C: 1J ?%K/@ >A '=@A B=IJAH >O >=J?DE"C J%CAJDAH >ECCAH ?DK"1I %B @=J= %H >O ?=?DE"C HA?A"J/O =??AIIA@ @=J=: *%JD D=LA E'F%HJ="J @H=M>=?1I8 ?%"IE@AHE"C JD=J HA=@E"C ="@ MHEJE"C '=O D=LA %H@AHE"C ?%"IJH=E"JI B%H AN='F/A MDA" =??AIIE"C 'A'%HO '=FFA@ @ALE?AI8 MDE?D EI MDOMA @E@"%J E'F/A'A"J JDA': Jtagfs D=I ID%MA@ EJI F%MAH MDA" KIE"C EJ IALAH=/ JE'AI: .%H AN='F/A8 =BJAH FH%< CH=''E"C EJ8 MA B%K"@ JD=J KKIJ =BJAH IJ%FFE"C JDA ?%HA MEJD2/="'%"EJ8EJ M%K/@HA>%%J "% '=JJAH MD=J MA @E@: )BJAH I%'A F%1E"C ="@ FH%>E"C8 MA /A=H"J JD=J EJ M=I JDA M=J?D< @%C @ALE?A HA>%%JE"C JDA '=?DE"A MDA" JDA FH%?AII%H M=I IJ%FFA@: iKIJ >O MHEJE"C I%'A =?E@ ?%@A8 MA MAHA =>/A J% J% @EI=>/A ="@ HAA"=>/A JDA M=J?D@%C =I "AA@A@: )"%JDAH E"JAHAIJE"C ANFAHEA"?A M=I @A>KCCE"C I%'A ?%@A B%H JH=FI JD=J D=@ B=E/A@ J% M%H1 B%H = /%"C JE'A ="@ MA @E@ "%J K"@AHIJ="@ MDO: 1J JKH"A@ %KJ JD=J E" JDA A"@ MA MAHA KIE"C =" E"IJHK?JE%" MDE?D M=I "%J IKFF%HJA@ E" JDA '=?DE"A8 >KJ MD=J D=@ IJ=//A@ KIB%H@=OIM=I@A>KCCA@E"= ?%KF/A %B D%KHIKIE"C jtagfs: 6DA '%IJ E'F%HJ="J BA=JKHA MA D=LA 'EIIA@ MDA" KIE"C JDA @ALE?A =HA '%HA >HA=1F%E"J ="@ M=J?DF%E"J K"EJI8 MDE?D M%K/@ '=1A @A>KCCE"C IE'F/AH8 >KJ JDEI EI = D=H@M=HA FH%>/A' %KJIE@A %B %KH ?%"JH%/: 6DA "K'>AH %B K"EJI EI =/I% @AFA"@A"J %" JDA ?%HA: 5%BJM=HA >HA=1F%E"JI E" JDA 1AH"A/ ?%K/@ >A E'F/A'A"JA@8 >KJ MEJD JDA ?=?DAI ="@ JDA FEFA/E"AIE"JAH=?JE%"IJDAOM%K/@FH%>=>/O>A GKEJA = BA=J J%CAJ HECDJ:

Related work 6DAHA =HA IALAH=/ FH%CH='I J% E"JAHB=?A i6)/ FH%LE@E"C = >=?1A"@ J% C@>8 B%H AN='F/A MFA"M+, ^ ` %H JDA */=?1BE" 7?/E"KN C"K J%%/?D=E" ^!`: 6DAHA =HA =/I% @ALA/%FAH >%=H@I ="@ ?/%IA@ I%BJM=HA /E1A JD=J %B ^'`: )// %B JDA'8 %H =J /A=IJ JDA %"AI MA D=LA IAA" ="@ KIA@8 FH%LE@A =J '%IJ >=J?DD/E1A ?=F=>E/EJEAI MDAHA=I=?E@="@FH%??%'>E"A@FH%LE@A =

31 BK//O FH%CH=''=>/A E"JAHB=?A: .KHJDAH'%HA8 JDA proc! E"JAHB=?A EI @AIEC"A@ J% >A F%HJ=>/A I% EJ ?=" >A A=IE/O KIA@ BH%' ="O %JDAH FH%CH=''E"C /="CK=CA ="@ %FAH=JE"C IOIJA'8 FH%LE@E"C = IE'F/A F%HJ=>/A E"JAHB=?A8 MDAHA=I JDA E"JAHB=?AI FH%LE@A@ >O FH%< CH='I /E1A MFA"M+, MFA"M+, FH%LE@AI = C@> ?%''="@I JA/"AJ IAHLAH =HA @AIEC"A@ J%>A KIA@MEJDC@>="@"%J =ICA"AH=/:

Future work )I EJ EI "%M8 jtagfs %"/O FH%LE@AI .AH%?A%" IKFF%HJ ="@ D=I %"/O >AA" JHEA@ E" JDA 5DAAL=F/KC: 5KFF%HJ D=I >AA" =@@A@ B%H JDA )H'=@=8 >KJ EI K"JHEA@: Y%IJ %B JDA I%BJ< M=HA ID%K/@ M%H1 MEJD%KJ '%@EBE?=JE%" %" ="O )4Y % %H ' =I EJ D=I >AA" MHEJJA" J% >A LAHO F%HJ=>/A: 6% IKFF%HJ %JDAH >%=H@I JDA E@ ?%@A B%H JDA FH%?AII%H "AA@I J% >A =@@A@ ="@JDA ?%"BECKH=JE%""A?AII=HOJ%@A=/ MEJDJDA MEHE"C%B JDA >%=H@: )BJAH JDA 5DAAL=F/KC D=I >AA" HK""E"C B%H = ID%HJ FAHE%@ %B JE'A8 JDA i6)/ E"JAHB=?A IJ%FI HAIF%"@E"C K"/AII EJ D=I =/HA=@O >AA" =??AIIA@8 JD%KCD JDEI /%%1I /E1A EJ EI = ?D=H< =?JAHEIJE? %B JDA D=H@M=HA ="@ JDA I='A D=FFA"I J% MFA"M+, %" JE"KN: 1" ="O ?=IA8 MDA" JDA i6)/ @%AI "%J HAIF%"@8 EJ EI @AJA?JA@ E" JDA E@A"JEBE?=JE%" FD=IA ="@ EJ ?=" IJE// >A HAIAJ JDH%KCD JDA i6)/ E"JAHB=?A: )I /%"C =I JDAHA EI I%'A E"JAH=?JE%" MEJD JDA i6)/ EJ ?=">A %"/OJ%E@A"JEBOEJA=H/OE"JDA >%%J FH%?AII8JDA i6)/M%H1IB/=M/AII/O: 6DAHA =HA %JDAH ?=F=>E/EJEAI %B JDA )4Y ?DEFI MDE?D ?=" >A =??AIIA@ BH%' JDA i6)/ ="@ MDE?D ?%K/@ >A E"JAHAIJE"C: M"A %B JDA' EI JDA -'>A@@A@ 6H=?A Y=?H%?A// %H -6Y ^&` =" E"IJHK?JE%" ="@ @=J= JH=?E"C E"JAHB=?A J% JDA FH%?AII%H: )"%JDAH E"JAHAIJE"C ?=F=>E/EJO EI JDA ,++ %H ,A>KC +%''K"E?=JE%"I +D=""A/: 1J FH%LE@AI JDHAA HACEIJAHI J% =??AII = >E@EHA?JE%"=/ IAHE=/ ?%''K"E?=JE%"I ?D=""A/ F%//A@ %H E"JAHHKFJ @HELA" B%H FHE"JE"C ="@ @A>KCCE"C KIE"C JDA i6)/: .H%' E"IE@A JDA FH%?AII%H8 JDA J=HCAJ IAAI JDA ,++ =I JDA ?%FH%?AII%H " KIE"C MCR ="@ MRC: .H%' JDA i6)/ JDAIA HACEIJAHI ?=" >A =??AIIA@ >O 'A="I%B I?="?D=E" : )"%JDAHE"JAHAIJE"C?=F=>E/EJOJD=J ?%K/@>A E'F/A'A"JA@EI J% BHAA3A JDA FH%?AII%H BH%' MEJDE" JDA 1AH"A/8 >O IAJJE"C JDA @A>KC HACEIJAHI: 6DA"8 JDA D=H@M=HA ?%K/@ >A =??AIIA@ BH%' JDA KJ=C F%HJ KIE"C jtagfs: 9A D=LA "%J @%"A JDEI8 >KJ EJ ID%K/@ >A JHELE=/ J% @%8 =I EJ EI KKIJ IAJJE"C = HACEIJAH: M"A C%%@ F/=?A J% @% JDEI8 B%H AN='F/A8 M%K/@ >A E" JDA F="E?H%KJE"A8I%JD=J MDA"= 1AH"A/ F="E?I8EJ ?=">A E"IFA?JA@: 6DA i6)/ E"JAHB=?A ?%K/@ >A =/I% KIA@ J% E"KA?J = /%=@AH %H = 1AH"A/ =I = /=IJ HAI%HJ B%H = >HE?1A@@ALE?A %HJ%HA=@%HMHEJA JDA ?%"JA"JI%B JDA B/=ID: J=IJ >KJ "%J /A=IJ8 KIE"C lFH%? ="@ =?E@ ="O I%BJM=HA HK""E"C %" JDA )4Y ?=" >A @A>KCCA@: 1J M%K/@ >A LAHO E"JAHAIJE"C ="@ "%J LAHO @EBBE?K/J J% =@@ '%HA IKFF%HJ B%H -J. ^ !` IO'>%/ J=>/AI ="@ >E"=HEAI FAHD=FI KIE"C JD%IA %B F/="'F%HJI %H C% J% Y=?D: 6DEI?%K/@A"=>/A @A>KCCE"CJDA JE"KN1AH"A/ %H7D>%%J KIE"C=?E@:

References : .:i:*=//AIJAH%I8 Plan 9’s Universal Serial Bus8192'8 ': : 4: ,:8 MFA" M"D+DEF ,A>KCCAH8 Diploma, Department of Computer Science, Univer- sity of Applied Sciences Augsburg8: !: *:7:DJJFFll>/=?1BE":K?/E"KN:%HClCBl8*/=?1BE"/W7 6%%/?D=E": ": .: 6: ,: 1: J: DJJFFllBJ@E?DEF:?%'8 )W ! +ߝ +%''="@ 2H%?AII%H B%H Y255- ="@ Y+7 0%IJ *KI-'K/=JE%"Y%@AI: #: DJJFFllE"B%?A"JAH:=H':?%'8 )FF/E?=JE%" "%JA # 9HEJE"C i6)/ 5AGKA"?AI B%H )H' ' 2H%?AII%HI:

32 $: DJJFFllE"B%?A"JAH:=H':?%'8)4Y'-ߝ56A?D"E?=/ 4ABAHA"?A Y="K=/: %: DJJFFllE"B%?A"JAH:=H':?%'8)4Y%6,Y1ߝ5+%HA 6A?D"E?=/ 4ABAHA"?A Y="K=/: &: DJJFFllE"B%?A"JAH:=H':?%'8-'>A@@A@6H=?A Y=?H%?A// )H?DEJA?JKHA 5FA?EBE?=JE%": ': ::J:DJJFFllMMM:NKJ=C:?%'8:i6)/?%'F="O: : 1---8 1--- "': IJ="@=H@ IFA?EBE?=JE%"8 Standard Test Access Port and Boundary Scan Architecture8: : *:J=>I82/="''="F=CAI8 Plan 9 User’s manual, Vol 18 ''#: : /: /: Ys3GKE38 .: i: *=//AIJAH%I ="@ -: 5%HE="%8 Usb serial design and experience in Plan 98192'8  : !: 6: 1: 5J="@=H@8 -NA?KJ=>/A ="@ JE"1E"C .%H'=J -J. 5FA?EBE?=JE%" 8AHIE%" : 8 TIS Committee8: ": 2: 9E"JAH>%JJ%'8 )?E@ Y="K=/8 Plan 9 Programmer’s Manual. AT&T Bell Laborato- ries. Murray Hill, NJ.8 ''#:

33

34 FTP-like Streams for the 9P File Protocol

John Floren [email protected] February 16, 2011

ABSTRACT

The 9P file protocol is used for all file operations in the Plan 9 operating system. Although it is simple and generally effective, 9P tends to show extremely poor perfor- mance when used to transfer large files over high-latency links, such as the Internet. This work extends the 9P protocol to introduce the concept of "streams" as used in FTP.

Introduction The Plan 9 operating system utilizes a single filesystem protocol, 9P, to access all resources on the system, including devices, the network stack, the windowing system, and the archival backup system. All of these files are made available by file servers, which are mounted to a namespace at the kernel level and then accessed using 9P messages [4]. Although 9P has proven a very effective way to deal with local files and files on local networks, in some ways it is lacking. At its core, 9P operation is synchronous. A message is sent requesting an operation, such as a read, and the client program must then block until the reply comes back from the server. Every read or write request must wait for the entire round-trip time (RTT) between the client and the server before the program can continue. With the rising prominence of the Internet, where latencies of hundreds of millisec- onds are common, it has become apparent that accessing and transferring files from distant Plan 9 systems using 9P is extremely slow and inefficient, requiring far more time to complete a file transfer than the more popular Hyper-Text Transfer Protocol (HTTP) or File Transfer Protocol (FTP). In fact, initial tests indi- cated that over a connection with 50 ms RTT (relatively low for the Internet), transferring a file took nearly four times as long with 9P as it did with HTTP. Where 9P operates in terms of "chunks" of a file, requested and delivered one piece at a time, HTTP and FTP deal with entire files at once. When a file is requested from an FTP server in passive mode, the FTP server and the client negotiate a separate, new TCP connection to be used to transfer the file all at once. In HTTP, when a GET request is sent over the connection, the entire file is returned immediately (although a specific portion of the file can also be requested, which will also be sent immediately regardless of size) [5]. Because FTP and HTTP push data directly to a TCP connection rather than waiting for it to be requested like 9P, they avoid many of the issues of latency. This work proposes and implements a method for alleviating the latency problems in 9P. The solution, called "streams" in this text, operates by taking a leaf from FTP’s book: it allows the creation of a new TCP connection to transfer file data. These streams, made available to programmers through library functions, can be used in any situation in which sequential reading or writing of a file occurs. Rather than attempting to improve performance with programmer-transpared adjustments behind the scenes, streams extend the POSIX-style file I/O API to put explicit control in the hands of the programmer. As the results show, the introduction of streams to 9P allows Plan 9 to transfer data using 9P just as quickly as with HTTP.

35 9P Files in Plan 9 are served and accessed using the 9P protocol. Client programs, such as cp and ed, access files using the familiar read(), write(), open(), close(), etc. library functions. The C library then translates these function calls into 9P messages, which are sent to the appropriate file server. File servers listen for incoming 9P messages (typically over a network connection or a pipe) and respond to them appropriately. Only one reply is sent per request.

9P messages come in pairs: a client sends a T-message (such as Tread ), which is received by the server. The server then responds with an R-message (such as Rread ). A T-message will always receive its corre- sponding R-message, unless an error occurs, in which case the server will respond with the Rerror mes- sage. The complete set of 9P messages is shown in Table 1.

Tversion/Rversion Exchanges client/server 9P version numbers Tauth/Rauth Authenticates client with server Rerror Indicates an error (includes error string) Tflush/Rflush Aborts a previous request Tattach/Rattach Establishes a connection to a file tree Twalk/Rwalk Descendsadirectoryhierarchy Topen/Ropen Opensafileordirectory Tcreate/Rcreate Createsafile Tread/Rread Readsdatafromanopenfile Twrite/Rwrite Writesdatatoanopenfile Tclunk/Rclunk Closesanopenfile Tremove/Rremove Removes a file Tstat/Rstat Requestsinformationaboutafile Twstat/Rwstat Changesinformationaboutafile Table 1. 9P messages [1]. All connections are initiated with the exchange of a Tversion/Rversion pair. In this exchange, the client and server insure that they are both speaking a compatible version of the 9P protocol. At the time of writing, the most recent version was called "9P2000", with an earlier version "9P" long deprecated. If either the client or the server returns a version that the other does not understand, no communication can be per- formed. Note that the definition allows extensions to be specified by appending characters to the version string following a period [2]; for example, "9P2000.L" represents a version of 9P with extensions for Linux. Anything following the "." is considered optional, thus "9P2000.L" is backwards compatible with "9P2000".

Once the protocol version has been established, a client typically sends a Tattach message to attach to a specific file tree. Then, the client is free to Twalk, Tstat, Topen, etc. all over the file tree.

When a user opens a file, the client program makes an open() system call, which is translated into a 9P message, Topen, which is sent to the file server. The file server responds with an Ropen message when the file has been opened. The client then sends Tread and Twrite messages to read and write the file, with the server responding with Rread and Rwrite. When the transaction is completed, the client sends Tclunk and receives Rclunk in return, at which point the file is closed.

36 Streams The primary reason for the slow performance of 9P over high-latency links is its T-message/R-message nature. Every read call issued by a program must wait for the entire round-trip time of the connection before getting any information back. This means that programs end up blocking for a very long time while messages are sent across the network. The addition of "streams" is intended to alleviate this problem. Sequential reading of files is very common; it appears when copying files, playing music and videos, opening a file in an editor, etc. Typically, the pro- grammer knows when a file will be read sequentially, but with the stock 9P implementation that knowledge helps little. Streams, on the other hand, aim to provide programmers with a powerful method for quickly reading in a file sequentially. The core concept of streams is drawn from the operation of passive FTP. When a client requests a file in passive mode, the FTP server and the client negotiate over the existing connection to set up a new, separate TCP connection for transferring the data [3]. The server then simply writes the entirety of the requested file to the new connection, which the client then reads. Typically, all 9P messages between a given client computer and its server are multiplexed over a single TCP connection. This means that multiple programs may all be sending messages over a single connection. To initialize a stream, a client program sends a Tstream message to the server, requesting a new stream. The server in turn responds with a Rstream message indicating an IP and port which represent a new, dedicated TCP connection for transferring a file.

Library Interface Streams are made available to the programmer through the C library, libc. There are two ways in which programmers may use streams: in a regular (client) program, or in a file server. Regular programs such as cp or an MP3 player utilize streams using the library functions stream, sread, swrite, and routinessclose.These

Stream* stream(int fd, vlong off, char isread) long sread(Stream* s, void *buf, long n) long swrite(Stream* s, void *buf, long n) int sclose(Stream* s) Table 2. libc functions.

typedef struct Stream { int ofd; // The underlying file being streamed int conn; // The TCP connection char *addr; // The server’s IP and port vlong offset; // Current offset into the file char isread; // Read/write flag char compatibility; // Compatibility mode flag } Stream; The Stream structure The operation of the functions is very similar to the corresponding functions for regular reading and writ- ing. The stream function initializes a stream given an already-open file descriptor. It is at this point that the directionality of a stream (read or write) is determined. The sread, swrite, and sclose functions all behave just like the corresponding read, write, and close functions already existing in libc. Since some servers may not support 9P streams, if the creation of a stream fails the functions sread, swrite, and sclose work in "compatibility" mode, issuing regular reads and writes on the original file

37 descriptor.

Streaming 9P Messages 9P servers and the kernel drivers deal with 9P at the level of 9P messages, rather than the POSIX-like abstractions seen by regular client programs. To implement streaming, two new 9P messages were added, Tstream and Rstream, which are formatted as shown in Table 3. Numbers in brackets represent field sizes in bytes. size[4] Tstream tag[2] fid[4] isread[1] offset[8] size[4] Rstream tag[2] count[4] data[count] Table 3. Format of streaming 9P messages. Each message consists of a string of bytes, with the size defined by the size element at the beginning. The tag field is common to both messages and is used by the client to identify the messages as belonging to the same conversation. The Tstream message specifies an fid, a flag for reading or writing, and an offset into the specified file. An fid is a 32-bit integer used to identify a specific active file on the file server and is in many ways analogous to a file descriptor in a user program. The Rstream message is returned by the file server and contains a network address string in the data field, the length of which is defined in the count field. The network address is in the format "tcp!x.x.x.x!yyyyy", where x.x.x.x is the server’s IP and yyyyy is a TCP port on the server. This network address is used by the client to connect to the file server, creating a TCP stream over which file data is sent.

Server-Side Design Every 9P server program must be modified to support streaming explicitly. When the 9P version is negoti- ated at the beginning of a session, a streaming-compatible server will report its version as "9P2000.s" rather than the default "9P2000". As the definition of the Tstream/Rstream messages states, anything in a version string following a period represents an optional extension to 9P. Thus, a streaming server is still fully compatible with a client which does not handle streaming, and vice versa. In general, to add streaming to a 9P server it is necessary to add a new handler for the Tstream message type. When such a message comes in, this handler (forked off as a new process to avoid blocking) must begin listening on a new TCP port, then send the server’s IP and the port number back in an Rstream message. When the client connects to that port, the server then begins reading/writing file data to/from the connection until either the file is fully sent (in the case of a read stream) or the connection is closed (in the case of a write stream).

Implementation The implementation of streams in 9P introduced changes in essentially every level of the system. User-level functions were introduced into the C library and user programs were modified to use those functions. A new system call was also added, and streaming support was included in device-specific drivers. At the lowest level is the driver support. It is necessary for each kernel driver to know how to set up a stream; a specific function was added to each to request and create a new stream. However, all remote filesystems are mounted through the devmnt device; the upshot of this is that streams only had to be fully implemented in devmnt, while other devices could simply have their stream functions return failure, forc- ing the stream into compatibility mode. To act as an interface between user-space programs and the device drivers mentioned above, a pstream system call was added. This system call is called when a new stream is requested by a user-level program. It does little more than parse its arguments, convert the given file descriptor to an in-kernel channel, and

38 then call the appropriate device-specific function based on the location of the requested file. If streaming is not supported, pstream returns -1. The C library functions mentioned above were added to the /sys/src/libc/9sys directory. In gen- eral, these functions were quite simple to implement. The stream function simply creates a new Stream structure, sets some options, and calls the pstream system call, which returns an IP address and port. The function then calls dial to open a new TCP connection and returns to the user program. If the remote server or the device driver is not streaming compatible, pstream will have returned -1, a compatibility flag is set, and no TCP connection is created. The sread, swrite, and sclose functions behave "appropriately" based on the status of the stream’s compatibility flag. To summarize, a user program calls stream on an open file descriptor to obtain a new stream.

Tests and Results In order to test streaming 9P, two programs were modified to utilize streaming. The cp user program and the exportfs 9P server were, over the course of about an hour, modified to support streams. In the case of cp, the changes totalled about 4 lines; the modified (streaming) version of cp is here referred to as scp. Modifications to exportfs were slightly more extensive, but basically amounted to making the server report its version as "9P2000.s" and adding an 80-line Tstream handler function. A network was set up for simulating the latency of the Internet. As Figure 1 shows, a client machine ( illiac ,bootingstandalonefromalocaldisk)andaserver(p9 ,actingasacombinedCPU/auth/file server), both running Plan 9, were separated by a gateway computer ( sigil )runningLinux.Thisgate- way was configured to use the netem kernel extensions, which allow the introduction of arbitrary latencies for network packets passing through the gateway.

Figure 1. Testing network A set of tests were devised to find the speeds at which files could be transferred using 9P, HTTP, and streaming 9P. 10 MB, 50 MB, 100 MB, and 200 M B files were randomly generated, then transferred over the network via the three different protocols with round-trip latencies of 500 s, 15 ms, and 50 ms. The server was configured to run the modified (streams-enabled) exportfs server and Plan 9’s HTTP server. On the client, the server’s namespace was mounted locally using the command import p9 / /n/p9 ,whichconnectedtotheserver’srunningexportfs process.

39 In order to transfer a file from the server to the client using streams, commands of the form scp /n/p9/usr/john/random10M /dev/null were issued, using the specially modified streaming cp program to copy the files. Files were transferred using non-streaming 9P with commands such as cp /n/p9/usr/john/random10M /dev/null, and files were transferred via HTTP with the com- mand line hget http://p9/random10M > /dev/null time command (also present in Unix), which reports the time required to complete a process. Table 4 and Figure 2 show the resulting transfer times when no artificial latency was induced, giving an average round-trip time of 500 s. At such a low latency, the performance of HTTP, 9P, and streaming 9P are essentially identical. 9P (sec.) HTTP (sec.) Streaming 9P (sec.) File Size (MB) mean std. dev mean std. dev mean std. dev 10 10.91 0.51 12.66 0.37 12.71 0.31 50 59.21 2.34 62.75 0.33 62.11 0.29 100 126.96 5.72 125.30 0.58 125.58 0.58 200 262.40 0.37 251.41 0.59 251.53 0.87 Table 4. HTTP vs. 9P vs. Streaming 9P, no induced latency, average RTT 500 s

Figure 2. HTTP vs. 9P vs. Streaming 9P, no induced latency, average RTT 500 s When the latency was increased to 15 ms round-trip, as shown in Table 5 and Figure 3, regular 9P immedi- ately fell significantly behind HTTP, while streaming 9P maintained almost exactly the same performance as HTTP. Differences between the transfer speeds for the two protocols were small enough to be considered simple experimental variance.

40 9P (sec.) HTTP (sec.) Streaming 9P (sec.) File Size (MB) mean std. dev mean std. dev mean std. dev 10 30.85 1.34 14.47 0.55 14.41 0.11 50 156.29 2.84 71.41 0.41 70.91 0.51 100 319.88 5.8 144.44 0.50 142.10 1.07 200 647.22 1.87 286.56 2.06 284.60 0.61 Table 5. HTTP vs. 9P vs. Streaming 9P, no induced latency, average RTT 15 ms

Figure 3. HTTP vs. 9P vs. Streaming 9P, no induced latency, average RTT 15 ms Figure 4 and Table 6 show the results at 50 ms induced latency. As in the previous test, HTTP and stream- ing 9P took almost exactly the same amount of time to transfer the same data, remaining within a standard deviation of each other, while regular 9P fell even more behind. 9P (sec.) HTTP (sec.) Streaming 9P (sec.) File Size (MB) mean std. dev mean std. dev mean std. dev 10 75.15 0.41 19.58 0.23 19.88 0.12 50 379.67 2.04 96.71 0.46 96.83 0.66 100 767.93 5.19 193.10 1.40 193.23 0.58 200 1543.12 0.62 385.292 1.85 386.02 1.77 Table 6. HTTP vs. 9P vs. Streaming 9P, no induced latency, average RTT 50 ms The final test that was performed checked the concurrency capabilities of streaming 9P compared to HTTP and regular 9P. The commands that had been used previously, for example time cp /n/p9/usr/john/random10M /dev/null, were followed by an & character, which caused the command to be executed in the background and allowed for the execution of multiple client programs at the same time. The Plan 9 OS has a feature which allows a user to enter multiple commands while in "hold" mode; upon exiting "hold" mode, the shell begins processing all the commands one after another. This allowed multiple clients to be launched almost simultaneously. Tests were performed using two, four, and eight simultaneous client programs on the client PC. For the

41 Figure 4. HTTP vs. 9P vs. Streaming 9P, no induced latency, average RTT 50 ms test, a round-trip latency time of 50 milliseconds was used with a file size of 10 MB. The execution times for each instance of the programs were averaged to get the results shown in Table 7 and Figure 5. Number of Clients Streaming 9P (sec.) HTTP (sec.) 9P (sec.) 2 30.96 28.51 79.75 4 53.28 52.53 100.81 8 104.24 101.93 158.53 Table 7. 10 MB file transfer speeds with multiple concurrent clients, 50 ms RTT

Figure 5. 10 MB file transfer speeds with multiple concurrent clients, 50 ms RTT As the results show, all three protocols experienced increased transfer times as the number of concurrent transfers increased. Streaming 9P and HTTP both showed approximately the same level of scalability

42 within the limited confines of this test, with performance decreasing in a slow and linear fashion.

Summary The addition of streams functionality provides one way in which 9P’s latency problems may be overcome. By allowing programmers to explicitly indicate that they intend to read or write a file sequentially, stream- ing functionality is used only where appropriate. As the results show, the use of streams allows 9P to transfer files at a rate comparable to that of HTTP. The modifications necessary to enable streaming in a client program are not onerous and can potentially increase the speed of file operations many times over. Future work would include the conversion of more user programs and servers to use streams. Any file server which listens for connections over the network could benefit from the inclusion of streaming capabil- ity while still remaining backward-compatible with non-streaming clients. Specifically, the disk-backed file servers Fossil and Venti are ideal targets for streaming. When a Plan 9 system such as a terminal mounts a root file system, it typically connects to a remote Fossil server; providing streaming within Fossil would allow users to experience more efficient file access for almost all of their files. On the client side, the image and document viewers could benefit from streaming file access, as would the MP3 decoder; all of these pro- grams regularly access large files sequentially.

Bibliography [1] Introduction to the Plan 9 file protocol, 9P. Plan 9 online manual, section 5. http://plan9.bell- labs.com/magic/man2html/5/0intro. [2] Version. Plan 9 online manual, section 5. http://plan9.bell-labs.com/magic/man2html/5/version. [3] J. Postel and J. Reynolds. RFC 959: File transfer protocol, October 1985. [4] , Dave Presotto, Sean Dorward, Bob Flandrena, Ken Thompson, Howard Trickey, and Phil Winterbottom. . 8(3):221 254, Summer 1995.

43

44 To Stream or not to Stream

Jeffrey Sickel +%HFKI+=//%IK'+%HF%H=JE%" -L="IJ%"81J$  75) K=I(?%HFKID?=//%IK':?%'

ABSTRACT

6DEI F=FAH @AI?HE>AI = JA?D"EGKA J% '="=CA 'K/JEF/A IAHE=/ @ALE?AI JD=J IMEJ?D @=J= JH="I'EIIE%" '%@AI >AJMAA" HAGKAIJDHAIF%"IA ="@ IJHA='E"C FH%J%?%/I: 1J KJE/E3AI JDA E@A=I %B ?%H%KJE"AI ="@ ?%''K"E?=JE"C IAGKA"JE=/ FH%?AIIAI J% >KE/@ ?%"?KHHA"J E"FKJ ="@ %KJFKJ FH%?AIIE"C H%KJE"AI B%H A=?D @ALE?A: 6DA AN='F/A FH%CH=' /ALAH=CAI JE'>%ߣI >KBBAHA@ ?D=""A/I J% ?%"?KHHA"J/O GKAKA ="@ FH%?AII @=J=BH%''K/JEF/AE"FKJIE"I%BJHA=/DJE'A:

1. Introduction 5?%HAI %B HAIA=H?DAHI D=LA FH%'%JA@ L=HE%KI IJHK?JKHA@ FH%CH=''E"C JA?D"EGKAI J% '="=CA ?%"?KHHA"?O %LAH JDA OA=HI: +%"M=O ^ `8 ,EK1IJH= ^ `8 0%=HA ^!8"`8 ="@ m=D" ="@ Y=?3KAA" ^#` D=LA =// ?%"JHE>KJA@ J% JDA >%@O %B 1"%M/A@CA JD=J BH='AI D%M ?%"?KHHA"J FH%CH='I =HA MHEJJA" J%@=O: ;AJ8 ALA" MEJD JDEI DEIJ%HO8 HAIA=H?D8 ="@ FH=?JE?A %B FH%CH=''E"C8 JDA FH%?AIIE"C %B E"FKJ ="@ %KJFKJ 1lM ?%"JE"KAI J% >A HA@K?A@ J% H%KJE"AI JD=J 'KIJ HK" J% ?%'F/AJE%" >AB%HA ="%JDAH J=I1 ?=" ?%"JE"KA: 6DEI E"DAHA"J IE"C/ADJ=I1A@ "=JKHA %B D="@/E"C 1lM 'A="I JD=J KIAH FH%CH='I8 AIFA?E=//O MEJD CH=FDE?=/ BH%"J A"@I8 "AA@ J% E"LAIJEC=JA ?%"?KHHA"J =FFH%=?DAI J% '="=CE"C 'K/JEF/A 1lM E"JAHB=?AI: .%H AN='F/A8 HA=@E"C @=J= BH%' = I/%M HA'%JA @ALE?A MDE/A =J JDA I='A JE'A "AA@E"C J% IAHLE?A %JDAH E"FKJ J=I1I HAGKEHAI '="=CE"C IOIJA' IJ=JA IK??AIIBK//O J%FHALA"J>/%?1E"C?%"@EJE%"IBH%'E"JAHHKFJE"CJDA/%CE?B/%M: +%H%KJE"AI8 ?%E"A@ >O +%"M=O ="@ ANF="@A@ >O /=JAH HAIA=H?DAHI8 =HA = FH%LA" M=O J% D="@/A L=HE%KI EIIKAI IKHH%K"@E"C JDA /%CE?=/ IAC'A"J=JE%" %B ?%@A: 6DA @ABE"EJE%"8 =I FK>/EIDA@ >O +%"M=O^ F!'$`8A/K?E@=JA@ separability, %H'%@K/=HEJOF ^6DA ?%H%KJE"A` '=O >A ?%@A@ =I =" =KJ%"%'%KI FH%CH=' MDE?D ?%''K"E?=JAI MEJD =@K=?A"J '%@K/AI =I EB JDAO MAHA E"FKJ %H %KJFKJ IK>H%KJE"AI: 6DKI8 ?%H%KJE"AI =HA IK>H%KJE"AI =// =J JDA I='A /ALA/8 A=?D =?JE"C =I EB EJ MAHA JDA '=IJAH FH%CH=' MDA" E" B=?JJDAHAEI"%'=IJAHFH%CH=': JALAH=CE"C JDEI '%@K/=HEJO DA/FI E" @AIEC"E"C %FJE'=/ E"FKJD ="@ %KJFKJDD="@/E"C H%KJE"AI >=IA@ %" '=?DE"A %H FH%?AII IJ=JA =J ="O CELA" JE'A: 6D%KCD JDA /%CE? EI '%@K/=HE3A@8 IJ=JA ?D="CAI IJ%HA@ >O JDA ?%H%KJE"AI @% "%J BK//O '%@A/ = ?%"?KHHA"J %H F=H=//A/ IOIJA' =I JDA K%E" HAGKEHA@ B%H JM% ?%H%KJE"AI J% AN?D="CA @=J= ME// ?=KIA =J /A=IJ %"A J% M=EJ8 %H >/%?18 K"JE/ JDA %JDAHEI=>/AJ%IA"@%HHA?AELA@=J=J%JDAFAAHIAAm"KJD^$`B%HAN='F/AI: 1" %H@AH J% =?DEALA CHA=JAH ?%"?KHHA"?O = 'A?D="EI' EI HAGKEHA@ J% /ALAH=CA JDA 1lM D="@/E"C %B ?%H%KJE"AI E"J% = '%HA =FFH%=?D=>/A BH='AM%H1: 6DA IA'E"=/ F=FAH >O 0%=HA ^!`8 Communicating Sequential Processes +528 FH%LE@AI IK?D = BH='AM%H1 ="@ E"B/KA"?A@ JDA @AIEC" %B JDA JE'>% FH%CH=''E"C /="CK=CA: +52 EI JDA 'A?D="EI' KIA@ >O JE'>% ?D=""A/I J% FH%LE@A >ED@EHA?JE%"=/ ?%''K"E?=JE%" >AJMAA" FH%?AIIAI: JE'>% FH%?AIIAI =HA =>/A J% HK" ?%"?KHHA"J/O8 E" F=H=//A/ EB JDA K"@AH/OE"C D=H@M=HA IKFF%HJI EJ8 >O /ALAH=CE"C ?%"IJHK?JI FH%LE@A@ >O +52: 4EJ?DEA ^%` @AI?HE>AI JDA IE'F/EBEA@ KIA %B JE'>% ?D=""A/I J% D="@/A HA=@E"C @=J= BH%' = IE"C/A @ALE?A: 7F@=JAI J% 1"BAH"% ="@ JE'>% IE"?A 4EJ?DEAߣI @%?K'A"J "%M E"?/K@A >KBBAHA@ ?D=""A/I8 =

45 /="CK=CAANJA"IE%"JD=J=//%MIB%HKFJ% n >KBBAH IE3A %B L=/KAI J% >A IA"J MEJD%KJ >/%?1E"C: 6DEI F=FAH ?%"JHE>KJAI J% JDA =L=E/=>/A @%?K'A"J=JE%" %" KIE"C JE'>% ?D=""A/I J% '="=CA ?%"?KHHA"J 1lMJ=I1I: 6DA BE"=/ @ALA/%F'A"J IJ=CA %B = "AM =AH%D=?%KIJE? /ALEJ=J%H ))J ^&` HAGKEHA@ = FH%CH=' J% E"JAHB=?A8 ?%"JH%/8 ="@ @EIF/=O @=J= BH%' L=HE%KI IAHE=/ @ALE?AI: 5%'A %B JDAIA @ALE?AI KIA = IE'< F/A HAGKAIJDHAIF%"IA FH%J%?%/8 MDAHA=I %JDAHI IMEJ?D BH%' HAGKAIJDHAIF%"IA ?%''K"E?=JE%" J% = IJHA='E"C FH%J%?%/: )// %B JDA @ALE?AI %FAH=JA E" '%@AI MDAHA IA"@E"C = HAGKAIJ ="@ JDA" >/%?1E"C J% M=EJ B%H = HAIF%"IA ME// "%J IKBBE?A8 =I JDAHA =HA ?AHJ=E" ?%"@EJE%"I MDAHA = 'AII=CA ME// >A IA"J BH%' JDA@ALE?A%KJ%B%H@AHBH%'=IAGKA"JE=/HAGKAIJDHAIF%"IA/%%FE"EJE=JA@>OJDA KIAH ?%"JH%/ FH%CH=': 1" %H@AH J% '="=CA JDAIA 'AII=CA IJ=JAI8 JDEI E'F/A'A"J=JE%" KIAI 'K/JE< F/A =IO"?DH%"%KI FH%?AIIAI =I ?%H%KJE"AI J% D="@/A =// %B JDA @=J= '="=CA'A"J ="@ '=?DE"A ?%"JH%/: 6DA KIAH EI FHAIA"JA@ MEJD = IA='/AII E"JAHB=?A EI%/=JA@ BH%' JDA K"@AH/OE"C IAHE=/ ?%'< 'K"E?=JE%"J=I1I: 6DA B%//%ME"C IA?JE%"I FHAIA"J aal/pyro .ECKHA 8 = JE'>% FH%CH=' JD=J KIAI +52 FH%CH=''E"C JA?D"EGKAI J% '="=CA JDA 1lM BH%' 'K/JEF/A @ALE?AI: 6DA IOIJA' ?%'>E"AI = HA'%JA FOH%'AJAH MEJD = /E"A=H :; JH="I/=J%H8 JDHAA IAHE=/ @ALE?AI E" J%J=/: 6DA FH%CH=' F/%JI8 ="@ %FJE%"=//O /%CI8 JDA IJHA=' %B JA'FAH=JKHA 'A=IKHA'A"JI IA"J BH%' JDA FOH%'AJAH: 2%IEJE%" %B JDA FOH%'AJAH EI ?%"JH%//A@ KIE"C JDA :; JH="I/=J%HI JDH%KCD "K'AHE? 1AO A"JHO ="@ = CH=FDE?=/ LEAM JD=J =??AFJI ?%%H@E"=JAI ?%"LAHJA@ BH%' '%KIA E"FKJ: 6DAIA J=I1I =HA =??%'F/EIDA@ >O >KE/@E"C FH%CH=' IJHK?JKHAI J% D="@/A 1lM BH%' JDA L=HE%KI IAHE=/ E"JAHB=?AI: 6DA E'F/A'A"J=JE%" /ALAH=CAI JE'>%ߣI>KBBAHA@?D=""A/IB%HE"JAHDFH%?AII?%''K"E?=JE%"J%?%"JH%/F=H=//A/@=J=BAA@I:

Figure 1 ==/lFOH% =FF/E?=JE%"

2. Design 6DA aal/pyro FH%CH=' EI = CH=FDE?I E"JAHB=?A JD=J '="=CAI 1lM BH%' 'K/JEF/A FDOIE?=/ @ALE?AI: ,EBBAHA"J IAHE=/ ?%''K"E?=JE%"I FH%J%?%/I =HA KIA@ J% FH%?AII @=J= BH%' A=?D @ALE?A: */%?1E"C ?%"@EJE%"I ?%''%" E" 1lM H%KJE"AI =HA A/E'E"=JA@ BH%' JDA ?%"JH%/ B/%M >O IAF=H=JE"C A=?D J=I1 E"J% E"@AFA"@A"J FH%?AIIAI JD%KCDJ %B =I ?%H%KJE"AI: 6DA FH%CH=' '="=CAI JDAIA ?%H%KJE"AI >O ?%''K"E?=JE"C JDH%KCD JE'>% ?D=""A/I: *O EI%/=JE"C JDA >/%?1E"C BK"?JE%"I E"J% IAF=H=JA ?%H%KJE"AI8 JDA FH%CH=' EI =>/A J% HK" IA='/AII/O MEJD%KJ E"JAHHKFJE"C JDA E"JAH=?JELA FH%CH=' B/%M: 6DA JE'>% alt =/JAH=JE%" IJ=JA'A"J ^'` EI KIA@ J% '="=CA ?%"?KHHA"J ?%''K"E?=JE%"I >AJMAA" A=?D %B JDA 1AO ?%H%KJE"AI JD=J @AFA"@ %" @=J= FH%?AIIE"C: 6DA alt EI /E1A = case %H switch IJ=JA'A"J >KJ IFA?EBE? B%H D="@/E"C 'K/JEF/A ?%''K"E?=JE%"I ?D=""A/I: 6DKI JDA FH%CH=' /%CE??=">A@A?/=HA@E"IE'F/AIO"?DH%"%KIJAH'IALA"MDE/AD="@/E"C=IO"?DH%"%KIALA"JI: M" IJ=HJKF8 JDA pyro FH%?AII  .ECKHA  IF=M"I %BB = IE"C/A timer FH%?AII =I = 'A?D="EI' J%

46 IEC"=/ JDA pyro FH%?AII J% B/KID ="O %KJD%BDIO"? ?%''K"E?=JE%"I BH%' JDA :; JH="I/=J%H r=>AH: 6DA timer @%AI "%JDE"C K"JE/ = ?%""A?JE%" EI '=@A J% HA'%JA @ALE?AI: 6DA '=E" alt ALA"J /%%F E" JDA pyro FH%?AII D="@/AI KIAH E"JAH=?JE%" ="@ @H=ME"C H%KJE"AI HAFHAIA"JE"C JDA ?%%H@E"=JA IF=?A %B JDA r=>AH @ALE?AI: 2/%JJE"C ="@ %JDAH @H=ME"C KF@=JAI =HA '="=CA@ KIE"C IAF=H=JA FH%< ?AIIAIIJ=HJA@=BJAH?%""A?JE%"J%JDA-N=?JKIFOH%'AJAHEI'=@A:

Figure 2 ==/lFOH% FH%?AIIAI

)// IAHE=/ @ALE?AI D=LA = 'E"E'=/ @=J= IJHK?JKHA HABAHHA@ J% =I = port: .%H IE'F/E?EJO8 A=?D F%HJ ?=" >A %FA"A@ BH%' = IAHE=/ @ALE?A BE/A KIE"C sys−>open() %H LE= sys−>dial() J% ?%""A?J J% = HA'%JA IAHLE?A: 6DA ?%""A?JE%" H%KJE"A EI EJIA/B IF=M"A@ %BB BH%' JDA pyro FH%?AII I% JD=J JDA >/%?1E"C open() %H dial() ?=//I @% "%J E"DE>EJ %JDAH KIAH E"JAHB=?A E"JAH=?JE%": ) 'AII=CA ME// >A IA"J %LAH = ?D=""A/ J% JDA pyro FH%?AII "%JEBOE"C MDAJDAH = IK??AIIBK/ ?%""A?JE%" M=I '=@A: ) L=/E@ ?%""A?JE%" ME// A"=>/A =@@EJE%"=/ 71 A/A'A"JI ="@ IF=M" = @A@E?=JA@ FH%?AII J% '="=CA HA=@E"CBH%'JDA@ALE?A: +%""A?JE"CJ%JDA-N=?JKIFOH%'AJAHIJ=HJIKF=IAHEAI%B%JDAH FH%?AIIAI: 6DA BEHIJ EI JDA HA=@AH KIA@ J% ="=/O3A JDA @EBBAHA"J E"FKJ @=J= BH%' JDA @ALE?A: 6DA HA=@AH IF=M"I %BB = >/%?1E"C >OJA HA=@AH JD=J IE'F/O HA?AELAI =// @=J= BH%' JDA FOH%'AJAH IAHE=/ E"JAHB=?A ="@ IA"@I A=?D >OJA >=?1 %LAH = >KBBAHA@ ?D=""A/8 @A?%KF/E"C JDA ="=/OIEI BH%' JDA FDOIE?=/ @ALE?A: ) IAF=H=JA FH%?AII CH%KF EI KIA@ B%H %"DI?HAA" @H=ME"C: 6DA animproc FH%?AII EI IF=M"A@ =BJAH ?%""A?JE%" J% JDA FOH%'AJAH ="@ F/%JI JA'FAH=JKHA @=J= KIE"C = ?%%H@E"=JA@ ="E'=JA FH%?AII: ) IAF=H=JA plotscan FH%?AII EI ?HA=JA@ >O = KIAHDE"EJE=JA@ ALA"J J% F/%J JA'FAH=JKHA @=J= E" HA/=JE%" J% JDA =NE=/ F%IE< JE%" %B JDA FOH%'AJAH: -=?D %B JDA E"JAHB=?AI EI @A?/=HA@ E" EJI %M" '%@K/A =I @ABE"A@ E" JDA B%/< /%ME"CIA?JE%"I:

2.1. Zaber 6DA r=>AH :; JH="I/=J%HI =HA E"JAHB=?A@ LE= = IE"C/A 45 ! /E"1 JD=J ?%''K"E?=JAI MEJD >%JD JDA : ="@ JDA ; /E"A=H IJ=CA: 6DA IAHE=/ FH%J%?%/ FH%LE@AI = ?/A="8 BENA@ >OJAD/A"CJD 'AII=CA B%H'=J B%H >%JD IA"@E"C ="@ HA?AELE"C @=J=: 6D%KCD JDA FH%J%?%/ M%H1I /E1A = IAGKA"JE=/ JH="I'EJD HAIF%"IA %FAH=JE%"8 "%J =// ?%''="@I J% JDA @ALE?A HAJKH" = HAIF%"IA 'AII=CA: )@@EJE%"=//O8 JDAHA EI "% CK=H="JAA@ %H@AH J% JDA HAIF%"IAI ="@ JDAHA =HA ?AHJ=E" ?=IAI MDAHA JDA @ALE?A EIIKAIIJ=JA@=J=E"JAH/A=LA@>AJMAA"%JDAHHAIF%"IA'AII=CAI: 6DA?%""A?JE%"J%JDA@ALE?A?HA=JAI="E"IJ="?A%B=r=>AHF%HJF Port: adt { pid: int; local: string; ctl: ref Sys−>FD; data: ref Sys−>FD; rdlock: ref Lock−>Semaphore;

47 wrlock: ref Lock−>Semaphore; buf: array of byte;

write: fn(c: self ref Port, b: array of byte): int; }; )BJAH IK??AIIBK//O ?%""A?JE"C J% ="@ %FA"E"C JDA @ALE?A8 JDA pid EI IAJ J% JDA FH%?AII E@ %B JDA IF=M"A@ %BB reader(): ) >KBBAH %B HA?AELA@ >OJAI EI IJ%HA@ E" JDA port IJHK?JKHA: 6DA IA'=FD%HA rdlock EI KIA@ =I JDA >OJAI >KBBAHA@ E" JDA r=>AH reader FH%?AII =HA L=/E@=JA@ ="@ ?%"IK'A@ E" JDA pyro FH%?AII: 5F=M"E"C JDA reader %BB E"J% EJI %M" FH%?AII =//%MI JDA >/%?1E"C sys−>read() ?=// J% ?%"JE"K=//O HA=@ @=J= MEJD%KJ E"JAHBAHE"C MEJD JDA HAIJ %B JDA =FF/E?=JE%" ALA"J '="=CA'A"J: ,=J= HA?AELA@ BH%'JDA@ALE?AEIIJ%HA@E"=>KBBAHK"JE/=IK>IAGKA"JH%KJE"AF%//IJDA>KBBAHA@@=J=: reader(p: ref Port, pidc: chan of int) { pidc <−= sys−>pctl(0, nil);

buf := array[1] of byte; for(;;) { while((n := sys−>read(p.data, buf, len buf)) > 0) { p.rdlock.obtain(); if(len p.avail < Sys−>ATOMICIO) { na := array[len p.avail + n] of byte; na[0:] = p.avail[0:]; na[len p.avail:] = buf[0:n]; p.avail = na; } p.rdlock.release(); } # error, attempt reconnect and try again openport(p); } }

6DA F=HA"J pyro FH%?AII ?DA?1I B%H HAIF%"IAI KIE"C =@ D%? E"JAH/A=LAI MEJD @EHA?JA@ JE'A%KJI: 6DEI EI =??%'F/EIDA@ >O ?=//E"C readreply() MDA"ALAH JDA F=HA"J FH%?AIIAI "AA@I J% F%// @=J= BH%' JDA @ALE?A: -=?D readreply() ?=// F=IIAI = 'E//EIA?%"@ JE'A %KJ F=H='AJAH J% A"=>/A /%CE? B/%MJ%?%"JE"KAEB=HAIF%"IAD=I"%J>AHA?AELA@: 6DA HAF/O '=O >A nil @KA J% = JE'A%KJ: 1B JDA HAIF%"IA EI "%J HAJKH"A@8 EJ @%AI "%J '=JJAH J% JDA HAIJ %B JDA IOIJA' IJ=JA =I "% @AFA"@A"?O EI >=IA@ %" =?JK=/ HAIF%"IAI K"/AII IFA?EBE?=//O HAGKAIJA@ E" ="%JDAH H%KJE"A: 5?=""E"C FH%?AIIAI8 @EI?KIIA@ /=JAH8 HAGKEHA AN=?J F%IEJE%" @AJ=E/I ="@JDKIANF/E?EJ/OM=EJK"JE/JDAFH%FAHHAJKH"D=I>AA"HA?AELA@: readreply(p: ref Port, ms: int): ref Instruction { if(p == nil) return nil; if(ms < 0) ms = 60000; # arbitrary maximum of 60s

r : ref Instruction; for(start := sys−>millisec(); sys−>millisec() <= start+ms;) { a := getreply(p, 1); if(len a == 0) { sys−>sleep(1); continue; } return a[0]; }

return r; }

Readreply() ?=//IJDABK"?JE%" getreply() J%I?="JDA>KBBAH="@?DA?1B%HL=/E@E"IJHK?JE%"I:

48 getreply(p: ref Port, n: int): array of ref Instruction { if(p==nil || n <= 0) return nil;

b : array of byte; p.rdlock.obtain(); if(len p.avail >= 6) { if((n*6) > len p.avail) n = len p.avail / 6; b = p.avail[0:(n*6)]; p.avail = p.avail[(n*6):]; } p.rdlock.release();

a : array of ref Instruction; if(len b) { a = array[n] of { * => ref Instruction}; for(j:=0; j

)??AII J% JDA port =L=E/=>/A @=J= >KBBAH EI ?%%H@E"=JA@ >AJMAA" JDA r=>AH reader() FH%?AII ="@ ="O ?=//I J% JDA getreply() BK"?JE%" JDH%KCD JDA IA'=FD%HA p.rdlock. 6DA IA'=FD%HA EI KIA@ J% E"IKHA JD=J JDA >OJA HA=@E"C ="@ 'AII=CA E"JAHFHAJ=JE%" @% "%J ?%"B/E?J MDE/A =??AIIE"C JDA >KBBAH: 6DA getreply() H%KJE"A%>J=E"IJDAIA'=FD%HA/%?18JDA"?DA?1IJDA/A"CJDJ%@AJAH'E"AEB = L=/E@ 'AII=CA EI ?%"J=E"A@ E" JDA @=J=: 1B JDA >KBBAH ?%"J=E"I A"%KCD >OJAI B%H n 'AII=CAI8 EJ ME// IJ%HA JD%IA >OJAI ="@ JHE' JDA >KBBAH: 6DA IA'=FD%HA EI JDA" HA/A=IA@ J% =//%M JDA r=>AH reader FH%?AII J% ?%"JE"KA BE//E"C JDA >KBBAH =I "AM >OJAI =HA HA?AELA@ BH%' JDA @ALE?A: 6DEI ?%%H@E"=JA@ D="@D%BB KIE"C JDA readreply() /%%F 'A="I JD=J JE'A%KJI ?=" >A KIA@ MDE/A F%//E"C B%H"AM'AII=CAIBH%'JDA:;JH="I/=J%HIMEJD%KJ>/%?1E"CJDA pyro FH%?AII:

2.2. Exactus Y=1E"C JDA -N=?JKI FOH%'AJAH ?%"JH%/ JH="IF=HA"J J% JDA A"@ KIAH EI JDA FHE'=HO J=I1 %B JDA pyro FH%CH=': 6DA @ALE?A EI ?%""A?JA@ JDH%KCD =" 45 ! %H 45" E"JAHB=?A: 6DA ))J ?%""A?JI J% JDA FOH%'AJAH %LAH 6+2l12 KIE"C = 2AH/A 1MJ)W 5,5 =I = FH%NO B%H JH="IBAHHE"C JDA H=M >OJAI J% ="@ BH%' JDA @ALE?A: 6DA -N=?JKI KIAI JM% IAHE=/ FH%J%?%/I B%H "%H'=/ %FAH=JE%"F = HAGKAIJD HAIF%"IA FH%J%?%/ 1"%M" =I Y%@>KI8 ="@ = H=M >OJA IJHA=' %B @=J= JAH'A@ JDA /AC=?O -N=?JKI '%@A: 9DA" E" JDA IJHA='E"C '%@A8 EJ EI ?=F=>/A %B JH="I'EJJE"C KF J% %"A 'A=IKHA'A"J FAH 'E//EIA?%"@: 6D%KCD JDEI H=JA EI "%J B=IJ >O '%@AH" ?%'FKJE"C IJ="@=H@I8 JDA '%@A IMEJ?DE"C %LAHJDAI='AIAHE=/E"JAHB=?A@ABE"AIJDAM=OMAD=LAJ%E'F/A'A"JJDA>OJAHA=@AH: 6DA FOH%'AJAH IJHA='E"C '%@A /ALAH=CAI >KBBAHA@ ?D=""A/I J% IA"@ @A?%@A@ @=J= BH='AI J% JDA animproc FH%?AII JD=J EI @A@E?=JA@ J% ?%"LAHJE"C JD%IA @=J= E"J% "K'AHE?=/ B%H'I FHAIA"JA@ E" = CH=FDE?=/ LEAM ="@ %FJE%"=//O J% = /%C BE/A: M" JDA %"A D="@8 JDEI EI "% @EBBAHA"J JD=" IJ%HE"C JDA @=J= E" = >KBBAH ="@ D=LE"C ="%JDAH FH%?AII ?%"JE"K=//O F%// B%H "AM A"JHEAI E" JDA I='A M=O %"A M%K/@ /AJ JDA HAGKAIJDHAIF%"IA /%%F '="=CA IO"?DH%"%KI ?%''K"E?=JE%"I: *KJ E" JDEI ?=IA JDA HA=@AH FH%?AII EI%/=JAI JDA '%@A IMEJ?DE"C ="@ ?%"JE"K=//O '%"EJ%HI JDA E"FKJ >OJAI B%H FH%FAH 'AII=CA IJHK?JKHA B%H >%JD IJ=JAI: 6DA HAIK/JE"C @=J= IJHA='I =HA JOFA@ =I JDAO =HA HA=@ ="@ IK>IAGKA"J/OD="@A@%BBJ%JDAHAIFA?JELAA"@F%E"JI:

49 2.2.1. Modbus M" IJ=HJKF8 JDA FOH%'AJAH ?%''K"E?=JAI %LAH EJI IAHE=/ /E"1 KIE"C JDA Y%@>KI 467 FH%J%?%/: Y%@>KI EI = ?%''K"E?=JE%"I FH%J%?%/ KIA@ >O '="O E"@KIJHE=/ @ALE?AI ="@ ?%'AI E" JDHAA E'F/A< 'A"J=JE%"IF RTU, ASCII, ="@ TCP/IP. 6DA -N=?JKI KIAI = IK>IAJ %B JDA 467 FH%J%?%/ J% HA=@ ="@ MHEJA ?%E/ ="@ HACEIJAH L=/KAI %" JDA @ALE?A: -=?D 'AII=CA EI BH='A@ >O !:#D?D=H=?JAH JE'AI %B IE/A"?A =J #: 1>FI8 = !!:& 'tI >HA=1 >AJMAA" 'AII=CAI: )// 'AII=CAI 'KIJ >A E"EJE=JA@ >O JDA aal/pyro FH%CH='8 =I EJ EI JDA '=IJAH "%@A E" JDA IAHE=/ ?%"BECKH=JE%": 6DA FHE'=HO KIAH E"JAH=?JE%" JD=J KJE/E3AI JDA Y%@>KI '%@A EI J% ?D="CA JDA I='F/E"C H=JA8 1"%M" =I CH=FD H=JA8 ="@IMEJ?D>=?1E"J%JDA-N=?JKIIJHA='E"C'%@A@KHE"C=?JK=/@=J=?%//A?JE%": 6DA JE'>% Y%@>KI '%@K/A D=I >AA" '%@A/A@ %" JDA '2 %H 5JON '%@K/AI @KA J% EJI JH="I'EJ ="@ HAIF%"IA 'AII=CA IJHK?JKHA: 6DAHA =HA ' BK"?JE%" ?%@AI ="@ =" AHH%H JOFA @A?/=HA@ MEJDE" JDA @=J= IJHK?JKHA: 7"/E1A JDA E"?HA'A"J=/ F=EHE"C %B JDA 6 ="@ 4 JOFAI E" '28 Y%@>KI KIAI JDA I='A BK"?JE%" ?%@A L=/KAI MDA" @A?/=HE"C >%JD JDA JH="I'EJ ="@ HAIF%"IA IJHK?JKHAI: .%H AN='F/A8 JDA6Y'ICIJHK?JKHAF TMmsg: adt { frame: int; addr: int; # 1 or 2 bytes check: int; # 0 or 2 bytes pick { Readerror => error: string; Error => fcode: byte; ecode: byte; Readcoils => offset: int; # 2 bytes, 0x0000 to 0xFFFF quantity: int; # 2 bytes, 0x0001 to 0x07D0 Readdiscreteinputs => offset: int; quantity: int; Readholdingregisters => offset: int; quantity: int; # 2 bytes, 0x0001 to 0x007D ߪ read: fn(fd: ref Sys−>FD, msglim: int): ref TMmsg; packedsize: fn(nil: self ref TMmsg): int; pack: fn(nil: self ref TMmsg): array of byte; unpack: fn(b: array of byte, h: int): (int, ref TMmsg); mtype: fn(nil: self ref TMmsg): int; }; EI "A=H/O E@A"JE?=/ J% JDA 4Y'IC IJHK?JKHA B%H HA?AELA@ @=J=: )I JDA 6Y'IC EI HAGKAIJE"C @=J= BH%'=?AHJ=E"HACEIJAH%H?%E/8JDAHAJKH"4Y'IC'AII=CAM%K/@E"?/K@AJDA=?JK=/HAIK/JI8=IE"F Readholdingregisters => count: int; data: array of byte; # registers, N (of N/2 words)

)BJAH=FH%?AIIMHEJAI=6Y'IC8EJME//>/%?1M=EJE"CB%HJDAHAF/O>O?=//E"C readreply()F EPort.readreply(p: self ref EPort, ms: int): (ref ERmsg, array of byte, string) { if(p == nil) return (nil, nil, "No valid port");

limit := 60000; # arbitrary maximum of 60s r : ref ERmsg; b : array of byte; err : string; for(start := sys−>millisec(); sys−>millisec() <= start+ms;) { (r, b, err) = p.getreply(); if(r == nil) {

50 if(limit−−){ sys−>sleep(5); continue; } break; } else break; }

return (r, b, err); } W%JA JDA IE'E/=HEJO J% JDA readreply() KIA@ J% =??AII JDA r=>AH @ALE?AI: *%JD %B JDAIA KIA %"A BK"?JE%" E" = /%%F J% F%// JDA >KBBAH JDH%KCD JDA getreply() BK"?JE%": *O @%E"C I%8 JDA @ALA/%FAH ?=" I?DA@K/A ALA"JI =I "AA@A@ ="@ ?%"JE"KA ANA?KJE%" MEJD IE'F/A HA?%LAHO E" JDA ?=IA %B =" AHH%H:

2.2.2. Streaming 6DA -N=?JKI /AC=?O IJHA='E"C '%@A EI = IAJJE"C MDAHA JDA @ALE?A IA"@I %KJ = ?%"JE"K%KI IJHA=' %B 'AII=CAI =J = IAJ H=JA: 6DA B%KH 'AII=CA JOFAI =HA temperature, current, dual JA'FAH=JKHA ="@?KHHA"J8="@E"JAH"=/ device JA'FAH=JKHAI: 6DAIJHA='?%"J=E"IF=?1AJI %B @=J= 'AII=CAI %B L=HE=>/A /A"CJD JD=J ?%"IEIJ %B = DA=@AH >OJA @ABE"E"C JDA JOFA8 B%//%MA@ >O %"A %H '%HA ! D>EJ 1--- %#" >E"=HO B/%=JE"C F%E"J L=/KAI: 6DA F%HJE%" %B JDA F=?1AJ A"?%'F=IIE"C JDA B/%=JE"C F%E"J >OJAI '=O E"?/K@A AI?=FA ?%@AI '=I1E"C JDA JOFA ="@ %JDAH HAIAHLA@ >OJAI MEJDE" JDA 'AII=CA8 JDKI?HA=JE"C=L=HE=>/A/A"CJDF=?1AJ: 6DA temperature ="@ current JOFAI D=LA = L=HE=>/A F=?1AJ IE3A %B #D' >OJAI8 @AJAH'E"A@ >O JDA AI?=FA IAGKA"?AI KIA@ E" F=?1E"C JDA 'AII=CA: 6DA dual ="@ device JOFAI F=?1AJ IE3A EI 'D % >OJAI E" /A"CJD: 6DA /=?1 %B = /A"CJD =JJHE>KJA E" JDA -N=?JKI 'AII=CA FH%J%?%/ '="@=JAI JD=J A=?D >OJA HA?AELA@ >A I?=""A@ ="@ AL=/K=JA@ J% JAIJ B%H 'AII=CA ?%'F/AJE%": 6DA @=J= IJHK?JKHA KIA@E"JE'>%J%HAFHAIA"J="-N=?JKI'AII=CAEIF Emsg: adt { pick { Temperature => degrees: real; Current => amps: real; Dual => degrees: real; amps: real; Device => edegrees: real; cdegrees: real; Version => mode: byte; appid: byte; vermajor: int; verminor: int; build: int; Acknowledge => c: byte; }

unpack: fn(b: array of byte): (int, ref Emsg);

temperature: fn(m: self ref Emsg): real; current: fn(m: self ref Emsg): real; dual: fn(m: self ref Emsg): (real, real); device: fn(m: self ref Emsg): (real, real); acknowledge: fn(m: self ref Emsg): byte; text: fn(m: self ref Emsg): string; };

51 6DAHA EI "% DE"JE"C B%H JDA I='F/E"C JE'A BH%' JDA @ALE?AL JDA HA?AELAH 'KIJ ?=/?K/=JA JDA JE'E"C E"JAHL=/ >=IA@ %" JDA HA?AEFJ %B>OJAI: 6DAJE'E"C=??KH=?O@AFA"@I"%J%"/O%"JDAHAI%/KJE%"%B sys−>millisec() >KJ =/I% %" ="O /=JA"?O E" JDA HA?AEFJ %B JDA >OJAI BH%' JDA @ALE?A: 6D%KCD /=JA"?O ?=" >A =" EIIKA =J DECDAH JH="I'EIIE%" H=JAI8 JDA '=NE'K' 103 I='F/A H=JA BH%' JDA FOH%'AJAHEIIK??AIIBK//OD="@/A@:

2.2.3. Byte stream processing 5MEJ?DE"C IJ=JAI >AJMAA" Y%@>KI ="@ -N=?JKI '%@AI HAGKEHAI = I/ECDJ/O '%HA ?%'F/AN FH%?AII IJHK?JKHA B%H L=/E@=JE"C >OJAI HA?AELA@ BH%' JDA @ALE?A JD=" @ABE"A@ B%H JDA r=>AH E"JAHB=?A: Aal/pyro ?HA=JAI=HABAHA"?A EPort J%IJ%HA=//%BJDA?%""A?JE%"A/A'A"JIF EPort: adt { mode: int; # Exactus or Modbus maddr: int; # Modbus address temp: real; # Last measured temperature rate: int; # Graph rate path: string; ctl: ref Sys−>FD; data: ref Sys−>FD; wdata: ref Sys−>FD; rdlock: ref Lock−>Semaphore; wrlock: ref Lock−>Semaphore; buffer: array of byte; # bytes from reader pids: list of int; tchan: chan of ref Exactus−>Trecord; ms: int; # ms start of last packet

write: fn(p: self ref EPort, b: array of byte): int; getreply: fn(p: self ref EPort): (ref ERmsg, array of byte, string); readreply: fn(p: self ref EPort, ms: int): (ref ERmsg, array of byte, string); }; 9DA" = FH%?AII EI IF=M"A@ %BB J% ?%""A?J J% JDA @ALE?A8 JDA path EI IJ%HA@ ="@ sys−>dial() EI ?=//A@: )BJAH IK??AIIBK//O AIJ=>/EIDE"C = ?%""A?JE%"8 JDA 'A'>AHI ctl, data, ="@ wdate =HA F%FK< /=JA@ KIE"C sys−>open(). 6DA >/%?1E"C ?=//I sys−>dial() ="@ sys−>open() 'A=" JD=J EJ EI E'F%HJ="J B%H JDA '=E" /%%F J% D=LA IJ=HJA@ JDEI ?%""A?JE%" H%KJE"A ?%"?KHHA"J/O =I J% "%J >/%?1 ="O %JDAH A/A'A"JI %B JDA E"JAHB=?A %H @=J= D="@/E"C %B %JDAH 1lM ?%'F%"A"JI: M" IK??AIIBK/ E"EJE=/E3=JE%"8 JDA ?%""A?JE%" FH%?AII IA"@I = ?%''="@ >=?1 %LAH = ?D=""A/ J% JDA pyro FH%?AII ="@ JDA" ANEJI: 6DA "%JEBE?=JE%" JD=J JDA Eport D=I >AA" E"EJE=/E3A@ KF@=JAI JDA E"JAHB=?A ="@ IF=M"I %BB JDA animproc FH%?AIIKIA@J%F/%J="O@=J=BH%'JDAFOH%'AJAH: 6DA E"JAHAIJE"C 'A'>AHI %B JDA @=J= IJHK?JKHA =HA JDA mode, temp, rate, pids, ="@ tchan8 =I JDAO =HA KF@=JA@ >=IA@ %" KIAH E"JAH=?JE%" ?%"JH%//E"C JDA IJ=JA %B JDA @ALE?A: )"O ?%''="@I JD=J HA=@ %H MHEJA L=/KA ?D="CAI 'KIJ BEHIJ IAJ JDA @ALE?A J% Y%@>KI '%@A >AB%HA '=1E"C ="O BKHJDAH HAGKAIJI: 6DA @ALE?A ME// >A IMEJ?DA@ >=?1 J% -N=?JKI IJHA='E"C '%@A =BJAH JDA I='F/E"C H=JA EI IAJ ="@ @=J= ?%//A?JE%" EI IJ=HJA@: 6DA temp L=HE=>/A EI KIA@ =I IJ%H=CA ="@ = /%%1KF 'A?D="EI' B%H JDA '%IJ HA?A"J/O HA?AELA@ JA'FAH=JKHA 'AII=CA BH%' JDA FOH%'AJAH: Rate EI = DE"J BEA/@ IAJ MDA" JDA KIAH ?D="CAI JDA CH=FDE"C ="@ I='F/E"C H=JA %B JDA @ALE?A: 6DA KIA %B pids FH%LE@AI = /EIJ%BIK>FH%?AIIE@IJ%JDAF=HA"JFH%?AIIE"?=IAJDAO"AA@J%>AJAH'E"=JA@: 6DA?D=""A/ tchan EI KIA@ MDA" JDA @ALE?A EI E" JDA IJHA='E"C '%@A: 9DA" tchan EI "%J nil8 JDA" JA'FAH=JKHA @=J= ME// >A IA"J BH%' JDA HA=@E"C FH%?AII J% ="%JDAH FH%?AII JD=J =?JI =I = /EIJA"AH: 6DEI A"=>/AI JDA animproc CH=FDE"C FH%?AII J% >A IJ=HJA@ E"@AFA"@A"J/O BH%' JDA reader. 9DA" = BH='A %B @=J= BH%' JDA IJHA=' EI =L=E/=>/A8 EJ EI IA"J %LAH JDA tchan ?D=""A/ J% JDA animproc FH%?AIIB%HD="@/E"CMEJDE"JDACH=FDE?IIOIJA': 6DA JM% FH%?AIIAI JD=J '="=CA JDA -N=?JKI IAHE=/ ?%''K"E?=JE%"I =HA = reader() IF=M"A@ >O JDA pyro FH%?AII8 ="@ JDA >/%?1E"C bytereader()8 IF=M"A@ %BB >O JDA HA=@AHJ%FE?1%BB>OJAIBH%'JDA @=J=IJHA='F

52 bytereader(p: ref EPort, c: chan of (int, byte), e: chan of int) { p.pids = sys−>pctl(0, nil) :: p.pids; buf := array[1] of byte; while(sys−>read(p.data, buf, len buf) > 0) { c <−= (sys−>millisec(), buf[0]); } e <−= 0; } 6DA?D=""A/ chan of (int, byte) EI=>KBBAHA@?D=""A/?HA=JA@E" JDA reader FH%?AII JD=J @A?%KF/AI JDA >/%?1E"C HA=@AH BH%' JDA =?JK=/ @A?%@AH KIA@ J% L=/E@=JA JDA @=J= IJHA=': 6DA E"IAHJE%" %B JDA sys−>millisec() E" JDA JKF/A EI KIA@ J% '=H1 JDA HA?AEFJ JE'A %B JDA BEHIJ >OJA JD=J >ACE"I = 'AII=CA: J=JA"?O '=O %BBIAJ JDA =??KH=?O8 >KJ EJ @%AI FH%LE@A = 'A?D="EI' J% HAFHAIA"J JE'A >AJMAA"@=J='AII=CAIBH%'JDAFOH%'AJAH:

reader(p: ref EPort) { p.pids = sys−>pctl(0, nil) :: p.pids; c := chan[BUFSZ] of (int, byte); e := chan of int; spawn bytereader(p, c, e);

for(;;) alt { (ms, b) := <−c => p.rdlock.obtain(); n := len p.buffer; if(n == 0) { p.ms = ms; # used in Trecord, track first received l : list of byte; if(p.mode == ModeModbus) l = SMBYTES; else l = SEBYTES; if(!ismember(b, l)) { # frame error p.rdlock.release(); continue; } } na := array[n + 1] of byte; if(n) na[0:] = p.buffer[0:n]; na[n] = b; if(p.mode == ModeExactus && p.tchan != nil) { (i, m) := Emsg.unpack(na); if(m != nil) { t := ref Trecord(p.ms, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0); pick x := m { Temperature => t.temp0 = p.temp = x.degrees; Current => t.current1 = x.amps; Dual => t.temp0 = p.temp = x.degrees; t.current1 = x.amps; Device => t.etemp1 = x.edegrees; t.etemp2 = x.cdegrees; * => t = nil; } if(t != nil) { p.tchan <−= t; if(n > i) na = na[i:]; else na = nil; } } } p.buffer = na;

53 p.rdlock.release(); <−e => # bytereader exited, try again openport(p); spawn bytereader(p, c, e); } }

3. Graphical interface 6DA=FF/E?=JE%"D=IJM%FHE'=HO CH=FDE?=/ ?%'F%"A"JIF = HAFHAIA"J=JE%" %B JDA :; F%IEJE%" %B JDA FOH%'AJAH ="@ = JA'FAH=JKHA F/%J %B @=J= HA?AELA@: 6DA pyro ME"@%M FH%LE@AI = ?%"I%/E@=JA@ E"JAHB=?A E"J% JDA ?%"?KHHA"J FH%?AIIAI KIA@ J% ?%%H@E"=JA =// %B JDA 1lM BH%' JDA =JJ=?DA@ @ALE?AI: 6DA KIAH ?=" E"EJE=JA =" =@@EJE%"=/ LEAM JD=J ?%'>E"AI JDA F%IEJE%" ="@ JA'FAH=JKHA @=J= E"J% = ?%"I%/E@=JA@ I?=" F/%J: *O FH%LE@E"C = IE'F/EBEA@ LEAM %" J%F %B JDA ?%%H@E"=JA@ ?%H%KJE"AI8 JDA pyro FH%?AII EI =>/A J% IO"JDAIE3A JDA JH="I/=J%H ?%"JH%/ ="@ FOH%'AJAH @=J= =?GKEIEJE%"E"J%=?%"?EIALEAMJD=JDE@AIJDA'K/JEF/AFH%?AIIAIBH%'JDAKIAH:

3.1. Translator control 6DA r=>AH :; JH="I/=J%HI ?HA=JA = !N !'' HACE%" MDAHA JDA FOH%'AJAH ?=" >A B%?KIA@: 6DA @=J= JD=J =HA HAJKH"A@ >O JDA @ALE?A =HA E" 'E?H%DIJAFI ="@ =HA ?%"LAHJA@ J% 'E//E'AJAHI B%H KIAH LEAME"C ="@ "K'AHE?=//O A"JAHA@ ?D="CAI: 6DAHA EI =" =@@EJE%"=/ CH=FDE?=/ F="A/ JD=J FHAIA"JI JDA F%IEJE%" =I = HAJE?/A JD=J ?=" >A '%LA@ >O = ?/E?1 E" JDA LEAM: 6DA CH=FDE?=/ E"JAH=?JE%" EI '="=CA@?%'F/AJA/OMEJDE"JDA pyro '=E"=/J/%%FKIE"CJDA zcmd ?D=""A/F c := <−zcmd => if(dflag) sys−>fprint(stderr, "zcmd: ’%s’0, c); if(!plot.lock) { # max microstep: 131327 (nil, toks) := sys−>tokenize(c, " "); pnt := Point(int hd tl toks, int hd tl tl toks); ms := real MAXMICROSTEP / real plot.bimg.r.dx(); x1 := real pnt.x * ms; y1 := real pnt.y * ms; zsend(Instruction.newwithval(1, Zaber−>Cmoveabsolute, int(x1))); zsend(Instruction.newwithval(2, Zaber−>Cmoveabsolute, int(y1))); }

6DA zcmd EI = IJHE"C ?D=""A/ "='A@ B%H KIA MEJDE" JDA 61 CH=FDE?I IOIJA': )" %"DI?HAA" 61 F="A/ IA"@I : ="@ ; ?%%H@E"=JAI %LAH JDA ?D=""A/: 1B JDA F="A/ plot D=I "%J >AA" /%?1A@ >O JDA KIAH J% EC"%HA JDA ?%''="@I8 JDA" JDA ?%%H@E"=JAI ME// >A ?%"LAHJA@ E"J% JDA 'E?H%DIJAFI HAGKEHA@ >O JDA JH="I/=J%H ="@ MHEJJA" J% JDA@ALE?A: 6DABK"?JE%" zsend() A"?%@AIJDAE"IJHK?JE%" E"J% =" =HH=O %B >OJAI ="@ MHEJAI JDA' J% JDA @ALE?A E" %H@AH J% '%LA J% JDA =IIEC"A@ =>I%/KJA F%IEJE%": ) zsend() ?=// EI =@@HAIIA@ J% A=?D JH="I/=J%H =I JDAO =HA '%LA@ E"@AFA"@A"J/O: 6DA r=>AH @ALE?AI ME// "%J ?%"BEH' =" E"IJHK?JE%" K"JE/ =BJAH JDA FDOIE?=/ '%LA D=I ?%'F/AJA@: 6DA HAJKH" L=/KAI BH%' JDA @ALE?A '=O >A HA?AELA@ %KJ %B IAGKA"?A J% JDA ?=//E"C ?%"LA"JE%" =I JDA JE'A %B JH=LA/ >AJMAA" F%IEJE%"I EI JDA @AJAH'E"E"C B=?J%H: 6DAHA EI "% HAGKEHA'A"J J% M=EJ B%H JDA HAJKH" HAIK/J @KA J% JDA KIA %B = timer FH%?AII ?DA?1E"C B%H "AM GKAKA@ HAJKH" L=/KAI >AB%HA KF@=JE"CJDA@EIF/=O: 6DA timer FH%?AIIIA"@I = 'AII=CA %LAH tchan %"?A FAH IA?%"@: 6DA pyro '=E" =/J /%%F HA?AELAI JDAJE'A%KJ'AII=CA%LAHJDA tchan ="@FH%?AIIAIJDAALA"JF <−tchan => if(!scanning) { if(zport != nil) while((r := zaber−>readreply(zport, 1)) != nil) processzaber(r); if(epid > 0) ecmdc <−= PyroPlot−>SAMPLE; else if(eport != nil) updatedegrees(exactus−>temperature(eport)); }

54 6DA scanning ?DA?1 A"IKHAI JD=J JDA pyro FH%?AII ME// %"/O F%// JDA r=>AH >KBBAH MDA" JDA plotscan FH%?AII EI "%J =?JELA/O HK""E"C: r=>AH JH="I/=J%H 'AII=CAI =HA FH%?AIIA@ >AB%HA =JJA'FJE"C J% KF@=JA =" %"DI?HAA" JA'FAH=JKHA HA=@%KJ: 6DA ?D=""A/ ecmdc EI KIA@ J% 'AII=CA JDA animproc FH%?AII HAGKAIJE"C = "AM JA'FAH=JKHA 'A=IKHA'A"J: ) HAIF%"IA ?%''K"E?=JE%" M%K/@ JDA" KF@=JA JDA %"DI?HAA" JA'FAH=JKHA: 1B animproc EI JAH'E"=JA@8 JDA" JDA epid EI IAJ J% 3AH% ="@ = >/%?1E"C ?=// J% JDA FOH%'AJAH EI'=@ALJDEIHAGKEHAIJDA'=E"/%%FJ%M=EJB%H=HAJKH" BH%'JDAFOH%'AJAH>AB%HAKF@=JE"CJDA@EIF/=O="@?%"JE"KE"CJ%JDA"ANJE"IJHK?JE%":

3.2. Temperature plot /H=FDE? F/%JJE"C %B JA'FAH=JKHA @=J= EI '="=CA@ JDH%KCD JDA animproc FH%?AII IF=M"A@ =BJAH IK??AIIBK//O ?%""A?JE"C J% JDA -N=?JKI @ALE?A: +%''="@I ?%"JH%//E"C /%CCE"C8 I='F/E"C H=JA8 ="@ MDAJDAH %H "%J J% F/%J JDA @=J= =HA IA"J %LAH = ?D=""A/ >O JDA pyro FH%?AII: 6DA >KBBAHA@ ?D=""A/ recc8 %B -N=?JKI 6HA?%H@ JOFA8 EI KIA@ J% HA?AELA @=J= FH%?AIIA@ >O JDA -N=?JKI reader MDE/A%FAH=JE"CE"IJHA='E"C'%@AF Trecord: adt { time: int; temp0: real; temp1: real; temp2: real; current1: real; current2: real; etemp1: real; etemp2: real; emissivity: real; pack: fn(nil: self ref Trecord): array of byte; unpack: fn(b: array of byte): (int, ref Trecord); };

6DA Trecord EI?HA=JA@>OF=HIE"C L=/KAI IA"J BH%' JDA -N=?JKI IJHA=' @=J=: 6DA time BEA/@ EI JDA 'E//EIA?%"@I BH%' JDA >ACE""E"C %B = /%C %B JDA @=J=: J%CCE"C J% @EI1 ME// KIA JDA pack() BK"?JE%" J%?HA=JAJDA>E"=HO@=J=MHEJJA"%KJJ%=BE/AIOIJA': 5J=HJE"C animproc ME// E" JKH" IF=M" %BB ="%JDAH FH%?AII J% '="=CA JDA =?JK=/ @H=ME"C H%KJE"AI: 6DEI"AMFH%?AII8 animate8HA?AELAIHA=/L=/KAI%LAH="%JDAH>KBBAHA@?D=""A/F animate(top: ref Tk−>Toplevel, p: ref Plotter, c: chan of array of real) { for(;;) { data := <−c; if(!p.paused) p.mavg = update(top, p, data); } }

)// I?HAA" @H=ME"C EI >KBBAHA@ E" = BENA@D/A"CJD =HH=O %B HA=/ L=/KAI >AB%HA >AE"C IA"J J% JDA animate FH%?AII: 6DA ABBA?J %B JDEI >KBBAHE"C EI J% =//%M JDA CH=FDE?=/ F/%J J% =/M=OI FHAIA"J =J /A=IJ %"A 'E"KJA %B DEIJ%HE?=/ @=J=: 6DA CA"AH=JA@ F/%J F%E"J EI =" =LAH=CA %B =// JDA >KBBAHA@ @=J= F%E"JIL JDEI M%H1I MA// B%H JDA BK// IFA?JHK' %B CH=FDE"C H=JAI =L=E/=>/A BH%' JDA -N=?JKI FOH%'AJAH:

3.3. Scanning ,KHE"C JDA ?%KHIA %B = /ALEJ=JE%" ANFAHE'A"J8 EJ EI E'F%HJ="J J% LAHEBO JD=J JDA FOH%'AJAH EI B%?KIA@ %" JDA I='F/A E" %H@AH J% =?GKEHA JDA >AIJ JA'FAH=JKHA HA=@E"C F%IIE>/A: 1" %H@AH J% =??%'F/EIDJDA %FJE'=/ B%?KIE"C %B JDA FOH%'AJAH8 JDA :; JH="I/=J%HI =HA KIA@ J% I?=" = HACE%" E" %"A @E'A"IE%" MDE/A IE'K/J="A%KI/O ?%//A?JE"C JA'FAH=JKHA ="@ F%IEJE%" @=J=: 6DA I?=""E"CH%K< JE"A HAGKEHAI =// %B JDA FHE%H 1lM HA/=JA@ BK"?JE%"=/EJO E" %H@AH J% =??%'F/EID EJI J=I1 E" JDA pyro =FF/E?=JE%": 5?=""E"C EI D="@/A@ >O IF=M"E"C %BB = @A@E?=JA@ plotscan FH%?AII J% ?HA=JA ="@ ?%"JH%/ = "AM

55 ME"@%MMDAHA=F/%JEI@H=M"ID%ME"CF%IEJE%"%"JDA:=NEI="@JA'FAH=JKHA%"JDA;=NEI: 6DA ?HA=JE%" %B = plotscan FH%?AII IAJI KF JDA ME"@%M ="@ IF=M"I %BB = IAF=H=JA ID%HJD/ELA@ FH%?AII J%'%LAJDA:;JH="I/=J%H="@HAJKH"JA'FAH=JKHA@=J=B%HCH=FDE"CF c := chan[8] of (int, int, real); comp := chan of int; spawn scanregion(rect, c, comp); 6DA scanregion FH%?AII ?=/?K/=JAI "AM F%IEJE%"I J% '%LA JDA JH="I/=J%H ="@ IA"@I ?%''="@ 'AII=CAI E" = /%%F J% '=1A JDA '%LA %??KH: )J A=?D F%IEJE%" = JA'FAH=JKHA 'A=IKHA'A"J EI '=@A ="@ JDA HAIK/JE"C @=J= EI IA"J %LAH = >KBBAHA@ ?D=""A/8 c8 >=?1 J% JDA plotscan FH%?AII MDAHA =" F/%J ME// >A HA"@AHA@ %" JDA @EIF/=O: M"?A JDA I?=" ?%'F/AJAI8 = BE"=/ 'AII=CA ME// >A IA"J J% '%LA JDA FOH%'AJAH >=?1 J% JDA IJ=HJE"C F%IEJE%": 6DA scanregion FH%?AII ME// JDA" IA"@ ='AII=CA%LAHJDA comp ?D=""A/="@FH%'FJ/OANEJ: )// %JDAH aal/pyro FH%?AIIAI ?%"JE"KA J% HK" ="@ KF@=JA JDAEH CH=FDE?=/ ?%'F%"A"JI MDE/A JDA I?=""E"C EI J=1E"C F/=?A: M"?A JDA scanregion FH%?AII D=I ANEJA@8 EJ EI F%IIE>/A B%H JDA KIAH J% ?/E?1 %" JDA CH=FDE? JA'FAH=JKHA F/%J J% '%LA JDA FOH%'AJAH J% = >AJJAH ?A"JAHA@ /%?=JE%": 6DA KIAH'=OJDA"HAFA=JJDAFH%?AIIJ%LAHEBO%FJE'=/FOH%'AJAHF/=?A'A"J@KHE"CJDAANFAHE'A"J:

4. Conclusion 5OIJA' @ALA/%F'A"J ?=" >A @EBBE?K/J A"%KCD MEJD%KJ D=LE"C J% M%HHO =>%KJ 1lM >/%?1E"C = FH%< ?AII %H JDHA=@A@ FH%CH='I ?=KIE"C = @A=@/%?1: 6DEI AN='F/A @AJ=E/A@ D%M ?%H%KJE"A ="@ +52 '%@A/I ?=" >A KIA@ J% IK??AIIBK//O '="=CA 'K/JEF/A @ALE?AI >O EI%/=JE"C JDA 1lM D="@/AHI: 6DA @A?%KF/E"C %B JDA >/%?1E"C sys−>read() ?=//8 MDA" '="=CA@ MEJD JE'>% ?D=""A/I8 ?=" >A = KIABK/ J%%/B%HIAF=H=JE"C%KJ?%'F%"A"JI%B=FH%CH='J%FH%?AII1lM: JA=H"E"C J% /ALAH=CA JE'>% ?D=""A/I B%H E"JAHDFH%?AII ?%''K"E?=JE%" '=O >A = B%HAEC" E@A= MDA" ?%'E"C BH%' %JDAH FH%CH=''E"C /="CK=CAI: 6D%KCD ?D=""A/I >AD=LA /E1A FEFAI E" 7"EN8 JDA =>E/EJO J% ?HA=JA JOFA@ @=J= ="@ A=IE/O F=II EJ >AJMAA" FH%?AIIAI A"=>/AI JDA '%@A/ J% M%H1 GKEJA MA// B%H ?%"?KHHA"J FH%CH='I: 6DA E'F/A'A"J=JE%" KIAI JDEI BA=JKHA J% ?HA=JA E"@AFA"@A"J >OJA IJHA=' HA=@AHI JD=J CH=?ABK//O D="@/A IAHE=/ FH%J%?%/ ?D="CAI MDE/A ?%"JE"K=//O ?%"IK'E"C E"FKJBH%'ANJAH"=/@ALE?AI: 6DAHA =HA =HA=I MDAHA JDEI '%@A/ ?%K/@ >A E'FH%LA@: .%H %"A8 JDA HA=//%?=JE%" %B JDA >KBBAH =HH=O KIA@ J% IJ%HA >OJAI BH%' JDA E"FKJ IJHA=' ?=" >A %FJE'E3A@: 1'F/A'A"JE"C = "AM @=J= IJHK?JKHA J% A/E'E"=JA JDA IA'=FD%HA /%?1E"C ?%K/@ B=?E/EJ=JA FH%CH=''E"C /%CE? IE'F/EBE?=JE%": .%H "%M8 MEJD JDA ?%"IJH=E"J %B JDA IAHE=/ /E"A JH="I'EIIE%" IFAA@I =L=E/=>/A J% JDA HA'%JA @ALE?AI8 JDA IOIJA' FAHB%H'I MA// A"%KCD J% ?=FJKHA JH="I'EIIE%"I BH%' JDA FOH%'AJAH =J EJI '=NE'K'H=JA%B 103: 6DAJE'>%I%KH?AEI=L=E/=>/AKF%"HAGKAIJBH%'JDA=KJD%H: # wc results:

1103 3215 21536 exactus/exactus.b 196 578 4055 exactus/exactus.m

1143 3775 27058 modbus/modbus.b 248 787 5897 modbus/modbus.m

424 1276 8449 zaber/zaber.b 104 248 1944 zaber/zaber.m

1515 5351 41132 aal/appl/pyro/pyro.b 365 1035 9056 aal/appl/pyro/pyroplot.b 29 72 556 aal/module/pyroplot.m

5127 16337 119683 total

56 5. Acknowledgements 6DA =KJD%H MEIDAI J% JD="1 *A/'= 0=@3EIA/E'%LE? ="@ M'AH 0=@3EIA/E'%LE? B%H FH%LE@E"C =@LE?A %"JDAFH%FAHKIA%BJDA-"C/EID/="CK=CA8="@i=I%"*K>%/3B%HFH%LE@E"C=?HEJE?=/HALEAM: 6DA %HECE"=/ M%H1 M=I FAHB%H'A@ K"@AH ?%"JH=?J J% 2DOIE?=/ 2H%FAHJO YA=IKHA'A"JI8 1"?: B%H 4960 )=?DA" 7"ELAHIEJO 1"IJEJKJA %B YE"AH=/ -"CE"AAHE"C: .K"@E"C B%H JDEI FH%KA?J M=I FH%LE@A@ >O JDA /AH'=" 4AIA=H?D )II%?E=JE%" "K'>AH ,./F 1W56 l%%'D .7// ="@ JDA .A@AH=/ IJ=JA %BW%HJD4DE"AD9AIJFD=/E="K'>AHW49F l":$:#:&:D#$$:

6. References ^ ` YA/LE" -: +%"M=O: '$!: ,AIEC" %B = IAF=H=>/A JH="IEJE%"D@E=CH=' ?%'FE/AH: Commun. ACM $8 % iK/O '$!8 !'$D"&: ,M1u : "#l!$$$$!:!$$%" DJJFFll@%E:=?':%HCl : "#l!$$$$!:!$$%" ^ ` -: 9: ,EK1IJH=: '$#: 5%/KJE%" %B = FH%>/A' E" ?%"?KHHA"J FH%CH=''E"C ?%"JH%/: Commun. ACM &8 ' 5AFJA'>AH '$#8 #$'D: ,M1u : "#l!$###':!$#$ % DJJFFll@%E:=?':%HCl : "#l!$###':!$#$ % ^!` +: ): 4: 0%=HA: '%&: +%''K"E?=JE"C IAGKA"JE=/ FH%?AIIAI: Commun. ACM 8 & )KCKIJ '%&8 $$$D$%%: ,M1u : "#l!#'#%$:!#'#&# DJJFFll@%E:=?':%HCl : "#l!#'#%$:!#'#&# ^"` +: ): 4: 0%=HA: ": Communicating Sequential Processes8 ?KHHA"J A@EJE%" FK>/EIDA@ %"D/E"A =J DJJFFllMMM:KIE"C?IF:?%'l: ^#` /: m=D" ="@ ,: *: Y=?3KAA": '%%: +%H%KJE"AI ="@ "AJM%H1I %B F=H=//A/ FH%?AIIAI8 1"B%H'=JE%" 2H%?AIIE"C: 1" Proceedings of IFIP Congress, %%F''!D''&: DJJFFllD=/:=H?DELAID%KLAHJAI:BHlE"HE=D!$#$#l: ^$` ,%"=/@ -: m"KJD: ''%: The Art of Computer Programming, Volume 1 (3rd Ed.): Fundamental Algorithms, FF: '!D ! : )@@EI%" 9AI/AO J%"C'=" 2K>/EIDE"C +%:8 1"?:8 4A@M%%@ +EJO8 +)8 75): ^%` ,A""EI Y: 4EJ?DEA: 6DA JE'>% 2H%CH=''E"C J="CK=CA8 1" Inferno Programmer’s Manual, Volume Two8 FF: ' D : 8EJ= WK%L= 0%/@E"CI JJ@:8 ;%H18 : ^&` iABB 5E?1A/8 ="@ 2=K/ +: W%H@E"A:  : -BBA?JELA 4AI%"="J .HAGKA"?O 6H=?1E"C 9EJD 1"BAH"%8 1" Proceedings of IWP98  F " D# : ^'` 5A=" ,%HM=H@8 4%> 2E1A8 ="@ 2DE/ 9E"JAH>%JJ%': ''%: 2H%CH=''E"C E" JE'>%: 1" Proceedings of the 42nd IEEE International Computer Conference +MY2+MW ߣ'%: 1--- +%'FKJAH 5%?EAJO8 9=IDE"CJ%"8 ,+8 75)8 "#D:

57

58 Appendix: Work In Progress

The WIP session included the presentation and discussion of the following works:

• A Bluetooth Protocol Stack for Plan 9, by Richard Miller

• A Plan 9 C Toolchain for the Altera Nios2 Processor A Plan 9 C Toolchain for the Altera Nios2 Processor, by Richard Miller

• New file system proposals, by Francisco Ballasteros, Sape Mullender, Latchesar Ionkov, and others.

• Dfs – A WebDav filesystem client, by Steve Simon

• Wsys(4): hosted window system, by Jesús Galán López

This appendix includes the submitted abstracts for the WIP session.

59

60 A Bluetooth Protocol Stack for Plan 9

Richard Miller 'E//AH(D='"=L%A:?%'

ABSTRACT

6DA */KAJ%%JD B='E/O %B ?%''K"E?=JE%" FH%J%?%/I EI IE'E/=H E" BK"?JE%" J% 6+2l128 >KJ @EBBAHA"J E" ?D=H=?JAH: 1"JA"@A@ B%H /%M F%MAH8 ID%HJ @EIJ="?A F%E"J J% F%E"J H=@E% ?%''K"E?=JE%" >AJMAA" F=EHI %B @ALE?AI8 MEJD /E"1I IAJ KF =J /A=IJ E"EJE=//O MEJD DK'=" E"JAHLA"JE%"8 EJ D=I "% 'K/JE D%F H%KJE"C8 "% 'AII=CA >H%=@?=IJ8 "% @%'=E" "='A %H =@@HAII HAI%/KJE%"L EJ @%AI D=LA = JHKIJA@ @ALE?A '%@A/ AIJ=>/EIDA@ >O = %"A JE'A F=EHE"C %FAH=JE%": 7"/E1A 6+2l128 E" MDE?D JDA DECDAH FH%J%?%/ /=OAHI =HA JOFE?=//O E'F/A'A"JA@ E" I%BJM=HA %" J%F %B = FHE'EJELA D=H@M=HA /E"1 /=OAH %B IE'< F/A @=J=CH=' %FAH=JE%"I >AJMAA" D=H@M=HA =@@HAIIAI8 */KAJ%%JD ?DEFI =?J =I >/=?1 >%NAI MDE?D AIJ=>/EID ="@ '=E"J=E" DECD /ALA/ 'K/JEF/ANA@ ?%""A?JE%"I >AJMAA" 'K/JEF/A @ALE?AI8 FHAIA"JE"C = ?%'F/AN ?%''="@ ="@ ALA"J E"JAHB=?A J% JDA D%IJ M5 MDE?D HAGKEHAI = 8"  F=CA IFA?EBE?=< JE%"J%@AI?HE>A: 1" IFEJA %B JDAIA @EBBAHA"?AI8 JDA 2/=" ' "AJM%H1 =>IJH=?JE%" EI IKBBE?EA"J/O CA"AH=/ B%H = KIABK//O /=HCA IK>IAJ %B */KAJ%%JD J% D=LA >AA"E"?%HF%H=JA@ E"= B=EH/OIJH=ECDJB%HM=H@M=O8IE'F/O>OANJA"@E"C /net MEJD= "AM FH%< J%?%/ @EHA?J%HO /net/bt8 IKFF%HJA@ >O JDA "AM btfs IO"JDAJE? BE/A IAHLAH HK""E"C =I = KIAH /ALA/ FH%?AII: 9EJD "% ?D="CAI MD=JI%ALAH J% JDA 1AH"A/ %H J% + /E>H=HO H%KJE"AI IK?D =I dial8 announce8 ="@ listen8 EJ EI F%IIE>/A8 B%H AN='F/A8 B%H = 2/=" ' '=?DE"A J% ID=HA EJI BE/A IOIJA' MEJD ="%JDAH LE= */KAJ%%JD KIE"C JDEI F=EH %B ?%''="@I8 %" IAHLAH ="@?/EA"J HAIFA?JELA/OF aux/listen1 bt!*!42 /bin/exportfs import −A bt!001122334455!42 /n/blue ) I'=// ?D="CA J% JDA ?%""A?JE%" IAHLAH cs& =//%MI JDA KIA %B = '%HA BHEA"@/O @ALE?A "='A E" F/=?A %B JDA DAN=@A?E'=/ */KAJ%%JD @ALE?A =@@HAII: 5%'A %B JDA */KAJ%%JD FH%BE/AI IJ="@=H@ IAHLE?AI MDE?D ?=" >A FH%LE@A@ %LAH = */KAJ%%JD ?D=""A/ ?=" =@@ KIABK/ BK"?JE%"=/EJO J% 2/=" ': .%H AN='F/A8 JDA 01, DK'=" E"JAHB=?A @ALE?A FH%BE/A EI = 'E"%H L=HE=JE%" %B JDA 75* 01, IFA?EBE?=JE%"8 I% JD=J ?D="CE"C = BAM /E"AI %B I%KH?A ?%@A E" JDA 75* 1AO>%=H@ ="@ '%KIA @HELAH usb/kb D=I '=@A EJ M%H1 MEJD */KA< J%%JD 1AO>%=H@I ="@ 'E?A: ) IE'F/A ?%''="@D/E"A ?/EA"J B%H JDA M*-: %>KA?J AN?D="CA FH%J%?%/ D=I >AA" MHEJJA"8 J% BAJ?D %H IA"@ IE"C/A IE"< C/A BE/AI >AJMAA" = 2/=" ' '=?DE"A ="@ = */KAJ%%JDDAGKEFFA@ FD%"A %H %JDAH @ALE?A: ) BKJKHA FH%KA?J EI J% MHEJA = BE/A IAHLAH E'F/A'A"JE"C JDA M*-: .62 FH%J%?%/8 MDE?D M%K/@ =//%M = 2/=" ' '=?DE"A ="@ */KAJ%%JD FD%"A J%>H%MIA A=?D%JDAHߣIBE/A IOIJA':

61 62 A Plan 9 C Toolchain for the Altera Nios2 Processor

Richard Miller 'E//AH(D='"=L%A:?%'

ABSTRACT

6DA WE%I FH%?AII%H EI = I%BJ +27 MDE?D ?=" >A E"IJ="JE=JA@ =I F=HJ %B = KIAHD@AIEC"A@ IOIJA'D%"D?DEF %" )/JAH=ߣI .EA/@ 2H%CH=''=>/A /=JA )HH=OI .2/)I: 1J D=I = IE'F/A 415+ =H?DEJA?JKHA8 MEJD = H="CA %B E'F/A< 'A"J=JE%"I %B L=HOE"C IE3A ="@ ?%'F/ANEJO: 6DA JE"O WE%I lA BEJI E" w% J%CE? -/A'A"JI = JOFE?=/ .2/) ME// D=LA JA"I %H DK"@HA@I %B JD%KI="@I %B J-I >O %'EJJE"C /KNKHEAI /E1A D=H@M=HA 'K/JEF/O ="@ @ELE@A E"IJHK?JE%"I8 'A'%HO ?=?DAI8 YY78 ="@ KIAHl1AH"A/ '%@A: 6DA HA/=JELA/O DECD FAH< B%H'="?A WE%I lB =@@I =// JDAIA BA=JKHAI MEJD = $ IJ=CA ANA?KJE%" FEFA< /E"A E"?%HF%H=JE"C @O"='E? >H="?D FHA@E?JE%" ="@ '%HA8 J% %??KFO =>%KJ ! J-I: *AJMAA" JDA' EI JDA WE%I lI8 = ?%'FH%'EIA >AJMAA" IE3A ="@ IFAA@: 1" = HA?A"J FH%KA?J 1 =@=FJA@ JDA 1"BAH"% A'K/=J%H B%H JDA WE%I 8 HK""E"C %" J%F %B JDA 2M51: ?%'F=JE>/A A+%I %FAH=JE"C IOIJA': 6DEI M=I KIABK/ =I = F/=JB%H' B%H MHEJE"C @A'% ="@ JAIJ FH%CH='I B%H = ?/EA"JߣI H=FE@/O AL%/LE"C .2/)D>=IA@ D=H@M=HA FH%J%JOFA: 0%MALAH JDA D%IJA@ E'F/A< 'A"J=JE%" M=I K"I=JEIB=?J%HO E" I%'A M=OIF JDA ANJH= ="@ /=HCA/O HA@K"< @="J %FAH=JE"C IOIJA' /=OAH KIA@ = /%J %B HAI%KH?AI %" = I'=// ?DEFL JDA gcc ?%'FE/AH KIA@ MEJD A+%I EI K"MEA/@O ="@ EJI CA"AH=JA@ ?%@A EI "%J F=HJE?K/=H/O C%%@: 6DAHAB%HA =I = IJAF J%M=H@I "=JELA 1"BAH"% %" JDA WE%I ="@ FAHD=FI ALA"JK=//O 2/=" ' =I MA//8 EJ IAA'I M%HJDMDE/A J% HAJ=HCAJ JDA 2/="'+ ?%'FE/AHJ%%/?D=E"B%HJDEIFH%?AII%H: 7IE"C JDA ANEIJE"C Y125 J%%/?D=E" =I = IJ=HJE"C F%E"J8 J% @=JA 1ߣLA FH%< @K?A@ = ?%'FE/AH8 =IIA'>/AH ="@ /E"1AH nc8 na8 ="@ nl B%H JDA '=NE'=/ WE%I lB8 ="@ =@@A@ E"IJHK?JE%" @EI=IIA'>/O H%KJE"AI J% JDA libmach /E>H=HO: .KJKHA M%H1 E"?/K@AI I%BJM=HA A'K/=JE%" %B JDA 'EIIE"C E"JACAH 'K/JEF/Ol@ELE@A E"IJHK?JE%"IB%HJDA WE%I lA8="@A'K/=JE%"%B @%K>/A FHA< ?EIE%" B/%=JE"C F%E"J JDA )/JAH= ?%HAI IKFF%HJ %"/O IE"C/A FHA?EIE%" ="@ $">EJ E"JACAH%FAH=JE%"IB%H=// FH%?AII%HI:

63

64 IX: A file protocol for NIX WIP

Francisco J. Ballsteros

ABSTRACT

It is common to use Plan 9 file servers through slow network connections. Tools like CFS, OP, and others try to help there. But it would be desirable to be able to work from remote terminals suffering poor-latency links, keeping coherency with a main file server when feasible, yet being able to work disconnected when there is no other way. IX is a protocol designed to connect a caching file system client with support for discon- nected operation to a remote file server. At present it is still work in progress. The imple- mentation is included in the distribution for NIX.

Problem statement We have been using the Octopus Protocol, OP [1], to connect to Plan 9 file servers over high-latency net- work links. But, while this protocol makes it feasible to operate on remote file servers with better perfor- mance than 9P, there are still problems: ࢫ There is no support for conditional retrieval of file contents. Caching clients might require to retrieve a particular file only if its own cached version is out of date. ࢫ There is no support for moving a file within the file hierarchy kept in the server without forcing the data to pass through the client. ࢫ Coherent operation can be improved. There is a coherency window but the protocol does not make a distinction between device files and regular files (such as those provided by fossil). The first issue is serious for clients that support disconnected operation, because they have, by definition, to be aggressive regarding data caching. The second issue is an optimization, but is important because the dif- ference in performance may be significant, and it is not unfrequent to move files among different directo- ries within the file server. The third issue is critical if the protocol must be able to operate on remote name spaces.

IX design IX is built by leveraging what we learned from Op, the existing code-base for 9P, and ideas as discussed previously in the community [2]. The protocol is built upon a few design guidelines: ࢫ The underlying transport is a reliable, ordered, connectionߞsimilar to a TCP streamߞ,withflow control for network congestion. ࢫ An RPC in the protocol is a series of elementary transactions. Such transactions are similar to 9P requests. IX is built upon the concept of connection channels. It is extremely cheap to build or dismantle a channel, so that it is reasonable to create one for each RPC. Channels are duplex, and inherit the reliability and ordering properties from the underlying transport. A single connection is multiplexed among multiple channels so that there is no starvation for sending or receiving through them. An IX client would create a new RPC by just creating a channel. This does not require communica- tion with the peer, and is a local operation. Then, one or more transaction requests would be sent through the new channel. The last one is flagged to indicate that the channel write direction can be closed when the

65 - 2 - request has been sent. Only the client can allocate new channel identifiers, which are local to the connection being multiplexed. An IX server receives requests through allocated channels and processes sequentially all requests for a given channel. It ceases to process them when one fails or when one is flagged to be the last one. What- ever happens first. Note that channels are different from 9P tags. Like tags, they identify a particular outstanding RPC, so that multiple RPCs may be in transit at the same time. But, unlike tags, channels permit huge amounts of data to be sent (concurrently with requests for other channels) and each direction in the duplex stream can be closed independently. Once a client has sent the desired transaction requests through a channel (or perhaps concurrently with them), a client receives through that channel individual replies for all transactions sent. An error reply to a transaction indicates that the RPC is finished, and the channel is closed. To identify files, IX relies on fids and qids, similar to those in 9P. But, unlike in 9P, the server defines which values are to be used for new fids. The client has to keep its own data structures for files, which means that it has no advantage by selecting fid numbers. On the other hand, the server might exploit fid values to improve the data structure used to keep and look up fids. Because a channel implies a context for individual transactions, it is feasible to simplify 9P transac- tions for use in IX to avoid unnecessary duplication through the wire. For example, once a fid has been established for an RPC, it is not necessary to repeat its value for each following transaction. The set of sim- plifications made is described in the next section. To support aggressive caching, a conditional transaction has been added to the set of 9P requests known by IX. This transaction, Tcond, asks the server if a piece of metadata for a file is the same, greater than, less than, or different than the given value. The same relational operation can be performed for multi- ple elements of the stat information for a given file. If the condition holds, the server replies with an Rcond reply. Otherwise, the server replies with an error indication; Thus, terminating the RPC.

IX Requests Using the syntax of intro(5) for 9P, this is the set of transactions known to IX:

Tversion msize[4] version[s] Rversion msize[4] version[s] Tauth afid[4] uname[s] aname[s] Rauth aqid[13] Rerror ename[s]

Similar to version, auth, and error messages in 9P.

Tattach afid[4] uname[s] aname[s] Rattach fid[4] qid[13]

Similar to 9P’s. But here the reply carries a value for the resulting fid. That fid is assumed as context for further transactions in the same RPC.

Tfid fid[4] cflags[1] Rfid

Defines fid as the fid to use for following transactions in the RPC. Also, this request can set or reset two different flags for such fid: OCEND and OCERR. Both are used to automatically clunk the fid. The former upon reaching the end of file on read transactions, the latter upon errors in the RPC.

Tclone cflags[1] Rclone newfid[4] Similar to the clone request in the original 9P. Unlike in that, the client only specifies flags for the new fid (see the previous request) and the server decides on the value for the new fid. Note that, as in many other transactions, the fid to use (to clone in this case) must be defined by previous requests in the RPC.

66 - 3 -

Twalk wname[s] Rwalk wqid[13]

Similar to the walk request in the original 9P. The implicit fid is walked to the given name.

Topen mode[1] Ropen qid[13] iounit[4] Tcreate name[s] perm[4] mode[1] Rcreate qid[13] iounit[4]

Similar to 9P’s counterparts, but using a implicit fid value. In particular, create would walk the implicit fid to the created file, and open it, when successful.

Tread nmsg[4] offset[8] count[4] Rread count[4] data[count] may be repeated

The read request exploits that requests are sent through channels. It permits specifying a maximum number of replies for the request. Each single reply may contain no more than count bytes. This grants the server rights to stream replies up to a given limit. Also, a side effect of the reply is that it may clunk the fid if it was OCEND.

Twrite offset[8] count[4] data[count] Rwrite count[4]

Similar to 9P’s write.

Tclunk Rclunk Tremove Rremove

These requests do not need any fields (other than their types), because the fid is implicit.

Tstat Rstat stat[n] Twstat stat[n] Rwstat

In these, an extra bit is used in the qid type, indicating if the file is (part of) a device. Such files should not be cached at all.

Tcond cond[1] stat[n] Rcond

The cond request converts IX requests into a microlanguage capable of making decisions. Here, cond is a relational operator and stat supplies one or more non-null fields for file metadata. The server is expected to apply the relational operator to each non-null field, and reply with Rcond only if the condition holds in all the cases. Otherwise, the server replies with an error indication: false.

Tmove tofid[4] Rmove

Moves the file identified by the implicit fid to the directory identified by tofid, if permissions permit. Should the name have to change, a separate Twstat request must be issued.

Examples This is an example retrieval for a file:

67 - 4 -

-ch0-> Tversion msize 8192 version ’ix’ |ch0-> Tattach afid -1 uname nemo aname main <-ch0- Rversion msize 8190 version ’ix’ <-ch0| Rattach fid 0 qid (0000000000000054 692693930 d)

-ch0-> Tfid fid 0 cflags 0 -ch0-> Tclone cflags 3 -ch0-> Twalk wname acme.dump -ch0-> Tstat -ch0-> Topen mode 0 |ch0-> Tread nmsg -1 offset 0 count 8190 <-ch0- Rfid <-ch0- Rclone newfid 1 <-ch0- Rwalk wqid (0000000000efd4d2 100 ) <-ch0- Rstat stat ’acme.dump’ ’nemo’ ’nemo’ ’nemo’ ... <-ch0- Ropen qid (0000000000efd4d2 100 ) iounit 0 <-ch0- Rread count 8185 ... <-ch0- Rread count 8185 ... <-ch0- Rread count 8185 ... <-ch0- Rread count 8185 ... <-ch0- Rread count 946 ... <-ch0| Rread count 0 ’’

Note that sending a Tcond request before the Tstat request in this example might change the dialog so that data and metadata would only be retrieved if, for example, the qid path or version had changed with respect to the ones given in Tcond. As an example of how the implementation for a client might look like, this is an excerpt from the client being used for testing:

ch = newch(cm); xtfid(ch, rootfid, 0); /* 0 == it’s not the last request */ xtclone(ch, OCEND|OCERR, 0); for(i = 0; i < nels; i++) xtwalk(ch, els[i], 0); xtstat(ch, 0); xtopen(ch, OREAD, 0); xtread(ch, -1, 0ULL, msz, 1); /* 1 == it’s the last request */ /* fid automatically clunked on errors and eof */ fd = -1; if(xrfid(ch) < 0){ fprint(2, "%s: fid: %r0, a); goto Done; } if(xrclone(ch) < 0){ fprint(2, "%s: clone: %r0, a); goto Done; } for(i = 0; i < nels; i++) if(xrwalk(ch, nil) < 0){ fprint(2, "%s: walk[%s]: %r0, a, els[i]); goto Done; }

68 - 5 -

if(xrstat(ch, &d, buf) < 0){ fprint(2, "%s: stat: %r0, a); goto Done; } if(xropen(ch) < 0){ fprint(2, "%s: open: %r0, a); goto Done; } offset = 0ULL; do{ m = xrread(ch); if(m == nil){ fprint(2, "%s: read: %r0, a); goto Done; } nr = wdata(fd, m->io->rp, nr, offset); offset += nr; freemsg(m); }while(nr > 0); Done: /* the channel is deallocated by now (a last request was sent and * a last reply was received */

Implementation status A server that exports its own namespace has been implemented for NIX. A client for testing that performs operations on a single file is also implemented. The actual caching client with support for disconnected operation is still under construction. See the nix distribution for access to the source code.

References 1. F. J. Ballesteros, G. Guardiola, E. Soriano and S. Lalis, Op: Styx batching for High Latency Links, IWP9, 2007. 2. J. Floren, R. Minnich and A. Mirtchovski, HTTP-like Streams for 9P, IWP9, 2010.

69

70 wdfs −A WebDav filesystem client

Steve Simon

ABSTRACT

6DA @AIEC" ="@ E'F/A'A"J=JE%" %B = 9A>,=L BE/AIOIJA' ?/EA"J B%H F/="' EI @AI?HE>A@ J%CAJDAH MEJD ?KHHA"J ="@ F%IIE>/A BKJKHA ?D="CAI J% E'FH%LAEJIFAHB%H'="?A:

1. Introduction 6DAHA M=I = B/KHHO %B AN?EJA'A"J =>%KJ 9A>,=L E" JDA /=JA ''I MEJD JDA D%FA JD=J EJ M%K/@ >A?%'A = IJ="@=H@ B%H HA'%JA MA> =KJD%HE"C8 ="@8 MEJD JDA =@@EJE%" %B ,A/J=8 8 LAHIE%" ?%"JH%/: 1J D=I IE"?A >AA" ME@A/O E'F/A'A"JA@ EJ D=I IAA" KIA =I = '%HA CA"AH=/ HA'%JA BE/A =??AII FH%J?%/ E" I%'A =HA=IL ) 9A>,=L IAHLAH EI ALA" =L=E/=>/A %" F/="' KIE"CJDA2AC=IKI0662IAHLAH: 9A>,=L KIAI =" ANJA"IE%" %B JDA 0662 FH%J%?%/ J% IA"@ I'=// :YJ I"EFFAJI IAF?EBOE"C JDA JH="I=?JE%"I HAGKEHA@8 JDKI ="O F/="' 9A>,=L E'F'A"J=JE%" ME// "AA@ =" :YJ ! F=HIAH:

1.1. XML parser ) ,MY '%@A/ :YJ F=HIAH M=I MHEJJA" B%H ="%JDAH FH%KA?J ="@ =@=FJA@ J% JDA "AA@I %B F=HIE"C = "AJM%H1 IJHA=': ,MY '%@A/ F=HIAHI HA=@ =" :YJ BE/A E"J% /E"1A@ @=J= IJHK?< JKHAIE"'A'%HO="@"AA@%"/O%"AF=II%LAHJDAEHE"FKJ: 6DA F=HIAH EI ?%'F/AJA ="@ IJ=>/A: 6DA :YJ F=HIAH =??AFJI IJ="@=H@ A"JEJO HABAHA"?AI8 2+,)6)8 =JJHE>KJAI ="@ L=/KAI8 ="@ FHAIAHLAI JDA A/A'A"J DEAH=H?DO: +%''A"JI =HA A/E@A@ ="@ JDAHA EI >=IE? IKFF%HJ B%H :YJ "='AIF=?AI: 1J @%AI "%J ?KHHA"J/O IKFF%HJ +,)6)%H=JJA'FJL=/E@=JE%"=C=E"IJ=I?DA'=%H,6,: 6DA ,MY '%@A/ =//%MI IE'F/A JH=LAHI=/ %B JDA DEAH=H?DO >KJ FKJI /=HCA @A'="@I %" JDA '=//%?/E>H=HOB%HEJI@=J=IJHK?JKHAI: -NFAHEA"?A D=I ID%M" JD=J EB =JJHE>KJA "='AI ="@ L=/KAI =HA DA/@ E" = HABAHA"?A ?%K"JA@ JHAA ="@ IJHE"C DA=F HAIFA?JELA/O JDEI FH%>/A' ?=" >A 'E"E'EIA@: 6DEI EI "%J @%"A E" wdfs =IJDAN'/I"EFFAJI=HA"ALAH>ECA"%KCDJ%M=H="JJDA%FJE'EI=JE%":

2. Webfs extensions Webfs 8JDA F/="' 0662 ?/EA"J =FF/E?=JE%"8 D=@ J% >A '%@EBEA@ E" IALAH=/ =HA=I J% IKFF%HJ 9A>,=LF ߦ 5KFF%HJJDA"AM9A>,=L'AII=CAJOFAI ߦ -NF%IA'%HA0662DA=@AHE"B%H'=JE%" ߦ 1'FH%LAMA>BIߣI=KJDA"JE?=JE%"?%LAH=CA@ECAIJ=@@A@I%B=H ߦ 5KFF%HJ?DK"1A@A"?%@E"C8KIA@>O'="O9A>,=LIAHLAHI -LAHO =JJA'FJ M=I '=@A J% @% JDEI E" = IO'F=JDAJE? '=""AH >KJ EJ EI IJE// "%J ?/A=H MDAJDAH JDA @AIEC" %B webfs =I = IAFAH=JA =FF/E?=JE%" H=JDAH JD=" = /E>H=HO EI JDA ?%HHA?J M=OJ%FH%?AA@:

71 < <

3. 9P file server ) B=EH/O JH=@EJE%"=/ 'K/JEJDHA=@A@ BE/A IAHLAH M=I MHEJJA" >=IA@ %" JDA /E>'F /E>H=HO E" JDA F/="'@EIJHE>KJE%"8JDEIF=HJ%BJDAIOIJA'FHAIA"JA@/EJJ/A@EBBE?K/JO:

4. WebDav protocol variations )I wdfs M=I JAIJA@ =C=E"IJ '%HA IAHLAHI EJ I%%" >A?='A =FF=HA"J JD=J JDA 9A>,=L FH%< J%?%/ EI "%J =I @AJ=E/A@ =I %"A 'ECDJ /E1A: 5E'F/A =JJHE>KJAI '=O >A IKFF%HJA@ @EBBAHA"J/O %" A=?D IAHLAH D B%H AN='F/A = HA=@%"/O B/=C %" = BE/A8 ="@ %JDAHI %"/O =FFA=H MDA" JDA IAHLAH EI E" = IFA?EBE? '%@A YE?H%5%BJࡊ 5D=HA2%E"J: )I = HAIK/J wdfs =/M=OI FH%LE@AI = HA=I%"=>/A 'E"E'K' BA=JKHA IAJ ߝ HAF%HJE"C BE/A %M"AHIDEF8 HA=@%"/O B/=CI ="@8 /=IJ =??AIIJE'AIߝ =@@E"C%JDAH'AJ=@=J=MDAHA=L=E/=>/A: 6DA '%IJ @EI=FF%E"JE"C L=HE=JE%" M=I JDA E"=>E/EJO %B I%'A IAHLAHI J% IKFF%HJ /-6 %H 276 'AJD%@I MEJD = H="CA IFA?EBE?=JE%": 6DA JDA A"JEHA BE/A 'KIJ >A JH="IBAHA@ =I = ?%'< F/AJA BE/A HA=@D=DA=@ %H MHEJAD>ADE"@: 6D%KCD JDEI E'FH%LAI %LAH=// JDH%KCDFKJ EJ E"?HA=IAI /=JA"?O '=1E"C IE'F/A A@EJI %" /=HCA BE/AI F=E"BK/: .KHJDAH'%HA JDAHA@%AI"%J IAA'J%>A=M=OJ%@AJA?JHA/E=>/OMDAJDAHJDEIBA=JKHAEIIKFF%HJA@%H"%J: )I MA F=O IK?D = FA"=/JO 'EIIE"C JDEI BA=JKHA %" I%'A IAHLAHI = ?%''="@ /E"A %FJE%" EI =L=E/=>/A J% A"=>/A F=HJE=/ MHEJAI %H HA=@I KIE"C = H="CA IFA?EBEAH MDAHA JDAO =HA 1"%M" J%>A=L=E/=>/A:

5. Performance enhancement 6DA FAHB%H'="?A %B webfs ?=" =FFA=H B=EH B%H /%?=/ BE/A IAHLAHI %H @HA=@BK/ B%H HA'%JA %H I/%M%"AI8JDAHA=HAIALAH=/HA=I%"IB%HJDEI: 466 J=HCA H%K"@DJHEF JE'AI I/%M HA'%JA BE/AIOIJA' HAIF%"IA: M"A %>LE%KI I%/KJE%" EI J% 'AHCA HAGAIJI MDAHA F%IIE>/A8 I%'JDE"C JDA FH%J%?%/ =//%MI: ) IE'F/A E'F/A< 'A"J=JE%" M%K/@ >A J% IA"@ = 'F M=/1 HAGKAIJ =I = IE"C/A JH="I=?JE%" D E'F/A'A"J< E"CJDAM=/1E"JAHB=?AJ%/E>'FH=JDAHJD="M=/1 : 4A=@D=DA=@ 4A=@D=DA=@ ?%K/@ >A KIA@ J% =IO"?DH%"%KI/O JH="IBAH '%HA %B = BE/AI ?%"JA"JI MDA" %"/O = I'=// ='%K"J D=I >AA" HAGKAIJA@ E" JDA JH=@EJE%"=/ '=""AH: 6DEI EI =/HA=@O FAHB%H'A@ J% JDA ANJA"J %B H%K"@E"C KF JH="IBAHI J% &m>OJAI ="@ IAHLE"C HA=@I BH%' = /%?=/ >KBBAH: 6DEI JA?D"EGKA ?%K/@ >A ANJA"@A@ J% HAGKAIJE"C = @EHA?< J%HOI?="%BJDAJAH'E"=/@EHA?J%HO%B=M=/18E"JDAD%FAJD=JEJ'ECDJ>A"AA@A@: C3EF?%"JA"JDA"?%@E"C +KHHA"J/O ?%'FHAIIA@ A"?%@E"C I?DA'AI =HA "%J IKFF%HJA@ >O webfs 8 JDAIA ?%K/@ E'FH%LA HAIF%"IA MDA" B=?A@ MEJD /%M >="@MEJD?%""A?JE%"I8JD%KCDJDEIEI/AII%B =FH%>/A'JDAIA@=OI="@I%EJM=I"%J?%"IE@AHA@=FHE%HEJO: 2AHIEIJA"J0662?%""A?JE%"I +KHHA"J/O MA>BI @%AI "%J IKFF%HJ FAHIEIJA"J 6+2 IAIIE%"I8 JDKI JDAHA EI JDA IEC"EBE< ?="J6+2IAJKF="@JA=H@%M"JE'A?%IJJ%A=?DJH="I=?JE%":

5% B=H %"/O =" ANFAHE'A"J=/ L%/=JE/A 'AJ=@=J= ?=?DA D=I >AA" MHEJJA": 6DEI IJ%HAI %"/O JDA HAIK/JI %B M=/1I ="@ @EHA?J%HO I?="I: 6DEI IE'F/A IJAF FH%LE@A@ = IEC"EBE?="J E'FH%L< 'A"J J% JDA FAH?AELA@ FAHB%H'="?A %B webfs : 6DA ?=?DA KIAI = FK>/EIDA@ DAKHEIJE? MDE?D=JJA'FJIJ%HA@K?AJDA?D="?AI%BA"JHEAI>A?%''E"CIJ=/A:" :

6. Applications Wdfs D=IB%K"@I%'AK"ANFA?JA@KIAIE"@=E/O/EBA: 1J>A?%'AI=HA=@%"/O58W?/EA"J B%H F/="' D = 9A>,=L IAHLAH EI F=HJ %B ALAHO 58W E"IJ=//=JE%" ="@ ANFAHEA"?A D=I ID%M" EJ EI CA"AH=//OA"=>/A@:

72 <!<

8A"JE I?%HA IJ%H=CA D IALAH=/ ?/%K@ IJ%H=CA FH%LE@AHI8#8 $ %BBAH 9A>,=L J% =??AII JDAEH IJ%H=CA8 ="@ ALA" =//%M KIAHI BHAA =??AII J% = BAM /EC= >OJAI: 6DA =KJD%H KIAI %"A %B JDAIAJ%1AAFDEILA"JEI?%HAI: 6M% %JDAH 'E/@/O ='KIE"C J%%/I D=LA =/I% IFK" %BB BH%' JDEI M%H1F =" :YJ HADE"@A"JAH8 ="@="N'/J%B/=JBE/A?%"LAHJAHLIE'E/=HJ%JDA/E"KN=FF/E?=JE%"N'/  :

7. References

: TTP Extensions for Web Distributed Authoring and Versioning (WebDAV), 1-6. iK" %: 4.+"' &@H=BJ : Versioning Extensions to WebDAV (Web Distributed Authoring and Versioning), 1-6. Y=H  : 4.+! #!@H=BJ !: 6E'*H=O8iA="2=%/E8+:Y:5FAH>AHCDY?3KAA"8-LA Y=/AH .H="x%EI ;AHCA=K8 Extensi- ble Markup Language (XML) 1.0, 9!+W%L &: ": 8E"?A"J +=JA:8 ߢߢ)/AN D = //%>=/ .E/AIOIJA':8ߣߣ In Proceedings of the 1992 USENIX File System Workshop8FF: D Y=O '' : #: DJJFFll>%N:"AJ: $: DJJFFllMMM:'O@HELA:?%':

73

74 Wsys(4): hosted window system

Jesús Galán López [email protected]

ABSTRACT

Wsys(4) EI = FH%CH=' MDE?D IAHLAI = '2 BE/A IOIJA' IE'E/=H J% JDA K"E%" %B rio(4) ="@ draw(3). 1JI E"JAHB=?A EI IE'E/=H J% rio(4), >KJ MIOI ME"@%MI =HA ?HA=JA@ E" = D%IJ IOIJA'8 EA: JDAO =HA : ME"@%MI E" 7"EN JDA %"/O ANEIJE"C E'F/A'A"J=JE%" B%H JDA '%'A"J: 7IE"C wsys, JDA ME"@%M '="=CAH %B JDA D%IJ IOIJA' ?=" >A KIA@ J% '="EFK/=JA ME"@%MI HK""E"C =FF/E?=JE%"I %" JDA D%IJA@ IOIJA'8 E"IJA=@ %B IE'F/O A'K/=JE"C = I?HAA" E" = IE"C/A ME"@%M: 9IOI EI >KE/J %" J%F %B I%'A 1"BAH"% /E>H=HEAI ="@ J=1AI I%'A /AII%"I ="@ '="O /E"AI %B ?%@A BH%' JDA : LAHIE%" %B F'FߣI devdraw(1).

1. Introduction: hosted drawing devices 'LN8@H=MJAH' ="@ D%IJA@ 1"BAH"% =// ID=HA JDA "AA@ %B = drawing device E" JDA D%IJ IOI< JA': 6DEI @ALE?A "AA@I J% ?%''K"E?=JA MEJD JDA D%IJ ME"@%ME"C IOIJA' : 8 9E"< @%MI8 +%?%= ="@ IAHLA = '2 BE/A IOIJA': Mouse ="@ cons @ALE?AI (pointer ="@ keyboard E" JDA ?=IA %B 1"BAH"% "AA@ J% HA=@ ALA"JI BH%' JDA D%IJ IOIJA' ="@8 =C=E"8 IAHLA I%'A BE/AI: ) IE'E/=H BK"?JE%" EI FAHB%H'A@ E" 2/=" ' >O rio(4) 8 MDE?D IAHLAI BE/AI AGKEL=/A"J J% JD%IA %B JDA "=JELA @ALE?AIJ%ALAHOME"@%M AN?AFJ draw(3) 8MDE?D 'K/JEF/ANAIEJIA/B: 1" = D%IJA@ IOIJA' 'LN8 @H=MJAH'8 A'K8 '%KIA8 1AO>%=H@ ="@ @H=ME"C @ALE?AI =HA E'F/A'A"JA@ =I F=HJ %B JDA 1AH"A/: 5/ECDJ/O @EBBAHA"J LAHIE%"I %B JDA I='A ?%@A =HA E"?/K@A@E"A=?D %B JDAIA FH%CH='I: 6DEI ?%@A E"?/K@AI I%'A F%HJ=>/A /E>H=HEAI ="@ =/I% = IOIJA' @AFA"@A"J F=HJ: *KCI FH%F=C=JA =J @EBBAHA"J H=JA JD=" >KCBENAI ="@ EJ EI @EBBE< ?K/J J% 1AAF JDA =// JDA LAHIE%"I E" IO"?: )@@EJE%"=/O8 E" JDA ?=IA %B : 8 'K/JEJDHA=@A@ =FF/E?=JE%"I ?=" >A FH%>/A'=JE?: )I = HAIK/J8 EJ EI '%HA ?%"LA"EA"J J% HK" JDA : @AFA"< @A"J ?%@A E" = @EBBAHA"J FH%?AII: 6DEI I%/KJE%" EI FKJ E" FH=?JE?A E" F'F8 MDE?D KIAI devdraw(1) J%E"JAH=?J MEJDJDA D%IJ ME"@%M IOIJA': ) IE'E/=H =FFH%=?D EI J=1A" >O wsys(4) =/JD%KCD8 ?%"JH=HO J% devdraw(1), wsys @%AI "%J KIA = ?KIJ%' FH%J%?%/: 1"IJA=@8 EJ IAHLAI = '2 BE/A IOIJA' IE'E/=H J% JDA %"A B%K"@ E" rio(4). .ECKHA ID%MI D%M wsys(4) HK"I J%CAJDAH MEJD = D%IJA@ IOIJA' J=1E"CJDA H%/A %B I%'A 1AH"A/ @ALE?AI:

2. Wsys 9DA" HK"8 wsys F%IJI = D="@/AH J% = '2 IAHLAH >O @AB=K/J E" $NAMESPACE, =I F'F ="@ /E>ENF @%8 %H %FJE%"=//O /EIJA"I BH%' = F%HJ: Y%K"JE"C EJ EI ="=/%C%KI J% '%K"JE"C JDA wsys IAHLE?A FH%LE@A@ >O rio(4), MEJD JDA F=HJE?K/=HEJO JD=J ME"@%MI =HA "%J ?HA< =JA@ E" =" =FF/E?=JE%" ME"@%M %H = JAH'E"=/ I?HAA"8 >KJ E" JDA D%IJ ME"@%M IOIJA':

75 0%IJA@5OIJA' 'LNl@H=MJAH'l1"BAH"% 9P )FF/E?=JE%"I 9IOI 9P mAH"A/lA'K 2%HJ=>/A?%@A

2%HJ=>/A?%@A 5OIJA'@AFA"@A"J ?%@AN/E> 5OIJA'@AFA"@A"J ?%@AN/E> X protocol

0%IJ 9E"@%M 5OIJA': 

0%IJ MFAH=JE"C5OIJA'JE"KN

.ECKHA : 1" = D%IJA@ IOIJA' @H=MJAH'8 'LN %H 1"BAH"% 1AH"A/ @ALE?AI ?%"J=E" IOIJA' @AFA"@A"J ?%@A MDE?D ?%''K"E?=JAI MEJD JDA D%IJ ME"@%M IOIJA' :/E> ?%@A E" JDA ?=IA %B JDA : LAHIE%": Wsys(4) %BBAHI = IE'E/=H BE/A IOIJA' BH%' = @EBBAHA"J FH%?AII MDE?D /AJI D%IJA@ =FF/E?=JE%"I J% KIA ME"@%MI E" JDA D%IJ IOIJA' JDH%KCD = '2 ?%""A?JE%": )I = HAIK/J8 JDA ?%@A @AFA"@A"J %" JDA D%IJ ME"@%M IOIJA' ?=" >A J=1A" %KJ %B JDA 1AH"A/

Y%IJ %B draw(3)="@ rio(4) =FF/EAI J% wsys. 9DA" '%K"JA@8 = "AM ME"@%M EI ?HA< =JA@ ="@ =" A"JHO EI =@@A@ J% JDA wsys/ @EHA?J%HO ?%''%" J% =// JDA ?/EA"JI: .E/AI E" draw/ %H JDA @ALE?A ="@ ?J/ BE/AI (cons, mouse, wctl, label, snarf, ...) M%H1 =IANFA?JA@: 0%MALAH8JDAHA =HA = BAM @EBBAHA"?AI: Wsys HK"I %" JDA D%IJ8 I% EJ ?=""%J ?HA=JA %H BE"EID FH%?AIIAI %" JDA D%IJA@ IOIJA': .%H AN='F/A8 MDA" '%K"JA@ BH%' 'LN8 wsys ?=""%J ?HA=JA "AM FH%?AIIAI E"IE@A 'LN8 %H 1E// ="O FH%?AII MDA" = ME"@%M EI ?/%IA@: +HA=JE"C "AM FH%?AIIAI EI =?JK=//O "%J AIIA"JE=/8 >A?=KIA JDA 'AJD%@ KIA@ >O window −m EI A"%KCD J% KIA wsys. 6DA kill BE/A8 @EI?KIIA@ /=JAH8 EI KIA@ B%H FH%?AII JAH'E"=JE%": )I =" =@@EJE%"=/ KJE/EJO8 wsys EI @EIJHE>KJA@ MEJD = wctl H? I?HEFJ MDE?D ?=" >A HK" BH%' 'LN %H @H=MJAH' J% FH%LE@A = wctl IAHLE?A8="@>A =>/A J%KIA window MEJD%KJ JDA −m B/=C: )"%JDAH @EBBAHA"?A MEJD rio EI JD=J wsys, MDA" '%K"JA@ MEJD JDA =JJ=?D IFA?EBEAH /, ME// "%J ?HA=JA = "AM ME"@%M: 1" JDEI ?=IA8= @EBBAHA"J BE/A IOIJA'EIIAHLA@8?%"IEIJE"C%" JDA wsys/ @EHA?J%HO MEJD IK>@EHA?J%HEAI B%H A=?D %FA" ME"@%M8 JDA ?%''%" draw/ @EHA?J%HO MEJD%KJ new BE/A8 = snarf BE/A8 ="@ = kill BE/A: 4A=@E"C JDA kill BE/A >/%?1I K"JE/ = ME"@%M EI ?/%IA@8 ="@ JDA" HAJKH"I JDA pid CELA" E" JDA =JJ=?D IFA?EBEAH MDA" JD=J ME"@%M M=I ?HA=JA@: 6DEI BE/A EI HA=@ >O JDA wctl I?HEFJ J% 1E// FH%?AIIAI %B @A/AJA@ ME"@%MI: 6DA snarf BE/A8 MDE?D EI KIK=//O =II%?E=JA@ MEJD JDA '%KIA E" 2/=" '8 EI IAHLA@ BH%' wsys MEJD%KJ >AE"C =II%?E=JA@ J% ="O ME"@%M: 6DEI EI I% E" ?=IA I%'A FH%CH='B%HAN='F/A8JDA F/K'>AHEIE"JAHAIJA@ E" =??AIIE"C JDA ?/EF>%=H@ MEJD%KJ D=L< E"CJ%?HA=JA = @K''OME"@%M:

2.1. Implementation Wsys EI >KE/J %" J%F %B ANEIJE"C JA?D"%/%CEAI: 8AHO BAM ?%@A D=@ J% >A MHEJJA" BH%' I?H=J?D: 1J E"?/K@AI I%'A >EJI BH%' 1"BAH"%8 I%'A >EJI BH%' F'F '%IJ %B JDA' BH%' @AL@H=M8 I%'A BH%' HE%8 I%'A BH%' 'LN8 ::: 6DA HAIK/J %B JDEI ?%'>E"=JE%" EI =?JK=//O =

76 GKEJA IE'F/A FH%CH='8 MDE?D EI '%@K/=H ="@ F%HJ=>/A8 ="@ @%AI JDA K%> B%H MDE?D EJ M=I ?HA=JA@: 9IOI '=1AI KIA %B = BAM 1"BAH"% /E>H=HEAIF lib9 FH%LE@AI JDA >=IE?I8 MDE/A libdraw, libmemdraw ="@ libmemlayer =HA HAIF%"IE>/A %B @H=ME"C %" 'A'%HO HACE%"I FH%< LE@A@ >O JDA IOIJA' @AFA"@A"J ?%@A: 6DAIA /E>H=HEAI =HA =/I% F=HJ %B emu ="@8 JDAHA< B%HA8D=LA =/HA=@O>AA"F%HJA@J%= "K'>AH%B IOIJA'I="@=HA MA// JAIJA@: JE>"E"AF EI JDA /E>H=HO HAIF%"IE>/A %B IAHLE"C JDA '2 FH%J%?%/: 6DEI /E>H=HO EI E" B=?J =" ANJA"@A@ LAHIE%" %B libstyx(10), E"?/K@A@ MEJD 1"BAH"%: Libninep =@@I J% libstyx %KJ %B %H@AH HAGKAIJI8 >E"@E"C =J JDA BE/A JHAA @ABE"EJE%" /ALA/8 ="@ '%HA ?%"< JH%/ J%FH%?AIIHAGKAIJIMEJD%KJ KIE"CDA/FAHBK"?JE%"I: 6DA %"/O LAHIE%" %B wsys =L=E/=>/A B%H JDA '%'A"J HK"I %" J%F %B : : 6DA :/E> @AFA"< @A"J ?%@A D=I >AA" '%IJ/O J=1A" BH%' F'FߣI @AL@H=M8 >KJ =/I% BH%' 1"BAH"% ="@ 'LN: 6DA "%"DF%HJ=>/A ?%@A EI ?/A=H/O IAF=H=JA@ BH%' JDA HAIJ8 E" %H@AH J% '=1A F%HJE"C J% %JDAHIOIJA'IA=IEAH: 6DA HAIJ %B wsys EI I%'A ?%@A BH%' rio B%H '="=CE"C ME"@%MI ="@ = >EJ %B C/KA J% 1AAF=// JDA F=HJIJ%CAJDAH:

3. Status and further work Wsys EI IJE// AL%/LE"C8 >KJ EJ =/HA=@O EI E" = GKEJA KI=>/A IJ=JA: 0%MALAH8 EJ ME// "%J ID%M =// EJI F%JA"JE=/ K"JE/ JDAHA =HA LAHIE%"I B%H %JDAH IOIJA'I: M"?A M5 : ="@ 9E"@%MI =HA IKFF%HJA@8 wsys ?%K/@HAF/=?A = >EC='%K"J %B ?%@A E"1"BAH"%8@H=MJAH'="@'LN: .%HJDA '%'A"J8JDA : LAHIE%"%B wsys IJE// D=LA I%'A FH%>/A'IF HAIE3E"C ?=" /A=LA = ME"@%M >/="18 JDA 1AO>%=H@ ?=" B=E/ MDA" C%E"C >=?1 ="@ B%HM=H@ %B BK//I?HAA" '%@A8 ANEJE"C FH%CH='I @% "%J =/M=OI @A/AJA JDA ME"@%M::: 6DAIA >KCI =HA "%J BHAGKA"J8 >KJ JDAO?="D=FFA": WALAHJDA/AII8 wsys ?=" >A KIA@ MEJD 'LN %H @H=MJAH' MEJD HA=I%"=>/A IK??AII: 9EJD JDA DA/F %B JDA wctl I?HEFJ JDA KI=CA %B wsys BAA/I LAHO "=JKH=/ BH%' JDA F%E"J %B LEAM %B >%JDJDA 7"END%IJ ="@JDA D%IJA@2/="'IOJA': 1"BAH"% =FF/E?=JE%"I @% "%J KIK=//O IFA=1 9P @EHA?J/O MEJD @ALE?AI8 ="@ E"IJA=@ JDAO KIA wm(1). 0%MALAH8 wsys ?=" >A KIA@8 B%H AN='F/A8 J% /=K"?D IALAH=/ wm E"IJ="?AI E" @EBBAHA"J ME"@%MIF ; mount −Ab ’#U*’/tmp/ns.$user.$DISPLAY/wsys /dev ; wm/wm & MJDAH F%IIE>E/EJEAI =HA J% KIA 1"BAH"% =I = drawterm HAF/=?A'A"J KIE"C wsys ="@ 9cpu, %H J% KIA wsys E" =" 7"EN IOIJA' J% HK" =FF/E?=JE%"I BH%' = hellaphone E" : ME"@%MI8B%HAN='F/A: 2/="'F%HJ =/I% E"?/K@AI ?%@A J% @A=/ MEJD JDA D%IJ ME"@%M IOIJA'8 >KJ EJ ?=""%J @EHA?J/O KIA wsys, IE"?A EJ ?KHHA"J/O KIAI EJI %M" FH%J%?%/ E"IJA=@ %B '2: 5ALAH=/ I%/KJE%"I =HA F%IIE>/A8>KJ "%"A %B JDA'D=I>AA"JHEA@OAJ:

4. Acknowledgements 6DEI M%H1 EI JDA HAIK/J %B = /%%C/AߣI 5K''AH %B +%@A /5%+ FH%KA?J: 6D="1I J% ALAHO< >%@O E"IE@A /%%C/A ="@ plan9−gsoc B%H '=1E"C EJ F%IIE>/A: 5FA?E=/ JD="1I J% +D=H/AI .%HIOJD B%H 'A"J%HE"C JDA FH%KA?J: 6D="1I =/I% J% JDA %HECE"=/ =KJD%HI %B =// JDA ?%@A KIA@ E" JDA @ALA/%F'A"J %B MIOI: 6DAO =HA JDA =KJD%HI %B MIOI J%% >KJ >KCI =HA FH%>=< >/O'E"A:

77