diff options
author | thierry <thierry@FreeBSD.org> | 2004-08-03 01:49:14 +0800 |
---|---|---|
committer | thierry <thierry@FreeBSD.org> | 2004-08-03 01:49:14 +0800 |
commit | 8f8a59d3dd5735f37a7f2e781f9885c09c21f09f (patch) | |
tree | d9af36fe527d96cf62f9d0de573e8e432238d1f0 /devel/py-psyco | |
parent | 360f1dea5b297d37cd2699dd1612ca7c9dfdacbf (diff) | |
download | freebsd-ports-gnome-8f8a59d3dd5735f37a7f2e781f9885c09c21f09f.tar.gz freebsd-ports-gnome-8f8a59d3dd5735f37a7f2e781f9885c09c21f09f.tar.zst freebsd-ports-gnome-8f8a59d3dd5735f37a7f2e781f9885c09c21f09f.zip |
Unbreak py-psyco: fix a problem with anonymous mmaps.
PR: ports/69865
Submitted by: myself
Approved by: maintainer
Obtained from: Armin Rigo (author)
Diffstat (limited to 'devel/py-psyco')
-rw-r--r-- | devel/py-psyco/Makefile | 1 | ||||
-rw-r--r-- | devel/py-psyco/files/patch-c::codemanager.c | 85 |
2 files changed, 86 insertions, 0 deletions
diff --git a/devel/py-psyco/Makefile b/devel/py-psyco/Makefile index 09b7ff16b481..aa70cd85b98e 100644 --- a/devel/py-psyco/Makefile +++ b/devel/py-psyco/Makefile @@ -7,6 +7,7 @@ PORTNAME= psyco PORTVERSION= 1.2 +PORTREVISION= 1 CATEGORIES= devel python MASTER_SITES= ${MASTER_SITE_SOURCEFORGE} MASTER_SITE_SUBDIR= psyco diff --git a/devel/py-psyco/files/patch-c::codemanager.c b/devel/py-psyco/files/patch-c::codemanager.c new file mode 100644 index 000000000000..fa5a6a3bb61b --- /dev/null +++ b/devel/py-psyco/files/patch-c::codemanager.c @@ -0,0 +1,85 @@ +--- c/codemanager.c.orig Tue Dec 2 17:46:39 2003 ++++ c/codemanager.c Sun Aug 1 08:41:16 2004 +@@ -2,21 +2,12 @@ + #include <ipyencoding.h> + + /*** Allocators for Large Executable Blocks of Memory ***/ +-/* Defaults, possibly overridden below */ +-#define LEBM_WITH_MMAP 0 /* assume memory executable by default */ +-#define LEBM_NUM_BIGBLOCKS 1 /* not too large blocks */ + + #ifndef MS_WINDOWS + /* Assume UNIX */ + # include <sys/mman.h> +-# if defined(MAP_ANONYMOUS) || defined(MAP_ANON) +-# undef LEBM_WITH_MMAP +-# undef LEBM_NUM_BIGBLOCKS +-# define LEBM_WITH_MMAP 1 /* use mmap() with PROT_EXEC */ +-# define LEBM_NUM_BIGBLOCKS 32 /* ask for 32MB at a time */ +-# ifndef MAP_ANONYMOUS +-# define MAP_ANONYMOUS MAP_ANON +-# endif ++# if defined(MAP_ANON) && !defined(MAP_ANONYMOUS) ++# define MAP_ANONYMOUS MAP_ANON + # endif + #endif + +@@ -42,22 +33,44 @@ + + static void allocate_more_buffers(codemanager_buf_t** bb) + { +- char* p; +- int i; +- +-#if LEBM_WITH_MMAP +- p = (char*) mmap(NULL, BIG_BUFFER_SIZE * LEBM_NUM_BIGBLOCKS, +- PROT_EXEC|PROT_READ|PROT_WRITE, +- MAP_PRIVATE|MAP_ANONYMOUS, 0, 0); +- if (p == MAP_FAILED) +- OUT_OF_MEMORY(); +-#else +- p = (char*) PyMem_MALLOC(BIG_BUFFER_SIZE * LEBM_NUM_BIGBLOCKS); +- if (!p) +- OUT_OF_MEMORY(); ++ char* p = NULL; ++ int num_bigblocks = 1; ++ ++#if defined(MAP_ANONYMOUS) && defined(MAP_PRIVATE) ++ /* if we have anonymous mmap's, try using that -- this is known ++ to fail on some platforms */ ++ static int mmap_works = -1; ++ if (mmap_works != 0) ++ { ++ num_bigblocks = 32; /* allocate 32MB at a time */ ++ p = (char*) mmap(NULL, BIG_BUFFER_SIZE * num_bigblocks, ++ PROT_EXEC|PROT_READ|PROT_WRITE, ++ MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); ++ if (p == MAP_FAILED || p == NULL) ++ { ++ if (mmap_works == 1) ++ OUT_OF_MEMORY(); ++ mmap_works = 0; /* doesn't work */ ++ p = NULL; ++ num_bigblocks = 1; ++ /* note that some platforms *require* the allocation to be performed ++ by mmap, because PyMem_MALLOC() doesn't set the PROT_EXEC flag. ++ On these platforms we just hope that the first allocation is ++ successful, which sets mmap_works to 1; a failure in a subsequent ++ allocation correctly signals the OUT_OF_MEMORY. */ ++ } ++ else ++ mmap_works = 1; ++ } + #endif + +- for (i=0; i<LEBM_NUM_BIGBLOCKS; i++) ++ if (p == NULL) ++ { ++ p = (char*) PyMem_MALLOC(BIG_BUFFER_SIZE); ++ if (p == NULL) ++ OUT_OF_MEMORY(); ++ } ++ while (--num_bigblocks >= 0) + { + /* the codemanager_buf_t structure is put at the end of the buffer, + with its signature to detect overflows (just in case) */ |