static void caml_ba_finalize(value v) { struct caml_ba_array * b = Caml_ba_array_val(v); switch (b->flags & CAML_BA_MANAGED_MASK) { case CAML_BA_EXTERNAL: break; case CAML_BA_MANAGED: if (b->proxy == NULL) { free(b->data); } else { if (-- b->proxy->refcount == 0) { free(b->proxy->data); caml_stat_free(b->proxy); } } break; case CAML_BA_MAPPED_FILE: if (b->proxy == NULL) { caml_ba_unmap_file(b->data, caml_ba_byte_size(b)); } else { if (-- b->proxy->refcount == 0) { caml_ba_unmap_file(b->proxy->data, b->proxy->size); caml_stat_free(b->proxy); } } break; } }
void core_bigstring_destroy(struct caml_ba_array *b, int flags) { int i; switch (b->flags & CAML_BA_MANAGED_MASK) { case CAML_BA_EXTERNAL : if ((flags & CORE_BIGSTRING_DESTROY_ALLOW_EXTERNAL) != CORE_BIGSTRING_DESTROY_ALLOW_EXTERNAL) caml_failwith("bigstring_destroy: bigstring is external or already deallocated"); break; case CAML_BA_MANAGED : check_bigstring_proxy(b); free(b->data); break; case CAML_BA_MAPPED_FILE : check_bigstring_proxy(b); if ((flags & CORE_BIGSTRING_DESTROY_DO_NOT_UNMAP) != CORE_BIGSTRING_DESTROY_DO_NOT_UNMAP) caml_ba_unmap_file(b->data, caml_ba_byte_size(b)); break; } b->data = NULL; b->flags = CAML_BA_EXTERNAL; for (i = 0; i < b->num_dims; ++i) b->dim[i] = 0; }