From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Original-To: caml-list@yquem.inria.fr Delivered-To: caml-list@yquem.inria.fr Received: from nez-perce.inria.fr (nez-perce.inria.fr [192.93.2.78]) by yquem.inria.fr (Postfix) with ESMTP id D6ACCBB91 for ; Tue, 26 Jul 2005 09:25:37 +0200 (CEST) Received: from pauillac.inria.fr (pauillac.inria.fr [128.93.11.35]) by nez-perce.inria.fr (8.13.0/8.13.0) with ESMTP id j6Q7PbPj012390 for ; Tue, 26 Jul 2005 09:25:37 +0200 Received: from concorde.inria.fr (concorde.inria.fr [192.93.2.39]) by pauillac.inria.fr (8.7.6/8.7.3) with ESMTP id JAA32693 for ; Tue, 26 Jul 2005 09:25:36 +0200 (MET DST) Received: from wetware.wetware.com (wetware.wetware.com [209.218.58.1]) by concorde.inria.fr (8.13.0/8.13.0) with ESMTP id j6Q7PYPK008593 for ; Tue, 26 Jul 2005 09:25:35 +0200 Received: from [69.12.155.90] (helo=[10.0.1.6]) by wetware.wetware.com with esmtp (Exim 4.43) id 1DxJoT-0005Y6-L7; Tue, 26 Jul 2005 00:25:18 -0700 Mime-Version: 1.0 (Apple Message framework v733) To: Ocaml Trade , The Caml Hump , OCNAE Help Message-Id: <75747C28-11D3-4EBE-AEF8-8C94995F600C@wetware.com> Content-Type: multipart/mixed; boundary=Apple-Mail-9-174110038 From: james woodyatt Subject: ANNOUNCE: OCaml NAE release cf-0.7 and iom-0.2 Date: Tue, 26 Jul 2005 00:25:14 -0700 X-Mailer: Apple Mail (2.733) X-Miltered: at nez-perce with ID 42E5E571.000 by Joe's j-chkmail (http://j-chkmail.ensmp.fr)! X-Miltered: at concorde with ID 42E5E56E.001 by Joe's j-chkmail (http://j-chkmail.ensmp.fr)! X-Spam: no; 0.00; woodyatt:01 jhw:01 wetware:01 ocaml:01 everyone--:01 ocaml:01 heap:01 red-black:01 binary:01 associative:01 red-black:01 binary:01 catenable:01 deque:01 parsing:01 X-Attachments: type="application/octet-stream" name="CHANGES cf-0.7" name="CHANGES cf-0.7" type="application/octet-stream" name="CHANGES iom-0.2" name="CHANGES iom-0.2" X-Spam-Checker-Version: SpamAssassin 3.0.3 (2005-04-27) on yquem.inria.fr X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=disabled version=3.0.3 --Apple-Mail-9-174110038 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=US-ASCII; delsp=yes; format=flowed everyone-- Today, the OCaml Network Application Environment (NAE) has released maintenance updates of two of its published libraries. As its project page on SourceForge.Net says, OCaml NAE is "a collection of Objective Caml libraries to support the development of concurrent, single-threaded Internet application servers." For downloads and more information, please see: The two libraries updated in this release are the Core Foundation (cf) and the Reactive I/O Monad (iom). The cf library was formerly known as the Pagoda Core Foundation. The complete CHANGES records for both libraries since their previous releases follows excerpts of the README files. ===== OCaml NAE Core Foundation (cf) library ===== This distribution is the Objective Caml Network Application Environment (NAE) Core Foundation library, which is a collection of miscellaneous extensions to the Objective Caml standard library. Highlighted features include: - Functional streams and stream processors (extended). - Functional bootstrapped skew-binomial heap. - Functional red-black binary tree (associative array). - Functional sets based on red-black binary tree. - Functional real-time catenable deque. - Functional LL(x) parsing using state-exception monad. - Functional lazy deterministic finite automaton (DFA). - Functional lexical analyzer (using lazy DFA and monadic parser). - Functional substring list manipulation (message buffer chains). - Gregorian calendar date manipulation. - Standard time manipulation. - System time in Temps Atomique Internationale (TAI). - Unicode transcoding. - Extended socket interface (supports more options, and UDP w/ multicast). - Universal resource identifier (URI) manipulation. - I/O event multiplexing (with Unix.select). Note: see the ISSUES file for a list of open problems in this release. ===== Required Components ===== This library requires the following external components: - Objective Caml (v3.08.3 or newer) - Findlib (tested with v1.0.4) Principal development was on Mac OS X 10.3 and Mac OS X 10.4 w/ XCode 2.1 using GCC 4.0. The final version of this library also compiled successfully and passed all self-tests without warnings on Suse Linux 9.2 for x86-32. Other platforms with POSIX-like environments should require only a minimal porting effort. One major open issue: the extended socket interface is broken under WIN32. (The author invites help porting the library to other environments.) ===== OCaml NAE Reactive I/O Monad (iom) library ===== This distribution is the Objective Caml Network Application Environment (NAE) Reactive I/O Monad library, which implements I/O monad functions designed to facilitate writing of concurrent, reactive, single-threaded network application services in a functional style. Note: see the ISSUES file for a list of open problems in this release. ===== Required Components ===== This library requires the following external components: - Objective Caml (v3.08.3 or newer) - Findlib (v1.0.4) - OCaml NAE Core Foundation (cf-0.7) Principal development was on Mac OS X 10.3 and Mac OS X 10.4 w/ XCode 2.1 using GCC 4.0. The final version of this library also compiled successfully and passed all self-tests without warnings on Suse Linux 9.2 for x86-32. Other platforms with POSIX-like environments should require only a minimal porting effort. ===== CHANGES ===== --Apple-Mail-9-174110038 Content-Transfer-Encoding: quoted-printable Content-Type: application/octet-stream; x-unix-mode=0644; name="CHANGES cf-0.7" Content-Disposition: attachment; filename="CHANGES cf-0.7" =3D=3D=3D=3D=3D=20OCaml=20NAE=20Core=20Foundation=20(cf)=20library=20= =3D=3D=3D=3D=3D=0A=0AThis=20file=20describes=20in=20technical=20detail=20= the=20functional=20differences=20between=0Areleased=20versions=20of=20= the=20library.=0A=0A=0A=3D=3D=3D=3D=3D=20Version=200.7=20=3D=3D=3D=3D=3D=0A= =0AHighlights=20of=20the=20changes:=0A=0A+=20Some=20very=20minor=20bugs=20= fixed.=0A+=20Minor=20performance=20and=20improvements.=0A+=20Additions=20= to=20[Cf_parser]=20interface.=0A+=20Minor=20modifications=20to=20= [Cf_parser]=20and=20[Cf_lex]=20interfaces.=0A+=20New=20module=20= [Cf_machine]:=20object-oriented=20layer=20over=20[Cf_gadget].=0A+=20= Removed=20trailing=20underscores=20from=20private=20methods=20defined=20= in=20class=20types=0A=20=20for=20the=20purpose=20of=20establishing=20a=20= convention.=0A=0A---=20[Cf_parser]=0A=20=20=20=20Fixed=20[to_extended]=20= to=20work=20given=20the=20new=20physical=20equality=20rules=20enforced=0A= =20=20=20=20by=20Ocaml-3.08.X.=20=20Still=20need=20to=20write=20a=20test=20= case=20for=20this.=0A=20=20=20=20Added=20[Error]=20exception=20and=20two=20= new=20functions,=20[err]=20and=20[req],=20to=20the=20[X]=0A=20=20=20=20= module.=20=20They=20do=20the=20expected=20thing.=0A=20=20=20=20Changed=20= the=20[err=20f]=20function=20to=20[err=20?f=20()]=20instead.=0A=0A---=20= [Cf_lex]=0A=20=20=20=20Change=20name=20of=20[line_cursor]=20class=20to=20= [cursor]=20for=20simplicity.=0A=0A---=20[Cf_message]=0A=20=20=20=20Fixed=20= [normalize]=20so=20that=20it=20works=20even=20when=20compiled=20with=20= -unsafe.=0A=20=20=20=20Improved=20performance=20of=20[normalize]=20by=20= verifying=20the=20list=20before=20filtering.=0A=0A---=20= [Cf_flow,Cf_rbtree,Cf_parser]=0A=20=20=20=20Use=20Cf_seq.nil=20in=20= place=20of=20Lazy.lazy_from_val=20Cf_seq.Z.=0A=0A---=20[Cf_machine]=0A=20= =20=20=20New=20module.=20=20Object-oriented=20framework=20for=20= [Cf_gadget]=20state=20machines.=0A=0A---=20[Cf_poll]=0A=20=20=20=20Allow=20= subclasses=20[Cf_poll.file]=20to=20have=20more=20states.=20=20Changed=20= the=20type=0A=20=20=20=20parameter=20of=20the=20[event]=20class=20to=20= 'state,=20rather=20than=20'event.=20=20Added=20the=0A=20=20=20=20rwx_t=20= convenience=20type,=20i.e.=20type=20rwx_t=20=3D=20[=20`R=20|=20`W=20|=20= `X=20]=0A=0A---=20[Cf_socket]=0A=20=20=20=20Add=20[`SOCK_SEQPACKET]=20to=20= the=20allowed=20socket=20types=20in=20the=20[listen]=20function.=0A=20=20= =20=20There=20is=20no=20support=20for=20that=20socket=20type=20yet,=20= but=20we=20must=20make=20room=20for=20it.=0A=20=20=20=20When=20= [setsockopt]=20fails,=20raise=20Unix_error=20with=20the=20right=20= function=20name.=0A=0A---=20[Cf_sock_common]=0A=20=20=20=20Make=20= [setsockopt]=20and=20[getsockopt]=20method=20explicitly=20polymorphic.=0A= =0A---=20[Cf_sock_dgram,=20Cf_sock_stream]=20Explicitly=20specify=20= socket=20type=20tags.=0A=0A---=20[cf_socket_p.c,=20cf_ip4_proto_p.c,=20= cf_ip6_proto.c]=20Use=20socklen_t=20instead=20of=0A=20=20=20=20other=20= types,=20in=20order=20to=20shut=20up=20compiler=20warnings=20when=20= using=20GCC=204.0.=0A=0A=3D=3D=3D=3D=3D=20Version=200.6=20=3D=3D=3D=3D=3D=0A= =0AHighlights=20of=20the=20changes:=0A=0A+=20More=20bugs=20fixed=20(some=20= critical).=0A=0A---=20[Cf_rbtree]=0A=20=20=20=20Fix=20bug=20in=20= [Map.insert]=20that=20failed=20to=20replace=20nodes=20when=20the=20key=20= specifies=0A=20=20=20=20a=20node=20that=20is=20already=20in=20the=20map.=20= =20(Thanks=20to=20Craig=20Falls,=20once=20again,=20for=0A=20=20=20=20= finding=20this=20bug.)=0A=0A---=20[Cf_dfa]=0A=20=20=20=20Improved=20lazy=20= DFA=20module=20with=20a=20better=20functorial=20interface,=20to=20allow=20= for=0A=20=20=20=20more=20efficient=20symbol=20maps=20(to=20support,=20= e.g.=20wide=20character=20lexers)=20and=20to=0A=20=20=20=20decouple=20= the=20symbol=20type=20from=20the=20cursor=20type,=20so=20that=20= Cf_parser.X=20can=20be=0A=20=20=20=20used=20easily=20in=20place=20of=20= Cf_parser.=0A=20=20=20=20=0A---=20[Cf_dfa,=20Cf_lexer]=0A=20=20=20=20= Fixed=20the=20documentation=20for=20the=20[(=20$@=20)]=20operator=20to=20= reflect=20the=20actual=0A=20=20=20=20behavior.=20=20When=20the=20action=20= parser=20does=20not=20accept=20the=20recognized=20sequence,=0A=20=20=20=20= then=20no=20other=20rule=20is=20selected=20and=20no=20other=20action=20= functions=20are=20executed.=0A=0A---=20[Cf_lexer]=0A=20=20=20=20Updated=20= to=20use=20the=20new=20[Cf_dfa]=20interface,=20though=20it=20is=20now=20= deprecated=20in=0A=20=20=20=20favor=20of=20the=20new,=20improved=20= [Cf_lex]=20module=20(see=20below).=0A=0A---=20[Cf_uri]=0A=20=20=20=20= Updated=20to=20use=20the=20new=20[Cf_lex]=20in=20place=20of=20the=20= deprecated=20[Cf_lexer].=0A=0A---=20[various=20.c=20files]=0A=20=20=20=20= Rename=20custom=20data=20tags=20from=20'pagoda'=20to=20'ocnae'.=0A=0A+=20= New=20functions.=0A=0A---=20[Cf_rbtree,=20Cf_set,=20Cf_map]=0A=20=20=20=20= Add=20[of_list_incr],=20[of_list_decr],=20[of_seq_incr]=20and=20= [of_seq_decr],=20which=0A=20=20=20=20are=20optimized=20for=20lists=20and=20= sequences=20known=20to=20be=20in=20increasing=20or=0A=20=20=20=20= decreasing=20order.=0A=20=20=20=20=0A=20=20=20=20These=20functions=20= were=20derived=20from=20code=20contributed=20by=20Brian=20Hurt=20= (thanks!)=0A=20=20=20=20and=20implement=20a=20variant=20on=20Hinze's=20= algorithm:=0A=20=20=20=20=20=20=20=20= =0A=0A---=20= [Cf_set]=0A=20=20=20=20Add=20[size]=20function.=0A=0A---=20[Cf_seq]=0A=20= =20=20=20Add=20[nil]=20value.=0A=20=20=20=20Add=20[flatten]=20function.=0A= =20=20=20=20Requires=20Ocaml-3.08=20now.=0A=0A---=20[Cf_flow]=0A=20=20=20= =20Add=20[commute_string]=20function.=0A=0A---=20[Cf_parser]=0A=20=20=20=20= Add=20[of_extended]=20and=20[to_extended]=20functions.=0A=20=20=20=20Add=20= [req]=20parser,=20an=20efficient=20shortcut=20for=20[alt=20(p=20::=20err=20= f=20::=20[])].=0A=20=20=20=20Add=20[Error]=20exception=20for=20generic=20= unparameterized=20errors.=0A=20=20=20=20Add=20[altz]=20parser=20for=20= match=20from=20a=20sequence=20(instead=20of=20a=20list)=20of=20choices.=0A= =0A---=20[Cf_scan_parser]=0A=20=20=20=20Change=20[scanf]=20to=20return=20= an=20ordinary=20Cf_parser.t=20function.=0A=20=20=20=20Add=20[scanfx]=20= to=20return=20a=20Cf_parser.X.t=20function.=0A=0A---=20[Cf_regex]=0A=20=20= =20=20New=20module=20for=20regular=20expression=20parsing,=20matching=20= and=20search.=0A=20=20=20=20=0A---=20[Cf_lex]=0A=20=20=20=20A=20new=20= and=20improved=20lexical=20analysis=20module,=20with=20an=20interface=20= derived=20from=0A=20=20=20=20the=20now=20deprecated=20[Cf_lexer].=20=20= It=20offers=20a=20more=20flexible=20interface=20to=20the=0A=20=20=20=20= underlying=20[Cf_dfa]=20module,=20and=20its=20[(=20!~=20)]=20and=20[(=20= !$=20)]=20operators=20parse=0A=20=20=20=20their=20string=20arguments=20= as=20regular=20subexpressions=20with=20the=20format=20defined=20in=0A=20=20= =20=20the=20new=20[Cf_regex]=20module.=0A=0A---=20[README]=0A=20=20=20=20= Fixed=20an=20embarrassing=20word-choice=20bug,=20i.e.=20principle=20vs.=20= principal.=0A=0A=3D=3D=3D=3D=3D=20Version=200.5=20=3D=3D=3D=3D=3D=0A=0A= Highlights=20of=20the=20changes:=0A=0A+=20Many=20bugs=20fixed=20(some=20= critical).=0A+=20IPv6=20socket=20addresses=20are=20now=20a=20triple,=20= containing=20the=20scope=20identifier.=0A+=20Fixed=20a=20very=20bad=20= stack=20leak=20problem=20in=20the=20[Cf_gadget]=20scheduler.=0A=0A---=20= [Cf_deque]=0A=20=20=20=20Fix=20major=20bug=20in=20[fold]=20that=20caused=20= a=20BUS=20ERROR=20(ack!),=20and=20also=20fixed=0A=20=20=20=20[filter]=20= so=20that=20it=20uses=20the=20non-recursive=20[fold]=20function=20here=20= instead=20of=0A=20=20=20=20going=20to=20the=20extra=20work=20of=20using=20= [Cf_seq.fold].=0A=0A---=20[Cf_rbtree]=0A=20=20=20=20Fix=20a=20bug=20in=20= [iterate]=20(found=20by=20Craig=20Falls;=20thanks=20Craig!)=20caused=20= by=20a=0A=20=20=20=20stoopid=20typo.=20=20Caused=20some=20elements=20to=20= be=20iterated=20twice,=20and=20others=20not=0A=20=20=20=20at=20all.=0A=0A= ---=20[Cf_gadget]=0A=20=20=20=20Moderate=20surgery=20on=20the=20= scheduler=20to=20fix=20a=20bad=20stack=20leak.=20=20The=20new=20code=0A=20= =20=20=20is=20probably=20a=20tiny=20bit=20more=20efficient=20too,=20= because=20I=20got=20rid=20of=20some=0A=20=20=20=20unnecessary=20uses=20= of=20{Lazy.t}=20in=20places,=20and=20there=20is=20a=20bit=20less=20= lifting=0A=20=20=20=20between=20monads.=20=20I=20didn't=20benchmark=20= it,=20though.=0A=0A---=20[Cf_socket]=0A=20=20=20=20Added=20a=20special=20= case=20for=20Mac=20OS=20X=20to=20work=20around=20a=20bug=20in=20Apple's=20= network=0A=20=20=20=20stack=20that=20errors=20in=20connect(2)=20on=20a=20= non-blocking=20socket=20do=20not=20get=20in=0A=20=20=20=20the=20errno=20= system=20variable.=20=20You=20have=20to=20get=20them=20out=20of=20the=20= socket=20with=0A=20=20=20=20the=20SO_ERROR=20socket=20option.=0A=0A---=20= [Cf_ip4_addr]=0A=20=20=20=20Make=20the=20network=20subnet=20manipulation=20= functions=20cope=20with=20networks=20that=0A=20=20=20=20are=20not=20= unicast=20networks.=20=20(Yes,=20there=20are=20multicast=20ranges=20that=20= can=20be=0A=20=20=20=20treated=20like=20subnets.)=0A=0A---=20= [Cf_ip6_proto]=0A=20=20=20=20Add=20a=20third=20element=20to=20the=20= socket=20address=20type:=20an=20int32=20for=20the=20scope=20id.=0A=20=20=20= =20=0A---=20[Cf_ip6_addr]=0A=20=20=20=20Fix=20the=20[v4compat]=20and=20= [v4mapped]=20address=20type=20tags=20so=20that=20they=20are=0A=20=20=20=20= actually=20polymorphic=20variants,=20like=20they're=20supposed=20to=20= be.=20=20This=20was=0A=20=20=20=20another=20stoopid=20typo,=20but=20I=20= found=20it=20myself.=0A=0A---=20[Cf_netif]=0A=20=20=20=20Fixed=20the=20= C-language=20code=20to=20call=20if_nametoindex()=20with=20the=20proper=0A= =20=20=20=20arguments.=20=20Again,=20this=20was=20a=20stoopid=20typo.=0A=0A= ---=20[Cf_poll]=0A=20=20=20=20A=20minor=20change=20to=20the=20commented=20= bits=20of=20debugging=20code=20in=20the=20middle=20of=20the=0A=20=20=20=20= select=20loop=20to=20use=20[Cf_journal]=20instead=20of=20my=20[xprintf]=20= hackery.=0A=0A---=20{TESTS}=0A=20=20=20=20Added=20a=20test=20for=20the=20= [Cf_gadget]=20scheduler=20to=20detect=20stack=20leaks.=0A=0A=3D=3D=3D=3D=3D= =20Version=200.4=20=3D=3D=3D=3D=3D=0A=0AHighlights=20of=20the=20changes:=0A= =0A+=20Fix=20Makefile=20for=20architectures=20that=20do=20not=20support=20= native=20compilers.=0A+=20Fix=20major=20bug=20in=20the=20[Cf_gadget]=20= scheduler=20that=20caused=20some=20wires=20to=20be=0A=20=20prematurely=20= collected=20without=20delivering=20events=20to=20their=20receivers.=0A=0A= ---=20[Cf_gadget]=0A=20=20=20=20Fix=20major=20bug=20in=20the=20= scheduler.=20=20Events=20transmitted=20on=20wires=20that=20are=20no=0A=20= =20=20=20longer=20connected=20to=20a=20receiver=20are=20now=20delivered=20= to=20any=20pending=20guards=20that=0A=20=20=20=20were=20queued=20before=20= the=20receiver=20was=20collected.=20=20Minor=20changes=20to=20the=0A=20=20= =20=20debugging=20hints=20to=20use=20Cf_journal.=0A=0A---=20[Makefile]=0A= =20=20=20=20Samuel=20Mimram,=20the=20Debain=20maintainer=20of=20this=20= package,=20says:=20There=20are=20some=0A=20=20=20=20minor=20issues=20= with=20your=20Makefile=20concerning=20non-native=20archs=20[...]:=0A=20=20= =20=20-=20the=20doc=20rule=20should=20use=20ocamldoc=20instead=20of=20= ocamldoc.opt=20since=20it=20is=0A=20=20=20=20not=20available=20on=20all=20= archs=20(or=20add=20a=20optdoc=20rule);=0A=20=20=20=20-=20the=20install=20= rule=20should=20not=20depend=20on=20cf.cmxa=20and=20cf.a=20since=20they=20= are=0A=20=20=20=20not=20necessarly=20built.=0A=20=20=20=20Thanks=20to=20= Mr.=20Mimram=20for=20catching=20this.=0A=0A=0A=3D=3D=3D=3D=3D=20Version=20= 0.3=20=3D=3D=3D=3D=3D=0A=0AHighlights=20of=20the=20changes:=0A=0A+=20= Rewrite=20the=20scheduler=20in=20[Cf_gadget]=20so=20that=20it=20sucks=20= less=20wind.=20=20The=20kernel=0A=20=20is=20now=20built=20entirely=20out=20= of=20mutable=20structures,=20and=20we=20got=20rid=20of=20the=20'pin'=0A=20= =20type=20because=20we=20don't=20represent=20wires=20internally=20as=20= integer=20keys=20in=20a=20map.=0A+=20Added=20[Cf_journal],=20a=20= foundation=20for=20extensible=20diagnostic=20event=20journaling=0A=20=20= inspired=20by=20Log4j=20from=20the=20Apache=20Foundation.=20=20(Look=20= for=20a=20full=20suite=20of=0A=20=20extensions=20to=20be=20sold=20= separately.)=0A+=20Removed=20the=20[?xf]=20optional=20exception=20= function=20from=20the=20[Cf_lexer.create]=0A=20=20function.=20=20Use=20a=20= derived=20cursor=20class=20with=20an=20[error]=20method=20that=20can=20= be=0A=20=20overridden=20for=20this=C2=A0purpose.=0A+=20Added=20= [Cf_scan_parser],=20which=20scans=20an=20input=20sequence=20using=20the=20= [Scanf]=0A=20=20module=20in=20the=20standard=20library.=0A+=20Minor=20= convenience=20functions=20added=20to=20[Cf_parser].=0A+=20Other=20bug=20= fixes.=0A=0A=0A---=20[Cf_deque]=0A=20=20=20=20Apply=20the=20iterative=20= function=20in=20left-to-right=20order=20for=20all=20the=20utility=0A=20=20= =20=20functions.=0A=0A---=20[Cf_journal]=0A=20=20=20=20All=20new=20= functions.=0A=0A---=20[Cf_parser]=0A=20=20=20=20Added=20the=20[filter],=20= [map]=20and=20[optmap]=20functions=20for=20transforming=20parser=0A=20=20= =20=20with=20higher=20order=20functions=20on=20their=20output=20symbols.=0A= =0A---=20[Cf_scan_parser]=0A=20=20=20=20New=20module,=20allowing=20the=20= mixing=20of=20[Scanf]=20and=20[Cf_lexer]=20in=20the=20same=0A=20=20=20=20= parser/lexer=20system.=0A=0A---=20[Cf_dfa,=20Cf_lexer]=0A=20=20=20=20= Added=20new=20['i=20cursor]=20class.=20=20Removed=20the=20['c=20= raise_exn_t]=20type=20and=20the=0A=20=20=20=20[?xf]=20optional=20= parameter=20from=20the=20[create]=20function.=0A=0A---=20[Cf_uri]=0A=20=20= =20=20Fixed=20bug=20in=20[refer_to_base]=20that=20allowed=20relative=20= paths=20to=20resolve=20to=0A=20=20=20=20absolute=20paths=20with=20a=20= [".."]=20segment=20at=20the=20beginning=20of=20the=20path.=20=20Also,=0A=20= =20=20=20changed=20to=20throw=20[Rel_undefined]=20instead=20of=20= [Invalid_argument]=20(as=20the=0A=20=20=20=20documentation=20specifies).=0A= =20=20=20=20Also,=20use=20the=20new=20[Cf_lexer.cursor]=20class,=20as=20= now=20required.=0A=0A---=20[Cf_gadget]=0A=20=20=20=20Major=20= modifications=20for=20new=20scheduler.=20=20The=20[pin_t]=20type=20is=20= no=20longer.=0A=20=20=20=20Should=20be=20more=20efficient=20(and=20less=20= buggy).=0A=0A---=20[all=20*.c=20files]=0A=20=20=20=20Stop=20abusing=20= Field()=20as=20a=20lvalue=20in=20the=20C=20primitives.=20=20The=20GC=20= is=20reputed=0A=20=20=20=20to=20hate=20that,=20and=20while=20we=20= haven't=20encountered=20it=20in=20this=20library,=20we've=0A=20=20=20=20= seen=20it=20in=20others.=20=20Best=20to=20be=20safe.=0A=0A=20=20=20=20= Also:=20stop=20using=20CAMLlocalX()=20in=20subblocks=20of=20functions.=20= =20Just=20use=20them=0A=20=20=20=20at=20the=20top=20of=20the=20main=20= function=20block.=20=20It=20seems=20to=20like=20that.=0A=0A=3D=3D=3D=3D=3D= =20Version=200.2=20=3D=3D=3D=3D=3D=0A=0AHighlights=20of=20the=20changes:=0A= =0A+=20Major=20overhaul=20of=20[Cf_rbtree]=20to=20address=20serious=20= performance=20issues=20(should=0A=20=20improve=20performance=20of=20= [Cf_dfa],=20[Cf_lexer],=20[Cf_poll]=20and=20[Cf_gadget]).=0A+=20Defined=20= [Cf_set.T]=20and=20[Cf_map.T]=20module=20types=20for=20use=20in=20= abstracting=20the=0A=20=20underlying=20algorithm=20behind=20sets=20and=20= maps.=0A+=20Added=20[Cf_seq.constrain]=20(and=20[Cf_seq.constrain2]=20= for=20consistency).=0A+=20Defined=20[Cf_heap.T]=20and=20[Cf_pqueue.T]=20= module=20types=20for=20use=20in=20abstracting=0A=20=20the=20use=20of=20= skew-binomial=20heaps=20as=20either=20a=20heap=20or=20a=20priority=20= queue.=0A=20=20Reimplemented=20the=20interface=20to=20[Cf_sbheap]=20so=20= it=20is=20consistent=20with=20the=0A=20=20new=20[Cf_rbtree]=20interface.=0A= =0A---=20[new=20files]=0A=20=20=20=20Added=20[Cf_heap],=20[Cf_map],=20= [Cf_pqueue]=20(and=20changed=20the=20meaning=20of=20the=0A=20=20=20=20= [Cf_set]=20module=20to=20be=20consistent).=20=20These=20files=20all=20= contain=20module=20types=0A=20=20=20=20for=20common=20data=20structure=20= algorithms=20implemented=20in=20the=20{Cf}=20library.=0A=20=20=20=20= Specific=20implementations=20are=20separated=20out=20into=20other=20= modules.=0A=0A---=20[Cf_rbtree]=0A=20=20=20=20Completely=20rewritten=20= to=20address=20serious=20performance=20issues=20and=20to=20combine=0A=20=20= =20=20the=20interface=20for=20both=20sets=20and=20maps.=20=20Use=20the=20= new=20[Cf_rbtree.Set(K)]=20and=0A=20=20=20=20[Cf_rbtree.Map(K)]=20= functors.=20=20Most=20functions=20now=20offer=20better=20performance=0A=20= =20=20=20for=20smoothly=20distributed=20input=20than=20do=20the=20[Set]=20= and=20[Map]=20modules=20in=20the=0A=20=20=20=20Ocaml=20standard=20= library.=20=20(Note:=20the=20[subset]=20function=20has=20been=20fixed=20= so=0A=20=20=20=20that=20it=20considers=20its=20arguments=20in=20the=20= same=20order=20as=20the=20standard=20library.)=0A=0A---=20[Cf_sbheap]=0A=20= =20=20=20Minor=20modifications=20to=20conform=20to=20the=20new=20= [Cf_heap]=20and=20[Cf_pqueue]=20module=0A=20=20=20=20types.=20=20Use=20= the=20new=20[Cf_sbheap.Heap(K)]=20and=20[Cf_sbheap.PQueue(K)]=20= functors.=0A=0A---=20[Cf_ordered]=0A=20=20=20=20Removed=20the=20= [KV_Pair_T]=20module=20type=20and=20its=20associated=20functor=20= [KV_Pair],=0A=20=20=20=20since=20these=20types=20are=20unecessary.=0A=0A= ---=20[Cf_seq]=0A=20=20=20=20Added=20the=20[constrain]=20and=20= [constrain2]=20functions=20for=20constraining=20a=0A=20=20=20=20sequence=20= to=20just=20those=20elements=20until=20the=20constraining=20function=20= is=20false.=0A=0A---=20[Cf_dfa=20Cf_gadget=20Cf_poll]=0A=20=20=20=20= Modified=20to=20use=20the=20new=20[Cf_rbtree]=20and=20[Cf_sbheap]=20= interface.=0A=0A---=20[t_cf]=0A=20=20=20=20Added=20a=20new=20test=20= case,=20that=20covers=20[Cf_flow.commute]=20and=20a=20few=20other=0A=20=20= =20=20things.=20=20(Test=20coverage=20is=20still=20abyssmally=20poor,=20= if=20you=20ask=20me.)=0A=0A=3D=3D=3D=3D=3D=20Version=200.1=20=3D=3D=3D=3D=3D= =0A=0AHighlights=20of=20the=20changes:=0A=0A+=20Compile=20and=20pass=20= self-tests=20on=20Suse=20Linux=209.0.=0A+=20Unified=20[sequence]=20and=20= [accumulate]=20monad=20functions=20in=20[Cf_seq].=0A+=20Added=20= [Cf_exnopt]=20module=20with=20a=20simple=20convenience=20type.=0A+=20New=20= monadic=20constructors=20for=20[Cf_seq]=20and=20[Cf_flow]=20types.=0A+=20= Moderate=20overhaul=20of=20[Cf_gadget]=20(fix=20bugs,=20design=20= problems).=0A+=20Fix=20portability=20bugs=20in=20[Cf_socket]=20and=20= cognates.=0A+=20Add=20support=20for=20UDP,=20IP=20multicast=20and=20= network=20interface=20selection.=0A+=20Fix=20bug=20in=20[Cf_poll.idle]=20= event=20polling=20(and=20give=20a=20timestamp).=0A+=20Slightly=20better=20= self-tests=20for=20[Cf_socket].=0A=0A---=20[Cf_cmonad,=20Cf_smonad,=20= Cf_scmonad]=0A=20=20=20=20Removed=20the=20[sequence]=20and=20= [accumulate]=20functions.=20=20Use=20the=20new=20functions=0A=20=20=20=20= in=20[Cf_seq]=20for=20this.=0A=0A---=20[Cf_exnopt]=0A=20=20=20=20Added=20= to=20library.=20=20This=20is=20a=20simple=20sum=20type=20useful=20for=20= defining=20monads=0A=20=20=20=20that=20answer=20with=20either=20a=20= value=20result=20or=20an=20Ocaml=20exception.=0A=0A---=20[Cf_seq]=0A=20=20= =20=20Added=20new=20functions=20for=20monadic=20construction.=0A=20=20=20= =20Use=20[writeC]=20to=20construct=20a=20sequence=20with=20a=20= continuation=20monad.=0A=20=20=20=20Use=20[writeSC]=20to=20construct=20a=20= sequence=20with=20a=20state-continuation=20monad.=0A=20=20=20=20Added=20= new=20modules,=20[C]=20and=20[SC],=20containing=20the=20[sequence]=20and=20= [accumulate]=0A=20=20=20=20functions=20from=20[Cf_cmonad]=20and=20= [Cf_scmonad]=20respectively.=20=20(The=20functions=0A=20=20=20=20from=20= [Cf_smonad]=20have=20been=20removed=20completely.)=0A=0A---=20[Cf_flow]=0A= =20=20=20=20Added=20new=20function=20for=20monadic=20construction.=0A=20=20= =20=20Use=20[readC]=20and=20[writeC]=20to=20construct=20a=20flow=20with=20= a=20continuation=20monad.=0A=20=20=20=20Use=20[readSC]=20and=20[writeSC]=20= to=20construct=20a=20flow=20with=20a=20state-continuation=0A=20=20=20=20= monad.=0A=20=20=20=20Evaluating=20a=20continuation=20monad=20or=20a=20= state-continuation=20monad=20with=20[evalC]=0A=20=20=20=20or=20[evalSC]=20= gives=20a=20resulting=20[('i,=20'o)=20Cf_flow.t]=20value.=0A=0A---=20= [Cf_gadget]=0A=20=20=20=20In=20the=20[gate0_t]=20record,=20removed=20the=20= [g_ptr_]=20field=20and=20changed=20the=20type=0A=20=20=20=20of=20the=20= [g_id_]=20field=20from=20an=20integer=20to=20a=20[pin_t]=20value.=0A=20=20= =20=20In=20the=20[kernel_t]=20record,=20changed=20the=20[k_rdyq_]=20= field=20from=20a=20queue=20of=0A=20=20=20=20[process0_t]=20values=20to=20= a=20queue=20of=20[process0_t=20Lazy.t]=20values.=0A=20=20=20=20Use=20= [Cf_cmonad]=20by=20references,=20instead=20of=20by=20copy=20and=20paste.=0A= =20=20=20=20Define=20new=20class=20[Cf_gadget.connection]=20as=20the=20= common=20base=20class=20of=0A=20=20=20=20[Cf_gadget.rx]=20and=20= [Cf_gadget.tx]=20to=20contain=20the=20[pin]=20method=20and=20two=20new=0A= =20=20=20=20methods:=20[check],=20which=20returns=20[false]=20if=20the=20= other=20end=20of=20the=20connection=0A=20=20=20=20has=20been=20collected=20= by=20the=20garbage=20collector;=20and=20[id]=20which=20returns=20a=20= text=0A=20=20=20=20representation=20of=20the=20pin=20identifier=20= (suitable=20for=20use=20in=20debug=20log=0A=20=20=20=20messages).=0A=20=20= =20=20Removed=20[zguard]=20to=20replace=20with=20new=20[guard]=20and=20= [rx]=20interface.=20=20The=20new=0A=20=20=20=20[rx#get]=20method=20= returns=20a=20[guard_t]=20continuation=20monad=20which=20is=20evaluated=0A= =20=20=20=20by=20the=20new=20[guard=20method].=20=20Internally,=20this=20= is=20done=20by=20redefining=20[gate_t]=0A=20=20=20=20as=20a=20= continuation=20monad=20constructing=20a=20sequence=20of=20[gate0_t]=20= values=0A=20=20=20=20(parameterized=20by=20state).=0A=20=20=20=20= Optimized=20[tx#put]=20so=20that=20it=20does=20not=20enter=20the=20= [scheduler_]=20function.=0A=20=20=20=20Only=20[guard]=20can=20invoke=20a=20= full=20pass=20through=20the=20scheduler=20now=20(though=20the=0A=20=20=20= =20scheduler=20could=20still=20use=20improvements=20for=20efficiency--=20= see=20ISSUES).=0A=20=20=20=20Fixed=20an=20efficiency=20bug=20in=20= [write]=20that=20unnecessarily=20constructed=0A=20=20=20=20= continuations.=0A=0A---=20[Cf_socket]=0A=20=20=20=20Many=20platforms=20= do=20not=20have=20a=20[sa_len]=20field=20in=20[sockaddr],=20so=20we=20= now=0A=20=20=20=20allocate=20socket=20address=20custom=20blocks=20with=20= an=20extra=20[size_t]=20field=20at=20the=0A=20=20=20=20beginning=20to=20= carry=20the=20size=20of=20the=20structure.=0A=20=20=20=20Stop=20using=20= buffers=20of=20[SOCK_MAXADDRLEN]=20length=20and=20use=20the=20structure=0A= =20=20=20=20defined=20in=20RFC=203493=20instead,=20i.e.=20[struct=20= sockaddr_storage].=0A=20=20=20=20Some=20socket=20options=20are=20not=20= available=20on=20all=20platforms;=20therefore,=20allow=0A=20=20=20=20the=20= [opt_get]=20and=20[opt_set]=20fields=20in=20an=20option=20structure=20to=20= be=20NULL=20if=20a=0A=20=20=20=20platform=20doesn't=20support=20them.=20=20= The=20[getsockopt]=20and=20[setsockopt]=20function=0A=20=20=20=20raise=20= [Failure]=20when=20those=20socket=20options=20are=20used=20on=20those=20= platforms.=0A=20=20=20=20The=20[SO_REUSEPORT]=20and=20[SO_NOSIGPIPE]=20= options=20are=20not=20available=20on=20Linux.=0A=0A---=20[Cf_nameinfo]=0A= =20=20=20=20Removed=20[ni_withscopeid]=20from=20list=20of=20flags.=20=20= This=20is=20a=20Mac=20OS=20X=20extension=0A=20=20=20=20and=20I'm=20not=20= sure=20how=20I=20will=20support=20address=20scoping=20issues=20yet.=20=20= Maybe=20it=0A=20=20=20=20comes=20back=20later.=0A=20=20=20=20Changes=20= to=20handling=20of=20[sockaddr]=20structures=20to=20accommodate=20new=0A=20= =20=20=20representation=20required=20for=20[Cf_socket]=20functions.=0A=20= =20=20=20Stop=20using=20buffers=20of=20[SOCK_MAXADDRLEN]=20length=20and=20= use=20the=20structure=0A=20=20=20=20defined=20in=20RFC=203493=20instead,=20= i.e.=20[struct=20sockaddr_storage].=0A=0A---=20[Cf_netif]=0A=20=20=20=20= New=20module.=20=20Provides=20wrapper=20around=20[if_nameindex]=20and=20= cognates.=0A=0A---=20[Cf_ip4_addr,=20Cf_ip6_addr]=0A=20=20=20=20Fixed=20= several=20endianness=20bugs=20caused=20by=20failure=20to=20apply=20(or=20= misapplication=0A=20=20=20=20of)=20[ntohX]=20and=20[htonX]=20macros.=0A=20= =20=20=20Linux=20does=20not=20define=20[IN_LINKLOCAL],=20so=20we=20= define=20it=20if=20it's=20undefined.=0A=20=20=20=20Linux=20also=20does=20= not=20define=20[IN6ADDR_NODELOCAL_ALLNODES_INIT],=0A=20=20=20=20= [IN6ADDR_LINKLOCAL_ALLNODES_INIT]=20or=20= [IN6ADDR_LINKLOCAL_ALLROUTERS_INIT].=0A=20=20=20=20Fix=20error=20in=20= [cf_ip4_addr_compute_limits].=0A=0A---=20[Cf_ip_common,=20Cf_ip4_proto,=20= Cf_ip6_proto]=0A=20=20=20=20Add=20new=20protocol=20number=20for=20IPv6.=0A= =20=20=20=20Add=20[TCP_NODELAY]=20socket=20option.=0A=20=20=20=20Add=20= [Cf_ip4_proto.mreq_t]=20type=20for=20[IP_ADD/DROP_MEMBERSHIP]=20socket=20= options.=0A=20=20=20=20Add=20[Cf_ip6_proto.mreq_t]=20type=20for=20= [IPV6_JOIN/LEAVE_GROUP]=20socket=20options.=0A=20=20=20=20Add=20new=20= socket=20options=20for=20IPv4=20sockets:=20IP_TTL,=20IP_ADD_MEMBERSHIP,=0A= =20=20=20=20IP_DROP_MEMBERSHIP,=20IP_MULTICAST_IF,=20IP_MULTICAST_TTL=20= and=0A=20=20=20=20IP_MULTICAST_LOOP.=0A=20=20=20=20Add=20new=20socket=20= options=20for=20IPv6=20sockets:=20IPV6_UNICAST_HOPS,=20IPV6_V6ONLY,=0A=20= =20=20=20IPV6_JOIN_GROUP,=20IPV6_LEAVE_GROUP,=20IPV6_MULTICAST_IF,=20= IPV6_MULTICAST_HOPS,=0A=20=20=20=20IPV6_MULTICAST_LOOP.=0A=20=20=20=20= Changes=20to=20handling=20of=20[sockaddr_in]=20and=20[sockaddr_in6]=20= structures=20to=0A=20=20=20=20accommodate=20new=20representation=20= required=20for=20[Cf_socket]=20functions.=0A=20=20=20=20Added=20a=20new=20= primitive=20function=20[Cf_ip4_proto.siocgifaddr]=20that=20returns=20the=0A= =20=20=20=20interface=20address=20for=20a=20named=20interface.=0A=0A---=20= [Cf_sock_common]=0A=20=20=20=20Remove=20[send]=20and=20[recv]=20private=20= methods=20from=20[Cf_sock_common.basic]=20class.=0A=0A---=20= [Cf_sock_stream]=0A=20=20=20=20Change=20[send]=20and=20[recv]=20methods=20= on=20[Cf_sock_stream.endpoint]=20class=20from=0A=20=20=20=20virtual=20= override=20to=20simple=20concrete=20methods.=0A=20=20=20=20Use=20an=20= abbreviation=20module=20for=20[Cf_socket]=20in=20the=20implementation.=0A= =0A---=20[Cf_sock_dgram]=0A=20=20=20=20New=20module=20for=20SOCK_DGRAM=20= sockets.=0A=0A---=20[Cf_udp4_socket,=20Cf_udp6_socket]=0A=20=20=20=20New=20= modules=20for=20UDP=20sockets=20(both=20IPv4=20and=20IPv6).=0A=0A---=20= [Cf_poll]=0A=20=20=20=20Change=20[p_idle_queue_]=20field=20of=20= [Cf_poll.t]=20record=20so=20that=20the=20callback=0A=20=20=20=20function=20= in=20each=20entry=20of=20the=20queue=20takes=20a=20[Cf_tai64n.t]=20= timestamp=0A=20=20=20=20indicating=20the=20timestamp=20when=20the=20idle=20= condition=20arrived.=0A=20=20=20=20Fix=20[cycle]=20so=20that=20idle=20= polls=20are=20processed=20even=20when=20no=20other=20polls=0A=20=20=20=20= are=20loaded.=0A=0A=0A=3D=3D=3D=3D=3D=20Version=200.0=20=3D=3D=3D=3D=3D=0A= =0AThis=20was=20the=20initial=20release=20of=20the=20library.=20=20Major=20= and=20minor=20version=20numbers=0Acount=20upward=20from=20zero.=20=20= Major=20version=20numbers=20with=20a=20minor=20version=20number=20of=0A= zero=20indicate=20the=20first=20release=20in=20a=20"stable"=20branch.=20=20= Non-zero=20minor=20version=0Anumbers=20indicate=20"development"=20= branches=20converging=20on=20the=20next=20stable=20release.=0APatches=20= to=20stable=20releases=20are=20numbered=20with=20a=20third=20level=20of=20= numbering.=0A=0A=0A--j=20h=20woodyatt=20=0A= --Apple-Mail-9-174110038 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=US-ASCII; format=flowed --Apple-Mail-9-174110038 Content-Transfer-Encoding: 7bit Content-Type: application/octet-stream; x-unix-mode=0644; name="CHANGES iom-0.2" Content-Disposition: attachment; filename="CHANGES iom-0.2" ===== OCaml NAE Reactive I/O Monad (iom) library ===== This file describes in technical detail the functional differences between released versions of the library. ===== Version 0.2 ===== This release is a major refactoring of almost all of the interfaces and implementations. Basically, everything north of the underlying [Cf_gadget] wrapper has been designed over from scratch. The main reason for doing this is to leverage the knowledge gained from other experimental projects that used the interfaces defined in the previous release. The new interface should offer more opportunities for reuse and be more easily adapted for new types of I/O requirements, e.g. UDP sockets, AF_LOCAL sockets, multicast, etcetera. Highlights of refactoring this release: + OCNAE Cf-0.7 is now required (for additions to [Cf_gadget] and other things). + Add new module [Iom_machine] to match the [Cf_machine] new with Cf-0.7. + Replace the [Iom_gadget.poll] function with a virtual subclass of [Iom_machine.state]. + Redesigned interface to core reactors in [Iom_reactor] module. + New modules [Iom_file] and [Iom_socket] containing virtual classes for state machines that process more generalized I/O events. + Redesigned interface to TCP connection/listening reactors and SOCK_STREAM endpoint reactors. Additional interfaces for UDP sockets, AF_LOCAL sockets and multicast, etc. are deferred until the next minor release at the earliest. ===== Version 0.1 ===== Highlights of this release: + Rewrote the [Iom_sock_stream.endpoint] reactor to fix bugs (and hopefully improve performance in some edge cases). + More optional tests coded (but they're still suboptimal, and maybe buggy). --- [Iom_sock_stream] Rewrote the [endpoint] reactor to use less consing, i.e. the state is now a couple of mutable objects derived from [Cf_poll.event]. Events are plumbed around the inside of the reactor in shorter paths. --- [T_iom] Change to be compatible with cf-0.5 notion of IPv6 socket addresses, which now contain an int32 element for the scope identifier. --- {New Tests} Added a couple of new programs which help me work out bugs. I don't think these programs are really done, since they don't quite give me the control I need to be able to adequately test and benchmark the performance of code based on the [Iom] library. I'll probably need to hammer on these for awhile before I have something to document. In the meantime, consider them curiosities for your amusement. ===== Version 0.0 ===== This was the initial release of the library. Major and minor version numbers count upward from zero. Major version numbers with a minor version number of zero indicate the first release in a "stable" branch. Non-zero minor version numbers indicate "development" branches converging on the next stable release. Patches to stable releases are numbered with a third level of numbering. --j h woodyatt san francisco, ca --Apple-Mail-9-174110038 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=US-ASCII; format=flowed -- j h woodyatt that's my village calling... no doubt, they want their idiot back. --Apple-Mail-9-174110038--