[Zope-Checkins] CVS: StandaloneZODB/ZODB - cPersistence.c:1.52 cPersistence.h:1.23 cPickleCache.c:1.43

Jeremy Hylton jeremy@zope.com
Mon, 1 Apr 2002 18:36:35 -0500


Update of /cvs-repository/StandaloneZODB/ZODB
In directory cvs.zope.org:/tmp/cvs-serv942

Modified Files:
	cPersistence.c cPersistence.h cPickleCache.c 
Log Message:
Some first cosmetic changes to the new cache implementation.

Define the contents of ccobject_head_struct via CACHE_HEAD macro.
Don't rely on two different files to define a struct with the same
layout by convention.

Remove many levels of parentheses from the HOME and NON_GHOST_COUNT
macros.

Replace KEEP_THIS_ONE_AROUND_FOR_A_WHILE() macro with a call to the
accessed() function.  (Who comes up with these names :-).

Remove include of string.h in cPersistence.c.

Expand cPersistent_HEAD macro so that it has one line for each
attribute!

Use typedef to define PerCache as "struct ccobject_head_struct" and
use this for the entry cache slot in cPersistent_HEAD instead of
PyObject *.

In cPickleCache.c, reflow a bunch of long lines, add some whitespace,
and an XXX comment explaining that I don't understand a different
comment.




=== StandaloneZODB/ZODB/cPersistence.c 1.51 => 1.52 ===
 "$Id$\n";
 
-#include <string.h>
 #include "cPersistence.h"
 
-/* the layout of this struct is the same as the start of ccobject in cPickleCache.c */
 struct ccobject_head_struct {
-  PyObject_HEAD
-  CPersistentRing ring_home;
-  int non_ghost_count;
+    CACHE_HEAD
 };
 
-#define HOME(O)             ((!((O)->cache))?(NULL): (&(((struct ccobject_head_struct *)((O)->cache))->ring_home)) )
-#define NON_GHOST_COUNT(O)  ((!((O)->cache))?(NULL): (&(((struct ccobject_head_struct *)((O)->cache))->non_ghost_count)) )
+#define HOME(O) (((O)->cache == NULL) ? NULL : &(O)->cache->ring_home)
+#define NON_GHOST_COUNT(O) \
+    (((O)->cache == NULL) ? NULL : &(O)->cache->non_ghost_count)
 
 #define ASSIGN(V,E) {PyObject *__e; __e=(E); Py_XDECREF(V); (V)=__e;}
 #define UNLESS(E) if(!(E))
@@ -142,16 +139,7 @@
   Py_DECREF(r);							 \
 }
 
-#define KEEP_THIS_ONE_AROUND_FOR_A_WHILE(self) \
- if(HOME(self) && self->state>=0) {            \
- self->ring.prev->next = self->ring.next;      \
- self->ring.next->prev = self->ring.prev;      \
- self->ring.next = HOME(self);           \
- self->ring.prev = HOME(self)->prev;       \
- HOME(self)->prev->next = &self->ring;    \
- HOME(self)->prev = &self->ring; }
-
-
+#define KEEP_THIS_ONE_AROUND_FOR_A_WHILE(self) accessed(self)
 
 /****************************************************************************/
 
@@ -160,7 +148,14 @@
 static void
 accessed(cPersistentObject *self)
 {
-    KEEP_THIS_ONE_AROUND_FOR_A_WHILE(self);
+    if (HOME(self) && self->state >= 0) {
+	self->ring.prev->next = self->ring.next;
+	self->ring.next->prev = self->ring.prev;
+	self->ring.next = HOME(self);
+	self->ring.prev = HOME(self)->prev;
+	HOME(self)->prev->next = &self->ring;
+	HOME(self)->prev = &self->ring; 
+    }
 }
 
 static void
