X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=src%2Fthread%2F__unmapself.c;h=1d3bee1d9b0404494db6d2745e31ebe780ed682e;hb=c30cbcb0a646b1f13a22c645616dce624465b883;hp=e69de29bb2d1d6434b8b29ae775ad8c2e48c5391;hpb=276904c2f6bde3a31a24ebfa201482601d18b4f9;p=musl diff --git a/src/thread/__unmapself.c b/src/thread/__unmapself.c index e69de29b..1d3bee1d 100644 --- a/src/thread/__unmapself.c +++ b/src/thread/__unmapself.c @@ -0,0 +1,29 @@ +#include "pthread_impl.h" +#include "atomic.h" +#include "syscall.h" +/* cheat and reuse CRTJMP macro from dynlink code */ +#include "dynlink.h" + +static volatile int lock; +static void *unmap_base; +static size_t unmap_size; +static char shared_stack[256]; + +static void do_unmap() +{ + __syscall(SYS_munmap, unmap_base, unmap_size); + __syscall(SYS_exit); +} + +void __unmapself(void *base, size_t size) +{ + int tid=__pthread_self()->tid; + char *stack = shared_stack + sizeof shared_stack; + stack -= (uintptr_t)stack % 16; + while (lock || a_cas(&lock, 0, tid)) + a_spin(); + __syscall(SYS_set_tid_address, &lock); + unmap_base = base; + unmap_size = size; + CRTJMP(do_unmap, stack); +}