[pypy-svn] r18063 - in pypy/dist/pypy: rpython translator/c translator/c/src

arigo at codespeak.net arigo at codespeak.net
Sat Oct 1 18:37:59 CEST 2005


Author: arigo
Date: Sat Oct  1 18:37:58 2005
New Revision: 18063

Modified:
   pypy/dist/pypy/rpython/lltype.py
   pypy/dist/pypy/translator/c/gc.py
   pypy/dist/pypy/translator/c/src/mem.h
Log:
(pedronis, arigo) Another interesting performance boost, by producing more
precise mallocs for Boehm:

* refine the condition under which a malloced object contains no pointer to track;
* for allocating arrays, use a malloc variant that knows that the array can be huge
    but that there are no pointer from outside into the *middle* of the array data;
* the non-atomic variants of Boehm's malloc already guarantee that the result is
    zero-initialized.


Modified: pypy/dist/pypy/rpython/lltype.py
==============================================================================
--- pypy/dist/pypy/rpython/lltype.py	(original)
+++ pypy/dist/pypy/rpython/lltype.py	Sat Oct  1 18:37:58 2005
@@ -113,6 +113,9 @@
     def _is_atomic(self):
         return False
 
+    def _is_varsize(self):
+        return False
+
 
 class ContainerType(LowLevelType):
     def _gcstatus(self):
@@ -174,6 +177,9 @@
                 return False
         return True
 
+    def _is_varsize(self):
+        return self._arrayfld is not None
+
     def __getattr__(self, name):
         try:
             return self._flds[name]
@@ -256,6 +262,9 @@
     def _is_atomic(self):
         return self.OF._is_atomic()
 
+    def _is_varsize(self):
+        return True
+
     def _str_fields(self):
         if isinstance(self.OF, Struct):
             of = self.OF
@@ -403,6 +412,8 @@
     def _short_name(self):
         return 'Ptr %s' % (self.TO._short_name(), )
     
+    def _is_atomic(self):
+        return not self.TO._gcstatus()
 
     def _defl(self, parent=None, parentindex=None):
         return _ptr(self, None)

Modified: pypy/dist/pypy/translator/c/gc.py
==============================================================================
--- pypy/dist/pypy/translator/c/gc.py	(original)
+++ pypy/dist/pypy/translator/c/gc.py	Sat Oct  1 18:37:58 2005
@@ -2,7 +2,7 @@
 from pypy.translator.c.support import cdecl
 from pypy.translator.c.node import ContainerNode
 from pypy.rpython.lltype import typeOf, Ptr, PyObject, ContainerType
-from pypy.rpython.lltype import GcArray, GcStruct
+from pypy.rpython.lltype import Array, GcArray, Struct, GcStruct
 from pypy.rpython.lltype import RuntimeTypeInfo, getRuntimeTypeInfo
 
 PyObjPtr = Ptr(PyObject)
@@ -252,6 +252,7 @@
     # zero malloc impl
 
     def zero_malloc(self, TYPE, esize, eresult, err):
+        assert TYPE._gcstatus()   # we don't really support this
         return 'OP_ZERO_MALLOC(%s, %s, %s);' % (esize,
                                                 eresult,
                                                 err)
@@ -338,18 +339,18 @@
 
     def zero_malloc(self, TYPE, esize, eresult, err):
         gcinfo = self.db.gettypedefnode(TYPE).gcinfo
-        atomic = ['','_ATOMIC'][TYPE._is_atomic()]
+        assert TYPE._gcstatus()   # _is_atomic() depends on this!
+        is_atomic = TYPE._is_atomic()
+        is_varsize = TYPE._is_varsize()
+        result = 'OP_BOEHM_ZERO_MALLOC(%s, %s, %d, %d, %s);' % (esize,
+                                                                eresult,
+                                                                is_atomic,
+                                                                is_varsize,
+                                                                err)
         if gcinfo and gcinfo.finalizer:
-            return 'OP_BOEHM_ZERO_MALLOC_FINALIZER(%s, %s, %s, %s, %s);' % (esize,
-                                                                            eresult,
-                                                                            atomic,
-                                                                            gcinfo.finalizer,
-                                                                            err)
-        else:
-            return 'OP_BOEHM_ZERO_MALLOC(%s, %s, %s, %s);' % (esize,
-                                                              eresult,
-                                                              atomic,
-                                                              err)
+            result += ('\tGC_REGISTER_FINALIZER(%s, %s, NULL, NULL, NULL);'
+                       % (eresult, gcinfo.finalizer))
+        return result
 
     def gc_libraries(self):
         return ['gc'] # xxx on windows?

Modified: pypy/dist/pypy/translator/c/src/mem.h
==============================================================================
--- pypy/dist/pypy/translator/c/src/mem.h	(original)
+++ pypy/dist/pypy/translator/c/src/mem.h	Sat Oct  1 18:37:58 2005
@@ -49,17 +49,16 @@
 
 #ifdef USING_BOEHM_GC
 
-#define OP_BOEHM_ZERO_MALLOC(size, r, atomic, err)   {                         \
-	r = (void*) GC_MALLOC##atomic(size);				       \
-	if (r == NULL) FAIL_EXCEPTION(err, PyExc_MemoryError, "out of memory");	\
-	memset((void*) r, 0, size);				       \
-  }
+#define BOEHM_MALLOC_0_0   GC_MALLOC
+#define BOEHM_MALLOC_1_0   GC_MALLOC_ATOMIC
+#define BOEHM_MALLOC_0_1   GC_MALLOC_IGNORE_OFF_PAGE
+#define BOEHM_MALLOC_1_1   GC_MALLOC_ATOMIC_IGNORE_OFF_PAGE
 
-#define OP_BOEHM_ZERO_MALLOC_FINALIZER(size, r, atomic, finalizer, err)   {    \
-	r = (void*) GC_MALLOC##atomic(size);				       \
+#define OP_BOEHM_ZERO_MALLOC(size, r, is_atomic, is_varsize, err)   {        \
+	r = (void*) BOEHM_MALLOC_ ## is_atomic ## _ ## is_varsize (size);    \
 	if (r == NULL) FAIL_EXCEPTION(err, PyExc_MemoryError, "out of memory");	\
-	GC_REGISTER_FINALIZER(r, finalizer, NULL, NULL, NULL);         \
-	memset((void*) r, 0, size);				       \
+	if (is_atomic)  /* the non-atomic versions return cleared memory */  \
+		memset((void*) r, 0, size);                                  \
   }
 
 #undef PUSH_ALIVE



More information about the Pypy-commit mailing list