Rev 126: (broken) in-progress work to switch over to allocating each _MemObject separately in http://bazaar.launchpad.net/~jameinel/meliae/mem-object-collection
John Arbash Meinel
john at arbash-meinel.com
Thu Dec 24 16:51:43 GMT 2009
At http://bazaar.launchpad.net/~jameinel/meliae/mem-object-collection
------------------------------------------------------------
revno: 126
revision-id: john at arbash-meinel.com-20091224165124-709j45twfgj6x18h
parent: john at arbash-meinel.com-20091224120246-qsyy8i0bil8ng920
committer: John Arbash Meinel <john at arbash-meinel.com>
branch nick: mem-object-collection
timestamp: Thu 2009-12-24 10:51:24 -0600
message:
(broken) in-progress work to switch over to allocating each _MemObject separately
-------------- next part --------------
=== modified file 'meliae/_loader.pyx'
--- a/meliae/_loader.pyx 2009-12-24 12:02:46 +0000
+++ b/meliae/_loader.pyx 2009-12-24 16:51:24 +0000
@@ -139,9 +139,8 @@
unsigned long total_size
-cdef PyObject *_dummy
-dummy = object()
-_dummy = <PyObject *>dummy
+cdef _MemObject *_dummy
+dummy = <_MemObject>(-1)
cdef class MemObjectCollection
@@ -234,18 +233,18 @@
cdef readonly int _table_mask # N slots = table_mask + 1
cdef readonly int _active # How many slots have real data
cdef readonly int _filled # How many slots have real or dummy
- cdef _MemObject* _table # _MemObjects are stored inline
+ cdef _MemObject** _table # _MemObjects are stored inline
def __init__(self):
self._table_mask = 1024 - 1
- self._table = <_MemObject*>PyMem_Malloc(sizeof(_MemObject)*1024)
- memset(self._table, 0, sizeof(_MemObject)*1024)
+ self._table = <_MemObject**>PyMem_Malloc(sizeof(_MemObject*)*1024)
+ memset(self._table, 0, sizeof(_MemObject*)*1024)
- cdef _MemObject* _lookup(self, address) except NULL:
+ cdef _MemObject** _lookup(self, address) except NULL:
cdef long the_hash
cdef size_t i, n_lookup
cdef long mask
- cdef _MemObject *table, *slot, *free_slot
+ cdef _MemObject **table, **slot, **free_slot
cdef PyObject *py_addr
py_addr = <PyObject *>address
@@ -256,20 +255,20 @@
free_slot = NULL
for n_lookup from 0 <= n_lookup <= <size_t>mask: # Don't loop forever
slot = &table[i & mask]
- if slot.address == NULL:
+ if slot[0] == NULL:
# Found a blank spot
if free_slot != NULL:
# Did we find an earlier _dummy entry?
return free_slot
else:
return slot
- if slot.address == py_addr:
+ if slot[0].address == py_addr:
# Found an exact pointer to the key
return slot
- if slot.address == _dummy:
+ if slot[0] == _dummy:
if free_slot == NULL:
free_slot = slot
- elif PyObject_RichCompareBool(slot.address, py_addr, Py_EQ):
+ elif PyObject_RichCompareBool(slot[0].address, py_addr, Py_EQ):
# Both py_key and cur belong in this slot, return it
return slot
i = i + 1 + n_lookup
@@ -292,21 +291,21 @@
slot.referrer_list = NULL
def _test_lookup(self, address):
- cdef _MemObject *slot
+ cdef _MemObject **slot
slot = self._lookup(address)
return (slot - self._table)
def __contains__(self, address):
- cdef _MemObject *slot
+ cdef _MemObject **slot
slot = self._lookup(address)
- if slot.address == NULL or slot.address == _dummy:
+ if slot[0] == NULL or slot[0] == _dummy:
return False
return True
def __getitem__(self, at):
- cdef _MemObject *slot
+ cdef _MemObject **slot
if isinstance(at, _MemObjectProxy):
address = at.address
@@ -314,7 +313,7 @@
address = at
slot = self._lookup(address)
- if slot.address == NULL or slot.address == _dummy:
+ if slot[0] == NULL or slot[0] == _dummy:
raise KeyError('address %s not present' % (at,))
if at is address:
return _MemObjectProxy(address, self)
More information about the bazaar-commits
mailing list