Skip to content

Commit dae5e80

Browse files
committed
Moving atomic library to extension
Using C++ <atomic> if C11 one is not available (Most likely Visual Studio on Windows)
1 parent 3075506 commit dae5e80

File tree

13 files changed

+239
-94
lines changed

13 files changed

+239
-94
lines changed

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ CTestTestfile.cmake
1414
cmake_install.cmake
1515
cmake_uninstall.cmake
1616
Makefile
17+
/Testing
18+
DartConfiguration.tcl
1719

1820
*.bin
1921
*.pc
@@ -31,6 +33,7 @@ sagittarius-package
3133

3234
/doc/*.html
3335
/doc/sections
36+
/ext/atomic/atomic.c
3437
/ext/crypto/bytevector.c
3538
/ext/crypto/cipher.c
3639
/ext/crypto/digest.c

CMakeLists.txt

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,6 @@ CHECK_INCLUDE_FILE(pthread.h HAVE_PTHREAD_H)
8989
# C11 features
9090
CHECK_INCLUDE_FILE(uchar.h HAVE_UCHAR_H)
9191
CHECK_INCLUDE_FILE(stdnoreturn.h HAVE_STDNORETURN_H)
92-
CHECK_INCLUDE_FILE(stdatomic.h HAVE_STDATOMIC_H)
9392

9493
IF (HAVE_TIME_H)
9594
CHECK_STRUCT_EXISTS("struct timespec" time.h HAVE_TIMESPEC)
@@ -374,9 +373,6 @@ IF(USE_BOEHM_GC)
374373
AND NOT EXISTS ${GC_DIR}/libatomic_ops)
375374
FILE(RENAME ${GC_DIR}/${LIBATOMIC_OPS} ${GC_DIR}/libatomic_ops)
376375
ENDIF()
377-
IF (NOT HAVE_STDATOMIC_H)
378-
INCLUDE_DIRECTORIES(${GC_DIR}/libatomic_ops/src)
379-
ENDIF()
380376
ENDIF()
381377
ENDIF()
382378
ENDIF()

cmake/config-cmake.h.in

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@
4040
/* C11 features */
4141
#cmakedefine HAVE_UCHAR_H
4242
#cmakedefine HAVE_STDNORETURN_H
43-
#cmakedefine HAVE_STDATOMIC_H
4443

4544
#cmakedefine HAVE_TIMESPEC
4645

ext/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ ELSE()
117117
ENDIF()
118118
ENDIF()
119119

120+
ADD_SUBDIRECTORY(atomic atomic)
120121
ADD_SUBDIRECTORY(zlib zlib)
121122
ADD_SUBDIRECTORY(threads threads)
122123
ADD_SUBDIRECTORY(time time)

ext/CMakeLists.txt.in

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,15 @@ ENDIF()
2121
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR})
2222

2323
SET_TARGET_PROPERTIES(sagittarius--@module@ PROPERTIES PREFIX "")
24+
IF (APPLE)
25+
SET_TARGET_PROPERTIES(sagittarius--@module@ PROPERTIES PREFIX ".dylib")
26+
ENDIF()
2427
TARGET_LINK_LIBRARIES(sagittarius--@module@ sagittarius)
2528

2629
INSTALL(TARGETS sagittarius--@module@
2730
DESTINATION ${SAGITTARIUS_DYNLIB_PATH})
2831
INSTALL(FILES sagittarius/@module@.scm
2932
DESTINATION ${SAGITTARIUS_SHARE_LIB_PATH}/sagittarius)
33+
34+
# for test
35+
FILE(APPEND ${EXT_TEST_RESOURCE_FILE} "${CMAKE_CURRENT_SOURCE_DIR}\n")

