* Gleydson Soares <gsoa...@gmail.com> [2018-03-10 13:45:08 -0300]: > On Fri, Mar 09, 2018 at 06:42:25PM -0600, Aaron Poffenberger wrote: > > This patch updates libthread in plan9port to be MAP_STACK compliant, > > replacing calls to malloc/free with mmap and munmap when allocating > > thread stacks. > > > > The most obvious effect was sam(1), acme(1), and 9term(1) would > > core when executed. All three run now with seemingly no issues. > > > > There maybe other problems I haven't noticed yet. > > it's missing a revision bump, apart from that, your diff looks good for > me. thanks for looking into this,
Looks like I implemented a memory leak. I meant to put sizeof *t, but left it off. Thanks to Bryan for pinging me on it. Revised patch follows. --Aaron
Index: Makefile =================================================================== RCS file: /cvs/ports/plan9/plan9port/Makefile,v retrieving revision 1.24 diff -u -p -r1.24 Makefile --- Makefile 20 Jan 2018 03:29:56 -0000 1.24 +++ Makefile 10 Mar 2018 16:34:49 -0000 @@ -6,6 +6,7 @@ BROKEN-powerpc = threading issues COMMENT = Plan 9 from user space DISTNAME = plan9port-20180117 +REVISION = 0 GH_ACCOUNT = 9fans GH_PROJECT = plan9port Index: patches/patch-src_libthread_thread_c =================================================================== RCS file: patches/patch-src_libthread_thread_c diff -N patches/patch-src_libthread_thread_c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ patches/patch-src_libthread_thread_c 10 Mar 2018 16:34:49 -0000 @@ -0,0 +1,26 @@ +$OpenBSD$ + +Index: src/libthread/thread.c +--- src/libthread/thread.c.orig ++++ src/libthread/thread.c +@@ -108,8 +108,9 @@ threadalloc(void (*fn)(void*), void *arg, uint stack) + ulong z; + + /* allocate the task and stack together */ +- t = malloc(sizeof *t+stack); +- if(t == nil) ++ t = mmap(0, sizeof *t+stack, PROT_READ|PROT_WRITE, ++ MAP_PRIVATE|MAP_ANON|MAP_STACK, -1, 0); ++ if(t == MAP_FAILED) + sysfatal("threadalloc malloc: %r"); + memset(t, 0, sizeof *t); + t->stk = (uchar*)(t+1); +@@ -364,7 +365,7 @@ procscheduler(Proc *p) + delthreadinproc(p, t); + p->nthread--; + /*print("nthread %d\n", p->nthread); */ +- free(t); ++ munmap(t, sizeof *t+t->stksize); + } + } + Index: patches/patch-src_libthread_threadimpl_h =================================================================== RCS file: patches/patch-src_libthread_threadimpl_h diff -N patches/patch-src_libthread_threadimpl_h --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ patches/patch-src_libthread_threadimpl_h 10 Mar 2018 16:34:49 -0000 @@ -0,0 +1,14 @@ +$OpenBSD$ + +Index: src/libthread/threadimpl.h +--- src/libthread/threadimpl.h.orig ++++ src/libthread/threadimpl.h +@@ -10,6 +10,8 @@ + # define _XOPEN_SOURCE /* for Snow Leopard */ + # endif + # include <ucontext.h> ++#elif defined(__OpenBSD__) ++# include <sys/mman.h> + #endif + #include <sys/utsname.h> + #include "libc.h"