diff options
author | ian <ian@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-11-11 21:02:48 +0000 |
---|---|---|
committer | ian <ian@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-11-11 21:02:48 +0000 |
commit | b65306f72d107388210b3cab1fc9989693daa634 (patch) | |
tree | 6dc91773cd2743418de4eb59e161cb0a4381c77a /libgo/runtime/go-defer.c | |
parent | 74460d8c34a44befb1dff1f3d119ca36257a5978 (diff) | |
download | ppe42-gcc-b65306f72d107388210b3cab1fc9989693daa634.tar.gz ppe42-gcc-b65306f72d107388210b3cab1fc9989693daa634.zip |
Introduce G structure and thread-local global g.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@181301 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libgo/runtime/go-defer.c')
-rw-r--r-- | libgo/runtime/go-defer.c | 24 |
1 files changed, 9 insertions, 15 deletions
diff --git a/libgo/runtime/go-defer.c b/libgo/runtime/go-defer.c index 1f116eb38c9..dda62fb4e1a 100644 --- a/libgo/runtime/go-defer.c +++ b/libgo/runtime/go-defer.c @@ -6,6 +6,7 @@ #include <stddef.h> +#include "runtime.h" #include "go-alloc.h" #include "go-panic.h" #include "go-defer.h" @@ -17,18 +18,14 @@ __go_defer (_Bool *frame, void (*pfn) (void *), void *arg) { struct __go_defer_stack *n; - if (__go_panic_defer == NULL) - __go_panic_defer = ((struct __go_panic_defer_struct *) - __go_alloc (sizeof (struct __go_panic_defer_struct))); - n = (struct __go_defer_stack *) __go_alloc (sizeof (struct __go_defer_stack)); - n->__next = __go_panic_defer->__defer; + n->__next = g->defer; n->__frame = frame; - n->__panic = __go_panic_defer->__panic; + n->__panic = g->panic; n->__pfn = pfn; n->__arg = arg; n->__retaddr = NULL; - __go_panic_defer->__defer = n; + g->defer = n; } /* This function is called when we want to undefer the stack. */ @@ -36,22 +33,19 @@ __go_defer (_Bool *frame, void (*pfn) (void *), void *arg) void __go_undefer (_Bool *frame) { - if (__go_panic_defer == NULL) - return; - while (__go_panic_defer->__defer != NULL - && __go_panic_defer->__defer->__frame == frame) + while (g->defer != NULL && g->defer->__frame == frame) { struct __go_defer_stack *d; void (*pfn) (void *); - d = __go_panic_defer->__defer; + d = g->defer; pfn = d->__pfn; d->__pfn = NULL; if (pfn != NULL) (*pfn) (d->__arg); - __go_panic_defer->__defer = d->__next; + g->defer = d->__next; __go_free (d); /* Since we are executing a defer function here, we know we are @@ -69,7 +63,7 @@ __go_undefer (_Bool *frame) _Bool __go_set_defer_retaddr (void *retaddr) { - if (__go_panic_defer != NULL && __go_panic_defer->__defer != NULL) - __go_panic_defer->__defer->__retaddr = retaddr; + if (g->defer != NULL) + g->defer->__retaddr = retaddr; return 0; } |