Update of /project/elephant/cvsroot/elephant/src In directory common-lisp.net:/tmp/cvs-serv22079/src
Modified Files: controller.lisp Log Message: poor man's counters, performance tweaking
Date: Sat Aug 28 08:39:56 2004 Author: blee
Index: elephant/src/controller.lisp diff -u elephant/src/controller.lisp:1.3 elephant/src/controller.lisp:1.4 --- elephant/src/controller.lisp:1.3 Fri Aug 27 19:31:59 2004 +++ elephant/src/controller.lisp Sat Aug 28 08:39:56 2004 @@ -80,6 +80,33 @@ ;; Should get cached since make-instance calls cache-instance (make-instance class-name :from-oid oid))))
+ +;; OID stuff +;; This stuff is all a hack until sequences appear in Sleepycat 4.3 +(defvar %oid-entry (uffi:allocate-foreign-object :char 12)) +(defvar %oid-lock (uffi:allocate-foreign-object :char 16)) + +(eval-when (:load-toplevel) + (loop for c across "%ELEPHANTOID" + for i from 0 to 11 + do (setf (uffi:deref-array %oid-entry '(:array :char) i) + (char-code c))) + (loop for c across "%ELEPHANTOIDLOCK" + for i from 0 to 15 + do (setf (uffi:deref-array %oid-lock '(:array :char) i) + (char-code c))) + ) + +(defvar %oid-entry-length 12) +(defvar %oid-lock-length 16) + +(defmethod next-oid ((sc store-controller)) + (sleepycat::next-counter (controller-environment sc) + (controller-db sc) + %oid-entry %oid-entry-length + %oid-lock %oid-lock-length)) + +;; Open/close (defmethod open-controller ((sc store-controller) &key (recover nil) (recover-fatal nil) (thread t)) "Opens the underlying environment and all the necessary @@ -96,6 +123,13 @@ :auto-commit t :type DB-BTREE :create t :thread thread) (let ((root (make-instance 'btree :from-oid -1))) (setf (slot-value sc 'root) root) + (let ((*auto-commit* t)) + (unless (db-get-key-buffered db %oid-entry %oid-entry-length) + (buffer-write-int 0 *out-buf*) + (db-put-buffered db %oid-entry %oid-entry-length + (buffer-stream-buffer *out-buf*) 4 + :auto-commit t) + (finish-buffer *out-buf*))) sc))))
(defmethod close-controller ((sc store-controller)) @@ -120,47 +154,3 @@ ,@body) (close-controller ,sc)))
-(defmacro with-transaction ((&key transaction - (environment (controller-environment - *store-controller*)) - (globally t) - (parent *current-transaction*) - dirty-read txn-nosync - txn-nowait txn-sync) - &body body) - `(sleepycat:with-transaction (:transaction ,transaction - :environment ,environment - :globally ,globally - :parent ,parent - :dirty-read ,dirty-read - :txn-nosync ,txn-nosync - :txn-nowait ,txn-nowait - :txn-sync ,txn-sync) - ,@body)) - -(defmacro with-transaction-retry ((&key transaction environment - (globally t) - (parent *current-transaction*) - (retries 100) - dirty-read txn-nosync - txn-nowait txn-sync) - &body body) - `(sleepycat:with-transaction-retry (:transaction ,transaction - :environment ,environment - :globally ,globally - :parent ,parent - :retries ,retries - :dirty-read ,dirty-read - :txn-nosync ,txn-nosync - :txn-nowait ,txn-nowait - :txn-sync ,txn-sync) - ,@body)) - - -;; This stuff is all a hack until sequences appear in Sleepycat 4.3 -(defconstant max-oid most-positive-fixnum) - -(defmethod next-oid ((sc store-controller)) - (random max-oid)) - - \ No newline at end of file