summary refs log tree commit diff stats
path: root/lib/pure/volatile.nim
diff options
context:
space:
mode:
Diffstat (limited to 'lib/pure/volatile.nim')
-rw-r--r--lib/pure/volatile.nim34
1 files changed, 34 insertions, 0 deletions
diff --git a/lib/pure/volatile.nim b/lib/pure/volatile.nim
new file mode 100644
index 000000000..a38247c7d
--- /dev/null
+++ b/lib/pure/volatile.nim
@@ -0,0 +1,34 @@
+#
+#
+#            Nim's Runtime Library
+#        (c) Copyright 2017 Jeff Ciesielski
+#
+#    See the file "copying.txt", included in this
+#    distribution, for details about the copyright.
+#
+
+## This module contains code for generating volatile loads and stores,
+## which are useful in embedded and systems programming.
+
+proc volatileLoad*[T](src: ptr T): T {.inline, noinit.} =
+  ## Generates a volatile load of the value stored in the container `src`.
+  ## Note that this only effects code generation on `C` like backends.
+  when nimvm:
+    result = src[]
+  else:
+    when defined(js):
+      result = src[]
+    else:
+      {.emit: [result, " = (*(", typeof(src[]), " volatile*)", src, ");"].}
+
+proc volatileStore*[T](dest: ptr T, val: T) {.inline.} =
+  ## Generates a volatile store into the container `dest` of the value
+  ## `val`. Note that this only effects code generation on `C` like
+  ## backends.
+  when nimvm:
+    dest[] = val
+  else:
+    when defined(js):
+      dest[] = val
+    else:
+      {.emit: ["*((", typeof(dest[]), " volatile*)(", dest, ")) = ", val, ";"].}