/* [size] is a number of bytes */ CAMLexport value caml_alloc_custom(struct custom_operations * ops, uintnat size, mlsize_t mem, mlsize_t max) { mlsize_t wosize; value result; wosize = 1 + (size + sizeof(value) - 1) / sizeof(value); if (wosize <= Max_young_wosize) { result = caml_alloc_small(wosize, Custom_tag); Custom_ops_val(result) = ops; if (ops->finalize != NULL) { /* Remembered that the block has a finalizer */ if (caml_finalize_table.ptr >= caml_finalize_table.limit){ CAMLassert (caml_finalize_table.ptr == caml_finalize_table.limit); caml_realloc_ref_table (&caml_finalize_table); } *caml_finalize_table.ptr++ = (value *)result; } } else { result = caml_alloc_shr(wosize, Custom_tag); Custom_ops_val(result) = ops; caml_adjust_gc_speed(mem, max); result = caml_check_urgent_gc(result); } return result; }
CAMLexport value caml_alloc_custom(struct custom_operations * ops, uintnat size, mlsize_t mem, mlsize_t max) { mlsize_t wosize; value result; wosize = 1 + (size + sizeof(value) - 1) / sizeof(value); if (ops->finalize == NULL && wosize <= Max_young_wosize) { result = caml_alloc_small(wosize, Custom_tag); Custom_ops_val(result) = ops; } else { result = caml_alloc_shr(wosize, Custom_tag); Custom_ops_val(result) = ops; caml_adjust_gc_speed(mem, max); result = caml_check_urgent_gc(result); } return result; }
CAMLexport value bigstring_alloc (value v_gc_max_unused, value v_size) { intnat size = Long_val (v_size); void * data = NULL; int flags = CORE_BIGSTRING_FLAGS | CAML_BA_MANAGED; intnat gc_max_unused = Long_val(v_gc_max_unused); intnat dims[1]; dims[0] = size; if (gc_max_unused >= 0) { data = (void *) malloc(sizeof(char) * size); if (NULL == data) caml_raise_out_of_memory (); /* caml_adjust_gc_speed is also called by caml_ba_alloc below, but it will have * numerator 0 when data != NULL. Effectively, that call will have no effect if this * call is made. */ caml_adjust_gc_speed(size, gc_max_unused); } return caml_ba_alloc (flags, 1, data, dims); }