Skip to content

Commit 9c65776

Browse files
authored
Track GC work for all managed bigarray allocations (upstream 11022) (#569)
1 parent 3903eeb commit 9c65776

File tree

1 file changed

+12
-12
lines changed

1 file changed

+12
-12
lines changed

ocaml/runtime/bigarray.c

+12-12
Original file line numberDiff line numberDiff line change
@@ -89,31 +89,31 @@ CAMLexport value
8989
caml_ba_alloc(int flags, int num_dims, void * data, intnat * dim)
9090
{
9191
uintnat num_elts, asize, size;
92-
int i;
92+
int i, is_managed;
9393
value res;
9494
struct caml_ba_array * b;
9595
intnat dimcopy[CAML_BA_MAX_NUM_DIMS];
9696

9797
CAMLassert(num_dims >= 0 && num_dims <= CAML_BA_MAX_NUM_DIMS);
9898
CAMLassert((flags & CAML_BA_KIND_MASK) <= CAML_BA_CHAR);
9999
for (i = 0; i < num_dims; i++) dimcopy[i] = dim[i];
100-
size = 0;
101-
if (data == NULL) {
102-
num_elts = 1;
103-
for (i = 0; i < num_dims; i++) {
104-
if (caml_umul_overflow(num_elts, dimcopy[i], &num_elts))
105-
caml_raise_out_of_memory();
106-
}
107-
if (caml_umul_overflow(num_elts,
108-
caml_ba_element_size[flags & CAML_BA_KIND_MASK],
109-
&size))
100+
num_elts = 1;
101+
for (i = 0; i < num_dims; i++) {
102+
if (caml_umul_overflow(num_elts, dimcopy[i], &num_elts))
110103
caml_raise_out_of_memory();
104+
}
105+
if (caml_umul_overflow(num_elts,
106+
caml_ba_element_size[flags & CAML_BA_KIND_MASK],
107+
&size))
108+
caml_raise_out_of_memory();
109+
if (data == NULL) {
111110
data = malloc(size);
112111
if (data == NULL && size != 0) caml_raise_out_of_memory();
113112
flags |= CAML_BA_MANAGED;
114113
}
115114
asize = SIZEOF_BA_ARRAY + num_dims * sizeof(intnat);
116-
res = caml_alloc_custom_mem(&caml_ba_ops, asize, size);
115+
is_managed = ((flags & CAML_BA_MANAGED_MASK) == CAML_BA_MANAGED);
116+
res = caml_alloc_custom_mem(&caml_ba_ops, asize, is_managed ? size : 0);
117117
b = Caml_ba_array_val(res);
118118
b->data = data;
119119
b->num_dims = num_dims;

0 commit comments

Comments
 (0)