summary refs log tree commit diff stats
path: root/lib/pure/concurrency
diff options
context:
space:
mode:
authorBung <crc32@qq.com>2020-11-12 16:16:40 +0800
committerGitHub <noreply@github.com>2020-11-12 09:16:40 +0100
commit826e62953faa1f6cd9bac582246186935af4b8e6 (patch)
tree09dc416bf08bb46057c091aa3db5f396de354f16 /lib/pure/concurrency
parenta81434a890d70e7146c440c59caadc701c6099b3 (diff)
downloadNim-826e62953faa1f6cd9bac582246186935af4b8e6.tar.gz
fix #12726 Cannot take the compile-time sizeof Atomic types (#15928)
* fix #12726 Cannot take the compile-time sizeof Atomic types

* fix for arch 32
Diffstat (limited to 'lib/pure/concurrency')
-rw-r--r--lib/pure/concurrency/atomics.nim15
1 files changed, 8 insertions, 7 deletions
diff --git a/lib/pure/concurrency/atomics.nim b/lib/pure/concurrency/atomics.nim
index eaa811aa6..dc575c6c0 100644
--- a/lib/pure/concurrency/atomics.nim
+++ b/lib/pure/concurrency/atomics.nim
@@ -51,10 +51,11 @@ when defined(cpp) or defined(nimdoc):
         ## with other moSequentiallyConsistent operations.
 
   type
-    Atomic* {.importcpp: "std::atomic".} [T] = object
+    Atomic*[T] {.importcpp: "std::atomic", completeStruct.} = object
       ## An atomic object with underlying type `T`.
+      raw: T
 
-    AtomicFlag* {.importcpp: "std::atomic_flag".} = object
+    AtomicFlag* {.importcpp: "std::atomic_flag", size: 1.} = object
       ## An atomic boolean state.
 
   # Access operations
@@ -249,10 +250,10 @@ else:
     type
       # Atomic* {.importcpp: "_Atomic('0)".} [T] = object
 
-      AtomicInt8 {.importc: "_Atomic NI8".} = object
-      AtomicInt16 {.importc: "_Atomic NI16".} = object
-      AtomicInt32 {.importc: "_Atomic NI32".} = object
-      AtomicInt64 {.importc: "_Atomic NI64".} = object
+      AtomicInt8 {.importc: "_Atomic NI8", size: 1.} = object
+      AtomicInt16 {.importc: "_Atomic NI16", size: 2.} = object
+      AtomicInt32 {.importc: "_Atomic NI32", size: 4.} = object
+      AtomicInt64 {.importc: "_Atomic NI64", size: 8.} = object
 
     template atomicType*(T: typedesc[Trivial]): untyped =
       # Maps the size of a trivial type to it's internal atomic type
@@ -262,7 +263,7 @@ else:
       elif sizeof(T) == 8: AtomicInt64
 
     type
-      AtomicFlag* {.importc: "atomic_flag".} = object
+      AtomicFlag* {.importc: "atomic_flag", size: 1.} = object
 
       Atomic*[T] = object
         when T is Trivial: