@@ -447,16 +447,18 @@ static unsigned int hash_value_name(char const *name)
447
447
448
448
CAMLprim value caml_register_named_value (value vname , value val )
449
449
{
450
+ CAMLparam2 (vname , val );
450
451
const char * name = String_val (vname );
451
452
size_t namelen = strlen (name );
452
453
unsigned int h = hash_value_name (name );
453
454
int found = 0 ;
454
455
455
456
caml_plat_lock_non_blocking (& named_value_lock );
457
+ name = NULL ; /* block may have moved while we waited for the lock. */
456
458
for (struct named_value * nv = named_value_table [h ];
457
459
nv != NULL ;
458
460
nv = nv -> next ) {
459
- if (strcmp (name , nv -> name ) == 0 ) {
461
+ if (strcmp (String_val ( vname ) , nv -> name ) == 0 ) {
460
462
caml_modify_generational_global_root (& nv -> val , val );
461
463
found = 1 ;
462
464
break ;
@@ -465,14 +467,14 @@ CAMLprim value caml_register_named_value(value vname, value val)
465
467
if (!found ) {
466
468
struct named_value * nv = (struct named_value * )
467
469
caml_stat_alloc (sizeof (struct named_value ) + namelen );
468
- memcpy (nv -> name , name , namelen + 1 );
470
+ memcpy (nv -> name , String_val ( vname ) , namelen + 1 );
469
471
nv -> val = val ;
470
472
nv -> next = named_value_table [h ];
471
473
named_value_table [h ] = nv ;
472
474
caml_register_generational_global_root (& nv -> val );
473
475
}
474
476
caml_plat_unlock (& named_value_lock );
475
- return Val_unit ;
477
+ CAMLreturn ( Val_unit ) ;
476
478
}
477
479
478
480
CAMLexport const value * caml_named_value (char const * name )
0 commit comments