From: Andy W. <wi...@us...> - 2002-02-11 07:40:00
|
Update of /cvsroot/gstreamer/cothreads/cothreads In directory usw-pr-cvs1:/tmp/cvs-serv28190/cothreads Modified Files: cothreads.c cothreads.h Log Message: addition of some mmap checks so that we can save private data for cothread 0 Index: cothreads.c =================================================================== RCS file: /cvsroot/gstreamer/cothreads/cothreads/cothreads.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- cothreads.c 11 Feb 2002 06:33:28 -0000 1.3 +++ cothreads.c 11 Feb 2002 07:39:57 -0000 1.4 @@ -38,7 +38,7 @@ static gboolean (*stack_alloc_func_0) (char**, char**); static void* cothread_private_set (char *sp, void *priv, size_t size); -static void cothread_private_get (char *sp, void *priv, size_t size); +static void* cothread_private_get (char *sp, void *priv, size_t size); static void cothread_stub (void); @@ -121,9 +121,9 @@ cothread* cothread_create (void (*func)(int, void **), int argc, void **argv, cothread *main) { - char *low, *high; + char *low, *high, *dest; cothread_private priv; - cothread *ret = &priv.self; + cothread *ret = NULL; low = high = NULL; memset (&priv, 0, sizeof (priv)); @@ -131,6 +131,20 @@ if (!func) { /* we are being asked to save the current thread into a new cothread. this * only happens for the first cothread in a thread. */ + low = CURRENT_STACK_FRAME; +#if PTH_STACK_GROWTH > 0 + dest = (char*) ((gulong)low | (_cothreads_config_global->chunk_size / _cothreads_config_global->blocks_per_chunk - 1)) + + 1 - getpagesize() * 2; +#else + dest = (char*) ((gulong)low &~ (_cothreads_config_global->chunk_size / _cothreads_config_global->blocks_per_chunk - 1)) + + getpagesize(); +#endif + if (mmap (dest, getpagesize(), PROT_READ|PROT_WRITE, + MAP_FIXED|MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) == MAP_FAILED) { + g_critical ("mmap failed, captain"); + return NULL; + } + ret = (cothread*) cothread_private_set (low, &priv, sizeof(priv)); if (stack_alloc_func_0 && !stack_alloc_func_0 (&low, &high)) g_error ("couldn't create cothread 0"); else @@ -153,7 +167,7 @@ priv.argv = argv; priv.func = func; priv.main = main; - ret = (cothread*) cothread_private_set (low, &priv, sizeof(priv)); + ret = (cothread*)cothread_private_set (low, &priv, sizeof(priv)); g_message ("created a cothread %p with low=%p, high=%p", ret, low, high); @@ -163,6 +177,21 @@ } /** + * cothread_self: + * + * Gets the current cothread. + * + * Returns: A pointer to the current cothread + */ +cothread* +cothread_self (void) +{ + char *sp = CURRENT_STACK_FRAME; + + return (cothread*)cothread_private_get (sp, NULL, sizeof (cothread_private)); +} + +/** * cothread_reset: * @self: the cothread, created by cothread_create * @func: function to start with this cothread @@ -171,8 +200,6 @@ * @main: cothread to switch back to if @func exits, or NULL * * Reset a cothread to start running @func, as if it were newly created. - * - * Returns: A pointer to the new cothread */ void cothread_reset (cothread *self, cothread_func func, int argc, void **argv, cothread *main) @@ -187,6 +214,7 @@ pth_mctx_set (self, cothread_stub, low, high); + priv.self = *self; priv.argc = argc; priv.argv = argv; priv.func = func; @@ -228,7 +256,7 @@ return dest; } -static void +static void* cothread_private_get (char *sp, void *priv, size_t size) { char *src; @@ -241,7 +269,10 @@ + getpagesize(); #endif - memcpy (priv, src, size); + if (priv) + memcpy (priv, src, size); + + return src; } static void Index: cothreads.h =================================================================== RCS file: /cvsroot/gstreamer/cothreads/cothreads/cothreads.h,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- cothreads.h 11 Feb 2002 06:33:28 -0000 1.4 +++ cothreads.h 11 Feb 2002 07:39:57 -0000 1.5 @@ -80,6 +80,7 @@ void cothreads_init (cothreads_config *config); cothread* cothread_create (cothread_func func, int argc, void **argv, cothread *main); +cothread* cothread_self (void); void cothread_reset (cothread *self, cothread_func func, int argc, void **argv, cothread *main); void cothread_destroy (cothread *thread); |