context: move Mac swapcontext() to separate compilation unit
[model-checker.git] / context.cc
diff --git a/context.cc b/context.cc
new file mode 100644 (file)
index 0000000..b5ae0ba
--- /dev/null
@@ -0,0 +1,27 @@
+#include "context.h"
+
+#ifdef MAC
+
+int model_swapcontext(ucontext_t *oucp, ucontext_t *ucp)
+{
+       /*
+        * Mac OSX swapcontext() clobbers some registers, so use a hand-rolled
+        * version with {get,set}context(). We can avoid the same problem
+        * (where optimizations can break the following code) because we don't
+        * statically link with the C library
+        */
+
+       /* volatile, so that 'i' doesn't get promoted to a register */
+       volatile int i = 0;
+
+       getcontext(oucp);
+
+       if (i == 0) {
+               i = 1;
+               setcontext(ucp);
+       }
+
+       return 0;
+}
+
+#endif /* MAC */