diff --git a/ocaml/src/erasure.ml b/ocaml/src/erasure.ml index e0bd648b..313df837 100644 --- a/ocaml/src/erasure.ml +++ b/ocaml/src/erasure.ml @@ -63,26 +63,29 @@ let _encode ?(kind=Isa_l) ~k ~m ~w data_ptrs parity_ptrs size = data_ptrs parity_ptrs size) | Isa_l -> - let rsm = - Isa_l.gen_rs_vandermonde_matrix_jerasure ~k ~m - |> bigarray_start array1 - in + let rsm0 = Isa_l.gen_rs_vandermonde_matrix_jerasure ~k ~m in + let rsm = bigarray_start array1 rsm0 in let gftbls = Isa_l.init_tables ~k ~rows:(k + m) (rsm |> to_voidp |> from_voidp uchar |> fun x -> x +@ k*k) in - Lwt_preemptive.detach - (fun () -> - Isa_l.encode_data - ~release_runtime_lock:true - ~len:size - ~k ~rows:m - ~gftbls - ~data_in:data_ptrs - ~data_out:parity_ptrs) - () + Lwt.finalize + (fun () -> + Lwt_preemptive.detach + (fun () -> + Isa_l.encode_data + ~release_runtime_lock:true + ~len:size + ~k ~rows:m + ~gftbls + ~data_in:data_ptrs + ~data_out:parity_ptrs) + ()) + (fun () -> + Lwt_bytes2.Lwt_bytes.unsafe_destroy rsm0; + Lwt.return_unit) end let encode ?kind ~k ~m ~w data parity size = @@ -142,10 +145,8 @@ let decode ?(kind=Isa_l) ~k ~m ~w erasures data parity size = in (res, erased'))) in - - let rsm = Ctypes.(bigarray_start - array1 - (Isa_l.rs_vandermonde_matrix_from_jerasure ~k ~rows:k dm)) in + let rsm0 = Isa_l.rs_vandermonde_matrix_from_jerasure ~k ~rows:k dm in + let rsm = Ctypes.(bigarray_start array1 rsm0) in let all_fragments = List.append data parity in @@ -170,17 +171,23 @@ let decode ?(kind=Isa_l) ~k ~m ~w erasures data parity size = (rsm |> to_voidp |> from_voidp uchar |> fun x -> x) in - - Lwt_preemptive.detach - (fun () -> - Isa_l.encode_data - ~release_runtime_lock:true - ~len:size - ~k ~rows:k - ~gftbls - ~data_in:(shared_buffer_list_to_carray data_in) - ~data_out:(shared_buffer_list_to_carray data_out)) - () >>= fun () -> + Lwt.finalize + (fun () -> + Lwt_preemptive.detach + (fun () -> + Isa_l.encode_data + ~release_runtime_lock:true + ~len:size + ~k ~rows:k + ~gftbls + ~data_in:(shared_buffer_list_to_carray data_in) + ~data_out:(shared_buffer_list_to_carray data_out)) + ()) + (fun () -> + Lwt_bytes2.Lwt_bytes.unsafe_destroy rsm0; + Lwt.return_unit + ) + >>= fun () -> _encode ~kind ~k ~m ~w