ext/atomic/CMakeLists.txt

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
# Sagittarius extensions -*- CMake -*-
2+
#
3+
# Build file for atomic
4+
5+
CHECK_INCLUDE_FILE(stdatomic.h HAVE_STDATOMIC_H)
6+
# C++ for VS :(
7+
CHECK_INCLUDE_FILE_CXX(atomic HAVE_CPP_ATOMIC)
8+
9+
IF (HAVE_STDATOMIC_H)
10+
ADD_DEFINITIONS("-DHAVE_STDATOMIC_H")
11+
ENDIF()
12+
IF (HAVE_CPP_ATOMIC)
13+
ADD_DEFINITIONS("-D HAVE_CPP_ATOMIC")
14+
ENDIF()
15+
16+
ADD_LIBRARY(sagittarius--atomic MODULE
17+
sagittarius-atomic.c
18+
${CMAKE_CURRENT_BINARY_DIR}/atomic.c)
19+
20+
INCLUDE(${CMAKE_CURRENT_SOURCE_DIR}/../addstub.cmake)
21+
ADD_STUBS(sagittarius--atomic
22+
COMMAND ${GENSTUB}
23+
FILES atomic.stub)
24+
25+
IF (MSVC OR CYGWIN)
26+
# ugly solution
27+
SET_SOURCE_FILES_PROPERTIES(sagittarius-atomic.c
28+
${CMAKE_CURRENT_BINARY_DIR}/atomic.c
29+
PROPERTIES LANGUAGE CXX)
30+
ENDIF()
31+
32+
IF (NOT WIN32)
33+
if (HAVE_STDATOMIC_H)
34+
CHECK_C_SOURCE_COMPILES(
35+
"#include <stdatomic.h>
36+
#include <stddef.h>
37+
typedef struct {
38+
void *a;
39+
void *b;
40+
} cas16_t;
41+
typedef _Atomic cas16_t atomic_cas16_t;
42+
int main()
43+
{
44+
cas16_t v = { NULL, NULL };
45+
atomic_cas16_t a;
46+
atomic_init(&a, v);
47+
atomic_exchange(&a, v);
48+
return 0;
49+
}
50+
"
51+
CAS16_WORKS)
52+
ELSE()
53+
# TODO libatomic_ops?
54+
SET(CAS16_WORKS TRUE)
55+
ENDIF()
56+
IF (CAS16_WORKS)
57+
MESSAGE(STATUS "CAS16 works ... yes")
58+
ELSE()
59+
MESSAGE(STATUS "CAS16 works ... no")
60+
ENDIF()
61+
62+
# for CAS16
63+
IF (NOT CAS16_WORKS)
64+
TARGET_LINK_LIBRARIES(sagittarius--atomic atomic)
65+
ENDIF()
66+
ENDIF()
67+
68+
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR})
69+
70+
SET_TARGET_PROPERTIES(sagittarius--atomic PROPERTIES PREFIX "")
71+
IF(APPLE)
72+
SET_TARGET_PROPERTIES(sagittarius--atomic PROPERTIES SUFFIX ".dylib")
73+
ENDIF()
74+
TARGET_LINK_LIBRARIES(sagittarius--atomic sagittarius)
75+
76+
INSTALL(TARGETS sagittarius--atomic
77+
DESTINATION ${SAGITTARIUS_DYNLIB_PATH})
78+
INSTALL(FILES sagittarius/atomic.scm
79+
DESTINATION ${SAGITTARIUS_SHARE_LIB_PATH}/sagittarius)
80+
81+
FILE(APPEND ${EXT_TEST_RESOURCE_FILE} "${CMAKE_CURRENT_SOURCE_DIR}\n")

src/lib_atomic.stub renamed to ext/atomic/atomic.stub

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -25,25 +25,22 @@
2525
;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
2626
;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2727

28-
(library (sagittarius atomic)
29-
(export :only-bindings)
30-
(import (core))
31-
3228
(decl-code
33-
(.define "LIBSAGITTARIUS_BODY")
29+
(.define "LIBSAGITTARIUS_EXT_BODY")
3430
(.include <sagittarius/private.h>
35-
<sagittarius/private/atomic.h>))
31+
<sagittarius/extend.h>
32+
"sagittarius-atomic.h"))
3633