@@ -187,12 +182,18 @@
 static void
 deallocated(cPersistentObject *self)
 {
-    if(self->state>=0) ghostify(self);
-    if(self->cache)
-    {
-        PyObject *v=PyObject_CallMethod(self->cache,"_oid_unreferenced","O",self->oid);
-        if(!v) PyErr_Clear(); /* and explode later */
-        Py_XDECREF(v);
+    if (self->state >= 0) 
+	ghostify(self);
+    if (self->cache) {
+        PyObject *v;
+
+	v = PyObject_CallMethod((PyObject *)self->cache, 
+				"_oid_unreferenced", "O", self->oid);
+	/* XXX What does the comment below mean? */
+        if (v == NULL)
+	    PyErr_Clear(); /* and explode later */
+	else
+	    Py_DECREF(v);
     }
     Py_XDECREF(self->jar);
     Py_XDECREF(self->oid);
@@ -467,7 +468,7 @@
 	      {
 		UPDATE_STATE_IF_NECESSARY(self, NULL);
 
-		KEEP_THIS_ONE_AROUND_FOR_A_WHILE(self);
+		accessed(self);
 
 		if (self->serial[7]=='\0' && self->serial[6]=='\0' &&
 		    self->serial[5]=='\0' && self->serial[4]=='\0' &&
@@ -499,7 +500,7 @@
     {
       UPDATE_STATE_IF_NECESSARY(self, NULL);
 
-      KEEP_THIS_ONE_AROUND_FOR_A_WHILE(self);
+      accessed(self);
     }
 
   return getattrf((PyObject *)self, oname);
@@ -615,7 +616,7 @@
     {
       UPDATE_STATE_IF_NECESSARY(self, -1);
       
-      KEEP_THIS_ONE_AROUND_FOR_A_WHILE(self);
+      accessed(self);
 
       if((! (*name=='_' && name[1]=='v' && name[2]=='_'))
 	 && (self->state != cPersistent_CHANGED_STATE && self->jar)


=== StandaloneZODB/ZODB/cPersistence.h 1.22 => 1.23 ===
 #include <time.h>
 
+#define CACHE_HEAD \
+    PyObject_HEAD \
+    CPersistentRing ring_home; \
+    int non_ghost_count;
+
+struct ccobject_head_struct;
+
+typedef struct ccobject_head_struct PerCache;
+
+#define cPersistent_HEAD \
+    PyObject_HEAD; \
+    PyObject *jar; \
+    PyObject *oid; \
+    PerCache *cache; \
+    CPersistentRing ring; \
+    char serial[8]; \
+    signed char state; \
+    unsigned char reserved[3];
 
-#define cPersistent_HEAD PyObject_HEAD PyObject *jar, *oid, *cache; CPersistentRing ring; char serial[8]; signed char state; unsigned char reserved[3];
 #define cPersistent_GHOST_STATE -1
 #define cPersistent_UPTODATE_STATE 0
 #define cPersistent_CHANGED_STATE 1
 #define cPersistent_STICKY_STATE 2
 
-struct ccobject_head_struct;
-
 typedef struct CPersistentRing_struct
 {
     struct CPersistentRing_struct *prev;
@@ -34,7 +49,7 @@
 } CPersistentRing;
 
 typedef struct {
-  cPersistent_HEAD
+    cPersistent_HEAD
 } cPersistentObject;
 
 typedef int (*persetattr)(PyObject *, PyObject*, PyObject *, setattrofunc);


=== StandaloneZODB/ZODB/cPickleCache.c 1.42 => 1.43 ===
 /* the layout of this struct is the same as the start of ccobject_head in cPersistence.c */
 typedef struct {
-  PyObject_HEAD
-  CPersistentRing ring_home;
-  int non_ghost_count;
-  int klass_count;
-  PyObject *data;
-  PyObject *jar;
-  PyObject *setklassstate;
-  int cache_size;
-  int ring_lock;
-  int cache_drain_resistance;
+    CACHE_HEAD
+    int klass_count;
+    PyObject *data;
+    PyObject *jar;
+    PyObject *setklassstate;
+    int cache_size;
+    int ring_lock;
+    int cache_drain_resistance;
 } ccobject;
 
 staticforward PyTypeObject Cctype;
@@ -78,7 +76,8 @@
     return v;
 }
 
-static cPersistentObject *object_from_ring(ccobject *self,CPersistentRing *here,const char *context)
+static cPersistentObject *
+object_from_ring(ccobject *self, CPersistentRing *here, const char *context)
 {
     /* Given a position in the LRU ring, return a borrowed
     reference to the object at that point in the ring. The caller is
@@ -86,27 +85,31 @@
     correspond to a persistent object, although the debugging
     version will double-check this. */
 
-    PyObject *object = (PyObject *)(((char *)here)-offsetof(cPersistentObject,ring));
+    PyObject *object;
+
+    object = (PyObject *)(((char *)here) - offsetof(cPersistentObject, ring));
 
 #ifdef MUCH_RING_CHECKING
-    if(!PyExtensionInstance_Check(object))
-    {
-        PyErr_Format(PyExc_RuntimeError,"Unexpectedly encountered non-ExtensionClass object in %s",context);
+    if (!PyExtensionInstance_Check(object)) {
+        PyErr_Format(PyExc_RuntimeError,
+	     "Unexpectedly encountered non-ExtensionClass object in %s",
+		     context);
         return NULL;
     }
-    if(!(((PyExtensionClass*)(object->ob_type))->class_flags & PERSISTENT_TYPE_FLAG))
-    {
-        PyErr_Format(PyExc_RuntimeError,"Unexpectedly encountered non-persistent object in %s",context);
+    if (!(((PyExtensionClass*)(object->ob_type))->class_flags & PERSISTENT_TYPE_FLAG)) {
+        PyErr_Format(PyExc_RuntimeError,
+	     "Unexpectedly encountered non-persistent object in %s", context);
         return NULL;
     }
-    if(((cPersistentObject*)object)->jar!=self->jar)
-    {
-        PyErr_Format(PyExc_RuntimeError,"Unexpectedly encountered object from a different jar in %s",context);
+    if (((cPersistentObject*)object)->jar != self->jar) {
+        PyErr_Format(PyExc_RuntimeError,
+	     "Unexpectedly encountered object from a different jar in %s",
+		     context);
         return NULL;
     }
-    if(((cPersistentObject*)object)->cache!=(PyObject *)self)
-    {
-        PyErr_Format(PyExc_RuntimeError,"Unexpectedly encountered broken ring in %s",context);
+    if (((cPersistentObject *)object)->cache != (PerCache *)self) {
+        PyErr_Format(PyExc_RuntimeError,
+		     "Unexpectedly encountered broken ring in %s", context);
         return NULL;
     }
 #endif
@@ -714,27 +717,27 @@
             }
             else
             {
-                if(((cPersistentObject*)v)->cache)
-                {
-                    if(((cPersistentObject*)v)->cache==(PyObject *)self)
-                    {
-                        /* This object is already one of ours, which is ok.
-                        It would be very strange if someone was trying to register the
-                        same object under a different key */
-                    }
-                    else
-                    {
+                if(((cPersistentObject*)v)->cache) {
+                    if(((cPersistentObject*)v)->cache != (PerCache *)self) {
                         /* This object is already in a different cache. */
-                        PyErr_SetString(PyExc_ValueError, "Cache values may only be in one cache.");
+                        PyErr_SetString(PyExc_ValueError, 
+				"Cache values may only be in one cache.");
                         return -1;
-                    }
+                    } 
+		    /* else:
+		       
+		       This object is already one of ours, which
+		       is ok.  It would be very strange if someone
+		       was trying to register the same object under a
+		       different key. 
+		    */
                 }
 
                 if(check_ring(self,"pre-setitem")) return -1;
                 if(PyDict_SetItem(self->data, key, v)) return -1;
 
                 Py_INCREF(self);
-                ((cPersistentObject*)v)->cache = (PyObject *)self;
+                ((cPersistentObject*)v)->cache = (PerCache *)self;
                 if(((cPersistentObject*)v)->state>=0)
                 {
                     /* insert this non-ghost object into the ring just behind the home position */
@@ -791,7 +794,7 @@
                 Py_INCREF(v);
             }
 
-            Py_DECREF(((cPersistentObject*)v)->cache);
+            Py_DECREF((PyObject *)((cPersistentObject*)v)->cache);
             ((cPersistentObject*)v)->cache = NULL;
         }