From e2e2c4baacda2e36492adc2c59ffa8ef26584eec Mon Sep 17 00:00:00 2001 From: Simon Cruanes Date: Wed, 23 Mar 2022 15:32:44 -0400 Subject: [PATCH] fuck vendoring atomic --- .gitmodules | 3 -- src/atomic/atomic.post412.mli | 52 +++++++++++++++++++++++ src/atomic/atomic.pre412.mli | 52 +++++++++++++++++++++++ src/atomic/dune | 15 +++++++ src/atomic/gen.ml | 54 ++++++++++++++++++++++++ src/client/dune | 5 ++- src/client/opentelemetry_client_ocurl.ml | 1 + vendor/atomic | 1 - 8 files changed, 177 insertions(+), 6 deletions(-) create mode 100644 src/atomic/atomic.post412.mli create mode 100644 src/atomic/atomic.pre412.mli create mode 100644 src/atomic/dune create mode 100644 src/atomic/gen.ml delete mode 160000 vendor/atomic diff --git a/.gitmodules b/.gitmodules index 1554e2c4..6a111cdb 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,6 +1,3 @@ [submodule "vendor/opentelemetry-proto"] path = vendor/opentelemetry-proto url = https://github.com/open-telemetry/opentelemetry-proto -[submodule "vendor/atomic"] - path = vendor/atomic - url = https://github.com/c-cube/ocaml-atomic.git diff --git a/src/atomic/atomic.post412.mli b/src/atomic/atomic.post412.mli new file mode 100644 index 00000000..36ac6ce3 --- /dev/null +++ b/src/atomic/atomic.post412.mli @@ -0,0 +1,52 @@ + +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Stephen Dolan, University of Cambridge *) +(* Gabriel Scherer, projet Partout, INRIA Paris-Saclay *) +(* *) +(* Copyright 2017-2018 University of Cambridge. *) +(* Copyright 2020 Institut National de Recherche en Informatique et *) +(* en Automatique. *) +(* *) +(* All rights reserved. This file is distributed under the terms of *) +(* the GNU Lesser General Public License version 2.1, with the *) +(* special exception on linking described in the file LICENSE. *) +(* *) +(**************************************************************************) + +(** Atomic references. +*) + +(** An atomic (mutable) reference to a value of type ['a]. *) +type 'a t = 'a Stdlib.Atomic.t + +(** Create an atomic reference. *) +val make : 'a -> 'a t + +(** Get the current value of the atomic reference. *) +val get : 'a t -> 'a + +(** Set a new value for the atomic reference. *) +val set : 'a t -> 'a -> unit + +(** Set a new value for the atomic reference, and return the current value. *) +val exchange : 'a t -> 'a -> 'a + +(** [compare_and_set r seen v] sets the new value of [r] to [v] only + if its current value is physically equal to [seen] -- the + comparison and the set occur atomically. Returns [true] if the + comparison succeeded (so the set happened) and [false] + otherwise. *) +val compare_and_set : 'a t -> 'a -> 'a -> bool + +(** [fetch_and_add r n] atomically increments the value of [r] by [n], + and returns the current value (before the increment). *) +val fetch_and_add : int t -> int -> int + +(** [incr r] atomically increments the value of [r] by [1]. *) +val incr : int t -> unit + +(** [decr r] atomically decrements the value of [r] by [1]. *) +val decr : int t -> unit diff --git a/src/atomic/atomic.pre412.mli b/src/atomic/atomic.pre412.mli new file mode 100644 index 00000000..89905280 --- /dev/null +++ b/src/atomic/atomic.pre412.mli @@ -0,0 +1,52 @@ + +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Stephen Dolan, University of Cambridge *) +(* Gabriel Scherer, projet Partout, INRIA Paris-Saclay *) +(* *) +(* Copyright 2017-2018 University of Cambridge. *) +(* Copyright 2020 Institut National de Recherche en Informatique et *) +(* en Automatique. *) +(* *) +(* All rights reserved. This file is distributed under the terms of *) +(* the GNU Lesser General Public License version 2.1, with the *) +(* special exception on linking described in the file LICENSE. *) +(* *) +(**************************************************************************) + +(** Atomic references. +*) + +(** An atomic (mutable) reference to a value of type ['a]. *) +type 'a t + +(** Create an atomic reference. *) +val make : 'a -> 'a t + +(** Get the current value of the atomic reference. *) +val get : 'a t -> 'a + +(** Set a new value for the atomic reference. *) +val set : 'a t -> 'a -> unit + +(** Set a new value for the atomic reference, and return the current value. *) +val exchange : 'a t -> 'a -> 'a + +(** [compare_and_set r seen v] sets the new value of [r] to [v] only + if its current value is physically equal to [seen] -- the + comparison and the set occur atomically. Returns [true] if the + comparison succeeded (so the set happened) and [false] + otherwise. *) +val compare_and_set : 'a t -> 'a -> 'a -> bool + +(** [fetch_and_add r n] atomically increments the value of [r] by [n], + and returns the current value (before the increment). *) +val fetch_and_add : int t -> int -> int + +(** [incr r] atomically increments the value of [r] by [1]. *) +val incr : int t -> unit + +(** [decr r] atomically decrements the value of [r] by [1]. *) +val decr : int t -> unit diff --git a/src/atomic/dune b/src/atomic/dune new file mode 100644 index 00000000..ac05b2e1 --- /dev/null +++ b/src/atomic/dune @@ -0,0 +1,15 @@ + +(library + (name opentelemetry_atomic) + (synopsis "Compatibility package for the Atomic module for opentelemetry") + (public_name opentelemetry.atomic) + (modules atomic)) + +(executable + (modules gen) + (name gen)) + +(rule + (targets atomic.ml atomic.mli atomic.ml) + (deps atomic.pre412.mli atomic.post412.mli) + (action (run ./gen.exe))) diff --git a/src/atomic/gen.ml b/src/atomic/gen.ml new file mode 100644 index 00000000..29d0ae63 --- /dev/null +++ b/src/atomic/gen.ml @@ -0,0 +1,54 @@ + + +let atomic_before_412 = {| + type 'a t = {mutable x: 'a} + let[@inline] make x = {x} + let[@inline] get {x} = x + let[@inline] set r x = r.x <- x + + let[@inline never] exchange r x = + (* critical section *) + let y = r.x in + r.x <- x; + (* end critical section *) + y + + let[@inline never] compare_and_set r seen v = + (* critical section *) + if r.x == seen then ( + r.x <- v; + true + ) else false + + let[@inline never] fetch_and_add r x = + let v = r.x in + r.x <- x + r.x; + v + + let[@inline never] incr r = r.x <- 1 + r.x + let[@inline never] decr r = r.x <- r.x - 1 + |} + +let atomic_after_412 = {|include Stdlib.Atomic|} + +let write_file file s = + let oc = open_out file in output_string oc s; close_out oc + +let copy_file file1 file2 = + let oc = open_out file2 in + let ic = open_in file1 in + let buf = Bytes.create 1024 in + try + while true do + let n = input ic buf 0 (Bytes.length buf) in + if n=0 then raise End_of_file; + output oc buf 0 n + done + with End_of_file -> () + +let () = + let version = Scanf.sscanf Sys.ocaml_version "%d.%d.%s" (fun x y _ -> x,y) in + write_file "atomic.ml" (if version >= (4,12) then atomic_after_412 else atomic_before_412); + copy_file (if version >= (4,12) then "atomic.post412.mli" else "atomic.pre412.mli") "atomic.mli" ; + () + diff --git a/src/client/dune b/src/client/dune index 11696169..56d7fbf1 100644 --- a/src/client/dune +++ b/src/client/dune @@ -2,6 +2,7 @@ (library (name opentelemetry_client_ocurl) (public_name opentelemetry-client-ocurl) - (libraries opentelemetry curl ocaml-protoc threads - atomic mtime mtime.clock.os)) + (libraries opentelemetry opentelemetry.atomic + curl ocaml-protoc threads + mtime mtime.clock.os)) diff --git a/src/client/opentelemetry_client_ocurl.ml b/src/client/opentelemetry_client_ocurl.ml index d0ea0d31..275f4b0b 100644 --- a/src/client/opentelemetry_client_ocurl.ml +++ b/src/client/opentelemetry_client_ocurl.ml @@ -8,6 +8,7 @@ module OT = Opentelemetry open Opentelemetry +module Atomic = Opentelemetry_atomic.Atomic let[@inline] (let@) f x = f x diff --git a/vendor/atomic b/vendor/atomic deleted file mode 160000 index 12dc7c84..00000000 --- a/vendor/atomic +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 12dc7c84f79606a8a0026ba1eb7856b3cdf6cab6