3734
(define-type <atomic> "SgAtomic*" )
3835
(define-type <atomic-pair> "SgAtomic*" "atomic-pair"
3936
"SG_ATOMIC_PAIR_P" "SG_ATOMIC")
4037
(define-type <atomic-fixnum> "SgAtomic*" "atomic-fixnum"
4138
"SG_ATOMIC_FIXNUM_P" "SG_ATOMIC")
4239
(define-type <memory-order> "SgMemoryOrder" "memory-order"
43-
"Sg_MemoryOrderP" "SG_INT_VALUE" "SG_MAKE_INT")
40+
"Sg_MemoryOrderP" "SCM_TO_MEMORY_ORDER" "MEMORY_ORDER_TO_SCM")
4441

4542
(define-cise-expr default-memory-order
46-
((_) '(SG_MAKE_INT memory_order_seq_cst)))
43+
((_) '(MEMORY_ORDER_TO_SCM memory_order_seq_cst)))
4744

4845
(define-c-proc memory-order? (obj) ::<boolean> Sg_MemoryOrderP)
4946

@@ -63,7 +60,7 @@
6360

6461
(define-c-proc atomic-fixnum-add! (a::<atomic-fixnum> v::<fixnum> :optional (order::<memory-order> (default-memory-order))) ::<fixnum> Sg_AtomicFixnumAdd)
6562
(define-c-proc atomic-fixnum-sub! (a::<atomic-fixnum> v::<fixnum> :optional (order::<memory-order> (default-memory-order))) ::<fixnum> Sg_AtomicFixnumSub)
66-
(define-c-proc atomic-fixnum-or! (a::<atomic-fixnum> v::<fixnum> :optional (order::<memory-order> (default-memory-order))) ::<fixnum> Sg_AtomicFixnumOr)
63+
(define-c-proc atomic-fixnum-ior! (a::<atomic-fixnum> v::<fixnum> :optional (order::<memory-order> (default-memory-order))) ::<fixnum> Sg_AtomicFixnumIor)
6764
(define-c-proc atomic-fixnum-xor! (a::<atomic-fixnum> v::<fixnum> :optional (order::<memory-order> (default-memory-order))) ::<fixnum> Sg_AtomicFixnumXor)
6865
(define-c-proc atomic-fixnum-and! (a::<atomic-fixnum> v::<fixnum> :optional (order::<memory-order> (default-memory-order))) ::<fixnum> Sg_AtomicFixnumAnd)
6966

@@ -74,9 +71,3 @@
7471

7572
(define-c-proc atomic-thread-fence (order::<memory-order>) ::<void> Sg_AtomicThreadFence)
7673

77-
(define (atomic-fixnum-inc! atomic . opts)
78-
(apply atomic-fixnum-add! atomic 1 opts))
79-
(define (atomic-fixnum-dec! atomic . opts)
80-
(apply atomic-fixnum-sub! atomic 1 opts))
81-
82-
)

src/atomic.c renamed to ext/atomic/sagittarius-atomic.c

Lines changed: 36 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -26,16 +26,21 @@
2626
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2727
*/
2828
#include <stddef.h>
29-
#define LIBSAGITTARIUS_BODY
30-
#include "sagittarius/private/atomic.h"
31-
#include "sagittarius/private/error.h"
32-
#include "sagittarius/private/library.h"
33-
#include "sagittarius/private/pair.h"
34-
#include "sagittarius/private/port.h"
35-
#include "sagittarius/private/symbol.h"
36-
#include "sagittarius/private/writer.h"
29+
#define LIBSAGITTARIUS_EXT_BODY
30+
#include <sagittarius/extend.h>
31+
#include "sagittarius-atomic.h"
32+
#include <sagittarius/private/error.h>
33+
#include <sagittarius/private/library.h>
34+
#include <sagittarius/private/pair.h>
35+
#include <sagittarius/private/port.h>
36+
#include <sagittarius/private/symbol.h>
37+
#include <sagittarius/private/writer.h>
3738

38-
#ifndef HAVE_STDATOMIC_H
39+
#if !defined(HAVE_STDATOMIC_H) && defined(HAVE_CPP_ATOMIC)
40+
41+
using namespace std;
42+
43+
#elif !defined(HAVE_STDATOMIC_H) && !defined(HAVE_CPP_ATOMIC)
3944

4045
#include <atomic_ops.h>
4146

@@ -72,6 +77,8 @@ static void ao_store_explicit(volatile AO_t *o, AO_t v, memory_order order)
7277
{
7378
switch (order) {
7479
case memory_order_release:
80+
case memory_order_acq_rel:
81+
case memory_order_seq_cst:
7582
AO_store_release(o, v);
7683
break;
7784
default:
@@ -141,7 +148,7 @@ static AO_t ao_fetch_or(volatile AO_t *o, AO_t v, memory_order order)
141148
}
142149
return r;
143150
}
144-
static void ao_fetch_xor(volatile AO_t *o, AO_t v, memory_order order)
151+
static AO_t ao_fetch_xor(volatile AO_t *o, AO_t v, memory_order order)
145152
{
146153
AO_t r = ao_load_explicit(o, order);
147154
/* handle_memory_order((void), AO_xor, order, o, v); */
@@ -163,7 +170,7 @@ static void ao_fetch_xor(volatile AO_t *o, AO_t v, memory_order order)
163170
}
164171
return r;
165172
}
166-
static void ao_fetch_and(volatile AO_t *o, AO_t v, memory_order order)
173+
static AO_t ao_fetch_and(volatile AO_t *o, AO_t v, memory_order order)
167174
{
168175
AO_t r = ao_load_explicit(o, order);
169176
/* handle_memory_order((void), AO_and, order, o, v); */
@@ -190,18 +197,18 @@ static void ao_thread_fence(memory_order order)
190197
{
191198
switch (order) {
192199
case memory_order_relaxed:
193-
AO_nop(o, v);
200+
AO_nop();
194201
break;
195202
case memory_order_consume:
196203
case memory_order_acquire:
197-
AO_nop_read(o, v);
204+
AO_nop_read();
198205
break;
199206
case memory_order_release:
200-
AO_nop_write(o, v);
207+
AO_nop_write();
201208
break;
202209
case memory_order_acq_rel:
203210
case memory_order_seq_cst:
204-
AO_nop_full(o, v);
211+
AO_nop_full();
205212
break;
206213
}
207214
}
@@ -266,6 +273,9 @@ static void atomic_print(SgObject obj, SgPort *port, SgWriteContext *ctx)
266273
if (SG_ATOMIC_FIXNUM_P(obj)) {
267274
Sg_Printf(port, UC("#<atomic-fixnum %d>"),
268275
atomic_load_explicit(&SG_ATOMIC_REF_FIXNUM(obj), memory_order_relaxed));
276+
} else if (SG_ATOMIC_PAIR_P(obj)) {
277+
pair_t v = atomic_load_explicit(&SG_ATOMIC_REF_PAIR(obj), memory_order_relaxed);
278+
Sg_Printf(port, UC("#<atomic-pair %S>"), Sg_Cons(v.car, v.cdr));
269279
} else {
270280
Sg_Printf(port, UC("#<atomic %S>"),
271281
atomic_load_explicit(&SG_ATOMIC_REF_OBJECT(obj), memory_order_relaxed));
@@ -330,7 +340,7 @@ void Sg_AtomicStore(volatile SgAtomic *o, SgObject v, SgMemoryOrder order)
330340
if (!SG_PAIRP(v)) {
331341
Sg_Error(UC("pair is required for atomic-pair but got %A"), v);
332342
}
333-
pair_t v2 = { .car = SG_CAR(v), .cdr = SG_CDR(v) };
343+
pair_t v2 = { SG_CAR(v), SG_CDR(v) };
334344
atomic_store_explicit(&SG_ATOMIC_REF_PAIR(o), v2, order);
335345
} else {
336346
atomic_store_explicit(&SG_ATOMIC_REF_OBJECT(o), (object_t)v, order);
@@ -350,7 +360,7 @@ SgObject Sg_AtomicExchange(volatile SgAtomic *o, SgObject v, SgMemoryOrder order
350360
if (!SG_PAIRP(v)) {
351361
Sg_Error(UC("pair is required for atomic-pair but got %A"), v);
352362
}
353-
pair_t v2 = { .car = SG_CAR(v), .cdr = SG_CDR(v) };
363+
pair_t v2 = { SG_CAR(v), SG_CDR(v) };
354364
pair_t r = atomic_exchange_explicit(&SG_ATOMIC_REF_PAIR(o), v2, order);
355365
return Sg_Cons(r.car, r.cdr);
356366
} else {
@@ -402,7 +412,7 @@ long Sg_AtomicFixnumSub(volatile SgAtomic *o, long v, SgMemoryOrder order)
402412
{
403413
atomic_math(o, v, order, atomic_fetch_sub_explicit);
404414
}
405-
long Sg_AtomicFixnumOr(volatile SgAtomic *o, long v, SgMemoryOrder order)
415+
long Sg_AtomicFixnumIor(volatile SgAtomic *o, long v, SgMemoryOrder order)
406416
{
407417
atomic_math(o, v, order, atomic_fetch_or_explicit);
408418
}
@@ -435,8 +445,8 @@ int Sg_AtomicCompareAndSwap(volatile SgAtomic *o, SgObject e, SgObject v,
435445
Sg_Error(UC("atomic_pair must take pair but got %S and %S"), e, v);
436446
}
437447
{
438-
pair_t ev = { .car = SG_CAR(e), .cdr = SG_CDR(e) };
439-
pair_t vv = { .car = SG_CAR(v), .cdr = SG_CDR(v) };
448+
pair_t ev = { SG_CAR(e), SG_CDR(e) };
449+
pair_t vv = { SG_CAR(v), SG_CDR(v) };
440450
return atomic_compare_exchange_strong_explicit(&SG_ATOMIC_REF_PAIR(o),
441451
&ev, vv, success, failure);
442452
}
@@ -455,16 +465,16 @@ void Sg_AtomicThreadFence(SgMemoryOrder order)
455465
atomic_thread_fence(order);
456466
}
457467

458-
extern void Sg__Init_sagittarius_atomic();
468+
extern void Sg__Init_atomic(SgLibrary *lib);
459469

460-
void Sg__InitAtomic()
470+
SG_EXTENSION_ENTRY void CDECL Sg_Init_sagittarius__atomic()
461471
{
462472
SgObject lib = Sg_FindLibrary(SG_INTERN("(sagittarius atomic)"), TRUE);
463-
464-
Sg__Init_sagittarius_atomic();
465-
473+
SG_INIT_EXTENSION(sagittarius__atomic);
474+
Sg__Init_atomic(SG_LIBRARY(lib));
475+
466476
#define insert_binding(name, value) \
467-
Sg_MakeBinding(SG_LIBRARY(lib), SG_INTERN(#name), SG_MAKE_INT(value), TRUE)
477+
Sg_MakeBinding(SG_LIBRARY(lib), SG_INTERN(#name), MEMORY_ORDER_TO_SCM(value), TRUE)
468478

469479
insert_binding(*memory-order:relaxed*, memory_order_relaxed);
470480
insert_binding(*memory-order:consume*, memory_order_consume);

0 commit comments

Comments
 (0)