[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