Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
cmake: More cleanups of the sysv contexts
[simgrid.git] / tools / cmake / test_prog / prog_makecontext.c
diff --git a/tools/cmake/test_prog/prog_makecontext.c b/tools/cmake/test_prog/prog_makecontext.c
new file mode 100644 (file)
index 0000000..a3fffe9
--- /dev/null
@@ -0,0 +1,48 @@
+/* Copyright (c) 2010, 2014, 2016. The SimGrid Team. All rights reserved.   */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#ifdef __APPLE__
+#define _XOPEN_SOURCE 700
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <ucontext.h>
+
+ucontext_t uc_child;
+ucontext_t uc_main;
+
+static void child(void)
+{
+  /* switch back to the main context */
+  if (swapcontext(&uc_child, &uc_main) != 0)
+    exit(2);
+}
+
+int main(int argc, char *argv[])
+{
+  void *stack = malloc(64 * 1024);
+
+  /* configure a child user-space context */
+  if (stack == NULL)
+    exit(3);
+  if (getcontext(&uc_child) != 0)
+    exit(4);
+  uc_child.uc_link = NULL;
+  uc_child.uc_stack.ss_sp = (char *) stack + (32 * 1024);
+  uc_child.uc_stack.ss_size = 32 * 1024;
+  uc_child.uc_stack.ss_flags = 0;
+  makecontext(&uc_child, child, 0);
+
+  /* switch into the user context */
+  if (swapcontext(&uc_main, &uc_child) != 0)
+    exit(5);
+
+  /* Fine, child came home */
+  printf("yes\n");
+
+  /* die successfully */
+  return 0;
+}