* Gleydson Soares <[email protected]> [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"