@@ -386,32 +386,34 @@ static unsigned int hash_value_name(char const *name)
386
386
387
387
CAMLprim value caml_register_named_value (value vname , value val )
388
388
{
389
+ CAMLparam2 (vname , val );
389
390
const char * name = String_val (vname );
390
391
unsigned int h = hash_value_name (name );
391
392
int found = 0 ;
392
393
393
394
caml_plat_lock_non_blocking (& named_value_lock );
395
+ name = NULL ; /* block may have moved while we waited for the lock. */
394
396
for (struct named_value * nv = named_value_table [h ];
395
397
nv != NULL ;
396
398
nv = nv -> next ) {
397
- if (strcmp (name , nv -> name ) == 0 ) {
399
+ if (strcmp (String_val ( vname ) , nv -> name ) == 0 ) {
398
400
caml_modify_generational_global_root (& nv -> val , val );
399
401
found = 1 ;
400
402
break ;
401
403
}
402
404
}
403
405
if (!found ) {
404
- size_t namelen = strlen (name ) + 1 ;
406
+ size_t namelen = strlen (String_val ( vname )) ;
405
407
struct named_value * nv =
406
- caml_stat_alloc (sizeof (struct named_value ) + namelen );
407
- memcpy (nv -> name , name , namelen );
408
+ caml_stat_alloc (sizeof (struct named_value ) + namelen + 1 );
409
+ memcpy (nv -> name , String_val ( vname ) , namelen + 1 );
408
410
nv -> val = val ;
409
411
nv -> next = named_value_table [h ];
410
412
named_value_table [h ] = nv ;
411
413
caml_register_generational_global_root (& nv -> val );
412
414
}
413
415
caml_plat_unlock (& named_value_lock );
414
- return Val_unit ;
416
+ CAMLreturn ( Val_unit ) ;
415
417
}
416
418
417
419
CAMLexport const value * caml_named_value (char const * name )
0 commit comments