CAMLprim value caml_register_named_value(value vname, value val) { struct named_value * nv; const char * name = String_val(vname); size_t namelen = strlen(name); unsigned int h = hash_value_name(name); int found = 0; caml_plat_lock(&named_value_lock); for (nv = named_value_table[h]; nv != NULL; nv = nv->next) { if (strcmp(name, nv->name) == 0) { caml_modify_root(nv->val, val); found = 1; break; } } if (!found) { nv = (struct named_value *) caml_stat_alloc(sizeof(struct named_value) + namelen); memcpy(nv->name, name, namelen + 1); nv->val = caml_create_root(val); nv->next = named_value_table[h]; named_value_table[h] = nv; } caml_plat_unlock(&named_value_lock); return Val_unit; }
CAMLexport value * caml_named_value(char const *name) { struct named_value * nv; for (nv = named_value_table[hash_value_name(name)]; nv != NULL; nv = nv->next) { if (strcmp(name, nv->name) == 0) return &nv->val; } return NULL; }
CAMLexport const value* caml_named_value(char const *name) { struct named_value * nv; caml_root ret = NULL; caml_plat_lock(&named_value_lock); for (nv = named_value_table[hash_value_name(name)]; nv != NULL; nv = nv->next) { if (strcmp(name, nv->name) == 0){ ret = nv->val; break; } } caml_plat_unlock(&named_value_lock); /* *ret should never be a minor object, since caml_create_root promotes */ CAMLassert (!(ret && Is_minor(caml_read_root(ret)))); return Op_val(ret); }
CAMLprim value caml_register_named_value(value vname, value val) { struct named_value * nv; char * name = String_val(vname); unsigned int h = hash_value_name(name); for (nv = named_value_table[h]; nv != NULL; nv = nv->next) { if (strcmp(name, nv->name) == 0) { nv->val = val; return Val_unit; } } nv = (struct named_value *) caml_stat_alloc(sizeof(struct named_value) + strlen(name)); strcpy(nv->name, name); nv->val = val; nv->next = named_value_table[h]; named_value_table[h] = nv; caml_register_global_root(&nv->val); return Val_unit; }