From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Original-To: caml-list@sympa.inria.fr Delivered-To: caml-list@sympa.inria.fr Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 6BA027EF21 for ; Tue, 17 Jun 2014 18:43:27 +0200 (CEST) Received-SPF: None (mail2-smtp-roc.national.inria.fr: no sender authenticity information available from domain of bmillwood@janestreet.com) identity=pra; client-ip=38.105.200.112; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="bmillwood@janestreet.com"; x-sender="bmillwood@janestreet.com"; x-conformance=sidf_compatible Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of bmillwood@janestreet.com designates 38.105.200.112 as permitted sender) identity=mailfrom; client-ip=38.105.200.112; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="bmillwood@janestreet.com"; x-sender="bmillwood@janestreet.com"; x-conformance=sidf_compatible; x-record-type="v=spf1" Received-SPF: None (mail2-smtp-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@mxout1.mail.janestreet.com) identity=helo; client-ip=38.105.200.112; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="bmillwood@janestreet.com"; x-sender="postmaster@mxout1.mail.janestreet.com"; x-conformance=sidf_compatible X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AnQBAPVuoFMmachwnGdsb2JhbABZg19agmynEwsGmSaBBggWDwEBAQEBBhYJPIQcEQQZAQE4GA03AiQSAQUBIgE0iCADAgiNcpATaoowd4UBAQWaBBECBIVjiFE+gwKBTJpHkWcYKYRxawGBAw X-IPAS-Result: AnQBAPVuoFMmachwnGdsb2JhbABZg19agmynEwsGmSaBBggWDwEBAQEBBhYJPIQcEQQZAQE4GA03AiQSAQUBIgE0iCADAgiNcpATaoowd4UBAQWaBBECBIVjiFE+gwKBTJpHkWcYKYRxawGBAw X-IronPort-AV: E=Sophos;i="5.01,495,1400018400"; d="scan'208";a="80597227" Received: from mxout1.mail.janestreet.com ([38.105.200.112]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-SHA; 17 Jun 2014 18:43:26 +0200 Received: from tot-smtp.delacy.com ([172.27.22.15] helo=tot-smtp) by mxout1.mail.janestreet.com with esmtps (TLSv1.2:DHE-RSA-AES256-GCM-SHA384:256) (Exim 4.82) (envelope-from ) id 1WwwTj-0002io-L7 for caml-list@inria.fr; Tue, 17 Jun 2014 12:43:23 -0400 Received: from tot-dmz-mxgoog1.delacy.com ([172.27.224.14] helo=mxgoog2.janestreet.com) by tot-smtp with esmtps (TLSv1:AES256-SHA:256) (Exim 4.72) (envelope-from ) id 1WwwTg-0001iH-Hz for caml-list@inria.fr; Tue, 17 Jun 2014 12:43:20 -0400 Received: from mail-qc0-f179.google.com ([209.85.216.179]) by mxgoog2.janestreet.com with esmtp (Exim 4.76) (envelope-from ) id 1WwwTg-0001FS-FY for caml-list@inria.fr; Tue, 17 Jun 2014 12:43:20 -0400 Received: by mail-qc0-f179.google.com with SMTP id x3so9214892qcv.10 for ; Tue, 17 Jun 2014 09:43:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=janestreet.com; s=google; h=mime-version:date:message-id:subject:from:to:content-type; bh=ynQI53Nuxoyt7wXgOJxNeWu0GmdpoZ4RDeoCIFQTx3I=; b=rTIodpYM35SMw+slTFhb5HlOYqaqvQ11dIYO96mPFf9yLTsQjgQMxthSmU508N6FGA prKJ591O4ak/Ss5VQ+I3RlKI7mri/0WYJWNWolJ/MM9wqyrNoYoD6IK/v0EkV7JSSyRu O0cgi22tGYwI3rW2l0nOTxnOC8ImXJb6Qal7A= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:date:message-id:subject:from:to :content-type; bh=ynQI53Nuxoyt7wXgOJxNeWu0GmdpoZ4RDeoCIFQTx3I=; b=cn+Y1fLpq5wTOzAMP8o09o6e3uDFhZh9OCn2YvULasb1rYOH9FcO7GUArrOv0gpgsl zdAvwTHTVC8lIUvFFr/7+ZrEE7RpxUksy2Jms5WwiSZa3YuUYsNdbncN59XZSCdgYnpY s9WpxxWlQvmsBm83x/oihpAq752gs6r1LfOuNPPU76I6N3/oG1t3VcASNP3o32jN+OAr 0cpJLw6E3n4e/GNEw+t1QAlFpd73wSC2I/GzqYCLAW/2+d532xlegz40BrIexkj6c1t4 FrkwwqDJ9Cg8LvDu/UWOiNJlWNlXeOlVMOa1ODcSSfz9YoJnVg/mUbE3t/t3RmzkvCnh Lt3g== X-Gm-Message-State: ALoCoQkWRRZUuCFLb+Cml2AFsmV+x7z3RQjAJb9O7o501l64f/oDewVOO+K7lI2l7qrZm1ISCgytBxC/YtE2Yk6vKuwfmSI4oCfXSEKNK3HS1iySf2U2XUIjgoJsir6H4drq/dT5OQI9 X-Received: by 10.140.84.168 with SMTP id l37mr15491182qgd.104.1403023400333; Tue, 17 Jun 2014 09:43:20 -0700 (PDT) MIME-Version: 1.0 X-Received: by 10.140.84.168 with SMTP id l37mr15491151qgd.104.1403023400162; Tue, 17 Jun 2014 09:43:20 -0700 (PDT) Received: by 10.140.103.67 with HTTP; Tue, 17 Jun 2014 09:43:20 -0700 (PDT) Date: Tue, 17 Jun 2014 17:43:20 +0100 Message-ID: From: Ben Millwood To: ocaml-core@googlegroups.com, caml users Content-Type: multipart/alternative; boundary=001a11c1170860f1d804fc0ad766 Subject: [Caml-list] [ANN] Core Suite 111.17.00 --001a11c1170860f1d804fc0ad766 Content-Type: text/plain; charset=UTF-8 I am pleased to announce the (somewhat delayed) 111.17.00 release of the Core suite. The following packages were upgraded: - async - async_extra - async_inotify - async_kernel - async_parallel - async_unix - bignum - core - core_extended - core_kernel - faillib - jenga - ocaml_plugin - patdiff - patience_diff - sexplib - typerep We're also releasing for the first time a new library called async_extended, which contains more experimental and less well-scrutinised code than async, in much the same role that core_extended plays for core. Note that async_extra, despite the name, does not play that role: the code in async_extra is subject to the same level of scrutiny as async or async_kernel. We've had discussions internally about merging async and async_extra into a single library, since they serve essentially the same purpose, but it's no-one's top priority. Files and documentation for this release are available on our website and all packages are in opam: https://ocaml.janestreet.com/ocaml-core/111.17.00/individual https://ocaml.janestreet.com/ocaml-core/111.17.00/doc Here is the list of changes for this version: ## async_extra - Added module `Persistent_rpc_client`, an RPC client that attempts to reconnect when the connection is lost, until a new connection is established. - Significantly sped up the `Rpc` module by removing `Bigstring` serialization. Performance of the two implementations was tested by building a simple client/server executable that would count major cycles. Sending 100 byte messages at a rate of 50k/second shows (on both sides of the RPC): original: * ~160 major cycles in 30s * CPU usage around 60% new: * ~10 major cycles in 30s * CPU usage <= 2% - Enabled a version of `Pipe_rpc` and `State_rpc` where the consumer can pushback on the producer if it can't consume the contents of the pipe fast enough. - Added `Log.Level.arg : Log.Level.t Command.Spec.Arg_type.t` for defining command lines that accept (and autocomplete) log levels. - Added `Command.async_or_error` and renamed `Command.async_basic` to `Command.async`, leaving `async_basic` a deprecated alias for the new name. `Command.async_or_error` is similar to `Command.basic` and `Command.async`, but accepts a `unit Or_error.t Deferred.t` type. - Added `Persistent_rpc_connection.current_connection`, so that one can detect whether one is currently connected. ```ocaml val current_connection : t -> Rpc.Connection.t option ``` ## async_inotify - Upgraded library to use inotify 2.0 ## async_kernel - Renamed `Monitor.errors` to `Monitor.detach_and_get_error_stream` and `Monitor.error` as `Monitor.get_next_error`. The use of `detach` in the name is intended to make clear that errors do not propagate to the parent. Added several other non-stream =Monitor= functions to capture common use cases of `Monitor.detach_and_get_error_stream`: ```ocaml detach_and_get_next_error detach_and_iter_errors detach ``` ## bignum - Improved the performance of binprot deserialization by removing the allocation of an intermediate type. ## core - Fixed a bug in `Bigstring.really_recv` if `recv` doesn't receive all the data it wants. This bug has been around forever; it may not have caused trouble because `Bigstring.really_recv` (1) is barely used (the only use is in `Bigstring.unmarshal_from_sock`) and (2) passes `recv` the `MSG_WAITALL` flag, so it will read the full amount unless it gets interrupted by a signal. - Fixed `Bigstring.read`'s handling of `EINTR` so that it retries rather than returning zero. This fixes a bug introduced in 111.09 in the interaction between `Bigstring.read` and `Async.Reader`. Prior to 111.09, `Bigstring.read` would raise on `EINTR`, and `Async.Reader` would propagate the exception. From 111.09 to 111.16, `Bigstring.read` would return zero, which would confuse `Async.Reader` into thinking it reached EOF when it hadn't. From 111.17, `Bigstring.read` will retry and not return zero when not at EOF. We believe the bug was rare, because otherwise we would have frequently seen `EINTR` exceptions prior to 111.09. - Added `Command.Spec.apply` and `pair`, which allow one to program more with `Spec.param` rather than `Spec.t`. ```ocaml val apply : ('a -> 'b) param -> 'a param -> 'b param val pair : 'a param -> 'b param -> ('a * 'b) param ``` - Added `Command.Spec.file`, which builds an `Arg_type` value with the same autocompletion as `Spec.file`. ```ocaml (** [file] defines an [Arg_type.t] that completes in the same way as [Command.Spec.file], but perhaps with a different type than [string] or with an autocompletion key. *) val file : ?key:'a Univ_map.Multi.Key.t -> (string -> 'a) -> 'a t ``` ## core_extended - Added some functions to `Splay_tree`: * `length` * `keys` * `data` * `to_alist` * `delete_{after,before}` * `map` * `map_range` * `split`. ## core_kernel - In `Bigstring`, made many operations use compiler primitives new in OCaml 4.01. Exposed `Bigstring.get` and `set` as compiler primitives in the interface. Added `Bigstring.unsafe_get_int64_{le,be}_trunc`. - Made `Error` round trip `exn`, i.e. `Error.to_exn (Error.of_exn exn) = exn`. - Added to `failwiths` an optional `?here:Lexing.position` argument. - Added `with typerep` to `Flags.S`. - Optimized `List.dedup []` to return immediately. - Added `data` argument to polymorphic type `Hashtbl_intf.Creators.create_options`. This allows implementations of `Hashtbl_intf.Creators` to have constructor arguments that depend on the type of both key and data values. For example: ```ocaml module type Hashtbl_creators_with_typerep = Hashtbl_intf.Creators with type ('key, 'data, 'z) create_options = typerep_of_key:'key Typerep.t -> typerep_of_data:'data Typerep.t -> 'z ``` - Improved the interface for getting `Monad.Make` to define `map` in terms of `bind`. Instead of passing a `map` function and requiring everyone who wants to define `map` using `bind` to call a special function, we use a variant type to allow the user to say what they want: ```ocaml val map : [ `Define_using_bind | `Custom of ('a t -> f:('a -> 'b) -> 'b t) ] ``` - Improved the performance of many `Dequeue` functions. Previously, many `Dequeue.dequeue`-type functions worked by raising and then catching an exception when the dequeue is empty. This is much slower than just testing for emptiness, which is what the code now does. This improves the performance of `Async.Writer`, which uses `Dequeue.dequeue_front`. ## patdiff - Removed latex output. ## patience_diff - Exposed `Patience_diff.matches`. ## sexplib - Make the camlp4 dependency optional --- We hope you find it useful! -- Ben Millwood, on behalf of the Core team --001a11c1170860f1d804fc0ad766 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
I am pleased to announce the (somewhat delayed) 111.17.00 = release of the Core suite.

The following packages were upgrade= d:

- async
- async_extra
- async_inotify
= - async_kernel
- async_parallel
- async_unix
- b= ignum
- core
- core_extended
- core_kernel
- faillib
- jenga=
- ocaml_plugin
- patdiff
- patience_diff
- sexplib
- typerep
We're also releasing for the first time a new library called= async_extended, which contains more experimental and less well-scrutinised= code than async, in much the same role that core_extended plays for core.<= br>
Note that async_extra, despite the name, does not play that role:= the code in async_extra is subject to the same level of scrutiny as async = or async_kernel. We've had discussions internally about merging async a= nd async_extra into a single library, since they serve essentially the same= purpose, but it's no-one's top priority.

Files and documentation for this release are available on our webs= ite and all packages are in opam:

=C2=A0 https://ocaml.janestreet.com/ocaml-core/111.17.00/doc

<= /div>Here is the list of changes for this version:

## async_extra

- Added module `Persistent_rpc_client`, an = RPC client that attempts to
=C2=A0 reconnect when the connection is lost= , until a new connection is
=C2=A0 established.
- Significantly sped = up the `Rpc` module by removing `Bigstring`
=C2=A0 serialization.

=C2=A0 Performance of the two implementations = was tested by building a
=C2=A0 simple client/server executable that wou= ld count major cycles.
=C2=A0 Sending 100 byte messages at a rate of 50k= /second shows (on both
=C2=A0 sides of the RPC):

=C2=A0 original:
=C2=A0 * ~160 major cy= cles in 30s
=C2=A0 * CPU usage around 60%

=C2=A0 new:
=C2=A0 *= ~10 major cycles in 30s
=C2=A0 * CPU usage <=3D 2%
- Enabled a ve= rsion of `Pipe_rpc` and `State_rpc` where the consumer
=C2=A0 can pushback on the producer if it can't consume the contents of= the
=C2=A0 pipe fast enough.
- Added `Log.Level.arg : Log.Level.t Co= mmand.Spec.Arg_type.t` for
=C2=A0 defining command lines that accept (an= d autocomplete) log levels.
- Added `Command.async_or_error` and renamed `Command.async_basic` to
= =C2=A0 `Command.async`, leaving `async_basic` a deprecated alias for the=C2=A0 new name.

=C2=A0 `Command.async_or_error` is similar to `Com= mand.basic` and
=C2=A0 `Command.async`, but accepts a `unit Or_error.t Deferred.t` type.- Added `Persistent_rpc_connection.current_connection`, so that one
=C2= =A0 can detect whether one is currently connected.

=C2=A0 ```ocaml=C2=A0 val current_connection : t -> Rpc.Connection.t option
=C2=A0 ```

## async_inotify

- Upgraded library to use i= notify 2.0

## async_kernel

- Renamed `Monitor.errors` t= o `Monitor.detach_and_get_error_stream`
=C2=A0 and `Monitor.error` as `M= onitor.get_next_error`.

=C2=A0 The use of `detach` in the name is intended to make clear that=C2=A0 errors do not propagate to the parent.

=C2=A0 Added several= other non-stream =3DMonitor=3D functions to capture common
=C2=A0 use c= ases of `Monitor.detach_and_get_error_stream`:

=C2=A0 ```ocaml
=C2=A0 detach_and_get_next_error
=C2=A0 detach_an= d_iter_errors
=C2=A0 detach
=C2=A0 ```

## bignum

= - Improved the performance of binprot deserialization by removing the
= =C2=A0 allocation of an intermediate type.

## core

- Fixed a bug in `Bigstring.really_recv` if `= recv` doesn't receive all
=C2=A0 the data it wants.

=C2=A0 Th= is bug has been around forever; it may not have caused trouble
=C2=A0 be= cause `Bigstring.really_recv` (1) is barely used (the only use is
=C2=A0 in `Bigstring.unmarshal_from_sock`) and (2) passes `recv` the
=C2= =A0 `MSG_WAITALL` flag, so it will read the full amount unless it gets
= =C2=A0 interrupted by a signal.
- Fixed `Bigstring.read`'s handling = of `EINTR` so that it retries
=C2=A0 rather than returning zero.

=C2=A0 This fixes a bug introduce= d in 111.09 in the interaction between
=C2=A0 `Bigstring.read` and `Asyn= c.Reader`.=C2=A0 Prior to 111.09,
=C2=A0 `Bigstring.read` would raise on= `EINTR`, and `Async.Reader` would
=C2=A0 propagate the exception.=C2=A0 From 111.09 to 111.16, `Bigstring.rea= d`
=C2=A0 would return zero, which would confuse `Async.Reader` into thi= nking
=C2=A0 it reached EOF when it hadn't.=C2=A0 From 111.17, `Bigs= tring.read` will
=C2=A0 retry and not return zero when not at EOF.

=C2=A0 We believe the bug was rare, because otherwise we would have
= =C2=A0 frequently seen `EINTR` exceptions prior to 111.09.
- Added `Comm= and.Spec.apply` and `pair`, which allow one to program
=C2=A0 more with = `Spec.param` rather than `Spec.t`.

=C2=A0 ```ocaml
=C2=A0 val apply : ('a -> 'b) param ->= 'a param -> 'b param
=C2=A0 val pair : 'a param -> &#= 39;b param -> ('a * 'b) param
=C2=A0 ```
- Added `Command.= Spec.file`, which builds an `Arg_type` value with the
=C2=A0 same autocompletion as `Spec.file`.

=C2=A0 ```ocaml
=C2=A0= (** [file] defines an [Arg_type.t] that completes in the same way as
= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 [Command.Spec.file], but perhaps with a diff= erent type than [string] or with an
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 autocompletion key. *)
=C2=A0 val file=C2=A0=C2=A0=C2=A0 :=C2=A0 ?key:'a Univ_map.Multi.Key.t
=C2=A0=C2= =A0=C2=A0 -> (string -> 'a)
=C2=A0=C2=A0=C2=A0 -> 'a t<= br>=C2=A0 ```

## core_extended

- Added some functi= ons to `Splay_tree`:
=C2=A0 * `length`
=C2=A0 * `keys`
=C2=A0 * `data`
=C2=A0 * `to_ali= st`
=C2=A0 * `delete_{after,before}`
=C2=A0 * `map`
=C2=A0 * `map_= range`
=C2=A0 * `split`.

## core_kernel

- In `B= igstring`, made many operations use compiler primitives new in
=C2=A0 OCaml 4.01.

=C2=A0 Exposed `Bigstring.get` and `set` as compi= ler primitives in the
=C2=A0 interface.

=C2=A0 Added `Bigstring.u= nsafe_get_int64_{le,be}_trunc`.
- Made `Error` round trip `exn`, i.e. `E= rror.to_exn (Error.of_exn exn)
=C2=A0 =3D exn`.
- Added to `failwiths` an optional `?here:Lexing.positi= on` argument.
- Added `with typerep` to `Flags.S`.
- Optimized `List.= dedup []` to return immediately.
- Added `data` argument to polymorphic = type `Hashtbl_intf.Creators.create_options`.

=C2=A0 This allows implementations of `Hashtbl_intf.Creators` to have=C2=A0 constructor arguments that depend on the type of both key and data=
=C2=A0 values.=C2=A0 For example:

=C2=A0 ```ocaml
=C2=A0 modu= le type Hashtbl_creators_with_typerep =3D
=C2=A0=C2=A0=C2=A0 Hashtbl_intf.Creators
=C2=A0=C2=A0=C2=A0 with type (&= #39;key, 'data, 'z) create_options
=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0 =3D=C2=A0 typerep_of_key:'key Typerep.t
=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0 -> typerep_of_data:'data Typerep.t
=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0 -> 'z
=C2=A0 ```
- Improved the interface for gettin= g `Monad.Make` to define `map` in
=C2=A0 terms of `bind`.

=C2=A0 Instead of passing a `map` function a= nd requiring everyone who wants
=C2=A0 to define `map` using `bind` to c= all a special function, we use a
=C2=A0 variant type to allow the user t= o say what they want:

=C2=A0 ```ocaml
=C2=A0 val map : [ `Define_using_bind
=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 | `Custom of (= 9;a t -> f:('a -> 'b) -> 'b t)
=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 ]
=C2=A0 ```
- Impro= ved the performance of many `Dequeue` functions.

=C2=A0 Previously, many `Dequeue.dequeue`-type functions worked by rais= ing
=C2=A0 and then catching an exception when the dequeue is empty.=C2= =A0 This is
=C2=A0 much slower than just testing for emptiness, which is= what the code
=C2=A0 now does.

=C2=A0 This improves the performance of `Async.Writ= er`, which uses
=C2=A0 `Dequeue.dequeue_front`.

## pat= diff

- Removed latex output.

## patience_diff
<= br>- Exposed `Patience_diff.matches`.

## sexplib

- Make the camlp4 dependency optional
<= br>---

We hope you find it useful!

-- B= en Millwood, on behalf of the Core team
--001a11c1170860f1d804fc0ad766--