Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
fix build on mac
[simgrid.git] / src / xbt / win32_ucontext.c
index b6d5caf..80dd2e5 100644 (file)
-/*\r
- *      win32-ucontext: Unix ucontext_t operations on Windows platforms\r
- *      Copyright(C) 2007 Panagiotis E. Hadjidoukas\r
- *\r
- *      Contact Email: phadjido@cs.uoi.gr, xdoukas@ceid.upatras.gr\r
- *\r
- *      win32-ucontext is free software; you can redistribute it and/or\r
- *      modify it under the terms of the GNU Lesser General Public\r
- *      License as published by the Free Software Foundation; either\r
- *      version 2 of the License, or (at your option) any later version.\r
- *\r
- *      win32-ucontext is distributed in the hope that it will be useful,\r
- *      but WITHOUT ANY WARRANTY; without even the implied warranty of\r
- *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
- *      Lesser General Public License for more details.\r
- *\r
- *      You should have received a copy of the GNU Lesser General Public\r
- *      License along with SimGrid in the file LICENSE-LGPL-2.1;\r
- *      if not, write to the Free Software Foundation, Inc.,\r
- *      59 Temple Place - Suite 330, Boston, MA 02111-1307, USA\r
- */  \r
-    \r
-#include "win32_ucontext.h"\r
-\r
-int getcontext(ucontext_t * ucp) \r
-{\r
-  int ret;\r
-  \r
-      /* Retrieve the full machine context */ \r
-      ucp->uc_mcontext.ContextFlags = CONTEXT_FULL | CONTEXT_DEBUG_REGISTERS;\r
-  ret = GetThreadContext(GetCurrentThread(), &ucp->uc_mcontext);\r
-  return (ret == 0) ? -1 : 0;\r
-}\r
-\r
-int setcontext(const ucontext_t * ucp) \r
-{\r
-  int ret;\r
-  \r
-      /* Restore the full machine context (already set) */ \r
-      ret = SetThreadContext(GetCurrentThread(), &ucp->uc_mcontext);\r
-  return (ret == 0) ? -1 : 0;\r
-}\r
-\r
-int makecontext(ucontext_t * ucp, void (*func) (), int argc, ...) \r
-{\r
-  int i;\r
-  va_list ap;\r
-  char *sp;\r
-\r
-   /* Stack grows down */\r
-      sp = (char *) (size_t) ucp->uc_stack.ss_sp + ucp->uc_stack.ss_size;\r
-  \r
-      /* Reserve stack space for the arguments (maximum possible: argc*(8 bytes per argument)) */ \r
-      sp -= argc * sizeof(void*);\r
-  if (sp < (char *) ucp->uc_stack.ss_sp) {\r
-    \r
-        /* errno = ENOMEM; */ \r
-        return -1;\r
-  }\r
-  \r
-      /* Set the instruction and the stack pointer */\r
-  #ifdef _I_X86_\r
-  ucp->uc_mcontext.Eip = (DWORD) func;\r
-  ucp->uc_mcontext.Esp = (DWORD) sp - sizeof(void*);\r
-  #endif\r
-  #ifdef _IA64_\r
-  #  error "_IA64_"\r
-  #endif\r
-  #ifdef _AMD64_\r
-  ucp->uc_mcontext.Rip = (DWORD64) func;\r
-  ucp->uc_mcontext.Rsp = (DWORD64) sp - sizeof(void*);\r
-  #endif\r
-\r
-      /* Save/Restore the full machine context */ \r
-      ucp->uc_mcontext.ContextFlags = CONTEXT_FULL | CONTEXT_DEBUG_REGISTERS;\r
-  \r
-      /* Copy the arguments */ \r
-      va_start(ap, argc);\r
-  for (i = 0; i < argc; i++) {\r
-    memcpy(sp, ap, sizeof(void*));\r
-    ap += sizeof(void*);\r
-    sp += sizeof(void*);\r
-  }\r
-  va_end(ap);\r
-  return 0;\r
-}\r
-\r
-int swapcontext(ucontext_t * oucp, const ucontext_t * ucp) \r
-{\r
-  int ret;\r
-  if ((oucp == NULL) || (ucp == NULL)) {\r
-    \r
-        /*errno = EINVAL; */ \r
-        return -1;\r
-  }\r
-  ret = getcontext(oucp);\r
-  if (ret == 0) {\r
-    ret = setcontext(ucp);\r
-  }\r
-  return ret;\r
-}\r
-\r
+/* Copyright (c) 2010-2012, 2014-2015. 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. */
+
+/*
+ *      win32-ucontext: Unix ucontext_t operations on Windows platforms
+ *      Copyright(C) 2007 Panagiotis E. Hadjidoukas
+ *
+ *      Contact Email: phadjido@cs.uoi.gr, xdoukas@ceid.upatras.gr
+ *
+ *      win32-ucontext is free software; you can redistribute it and/or
+ *      modify it under the terms of the GNU Lesser General Public
+ *      License as published by the Free Software Foundation; either
+ *      version 2 of the License, or (at your option) any later version.
+ *
+ *      win32-ucontext is distributed in the hope that it will be useful,
+ *      but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *      Lesser General Public License for more details.
+ *
+ *      You should have received a copy of the GNU Lesser General Public
+ *      License along with SimGrid in the file LICENSE-LGPL-2.1;
+ *      if not, write to the Free Software Foundation, Inc.,
+ *      59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */  
+    
+#include "xbt/win32_ucontext.h"
+
+int getcontext(ucontext_t * ucp) 
+{
+  int ret;
+  
+      /* Retrieve the full machine context */ 
+      ucp->uc_mcontext.ContextFlags = CONTEXT_FULL | CONTEXT_DEBUG_REGISTERS;
+  ret = GetThreadContext(GetCurrentThread(), &ucp->uc_mcontext);
+  return (ret == 0) ? -1 : 0;
+}
+
+int setcontext(const ucontext_t * ucp) 
+{
+  int ret;
+  
+      /* Restore the full machine context (already set) */ 
+      ret = SetThreadContext(GetCurrentThread(), &ucp->uc_mcontext);
+  return (ret == 0) ? -1 : 0;
+}
+
+int makecontext(ucontext_t * ucp, void (*func) (), int argc, ...) 
+{
+  int i;
+  va_list ap;
+  char *sp;
+
+   /* Stack grows down */
+      sp = (char *) (size_t) ucp->uc_stack.ss_sp + ucp->uc_stack.ss_size;
+  
+      /* Reserve stack space for the arguments (maximum possible: argc*(8 bytes per argument)) */ 
+      sp -= argc * sizeof(void*);
+  if (sp < (char *) ucp->uc_stack.ss_sp) {
+    
+        /* errno = ENOMEM; */ 
+        return -1;
+  }
+  
+      /* Set the instruction and the stack pointer */
+  #if defined(_I_X86_) || defined(__i386) || defined(__i386__) || defined(_M_IX86)
+  ucp->uc_mcontext.Eip = (DWORD) func;
+  ucp->uc_mcontext.Esp = (DWORD) sp - sizeof(void*);
+  #elif defined(_IA64_) || defined(__ia64) || defined(__ia64__)
+  #  error "_IA64_"
+  #elif defined _AMD64_ || defined(__x86_64) || defined(__x86_64__) || defined(_M_X64)
+  ucp->uc_mcontext.Rip = (DWORD64) func;
+  ucp->uc_mcontext.Rsp = (DWORD64) sp - sizeof(void*);
+  #else
+  #error "No architecture defined for Windows build."
+  #endif
+
+      /* Save/Restore the full machine context */ 
+      ucp->uc_mcontext.ContextFlags = CONTEXT_FULL | CONTEXT_DEBUG_REGISTERS;
+  
+      /* Copy the arguments */ 
+      va_start(ap, argc);
+  for (i = 0; i < argc; i++) {
+    memcpy(sp, ap, sizeof(void*));
+    ap += sizeof(void*);
+    sp += sizeof(void*);
+  }
+  va_end(ap);
+  return 0;
+}
+
+int swapcontext(ucontext_t * oucp, const ucontext_t * ucp) 
+{
+  int ret;
+  if ((oucp == NULL) || (ucp == NULL)) {
+    
+        /*errno = EINVAL; */ 
+        return -1;
+  }
+  ret = getcontext(oucp);
+  if (ret == 0) {
+    ret = setcontext(ucp);
+  }
+  return ret;
+}