I have started running the bdb backendtests on latest sbcl, amd64 linux.
I also have got a beta snapshot of openmcl-linux-64 (2006-12-31) running
sometimes. I don't know how stable this beta is, but at least it's good
to run several lisps to find bugs.

When running the backend tests for bdb on sbcl, the first failure was
the FIXNUM test. It serializes/deserializes most-positive-fixnum. Since
most-positive-fixnum was larger than 32bit integers, I somehow suspected
64 bit problems. Which was not the main problem. Instead it was related
to the type checking in the serializer. I have attached a solution in a
diff-file. 

(A parenthesis: My 64-bit adventures gave some code as a sideffect. I
have added 64 bit integers to memutils.c and refactored/obscured it with
a macro that makes the reader and writer functions. I have changed all
references to int to be explict int32 in memutils.lisp and
bdb-controller. I have a half-finished version of bdb-controller with
macros making the cursor movement methods. I'll keep it in the closet if
it's of any use later on. End of parenthesis)

Now almost all backendtests run.
2 out of 115 total tests failed: INDEXING-WIPE-INDEX, INDEXING-TIMING.
Index-timing fails with this error. This is something I have noted
before with my recent experiments with elephant version 6. Suddently
after deleting instances, elephant would sometimes say that the class
was no longer indexed. I think it showed up with both the bdb and the
clsql backend. Has no one else noticed this? Below is a backtrace, you
can see the drop-instances call which I am suspecting.

About multithreading/testing. I volunteer to add some kind of
stress-test with bourdeaux threads later, but now the outstanding bug is
a blocker.

Speaking of multithreading: since few Lisp:s use native threads, and
writing thread-safe code can be difficult, in my opinion taking
advantage of multi-core processors is most easily done with spreading
processes. what about multiprocessing? I mean parallel Lisp instances,
on the same or different computers, writing and reading to the same
database? Is elephant supposed to work in that kind of environment. I
suppose the clsql backend does, but what about bdb? 

That's all for now, it's in the middle of the night for me, got to count
some sheep.
/Henrik Hjelte


Class #<PERSISTENT-METACLASS STRESS-INDEX> is not an indexed class
   [Condition of type SIMPLE-ERROR]

Restarts:
 0: [ABORT] Return to SLIME's top level.
 1: [TERMINATE-THREAD] Terminate this thread (#<THREAD
"worker" {1004E89801}>)

Backtrace:
  0: ((SB-PCL::FAST-METHOD FIND-CLASS-INDEX (PERSISTENT-METACLASS))
      #<unused argument>
      #<unused argument>
      #<PERSISTENT-METACLASS STRESS-INDEX>
      :SC
      NIL
      :ERRORP
      T)
  1: ((LAMBDA ()))
  2: ((SB-PCL::FAST-METHOD ELEPHANT::EXECUTE-TRANSACTION
       (DB-BDB::BDB-STORE-CONTROLLER #1="#<...>" . #1#))
      #<unused argument>
      #<unused argument>
      #<DB-BDB::BDB-STORE-CONTROLLER {1004E9A2D1}>
      #<CLOSURE (LAMBDA #) {10049CE119}>
      :TRANSACTION
      NIL
      :ENVIRONMENT
      NIL ..)
  3: (DROP-INSTANCES
      (#<STRESS-INDEX {10049CBB51}> #<STRESS-INDEX {10049CA331}>






Tue Jan 23 23:14:09 CET 2007  Henrik Hjelte <[EMAIL PROTECTED]>
  * Make most-negative and positive fixnum work on 64 bit sbcl
  Looks like a bigger change than it is because of indentation change.
Tue Jan 23 12:39:21 CET 2007  Henrik Hjelte <[EMAIL PROTECTED]>
  * openmcl complained about importing something that doesn't exist
Tue Jan 23 11:57:22 CET 2007  Henrik Hjelte <[EMAIL PROTECTED]>
  * openmcl detected that spec is a list starting with :bdb rather than a 
string or pathname
Mon Jan 22 22:23:37 CET 2007  Henrik Hjelte <[EMAIL PROTECTED]>
  * two small compiler warnings
diff -rN -u old-elephant/elephant.asd new-elephant/elephant.asd
--- old-elephant/elephant.asd   2007-01-24 00:26:46.318133014 +0100
+++ new-elephant/elephant.asd   2007-01-24 00:26:46.358133668 +0100
@@ -117,6 +117,7 @@
    "-lm"))
 
 (defmethod compiler-options ((compiler (eql :msvc)) (c elephant-c-source) &key 
input-file output-file)
+  (declare (ignorable c input-file output-file))
   (error "MSVC compiler option not supported yet"))
 
 ;; LOAD
diff -rN -u old-elephant/src/elephant/controller.lisp 
new-elephant/src/elephant/controller.lisp
--- old-elephant/src/elephant/controller.lisp   2007-01-24 00:26:46.314132948 
+0100
+++ new-elephant/src/elephant/controller.lisp   2007-01-24 00:26:46.334133276 
+0100
@@ -138,7 +138,7 @@
 ;;
 
 (defclass store-controller ()
-  ((spec :type (or pathname string (simple-array character))
+  ((spec :type list
         :accessor controller-spec
         :initarg :spec
         :documentation "Backend create functions should pass in :spec during 
make-instance")
diff -rN -u old-elephant/src/elephant/serializer1.lisp 
new-elephant/src/elephant/serializer1.lisp
--- old-elephant/src/elephant/serializer1.lisp  2007-01-24 00:26:46.314132948 
+0100
+++ new-elephant/src/elephant/serializer1.lisp  2007-01-24 00:26:46.338133341 
+0100
@@ -19,7 +19,6 @@
 (defpackage :elephant-serializer1
   (:use :cl :elephant :elephant-memutil)
   (:import-from :elephant 
-               *resourced-byte-spec*
                get-cached-instance
                slot-definition-allocation
                slot-definition-name
diff -rN -u old-elephant/src/elephant/serializer2.lisp 
new-elephant/src/elephant/serializer2.lisp
--- old-elephant/src/elephant/serializer2.lisp  2007-01-24 00:26:46.310132883 
+0100
+++ new-elephant/src/elephant/serializer2.lisp  2007-01-24 00:26:46.342133406 
+0100
@@ -20,7 +20,6 @@
   (:use :cl :elephant :elephant-memutil)
   (:import-from :elephant 
                *circularity-initial-hash-size*
-               *resourced-byte-spec*
                get-cached-instance
                controller-symbol-cache 
                controller-symbol-id-cache
@@ -77,6 +76,11 @@
 (defconstant +struct+               20)
 (defconstant +class+                21)
 
+;; Numerical constants
+(defconstant +most-positive-fixnum+ 22)
+(defconstant +most-negative-fixnum+ 23)
+
+
 (defconstant +nil+                  #x3F)
 
 ;; Arrays
@@ -158,9 +162,6 @@
              (serialize-symbol frob bs sc))
             (string
              (serialize-string frob bs))
-            ((integer #.most-negative-fixnum #.most-positive-fixnum)
-             (buffer-write-byte +fixnum32+ bs)
-             (buffer-write-int frob bs))
             (null
              (buffer-write-byte +nil+ bs))
             (persistent
@@ -197,25 +198,31 @@
                        (declare (dynamic-extent svs))
                        (%serialize (/ (length svs) 2))
                        (loop for item in svs
-                          do (%serialize item)))))))
+                              do (%serialize item)))))))
             (integer
-             (let* ((num (abs frob))
-                    (word-size (ceiling (/ (integer-length num) 32)))
-                    (needed (* word-size 4)))
-               (declare (type fixnum word-size needed))
-               (if (< frob 0) 
-                   (buffer-write-byte +negative-bignum+ bs)
-                   (buffer-write-byte +positive-bignum+ bs))
-               (buffer-write-int needed bs)
-               (loop for i fixnum from 0 below word-size 
-                  ;; this ldb is consing on CMUCL!
-                  ;; there is an OpenMCL function which should work 
-                  ;; and non-cons
-                  do
-                  #+(or cmu sbcl)
-                  (buffer-write-uint (ldb (int-byte-spec i) num) bs) ;; 
(%bignum-ref num i) bs)
-                  #+(or allegro lispworks openmcl)
-                  (buffer-write-uint (ldb (int-byte-spec i) num) bs))))
+              (cond
+                ((= frob most-positive-fixnum)
+                 (buffer-write-byte +most-positive-fixnum+ bs))
+                ((= frob most-negative-fixnum)
+                 (buffer-write-byte +most-negative-fixnum+ bs))
+                (t
+                 (let* ((num (abs frob))
+                        (word-size (ceiling (/ (integer-length num) 32)))
+                        (needed (* word-size 4)))
+                   (declare (type fixnum word-size needed))
+                   (if (< frob 0) 
+                       (buffer-write-byte +negative-bignum+ bs)
+                       (buffer-write-byte +positive-bignum+ bs))
+                   (buffer-write-int needed bs)
+                   (loop for i fixnum from 0 below word-size 
+                         ;; this ldb is consing on CMUCL!
+                         ;; there is an OpenMCL function which should work 
+                         ;; and non-cons
+                         do
+                         #+(or cmu sbcl)
+                         (buffer-write-uint (ldb (int-byte-spec i) num) bs) ;; 
(%bignum-ref num i) bs)
+                         #+(or allegro lispworks openmcl)
+                         (buffer-write-uint (ldb (int-byte-spec i) num) 
bs))))))
             (rational
              (buffer-write-byte +rational+ bs)
              (%serialize (numerator frob))
@@ -251,10 +258,10 @@
                      (%serialize (hash-table-rehash-threshold frob))
                      (%serialize (hash-table-count frob))
                      (loop for key being the hash-key of frob
-                        using (hash-value value)
-                        do 
-                        (%serialize key)
-                        (%serialize value))))))
+                            using (hash-value value)
+                            do 
+                            (%serialize key)
+                            (%serialize value))))))
             ;;            (structure-object 
             ;;             (buffer-write-byte +struct+ bs)
             ;;             (let ((idp (gethash frob *circularity-hash*)))
@@ -286,17 +293,17 @@
                      (let ((rank (array-rank frob)))
                        (buffer-write-int rank bs)
                        (loop for i fixnum from 0 below rank
-                          do (buffer-write-int (array-dimension frob i) 
-                                               bs)))
+                              do (buffer-write-int (array-dimension frob i) 
+                                                   bs)))
                      (when (array-has-fill-pointer-p frob)
                        (buffer-write-int (fill-pointer frob) bs))
                      (loop for i fixnum from 0 below (array-total-size frob)
-                        do
-                        (%serialize (row-major-aref frob i)))))))
+                            do
+                            (%serialize (row-major-aref frob i)))))))
             )))
