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