+++ /dev/null
-/*\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 QueueUserAPCEx in the file COPYING.LIB;\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 "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;\r
- ret = GetThreadContext(GetCurrentThread(), &ucp->uc_mcontext);\r
-\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
-\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*8;\r
-\r
- if ( sp < (char *)ucp->uc_stack.ss_sp) {\r
- /* errno = ENOMEM;*/\r
- return -1;\r
- }\r
-\r
- /* Set the instruction and the stack pointer */\r
- ucp->uc_mcontext.Eip = (unsigned long) func;\r
- ucp->uc_mcontext.Esp = (unsigned long) sp - 4;\r
-\r
- /* Save/Restore the full machine context */\r
- ucp->uc_mcontext.ContextFlags = CONTEXT_FULL;\r
-\r
- /* Copy the arguments */\r
- va_start (ap, argc);\r
- for (i=0; i<argc; i++) {\r
- memcpy(sp, ap, 8);\r
- ap +=8;\r
- sp += 8;\r
- }\r
- va_end(ap);\r
-\r
- return 0;\r
-}\r
-\r
-int swapcontext(ucontext_t *oucp, const ucontext_t *ucp)\r
-{\r
- int ret;\r
-\r
- if ((oucp == NULL) || (ucp == NULL)) {\r
- /*errno = EINVAL;*/\r
- return -1;\r
- }\r
-\r
- ret = getcontext(oucp);\r
- if (ret == 0) {\r
- ret = setcontext(ucp);\r
- }\r
- return ret;\r
-}
\ No newline at end of file