-    (%serialize frob)
-    (release-circularity-hash *circularity-hash*)
-    bs)))
+      (%serialize frob)
+      (release-circularity-hash *circularity-hash*)
+      bs)))
 
 (defun slots-and-values (o)
   (loop for sd in (compute-slots (class-of o))
@@ -329,6 +336,10 @@
           (cond
             ((= tag +fixnum32+) 
              (buffer-read-fixnum bs))
+             ((= tag +most-positive-fixnum+) 
+             most-positive-fixnum)
+             ((= tag +most-negative-fixnum+)
+             most-negative-fixnum)             
             ((= tag +nil+) nil)
             ((= tag +utf8-string+)
              (deserialize-string :utf8 bs))
@@ -378,7 +389,7 @@
             ((= tag +hash-table+)
              (let* ((id (buffer-read-fixnum bs))
                     (maybe-hash (lookup-id id)))
-               (declare (dynamic-extent id maybe-cons)
+               (declare (dynamic-extent id maybe-hash)
                         (type fixnum id))
                (if maybe-hash maybe-hash
                    (let ((h (make-hash-table :test (%deserialize bs)
diff -rN -u old-elephant/src/elephant/serializer2-locks.lisp 
new-elephant/src/elephant/serializer2-locks.lisp
--- old-elephant/src/elephant/serializer2-locks.lisp    2007-01-24 
00:26:46.314132948 +0100
+++ new-elephant/src/elephant/serializer2-locks.lisp    2007-01-24 
00:26:46.342133406 +0100
@@ -20,7 +20,8 @@
   (:use :cl :elephant :elephant-memutil)
   (:import-from :elephant 
                *circularity-initial-hash-size*
-               *resourced-byte-spec*
+               #+(or cmu sbcl allegro)
+                *resourced-byte-spec*
                get-cached-instance
                slot-definition-allocation
                slot-definition-name
diff -rN -u old-elephant/src/memutil/memutil.lisp 
new-elephant/src/memutil/memutil.lisp
--- old-elephant/src/memutil/memutil.lisp       2007-01-24 00:26:46.318133014 
+0100
+++ new-elephant/src/memutil/memutil.lisp       2007-01-24 00:26:46.346133472 
+0100
@@ -82,7 +82,7 @@
        (length :int))
     :returning :void))
 
-(eval-when (compile)
+(eval-when (:compile-toplevel)
   (declaim 
    #-elephant-without-optimize (optimize (speed 3) (safety 1) (space 0) (debug 
0))
    (inline read-int read-uint read-float read-double 

_______________________________________________
elephant-devel site list
elephant-devel@common-lisp.net
http://common-lisp.net/mailman/listinfo/elephant-devel

Reply via email to