ports/69865: devel/py-psyco: 1.2 is broken.

Thierry Thomas thierry at pompo.net
Sun Aug 1 07:10:25 UTC 2004


>Number:         69865
>Category:       ports
>Synopsis:       devel/py-psyco: 1.2 is broken.
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    freebsd-ports-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          update
>Submitter-Id:   current-users
>Arrival-Date:   Sun Aug 01 07:10:24 GMT 2004
>Closed-Date:
>Last-Modified:
>Originator:     Thierry Thomas
>Release:        FreeBSD 5.2.1-RELEASE-p9 i386
>Organization:
Kabbale Eros
>Environment:
System: FreeBSD ws90bj.pompo.net 5.2.1-RELEASE-p9 FreeBSD 5.2.1-RELEASE-p9 #1: Tue Jul 13 18:16:08 CEST 2004 thierry at ws90bj.pompo.net:/usr/obj/usr/src/sys/WS90BJ-040102 i386


	
>Description:
	Python aborts with py-psyco-1.2.

>How-To-Repeat:
	echo "import psyco" | python
	Fatal Python error: psyco: out of memory
	zsh: done                 echo "import psyco" | 
	zsh: abort (core dumped)  python

>Fix:
	The following patch has been obtained from the author Armin Rigo
	and is available in Psyco's CVS.

	If the maintainer agrees, I shall commit it.

--- py-psyco.diff begins here ---
diff -urN devel/py-psyco.orig/Makefile devel/py-psyco/Makefile
--- devel/py-psyco.orig/Makefile	Sat Jul 31 21:42:56 2004
+++ devel/py-psyco/Makefile	Sun Aug  1 08:48:51 2004
@@ -7,6 +7,7 @@
 
 PORTNAME=	psyco
 PORTVERSION=	1.2
+PORTREVISION=	1
 CATEGORIES=	devel python
 MASTER_SITES=	${MASTER_SITE_SOURCEFORGE}
 MASTER_SITE_SUBDIR=	psyco
diff -urN devel/py-psyco.orig/files/patch-c::codemanager.c devel/py-psyco/files/patch-c::codemanager.c
--- devel/py-psyco.orig/files/patch-c::codemanager.c	Thu Jan  1 01:00:00 1970
+++ devel/py-psyco/files/patch-c::codemanager.c	Sun Aug  1 08:41:48 2004
@@ -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) */
--- py-psyco.diff ends here ---

>Release-Note:
>Audit-Trail:
>Unformatted:



More information about the freebsd-ports-bugs mailing list