@@ -314,36 +314,43 @@ CAMLexport CAMLweakdef void caml_initialize (volatile value *fp, value val)
314
314
Ref_table_add (& Caml_state -> minor_tables -> major_ref , fp );
315
315
}
316
316
317
-
318
- CAMLprim value caml_atomic_load (value ref )
317
+ CAMLprim value caml_atomic_load_field (value obj , value vfield )
319
318
{
319
+ intnat field = Long_val (vfield );
320
320
if (caml_domain_alone ()) {
321
- return Field (ref , 0 );
321
+ return Field (obj , field );
322
322
} else {
323
- value v ;
324
323
/* See Note [MM] above */
325
324
atomic_thread_fence (memory_order_acquire );
326
- v = atomic_load (Op_atomic_val (ref ));
327
- return v ;
325
+ return atomic_load (& Op_atomic_val (obj )[field ]);
328
326
}
329
327
}
328
+ CAMLprim value caml_atomic_load (value ref )
329
+ {
330
+ return caml_atomic_load_field (ref , Val_long (0 ));
331
+ }
330
332
331
333
/* stores are implemented as exchanges */
332
- CAMLprim value caml_atomic_exchange (value ref , value v )
334
+ CAMLprim value caml_atomic_exchange_field (value obj , value vfield , value v )
333
335
{
334
336
value ret ;
337
+ intnat field = Long_val (vfield );
335
338
if (caml_domain_alone ()) {
336
- ret = Field (ref , 0 );
337
- Field (ref , 0 ) = v ;
339
+ ret = Field (obj , field );
340
+ Field (obj , field ) = v ;
338
341
} else {
339
342
/* See Note [MM] above */
340
343
atomic_thread_fence (memory_order_acquire );
341
- ret = atomic_exchange (Op_atomic_val (ref ) , v );
344
+ ret = atomic_exchange (& Op_atomic_val (obj )[ field ] , v );
342
345
atomic_thread_fence (memory_order_release ); /* generates `dmb ish` on Arm64*/
343
346
}
344
- write_barrier (ref , 0 , ret , v );
347
+ write_barrier (obj , field , ret , v );
345
348
return ret ;
346
349
}
350
+ CAMLprim value caml_atomic_exchange (value ref , value v )
351
+ {
352
+ return caml_atomic_exchange_field (ref , Val_long (0 ), v );
353
+ }
347
354
348
355
CAMLexport value caml_atomic_cas_field (
349
356
value obj , value vfield , value oldval , value newval )
@@ -377,22 +384,27 @@ CAMLprim value caml_atomic_cas (value ref, value oldval, value newval)
377
384
return caml_atomic_cas_field (ref , Val_long (0 ), oldval , newval );
378
385
}
379
386
380
- CAMLprim value caml_atomic_fetch_add (value ref , value incr )
387
+ CAMLprim value caml_atomic_fetch_add_field (value obj , value vfield , value incr )
381
388
{
389
+ intnat field = Long_val (vfield );
382
390
value ret ;
383
391
if (caml_domain_alone ()) {
384
- value * p = Op_val (ref );
385
- CAMLassert (Is_long (* p ));
392
+ value * p = & Op_val (obj )[field ];
386
393
ret = * p ;
394
+ CAMLassert (Is_long (ret ));
387
395
* p = Val_long (Long_val (ret ) + Long_val (incr ));
388
396
/* no write barrier needed, integer write */
389
397
} else {
390
- atomic_value * p = & Op_atomic_val (ref )[ 0 ];
391
- ret = atomic_fetch_add (p , 2 * Long_val (incr ));
398
+ atomic_value * p = & Op_atomic_val (obj )[ field ];
399
+ ret = atomic_fetch_add (p , 2 * Long_val (incr ));
392
400
atomic_thread_fence (memory_order_release ); /* generates `dmb ish` on Arm64*/
393
401
}
394
402
return ret ;
395
403
}
404
+ CAMLprim value caml_atomic_fetch_add (value ref , value incr )
405
+ {
406
+ return caml_atomic_fetch_add_field (ref , Val_long (0 ), incr );
407
+ }
396
408
397
409
CAMLexport void caml_set_fields (value obj , value v )
398
410
{
0 commit comments