1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20: #include <setjmp.h>
21: #include <stdlib.h>
22: #include "pthreadP.h"
23: #include <jmpbuf-unwind.h>
24:
25: void
26: __pthread_cleanup_upto (__jmp_buf target, char *targetframe)
27: {
28: struct pthread *self = THREAD_SELF;
29: struct _pthread_cleanup_buffer *cbuf;
30:
31:
32:
33:
34: uintptr_t adj = (uintptr_t) self->stackblock + self->stackblock_size;
35: uintptr_t targetframe_adj = (uintptr_t) targetframe - adj;
36:
37: for (cbuf = THREAD_GETMEM (self, cleanup);
38: cbuf != NULL && _JMPBUF_UNWINDS_ADJ (target, cbuf, adj);
39: cbuf = cbuf->__prev)
40: {
41: #if _STACK_GROWS_DOWN
42: if ((uintptr_t) cbuf - adj <= targetframe_adj)
43: {
44: cbuf = NULL;
45: break;
46: }
47: #elif _STACK_GROWS_UP
48: if ((uintptr_t) cbuf - adj >= targetframe_adj)
49: {
50: cbuf = NULL;
51: break;
52: }
53: #else
54: # error "Define either _STACK_GROWS_DOWN or _STACK_GROWS_UP"
55: #endif
56:
57:
58: cbuf->__routine (cbuf->__arg);
59: }
60:
61: THREAD_SETMEM (self, cleanup, cbuf);
62: }
63: hidden_def (__pthread_cleanup_upto)