From leslie.polzer at gmx.net Thu Apr 3 10:52:21 2008 From: leslie.polzer at gmx.net (Leslie P. Polzer) Date: Thu, 3 Apr 2008 12:52:21 +0200 (CEST) Subject: [elephant-devel] Two patches still in queue Message-ID: <61395.84.157.24.199.1207219941.squirrel@mail.stardawn.org> Hi guys, there are two tiny patches I've sent that must've been overlooked. One reverted a small previous change in the tutorial and one put the concurrency tests in a separate suite. Especially the latter one is important, so it'd be great if someone with commit access could apply them. Thanks! Leslie From leslie.polzer at gmx.net Thu Apr 3 11:14:19 2008 From: leslie.polzer at gmx.net (Leslie P. Polzer) Date: Thu, 3 Apr 2008 13:14:19 +0200 (CEST) Subject: [elephant-devel] Call SLOT-UNBOUND instead of signaling UNBOUND-SLOT Message-ID: <64027.84.157.24.199.1207221259.squirrel@mail.stardawn.org> Consider (defclass pineapple () () (:metaclass persistent-metaclass)) (let ((fruit (make-instance 'pineapple))) (defclass pineapple () ((tree :initform 1)) (:metaclass persistent-metaclass)) (slot-value fruit 'tree))) Will raise unbound slot hell with current code if you have a lot of instances. Backends signal UNBOUND-SLOT instead of calling SLOT-UNBOUND (which is the more conformant option as I see it from CLHS and the MOP spec). This is also better "do what I mean" behaviour; normally when you provide an initform for a slot you rely on never having to deal with unbound slots (at least I do). Attached is a patch which tests this, changes the backend behaviour and provides a default for SLOT-UNBOUND that uses the initform to fill in the slot value. I tested with BDB46, but can't test the others right now without too much hassle since I'm not at my main box. Therefore if possible please apply it, run the other backend tests and tell me whether they run green for you. Thanks! Leslie -------------- next part -------------- A non-text attachment was scrubbed... Name: slot-unbound.patch Type: application/octet-stream Size: 7200 bytes Desc: not available URL: From eslick at media.mit.edu Thu Apr 3 11:50:35 2008 From: eslick at media.mit.edu (Ian Eslick) Date: Thu, 3 Apr 2008 07:50:35 -0400 Subject: [elephant-devel] Call SLOT-UNBOUND instead of signaling UNBOUND-SLOT In-Reply-To: <64027.84.157.24.199.1207221259.squirrel@mail.stardawn.org> References: <64027.84.157.24.199.1207221259.squirrel@mail.stardawn.org> Message-ID: <825289A7-0CB6-4C91-AA14-CBE79CFD8166@media.mit.edu> A quick test confirms that the new code base has the correct behavior, by the way. Ian On Apr 3, 2008, at 7:14 AM, Leslie P. Polzer wrote: > Consider > > (defclass pineapple () () > (:metaclass persistent-metaclass)) > (let ((fruit (make-instance 'pineapple))) > (defclass pineapple () > ((tree :initform 1)) > (:metaclass persistent-metaclass)) > (slot-value fruit 'tree))) > > Will raise unbound slot hell with current code if you have > a lot of instances. Backends signal UNBOUND-SLOT instead > of calling SLOT-UNBOUND (which is the more conformant option > as I see it from CLHS and the MOP spec). > > This is also better "do what I mean" behaviour; normally > when you provide an initform for a slot you rely on never > having to deal with unbound slots (at least I do). > > Attached is a patch which tests this, changes the backend behaviour > and provides a default for SLOT-UNBOUND that uses the initform > to fill in the slot value. > > I tested with BDB46, but can't test the others right now without > too much hassle since I'm not at my main box. Therefore if > possible please apply it, run the other backend tests and tell me > whether they run green for you. > > Thanks! > > Leslie > _______________________________________________ > elephant-devel site list > elephant-devel at common-lisp.net > http://common-lisp.net/mailman/listinfo/elephant-devel From leslie.polzer at gmx.net Thu Apr 3 12:46:58 2008 From: leslie.polzer at gmx.net (Leslie P. Polzer) Date: Thu, 3 Apr 2008 14:46:58 +0200 (CEST) Subject: [elephant-devel] Call SLOT-UNBOUND instead of signaling UNBOUND-SLOT In-Reply-To: <825289A7-0CB6-4C91-AA14-CBE79CFD8166@media.mit.edu> References: <64027.84.157.24.199.1207221259.squirrel@mail.stardawn.org> <825289A7-0CB6-4C91-AA14-CBE79CFD8166@media.mit.edu> Message-ID: <64181.84.157.24.199.1207226818.squirrel@mail.stardawn.org> > A quick test confirms that the new code base has the correct behavior, > by the way. Exactly which code base are you talking about? Did you add this behaviour in one of your experimental branches? Leslie From kmkaplan+elephant at ded.kim-minh.com Thu Apr 3 13:23:22 2008 From: kmkaplan+elephant at ded.kim-minh.com (kmkaplan+elephant at ded.kim-minh.com) Date: Thu, 03 Apr 2008 13:23:22 +0000 Subject: [elephant-devel] Call SLOT-UNBOUND instead of signaling UNBOUND-SLOT In-Reply-To: <64027.84.157.24.199.1207221259.squirrel@mail.stardawn.org> (Leslie P. Polzer's message of "Thu, 3 Apr 2008 13:14:19 +0200 (CEST)") References: <64027.84.157.24.199.1207221259.squirrel@mail.stardawn.org> Message-ID: <87ej9nxeb9.fsf@ded.kim-minh.com> Leslie P. Polzer writes: > (defclass pineapple () () > (:metaclass persistent-metaclass)) > (let ((fruit (make-instance 'pineapple))) > (defclass pineapple () > ((tree :initform 1)) > (:metaclass persistent-metaclass)) > (slot-value fruit 'tree))) > > Will raise unbound slot hell with current code if you have > a lot of instances. Backends signal UNBOUND-SLOT instead > of calling SLOT-UNBOUND (which is the more conformant option > as I see it from CLHS and the MOP spec). > > This is also better "do what I mean" behaviour; normally > when you provide an initform for a slot you rely on never > having to deal with unbound slots (at least I do). > > Attached is a patch which tests this, changes the backend behaviour > and provides a default for SLOT-UNBOUND that uses the initform > to fill in the slot value. This is probably bad: you can't SLOT-MAKUNBOUND anymore. I have not yet read and understood all about CLHS 4.3.6.2 but something along UPDATE-INSTANCE-FOR-REDEFINED-CLASS looks like what's needed. I can't test it here but the test would look like: (deftest slot-unbound (progn (defclass pineapple () () (:metaclass persistent-metaclass)) (let ((fruit (make-instance 'pineapple))) (defclass pineapple () ((tree :initform 1)) (:metaclass persistent-metaclass)) (values (slot-value fruit 'tree) (progn (slot-makunbound fruit 'tree) (signals-specific-condition (unbound-slot) (slot-value inst 'slot1)))))) 1 t) From eslick at media.mit.edu Thu Apr 3 13:52:58 2008 From: eslick at media.mit.edu (Ian Eslick) Date: Thu, 3 Apr 2008 09:52:58 -0400 Subject: [elephant-devel] Call SLOT-UNBOUND instead of signaling UNBOUND-SLOT In-Reply-To: <87ej9nxeb9.fsf@ded.kim-minh.com> References: <64027.84.157.24.199.1207221259.squirrel@mail.stardawn.org> <87ej9nxeb9.fsf@ded.kim-minh.com> Message-ID: <990B9211-2D74-4008-8B7D-B3D7C8FA9DC6@media.mit.edu> Indeed! This was handled on the elephant-unstable development branch by fixing some bugs in the update-instance-for-redefined-class behavior. Darcs elephant-unstable will replace the main elephant branch in a few weeks when my schedule allows. I've been keeping up with the patches for the most part - but unstable required significant refactoring to support class schemas and schema evolution so the patches often have to be applied manually. The benefit, I believe, will be a much easier to use and more stable solution. It also has a number of new features which I've documented in earlier e-mails. In the process of refactoring I found, and wrote tests for, quite a few bugs that I'm amazed were not caught earlier. Ian On Apr 3, 2008, at 9:23 AM, kmkaplan+elephant at ded.kim-minh.com wrote: > Leslie P. Polzer writes: > >> (defclass pineapple () () >> (:metaclass persistent-metaclass)) >> (let ((fruit (make-instance 'pineapple))) >> (defclass pineapple () >> ((tree :initform 1)) >> (:metaclass persistent-metaclass)) >> (slot-value fruit 'tree))) >> >> Will raise unbound slot hell with current code if you have >> a lot of instances. Backends signal UNBOUND-SLOT instead >> of calling SLOT-UNBOUND (which is the more conformant option >> as I see it from CLHS and the MOP spec). >> >> This is also better "do what I mean" behaviour; normally >> when you provide an initform for a slot you rely on never >> having to deal with unbound slots (at least I do). >> >> Attached is a patch which tests this, changes the backend behaviour >> and provides a default for SLOT-UNBOUND that uses the initform >> to fill in the slot value. > > This is probably bad: you can't SLOT-MAKUNBOUND anymore. I have not > yet read and understood all about CLHS 4.3.6.2 but something along > UPDATE-INSTANCE-FOR-REDEFINED-CLASS looks like what's needed. > > I can't test it here but the test would look like: > > (deftest slot-unbound > (progn > (defclass pineapple () () > (:metaclass persistent-metaclass)) > (let ((fruit (make-instance 'pineapple))) > (defclass pineapple () > ((tree :initform 1)) > (:metaclass persistent-metaclass)) > (values (slot-value fruit 'tree) > (progn (slot-makunbound fruit 'tree) > (signals-specific-condition (unbound-slot) > (slot-value inst 'slot1)))))) > 1 t) > _______________________________________________ > elephant-devel site list > elephant-devel at common-lisp.net > http://common-lisp.net/mailman/listinfo/elephant-devel From rosssd at gmail.com Thu Apr 3 16:18:18 2008 From: rosssd at gmail.com (Sean Ross) Date: Thu, 3 Apr 2008 17:18:18 +0100 Subject: [elephant-devel] traversing btree using multiple indices Message-ID: <5bef28df0804030918u4680f456i29e3e775275e9589@mail.gmail.com> Hi All, I'm hoping that someone can point me in the right direction here. Given 2 secondary indices on an indexed btree is it at all possible to create/use a derived index which is the union of the 2 created indices without requiring the explicit creation of a 3rd index or am i barking up the wrong tree? Thanks, Sean. From killerstorm at newmail.ru Thu Apr 3 17:34:25 2008 From: killerstorm at newmail.ru (Alex Mizrahi) Date: Thu, 3 Apr 2008 20:34:25 +0300 Subject: [elephant-devel] Re: traversing btree using multiple indices References: <5bef28df0804030918u4680f456i29e3e775275e9589@mail.gmail.com> Message-ID: SR> I'm hoping that someone can point me in the right direction here. SR> Given 2 secondary indices on an indexed btree is it at all possible to SR> create/use a derived index which is the union of the 2 created indices SR> without requiring the explicit creation of a 3rd index i'm not sure what do you mean, but subject suggests that you just want to walk through both indices simultaneously as if they were just one sorted index. if so, you can use lower-level cursor APIs, without creating anything on database level. something like that: (let ((c1 (ele:make-inverted-cursor 'foo 'bar)) (c2 (ele:make-inverted-cursor 'foo 'baz))) (ele:cursor-first c1) (ele:cursor-first c2) (loop for cc = (whichever-less c1 c2) while cc for (exists k v) = (multiple-value-list (ele:cursor-current cc)) while exists do (something-with k v) do (ele:cursor-next cc)) (ele:cursor-close c1) ; it's better to put this in unwind protect (ele:cursor-close c2)) actually i've made some macro to do this in easier (and more general) way, but it's somewhat ugly so i'm not sure if i want to share it :) From eslick at media.mit.edu Thu Apr 3 17:46:10 2008 From: eslick at media.mit.edu (Ian Eslick) Date: Thu, 3 Apr 2008 13:46:10 -0400 Subject: [elephant-devel] traversing btree using multiple indices In-Reply-To: <5bef28df0804030918u4680f456i29e3e775275e9589@mail.gmail.com> References: <5bef28df0804030918u4680f456i29e3e775275e9589@mail.gmail.com> Message-ID: <793EC77B-3D47-443D-94D2-B77EC3811882@media.mit.edu> Do you just want the simple union, an ordered union by some criteria or do you mean intersection? Perhaps an example would help us help you! Ian On Apr 3, 2008, at 12:18 PM, Sean Ross wrote: > Hi All, > I'm hoping that someone can point me in the right direction here. > > Given 2 secondary indices on an indexed btree is it at all possible to > create/use a derived index which is the union of the 2 created indices > without requiring the explicit creation of a 3rd index > > or am i barking up the wrong tree? > > Thanks, > Sean. > _______________________________________________ > elephant-devel site list > elephant-devel at common-lisp.net > http://common-lisp.net/mailman/listinfo/elephant-devel From rosssd at gmail.com Fri Apr 4 08:15:47 2008 From: rosssd at gmail.com (Sean Ross) Date: Fri, 4 Apr 2008 09:15:47 +0100 Subject: [elephant-devel] traversing btree using multiple indices In-Reply-To: <793EC77B-3D47-443D-94D2-B77EC3811882@media.mit.edu> References: <5bef28df0804030918u4680f456i29e3e775275e9589@mail.gmail.com> <793EC77B-3D47-443D-94D2-B77EC3811882@media.mit.edu> Message-ID: <5bef28df0804040115m359e370aw4063196c4917f311@mail.gmail.com> On 4/3/08, Ian Eslick wrote: > Do you just want the simple union, an ordered union by some criteria or do > you mean intersection? Perhaps an example would help us help you! ack, intersection, not union, that'll teach me to post and run. as an example given the following class and index definitions (defclass test-event () ((date :accessor date-of :initform (now)) (name :accessor name-of :initform nil)) (:metaclass persistent-metaclass)) (defun create-date-indexer (a b c) (values t (date-of c))) (defun create-name-indexer (a b c) (values t (name-of c))) (add-index btree :index-name 'date-index :key-form 'create-date-indexer :populate t) (add-index btree :index-name 'name-index :key-form 'create-name-indexer :populate t) what is the best way to map across all added events between a particular date range with the name 'Sean'? Alex's pointer to the cursor api's (and in particular the index cursor API) seems to be what i am looking for but I cannot quite get it to work. sean. From killerstorm at newmail.ru Fri Apr 4 10:09:20 2008 From: killerstorm at newmail.ru (Alex Mizrahi) Date: Fri, 4 Apr 2008 13:09:20 +0300 Subject: [elephant-devel] Re: traversing btree using multiple indices References: <5bef28df0804030918u4680f456i29e3e775275e9589@mail.gmail.com><793EC77B-3D47-443D-94D2-B77EC3811882@media.mit.edu> <5bef28df0804040115m359e370aw4063196c4917f311@mail.gmail.com> Message-ID: SR> (defclass test-event () SR> ((date :accessor date-of :initform (now)) SR> (name :accessor name-of :initform nil)) SR> (:metaclass persistent-metaclass)) SR> (defun create-date-indexer (a b c) (values t (date-of c))) SR> (defun create-name-indexer (a b c) (values t (name-of c))) SR> (add-index btree SR> :index-name 'date-index SR> :key-form 'create-date-indexer SR> :populate t) this looks weird. you could just write (defclass test-event () ((date :accessor date-of :initform (now) :index t) ... and it will create indices for you automatically. SR> what is the best way to map across all added events between a SR> particular date range with the name 'Sean'? that's not union or intersection (at least i won't call them that way) -- you need an index with custom sorting order to do this. something like that: (defun id-and-time (id time) (formant nil "~a,~a" id time)) (add-class-derived-index 'test-event 'by-name-and-date '(lambda (e) (id-and-time (name-of e) (date-of e)))) then you'll get sequence like this: Ross,37343253 Sean,31334456 Sean,32345678 Somebody,30334656 it will work fine as long as name (and date) does not contain #\, -- then all entries will same name will be grouped together. then you can use simple range query: (get-instances-by-range 'test-event 'by-name-and-date (id-and-time "Sean" start-date) (id-and-time "Sean" end-date)) i believe that SQL RDBMS work this way too -- if one needs fast retrieval by several keys, he should create index on them. RDMBS knows how to sort tuples, though From rosssd at gmail.com Fri Apr 4 10:36:02 2008 From: rosssd at gmail.com (Sean Ross) Date: Fri, 4 Apr 2008 11:36:02 +0100 Subject: [elephant-devel] Re: traversing btree using multiple indices In-Reply-To: References: <5bef28df0804030918u4680f456i29e3e775275e9589@mail.gmail.com> <793EC77B-3D47-443D-94D2-B77EC3811882@media.mit.edu> <5bef28df0804040115m359e370aw4063196c4917f311@mail.gmail.com> Message-ID: <5bef28df0804040336m5062444do7ba67b5c5507b7d1@mail.gmail.com> On 4/4/08, Alex Mizrahi wrote: > (defclass test-event () > ((date :accessor date-of :initform (now) :index t) ... > and it will create indices for you automatically. Yes, although this is just an example of what I'm trying to achieve and isn't exactly what i'm doing. I'm really just curious about using 2 btree indices together without requiring the creation of a 3rd. > i believe that SQL RDBMS work this way too -- if one needs fast retrieval by > several keys, he should create index on them. RDMBS knows how to sort > tuples, though Well yes, but generally SQL RDBMS's will make efficient use of indexes it they are created on all the keys without requiring a combined index. sean. From rosssd at gmail.com Fri Apr 4 11:56:03 2008 From: rosssd at gmail.com (Sean Ross) Date: Fri, 4 Apr 2008 12:56:03 +0100 Subject: [elephant-devel] Re: traversing btree using multiple indices In-Reply-To: <5bef28df0804040336m5062444do7ba67b5c5507b7d1@mail.gmail.com> References: <5bef28df0804030918u4680f456i29e3e775275e9589@mail.gmail.com> <793EC77B-3D47-443D-94D2-B77EC3811882@media.mit.edu> <5bef28df0804040115m359e370aw4063196c4917f311@mail.gmail.com> <5bef28df0804040336m5062444do7ba67b5c5507b7d1@mail.gmail.com> Message-ID: <5bef28df0804040456la816e8cpc11c92741962bfb8@mail.gmail.com> > I'm really just curious about using > 2 btree indices together without requiring the creation of a 3rd. Of course I could be working against elephant while trying to do all of this. So here is what I am trying to achieve, any pointers would be great. Given the following code. >> (defpackage :test (:use :cl :elephant :alexandria)) (in-package :test) (open-store '(:bdb "/tmp/new")) (defclass event () ((date :initarg :date :initform (get-universal-time)) (tags :initarg :tags :initform ())) (:metaclass persistent-metaclass)) (defvar *events* (make-indexed-btree)) (defun random-tag () (random-elt '("lisp" "humour" "business" "friends" "family"))) (defun random-date () (funcall (if (zerop (random 2)) '+ '-) (get-universal-time) (random 100000))) (defun populate () (dotimes (x 1000) (setf (get-value x *events*) (make-instance 'event :date (random-date) :tags (list (format nil "~R" x) (random-tag)))))) << What is the best/easiest/most-elephantish way to retrieve all events in the btree which have the 'lisp' tag and whose date falls on today? sean. From killerstorm at newmail.ru Fri Apr 4 12:04:47 2008 From: killerstorm at newmail.ru (Alex Mizrahi) Date: Fri, 4 Apr 2008 15:04:47 +0300 Subject: [elephant-devel] Re: traversing btree using multiple indices References: <5bef28df0804030918u4680f456i29e3e775275e9589@mail.gmail.com><793EC77B-3D47-443D-94D2-B77EC3811882@media.mit.edu><5bef28df0804040115m359e370aw4063196c4917f311@mail.gmail.com> <5bef28df0804040336m5062444do7ba67b5c5507b7d1@mail.gmail.com> Message-ID: ??>> i believe that SQL RDBMS work this way too -- if one needs fast ??>> retrieval by several keys, he should create index on them. RDMBS knows ??>> how to sort tuples, though SR> Well yes, but generally SQL RDBMS's will make efficient use of indexes SR> it they are created on all the keys without requiring a combined SR> index. sure it's more optimized, but algorithmically it has same worst case as elephant has -- it has to pick _all_ elements from one of indices and check if they satisfy another condition. thus, if you have 10000 events with name = "Sean" and 10000 events for given date range, it will _have_ to read all 10000 events and verify them. for example, in postgresql query: explain select count(*) from tree1771 where qi = 5 and (value > 15000) and (value < 30000); plan with combined index: Aggregate (cost=29.93..29.94 rows=1 width=0) -> Index Scan using tree1771_idx on tree1771 (cost=0.00..29.91 rows=9 width=0) Index Cond: ((qi = 5) AND (value > 15000) AND (value < 30000)) and a plan with individual ones: Aggregate (cost=42.67..42.68 rows=1 width=0) -> Index Scan using tree1771_qi_idx on tree1771 (cost=0.00..42.65 rows=9 width=0) Index Cond: (qi = 5) Filter: ((value > 15000) AND (value < 30000)) so it gets all tuples from index and filters them -- we can do this with elephant too. or, another example how postgresql joins two relations (that's more like situation we have, because we have to use btrees of pairs rather than arbitrary tuples): Aggregate (cost=581.32..581.33 rows=1 width=0) (actual time=6.074..6.075 rows=1 loops=1) -> Hash Join (cost=298.64..581.22 rows=38 width=0) (actual time=3.965..5.994 rows=102 loops=1) Hash Cond: ("outer".value = "inner".value) -> Bitmap Heap Scan on tree1770 (cost=18.16..293.56 rows=1360 width=8) (actual time=0.405..1.575 rows=1252 loops=1) Recheck Cond: ((qi > 8) AND (qi < 10)) -> Bitmap Index Scan on tree1770_idx (cost=0.00..18.16 rows=1360 width=0) (actual time=0.366..0.366 rows=1252 loops=1) Index Cond: ((qi > 8) AND (qi < 10)) -> Hash (cost=277.71..277.71 rows=1107 width=8) (actual time=3.429..3.429 rows=1145 loops=1) -> Bitmap Heap Scan on tree1771 (cost=8.87..277.71 rows=1107 width=8) (actual time=0.244..2.112 rows=1145 loops=1) Recheck Cond: (qi = 5) -> Bitmap Index Scan on tree1771_qi_idx (cost=0.00..8.87 rows=1107 width=0) (actual time=0.208..0.208 rows=1145 loops=1) Index Cond: (qi = 5) Total runtime: 6.145 ms (13 rows) it gets retrieves values from both relations (1252 from one and 1145 from another) and finds there intersection via "hash join". it's also possible to do this in elephant on user level -- it might be more efficient than doing btree lookup to check each row individually. From killerstorm at newmail.ru Fri Apr 4 12:20:50 2008 From: killerstorm at newmail.ru (Alex Mizrahi) Date: Fri, 4 Apr 2008 15:20:50 +0300 Subject: [elephant-devel] Re: traversing btree using multiple indices References: <5bef28df0804030918u4680f456i29e3e775275e9589@mail.gmail.com><793EC77B-3D47-443D-94D2-B77EC3811882@media.mit.edu><5bef28df0804040115m359e370aw4063196c4917f311@mail.gmail.com><5bef28df0804040336m5062444do7ba67b5c5507b7d1@mail.gmail.com> <5bef28df0804040456la816e8cpc11c92741962bfb8@mail.gmail.com> Message-ID: SR> What is the best/easiest/most-elephantish way to retrieve all events SR> in the btree which have the 'lisp' tag and whose date falls on today? so you have lots of possible tags and many tags per event? then you need a btree with entry for each event for each tags, that is ( -> event_id) btree. just as with SQL you'd need (tag, date, event_id) table. as elephant cannot sort tuples, you need to convert them to strings as i've noted before. From eslick at media.mit.edu Fri Apr 4 13:45:20 2008 From: eslick at media.mit.edu (Ian Eslick) Date: Fri, 4 Apr 2008 09:45:20 -0400 Subject: [elephant-devel] Re: traversing btree using multiple indices In-Reply-To: References: <5bef28df0804030918u4680f456i29e3e775275e9589@mail.gmail.com><793EC77B-3D47-443D-94D2-B77EC3811882@media.mit.edu><5bef28df0804040115m359e370aw4063196c4917f311@mail.gmail.com><5bef28df0804040336m5062444do7ba67b5c5507b7d1@mail.gmail.com> <5bef28df0804040456la816e8cpc11c92741962bfb8@mail.gmail.com> Message-ID: <82AE2346-D730-4C6A-90F6-321702158D99@media.mit.edu> Hi there, The string tuple-sorting hack makes me cringe. I know that I could make BDB and the lisp side sort lists based on their constituents pretty easily if you felt we could make the same hack work in postmodern. (cons "Fred" 23) < (cons "Fred" 25) < (cons "Sally" 10) Maybe we could create a special tuple object for sorting aggregates so we didn't break the 'cannot sort on non-primitives' guarantee today. As for Sean's request about doing an efficient intersection, as Alex was explaining there are only two ways to do this efficiently: 1) Select the smallest set of objects (date range or tag name) and iterate over it filtering by the value of the other 2) Select both sets, but only by OID and then merge the OIDs and iterate the OID list creating only the objects you need. (elephant- unstable makes this easy and this should show up later). (If you wanted the OIDs in #2 sorted by date, then you'd have to find a way to do an OID merge and maintain the date information so you didn't have to resort. I have ideas on this but it isn't implemented.) However, premature optimization often causes more trouble than it's worth. The easiest thing to do to get going is to index both slots and say: (intersection (get-instances-by-range 'event 'date ) (get-instances-by-value 'event 'tag )) You may be surprised how fast that is! This will work for thousands of objects per set with BDB. The new unstable branch removes the MOP overhead so if your set sizes are in the low 10's of thousands this should take less than a second. Ian On Apr 4, 2008, at 8:20 AM, Alex Mizrahi wrote: > SR> What is the best/easiest/most-elephantish way to retrieve all > events > SR> in the btree which have the 'lisp' tag and whose date falls on > today? > > so you have lots of possible tags and many tags per event? > then you need a btree with entry for each event for each tags, that is > ( -> event_id) btree. > just as with SQL you'd need (tag, date, event_id) table. > as elephant cannot sort tuples, you need to convert them to strings > as i've > noted before. > > > > _______________________________________________ > elephant-devel site list > elephant-devel at common-lisp.net > http://common-lisp.net/mailman/listinfo/elephant-devel From rosssd at gmail.com Fri Apr 4 14:13:07 2008 From: rosssd at gmail.com (Sean Ross) Date: Fri, 4 Apr 2008 15:13:07 +0100 Subject: [elephant-devel] Re: traversing btree using multiple indices In-Reply-To: <82AE2346-D730-4C6A-90F6-321702158D99@media.mit.edu> References: <5bef28df0804030918u4680f456i29e3e775275e9589@mail.gmail.com> <793EC77B-3D47-443D-94D2-B77EC3811882@media.mit.edu> <5bef28df0804040115m359e370aw4063196c4917f311@mail.gmail.com> <5bef28df0804040336m5062444do7ba67b5c5507b7d1@mail.gmail.com> <5bef28df0804040456la816e8cpc11c92741962bfb8@mail.gmail.com> <82AE2346-D730-4C6A-90F6-321702158D99@media.mit.edu> Message-ID: <5bef28df0804040713w24781606m78851c68f8d05498@mail.gmail.com> On 4/4/08, Ian Eslick wrote: > However, premature optimization often causes more trouble than it's worth. > The easiest thing to do to get going is to index both slots and say: > > (intersection (get-instances-by-range 'event 'date ) > (get-instances-by-value 'event 'tag )) > > You may be surprised how fast that is! This will work for thousands of > objects per set with BDB. > > The new unstable branch removes the MOP overhead so if your set sizes are > in the low 10's of thousands this should take less than a second. Thanks Ian, I'll stick with this approach for now and migrate to the oid approach if I start having speed issues later. cheers, sean. From killerstorm at newmail.ru Fri Apr 4 14:29:52 2008 From: killerstorm at newmail.ru (Alex Mizrahi) Date: Fri, 4 Apr 2008 17:29:52 +0300 Subject: [elephant-devel] Re: traversing btree using multiple indices References: <5bef28df0804030918u4680f456i29e3e775275e9589@mail.gmail.com><793EC77B-3D47-443D-94D2-B77EC3811882@media.mit.edu><5bef28df0804040115m359e370aw4063196c4917f311@mail.gmail.com><5bef28df0804040336m5062444do7ba67b5c5507b7d1@mail.gmail.com><5bef28df0804040456la816e8cpc11c92741962bfb8@mail.gmail.com> <82AE2346-D730-4C6A-90F6-321702158D99@media.mit.edu> Message-ID: IE> The string tuple-sorting hack makes me cringe. yep, this looks weird. but i mostly have id-and-time situation, and it works fine for it. IE> I know that I could make BDB and the lisp side sort lists based on IE> their constituents pretty easily if you felt we could make the same IE> hack work in postmodern. i think hack for postmodern would be quite different one -- rather than messing with custom sorter, we can make multiple columns in our btree tables -- i.e. it was (qi, value), and we make it (qi1, qi2, value). it requires considerable amount of work to adapt queries to work with this, but it's quite useful feature to have. IE> Maybe we could create a special tuple object for sorting aggregates so IE> we didn't break the 'cannot sort on non-primitives' guarantee today. yep, special tuple type makes sense for postmodern, since it creates table according to types of first pair inserted. IE> As for Sean's request about doing an efficient intersection, as Alex IE> was explaining there are only two ways to do this efficiently: no, these are two ways to do it inefficiently, there is only one way to do it efficiently -- via combined index :) IE> However, premature optimization often causes more trouble than it's worth. yep, especially since it's quite easy to optimize it (addind indices etc) when it becomes slow. IE> The new unstable branch removes the MOP overhead so if your set sizes IE> are in the low 10's of thousands this should take less than a second. if it is slow or not depends on a use case -- one thing is interactive application where queries are made in response to user action and few seconds of delay are OK. another thing is a web site, where one slow query affects all users using this web site concurrently. From eslick at media.mit.edu Fri Apr 4 14:38:18 2008 From: eslick at media.mit.edu (Ian Eslick) Date: Fri, 4 Apr 2008 10:38:18 -0400 Subject: [elephant-devel] Re: traversing btree using multiple indices In-Reply-To: References: <5bef28df0804030918u4680f456i29e3e775275e9589@mail.gmail.com><793EC77B-3D47-443D-94D2-B77EC3811882@media.mit.edu><5bef28df0804040115m359e370aw4063196c4917f311@mail.gmail.com><5bef28df0804040336m5062444do7ba67b5c5507b7d1@mail.gmail.com><5bef28df0804040456la816e8cpc11c92741962bfb8@mail.gmail.com> <82AE2346-D730-4C6A-90F6-321702158D99@media.mit.edu> Message-ID: > IE> As for Sean's request about doing an efficient intersection, as > Alex > IE> was explaining there are only two ways to do this efficiently: > > no, these are two ways to do it inefficiently, there is only one way > to do > it efficiently -- via combined index :) True, but his request was efficiency without an extra index - and those are the two ways of doing it faster than linear! :) > IE> The new unstable branch removes the MOP overhead so if your set > sizes > IE> are in the low 10's of thousands this should take less than a > second. > > if it is slow or not depends on a use case -- one thing is interactive > application where queries are made in response to user action and few > seconds of delay are OK. > another thing is a web site, where one slow query affects all users > using > this web site concurrently. True, I don't have a good sense of how all these things play together yet in a real world, multi-user setting. Disk space is cheap, so you might as well use indices to save disk bandwidth! Ian From vagif at cox.net Sat Apr 5 00:24:48 2008 From: vagif at cox.net (Vagif Verdi) Date: Fri, 4 Apr 2008 16:24:48 -0800 Subject: [elephant-devel] Multi user client-server performance Message-ID: <20080404232459.LIYR16481.fed1rmmtao106.cox.net@fed1rmimpo01.cox.net> I'm looking for a object database to play with and possibly adopt for future projects, and I'm reading elephant site and manuals so far. I have a few questions to clarify. Reading Allegrocache site http://www.franz.com/products/allegrocache/AllegroCache_for_ILC_2005.htm I stumbled into this remark: "In order to ensure isolation, the Berkeley DB code employs aggressive locking and uses low level OS locking primitives. The result is that the Lisp application just froze when the process was waiting for access to data. This does not fit well with Lisp's own multithreading." Since I'm interested to use elephant with Berkeley db, I want to ask, how it fares in multi-user client-server environment? Are there real life usage scenarios and if yes, how many users and what size of database? Regards, Vagif Verdi. -------------- next part -------------- An HTML attachment was scrubbed... URL: From eslick at media.mit.edu Sat Apr 5 00:43:49 2008 From: eslick at media.mit.edu (Ian Eslick) Date: Fri, 4 Apr 2008 20:43:49 -0400 Subject: [elephant-devel] Multi user client-server performance In-Reply-To: <20080404232459.LIYR16481.fed1rmmtao106.cox.net@fed1rmimpo01.cox.net> References: <20080404232459.LIYR16481.fed1rmmtao106.cox.net@fed1rmimpo01.cox.net> Message-ID: <00C2F5B1-6133-4240-8BA2-A7904FFAE476@media.mit.edu> This is an issue on Allegro since it cannot thread and call foreign code at the same time. I do not believe that SBCL suffers from this particular limitation - presuming the C code is thread safe which BDB is. Ian On Apr 4, 2008, at 8:24 PM, Vagif Verdi wrote: > I?m looking for a object database to play with and possibly adopt > for future projects, and I?m reading elephant site and manuals so far. > I have a few questions to clarify. > > Reading Allegrocache site http://www.franz.com/products/allegrocache/AllegroCache_for_ILC_2005.htm > I stumbled into this remark: > > ?In order to ensure isolation, the Berkeley DB code employs > aggressive locking and uses low level OS locking primitives. The > result is that the Lisp application just froze when the process was > waiting for access to data. This does not fit well with Lisp's own > multithreading.? > > Since I?m interested to use elephant with Berkeley db, I want to > ask, how it fares in multi-user client-server environment? > Are there real life usage scenarios and if yes, how many users and > what size of database? > > Regards, > Vagif Verdi. > > > > _______________________________________________ > elephant-devel site list > elephant-devel at common-lisp.net > http://common-lisp.net/mailman/listinfo/elephant-devel From vagif at cox.net Sat Apr 5 04:09:48 2008 From: vagif at cox.net (Vagif Verdi) Date: Fri, 4 Apr 2008 20:09:48 -0800 Subject: [elephant-devel] Multi user client-server performance In-Reply-To: <00C2F5B1-6133-4240-8BA2-A7904FFAE476@media.mit.edu> Message-ID: <20080405031000.CWFV9382.fed1rmmtao103.cox.net@fed1rmimpo02.cox.net> > This is an issue on Allegro since it cannot thread and call foreign > code at the same time. I do not believe that SBCL suffers from this > particular limitation - presuming the C code is thread safe which BDB > is. > Ian Interesting. I'm using sbcl, so it is good to know that elephant with Berkeley db does not have such problems. But is is surprising to know that such a well established and mature lisp implementation as Allegro, cannot thread properly, while much younger and not so mature sbcl works better than expensive commercial solutions. Anyway, I would like to hear the accounts of real life usage of elephant in multi-user environment. Regards, Vagif Verdi. From read at robertlread.net Sat Apr 5 03:54:46 2008 From: read at robertlread.net (Robert L. Read) Date: Fri, 04 Apr 2008 22:54:46 -0500 Subject: [elephant-devel] Two patches still in queue In-Reply-To: <61395.84.157.24.199.1207219941.squirrel@mail.stardawn.org> References: <61395.84.157.24.199.1207219941.squirrel@mail.stardawn.org> Message-ID: <1207367687.4972.494.camel@penguin.yourdomain.com> On Thu, 2008-04-03 at 12:52 +0200, Leslie P. Polzer wrote: > Hi guys, > > there are two tiny patches I've sent that must've been overlooked. > One reverted a small previous change in the tutorial and one > put the concurrency tests in a separate suite. > > Especially the latter one is important, so it'd be great > if someone with commit access could apply them. > > Thanks! > > Leslie I can try to take care of this next week. > > > _______________________________________________ > elephant-devel site list > elephant-devel at common-lisp.net > http://common-lisp.net/mailman/listinfo/elephant-devel From killerstorm at newmail.ru Sat Apr 5 09:51:17 2008 From: killerstorm at newmail.ru (Alex Mizrahi) Date: Sat, 5 Apr 2008 12:51:17 +0300 Subject: [elephant-devel] Re: Multi user client-server performance References: <00C2F5B1-6133-4240-8BA2-A7904FFAE476@media.mit.edu> <20080405031000.CWFV9382.fed1rmmtao103.cox.net@fed1rmimpo02.cox.net> Message-ID: VV> I'm using sbcl, so it is good to know that elephant with Berkeley db VV> does not have such problems. VV> But is is surprising to know that such a well established and mature VV> lisp implementation as Allegro, cannot thread properly, while much VV> younger and not so mature sbcl works better than expensive commercial VV> solutions. i think they just have different quality standards. VV> Anyway, I would like to hear the accounts of real life usage of VV> elephant in multi-user environment. in elephant we have several different backends: * BDB one is primary one, APIs were modelled according to capabilities of BDB * CLSQL can work with any SQL database supported by CLSQL (that's good), but has some significant "sub-optimalities" * Postmodern can work with PostgreSQL only (uses "postmodern" library, hence the name) and has less sub-optimalities than CLSQL postmodern one was specially developed to work with multiple threads, multiple processes and on multiple machines, so it might be worth testing it if "multi-user" is essential for your application. possible benefits : * PostgreSQL uses MVCC model rather than locking. so it might allow more concurrency * PostgreSQL handles deadlocks automatically (iirc you need separate deadlock-detection process with BDB) * you can have separate server with PostgreSQL and connect to it from different machines via network * it hash optional client-side cache that is automatically synchronized among different processes * this backend was designed and tested to work in concurrent environment with multiple processes, threads etc but it has it's negative sides too: * inter-process communications have significant overhead, upto 10x, if we'll compare to in-process BDB (but it's offseted by cache to some point -- we assume that under constant load most data gets cached, so only index queries and writes need to communicate with PostgreSQL backend) * some features work differently from BDB backend -- or, in other words, they were not implemented correctly because there's no straightforward way to do this in SQL backend. most significant difference is sorting -- with db-postmodern you get correct ordering in index only if all keys are either integers or strings. * it's, um, less stable than BDB one, kinda still under development. as for real-life usage, we are using elephant with postmodern backend as a database for a web site, which is assumed to be multi-user one, and it sort of works. but OTOH our load, database size and complexity are relatively small, so i can't say it was tested in really harsh environment. From vagif at cox.net Sun Apr 6 00:38:25 2008 From: vagif at cox.net (Vagif Verdi) Date: Sat, 5 Apr 2008 16:38:25 -0800 Subject: [elephant-devel] Master-detail how to In-Reply-To: Message-ID: <20080405233838.HPAG18642.fed1rmmtao105.cox.net@fed1rmimpo01.cox.net> I read all tutorials and examples, and master-detail relationship is not covered anywhere. How do you guys do it? What is the idiomatic "oodb" way of doing master-detail? Let's say we have orders and orders may have several items in them. Obviously class order must be persistent. But what about class order-item? Should it be persistent too? Or is it just a normal class that you save into list in persistent slot items of class order? Next question. How do you search orders that have say particular item? Do you create a computed index on order class? Or do you make item class persistent and mark its name as indexed? Regards, Vagif From vagif at cox.net Sun Apr 6 00:45:46 2008 From: vagif at cox.net (Vagif Verdi) Date: Sat, 5 Apr 2008 16:45:46 -0800 Subject: [elephant-devel] Re: Multi user client-server performance In-Reply-To: Message-ID: <20080405234559.JFBE6668.fed1rmmtao107.cox.net@fed1rmimpo03.cox.net> AM>in elephant we have several different backends: AM > * BDB one is primary one, APIs were modelled according to capabilities AM> of BDB AM> * CLSQL can work with any SQL database supported by CLSQL (that's good), AM>but has some significant "sub-optimalities" AM> * Postmodern can work with PostgreSQL only (uses "postmodern" library, AM>hence the name) and has less sub-optimalities than CLSQL I do not see any technical reason using elephant with relational backend stores. It does not buy me sql capabilities, because table schema is butchered to make it work as key-value store. And trying to query it with sql from outside of elephant would be hard (if not impossible) Yet choosing sql backend, I'm gonna lose speed on the order of magnitude (in simple cases) and I suspect more in case of complex hierarchies of objects. The only non technical reason I see to use non Berkeley db backends is due to licensing. But BDB's GPL licensing works fine for me (inhouse use.) From eslick at media.mit.edu Sun Apr 6 01:03:57 2008 From: eslick at media.mit.edu (Ian Eslick) Date: Sat, 5 Apr 2008 21:03:57 -0400 Subject: [elephant-devel] Re: Multi user client-server performance In-Reply-To: <20080405234559.JFBE6668.fed1rmmtao107.cox.net@fed1rmimpo03.cox.net> References: <20080405234559.JFBE6668.fed1rmmtao107.cox.net@fed1rmimpo03.cox.net> Message-ID: <07A43232-FF54-471C-943E-14E538DA9D4D@media.mit.edu> On Apr 5, 2008, at 8:45 PM, Vagif Verdi wrote: > AM>in elephant we have several different backends: > AM > * BDB one is primary one, APIs were modelled according to > capabilities > AM> of BDB > AM> * CLSQL can work with any SQL database supported by CLSQL > (that's good), > > AM>but has some significant "sub-optimalities" > AM> * Postmodern can work with PostgreSQL only (uses "postmodern" > library, > AM>hence the name) and has less sub-optimalities than CLSQL > > I do not see any technical reason using elephant with relational > backend > stores. It does not buy me sql capabilities, because table schema is > butchered to make it work as key-value store. And trying to query it > with > sql from outside of elephant would be hard (if not impossible) > Yet choosing sql backend, I'm gonna lose speed on the order of > magnitude (in > simple cases) and I suspect more in case of complex hierarchies of > objects. Actually what it buys you is scalability (multi-process, multi-machine operation) on top of the licensing benefit. That's important for externally facing, commercially-oriented websites. The reason you would bother to do this vs. sticking with pure SQL (via CL-SQL, for instance) is for the simplicity of the integration with lisp. Slots are dynamically typed, you can easily redefine classes, call change-class, and have the system do the right thing. > The only non technical reason I see to use non Berkeley db backends > is due > to licensing. But BDB's GPL licensing works fine for me (inhouse use.) > > > > _______________________________________________ > elephant-devel site list > elephant-devel at common-lisp.net > http://common-lisp.net/mailman/listinfo/elephant-devel From Blog at common-lisp.net Sun Apr 6 03:42:43 2008 From: Blog at common-lisp.net (Blog at common-lisp.net) Date: 06 Apr 2008 11:42:43 +0800 Subject: [elephant-devel] How would you like to have your ad on 2 Million Websites ? Message-ID: <20080406114242.A8295AE289AF3288@from.header.has.no.domain> How would you like 2 Million Sites linking to your ad ? Weblog or blog population is exploding around the world, resembling the growth of e-mail users in the 1990s. Post your ads where people read them! - What if you could place your ad on all these sites ? Right, that would mean you would have millions of sites linking to your ad. For Full details please read the attached .html file Unsubscribe Please read the attached .txt file -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- An embedded and charset-unspecified text was scrubbed... Name: Unsubscribe email.txt URL: From killerstorm at newmail.ru Sun Apr 6 11:38:03 2008 From: killerstorm at newmail.ru (Alex Mizrahi) Date: Sun, 6 Apr 2008 14:38:03 +0300 Subject: [elephant-devel] Re: Master-detail how to References: <20080405233838.HPAG18642.fed1rmmtao105.cox.net@fed1rmimpo01.cox.net> Message-ID: VV> Obviously class order must be persistent. But what about class VV> order-item? Should it be persistent too? it's better to make it persistent, so you can search on details. VV> Next question. How do you search orders that have say particular item? (mapcar #'order-of (get-instances-by-value 'order-item 'item item)) VV> Do you create a computed index on order class? some complex queries require computed indices, but it seems not in this case VV> Or do you make item class persistent and mark its name as indexed? if you're using objects anyway it makes sense to make everything a persistent object From read at robertlread.net Mon Apr 7 02:38:57 2008 From: read at robertlread.net (Robert L. Read) Date: Sun, 06 Apr 2008 21:38:57 -0500 Subject: [elephant-devel] Re: Multi user client-server performance In-Reply-To: References: <00C2F5B1-6133-4240-8BA2-A7904FFAE476@media.mit.edu> <20080405031000.CWFV9382.fed1rmmtao103.cox.net@fed1rmimpo02.cox.net> Message-ID: <1207535937.25764.51.camel@penguin.yourdomain.com> On Sat, 2008-04-05 at 12:51 +0300, Alex Mizrahi wrote: > in elephant we have several different backends: > * BDB one is primary one, APIs were modelled according to > capabilities of > BDB > * CLSQL can work with any SQL database supported by CLSQL (that's > good), > but has some significant "sub-optimalities" > * Postmodern can work with PostgreSQL only (uses "postmodern" > library, > hence the name) and has less sub-optimalities than CLSQL As an aside, I am currently trying to implement Ian's latest extensions to the internal BTree model under CLSQL in order that we we can be green on all backends with his latest features (in the "elephant-unstable" branch.) Reviewing the code I wrote two or three years ago for CLSQL, which unfortunately influenced the PostModern stuff in some ways, it does seem pretty heinous. The lesson I take from this is mostly that we should try to prioritize a native-LISP backend as much as possible. Although I agree with the defense of using a relational database as a store given the engineering advantages (such as automated backups) that it provides, it is also clear that if we had a native-LISP backend we would broaden the choices that a user would have. One could then experiment with Elephant "out-of-the-box" (via the native LISP backend), then implement on top of PostModern, then perhaps move to BDB if you like. The main reason for maintaining the CL-SQL backend is that it would be a good starting point for an Oracle, MS Sql Server, or Mysql implementation. The PostModern backend actually would also be a model for those implementations, though a less direct one. I personally think the PostModern work made CL-SQL less important, and a Native LISP backend would make it less important still. I can imagine a time when we would deprecate the CL-SQL backend entirely. In particular, if we had something like PostModern for one other major database we would then have two models of how to implement that way, and could probably mothball the CL-SQL backend. From info at jensteich.de Mon Apr 7 04:56:51 2008 From: info at jensteich.de (Jens Teich) Date: Mon, 7 Apr 2008 06:56:51 +0200 Subject: [elephant-devel] Typos in CREDITS Message-ID: Hi, in CREDITS, you write: | Edi Weisz for Lispwork and Win32 patches | | Mac Chan for his Hutchentoot blog tutorial Edis last name is Weitz, his webservers name is Hunchentoot. It is Lispworks. Attached is a patch to fix these typos. I asked Edi and he is not completely sure what you mean with a Hunchentoot blog tutorial. Maybe you want to check that too. Jens -------------- next part -------------- A non-text attachment was scrubbed... Name: CREDITS.diff Type: application/octet-stream Size: 705 bytes Desc: not available URL: From info at jensteich.de Mon Apr 7 05:53:02 2008 From: info at jensteich.de (Jens Teich) Date: Mon, 7 Apr 2008 07:53:02 +0200 Subject: [elephant-devel] Error when loading elephant on Mac OS with Lispworks 5.1 Message-ID: <7139C083-E4DD-443A-85EC-03911647BB20@jensteich.de> Lispworks 5.1 Mac OS X 10.5 CL-USER 1 > (asdf :elephant) ; loading system definition from /Users/jensteich/Lisp/elephant/ elephant.asd into ; # ; Loading text file /Users/jensteich/Lisp/elephant/elephant.asd ; registering # as ELEPHANT ; loading system definition from /Users/jensteich/Lisp/cl-base64-3.3.2/ cl-base64.asd ; into # ; Loading text file /Users/jensteich/Lisp/cl-base64-3.3.2/cl-base64.asd ; registering # as CL-BASE64 ; registering # as CL-BASE64-TESTS ; loading system definition from /Users/jensteich/Lisp/uffi-1.6.0/ uffi.asd into ; # ; Loading text file /Users/jensteich/Lisp/uffi-1.6.0/uffi.asd ; registering # as UFFI ;;; Compiling file /Users/jensteich/Lisp/uffi-1.6.0/src/package.lisp ... ;;; Safety = 3, Speed = 1, Space = 1, Float = 1, Interruptible = 0 ;;; Compilation speed = 1, Debug = 2, Fixnum safety = 3 ;;; Source level debugging is on ;;; Source file recording is on ;;; Cross referencing is on ; (TOP-LEVEL-FORM 0) ; (TOP-LEVEL-FORM 1) ; (DEFPACKAGE "UFFI") ; (TOP-LEVEL-FORM 0) ; Loading fasl file /Users/jensteich/Lisp/uffi-1.6.0/src/package.xfasl ;;; Compiling file /Users/jensteich/Lisp/uffi-1.6.0/src/ primitives.lisp ... ;;; Safety = 3, Speed = 1, Space = 1, Float = 1, Interruptible = 0 ;;; Compilation speed = 1, Debug = 2, Fixnum safety = 3 ;;; Source level debugging is on ;;; Source file recording is on ;;; Cross referencing is on ; (TOP-LEVEL-FORM 0) ; (TOP-LEVEL-FORM 1) ; UFFI:DEF-CONSTANT ; UFFI:DEF-TYPE ; UFFI:NULL-CHAR-P ; UFFI:DEF-FOREIGN-TYPE ; (DEFVAR UFFI::+TYPE-CONVERSION-HASH+) ; (DEFVAR UFFI::*TYPE-CONVERSION-LIST*) ; (TOP-LEVEL-FORM 8) ; (TOP-LEVEL-FORM 9) ; UFFI::BASIC-CONVERT-FROM-UFFI-TYPE ; UFFI::%CONVERT-FROM-UFFI-TYPE ; UFFI::CONVERT-FROM-UFFI-TYPE ; (TOP-LEVEL-FORM 13) ; (TOP-LEVEL-FORM 13) ; UFFI::MAKE-LISP-NAME ; (TOP-LEVEL-FORM 15) ; (TOP-LEVEL-FORM 15) ; (TOP-LEVEL-FORM 0) ; Loading fasl file /Users/jensteich/Lisp/uffi-1.6.0/src/ primitives.xfasl ;;; Compiling file /Users/jensteich/Lisp/uffi-1.6.0/src/objects.lisp ... ;;; Safety = 3, Speed = 1, Space = 1, Float = 1, Interruptible = 0 ;;; Compilation speed = 1, Debug = 2, Fixnum safety = 3 ;;; Source level debugging is on ;;; Source file recording is on ;;; Cross referencing is on ; (TOP-LEVEL-FORM 0) ; (TOP-LEVEL-FORM 1) ; UFFI:SIZE-OF-FOREIGN-TYPE ; UFFI:ALLOCATE-FOREIGN-OBJECT ; UFFI:FREE-FOREIGN-OBJECT ; UFFI:NULL-POINTER-P ; UFFI:MAKE-NULL-POINTER ; UFFI:MAKE-POINTER ; UFFI:CHAR-ARRAY-TO-POINTER ; UFFI:DEREF-POINTER ; UFFI:ENSURE-CHAR-CHARACTER ; UFFI:ENSURE-CHAR-INTEGER ; UFFI:ENSURE-CHAR-STORABLE ; UFFI:POINTER-ADDRESS ; UFFI:WITH-FOREIGN-OBJECT ; UFFI:WITH-FOREIGN-OBJECTS ; UFFI:WITH-CAST-POINTER ; UFFI:DEF-FOREIGN-VAR ; UFFI:DEF-POINTER-VAR ; (TOP-LEVEL-FORM 0) ;;; Compiling file /Users/jensteich/Lisp/uffi-1.6.0/src/ aggregates.lisp ... ;;; Safety = 3, Speed = 1, Space = 1, Float = 1, Interruptible = 0 ;;; Compilation speed = 1, Debug = 2, Fixnum safety = 3 ;;; Source level debugging is on ;;; Source file recording is on ;;; Cross referencing is on ; (TOP-LEVEL-FORM 0) ; (TOP-LEVEL-FORM 1) ; UFFI:DEF-ENUM ; UFFI:DEF-ARRAY-POINTER ; UFFI::PROCESS-STRUCT-FIELDS ; UFFI:DEF-STRUCT ; UFFI:GET-SLOT-VALUE ; UFFI:GET-SLOT-POINTER ; UFFI:DEREF-ARRAY ; UFFI:DEF-UNION ; UFFI:CONVERT-FROM-FOREIGN-USB8 ; (TOP-LEVEL-FORM 0) ;;; Compiling file /Users/jensteich/Lisp/uffi-1.6.0/src/ functions.lisp ... ;;; Safety = 3, Speed = 1, Space = 1, Float = 1, Interruptible = 0 ;;; Compilation speed = 1, Debug = 2, Fixnum safety = 3 ;;; Source level debugging is on ;;; Source file recording is on ;;; Cross referencing is on ; (TOP-LEVEL-FORM 0) ; (TOP-LEVEL-FORM 1) ; UFFI::PROCESS-FUNCTION-ARGS ; UFFI::PROCESS-ONE-FUNCTION-ARG ; UFFI::ALLEGRO-CONVERT-RETURN-TYPE ; UFFI::FUNCALLABLE-LAMBDA-LIST ; UFFI::CONVERT-LISPWORKS-ARGS ; UFFI::PREPROCESS-NAMES ; UFFI::PREPROCESS-ARGS ; UFFI:DEF-FUNCTION ; UFFI::%DEF-FUNCTION ; (TOP-LEVEL-FORM 0) ; Loading fasl file /Users/jensteich/Lisp/uffi-1.6.0/src/functions.xfasl ; Loading fasl file /Users/jensteich/Lisp/uffi-1.6.0/src/ aggregates.xfasl ; Loading fasl file /Users/jensteich/Lisp/uffi-1.6.0/src/objects.xfasl ;;; Compiling file /Users/jensteich/Lisp/uffi-1.6.0/src/strings.lisp ... ;;; Safety = 3, Speed = 1, Space = 1, Float = 1, Interruptible = 0 ;;; Compilation speed = 1, Debug = 2, Fixnum safety = 3 ;;; Source level debugging is on ;;; Source file recording is on ;;; Cross referencing is on ; (TOP-LEVEL-FORM 0) ; (TOP-LEVEL-FORM 1) ; (DEFVAR UFFI:+NULL-CSTRING-POINTER+) ; UFFI:CONVERT-FROM-CSTRING ; UFFI:CONVERT-TO-CSTRING ; UFFI:FREE-CSTRING ; UFFI:WITH-CSTRING ; UFFI:WITH-CSTRINGS ; UFFI:CONVERT-TO-FOREIGN-STRING ; UFFI:CONVERT-FROM-FOREIGN-STRING ; UFFI:ALLOCATE-FOREIGN-STRING ; UFFI:FOREIGN-STRING-LENGTH ; UFFI:WITH-FOREIGN-STRING ; UFFI:WITH-FOREIGN-STRINGS ; (SUBFUNCTION UFFI::STRLEN (FLI:DEFINE-FOREIGN-FUNCTION UFFI::STRLEN)) ; (FLI:DEFINE-FOREIGN-FUNCTION UFFI::STRLEN) ; (FLI:DEFINE-FOREIGN-FUNCTION UFFI::STRLEN) ; (DEFTYPE UFFI::CHAR-PTR-DEF) ; UFFI::FAST-NATIVE-TO-STRING ; (TOP-LEVEL-FORM 0) ;;; Compiling file /Users/jensteich/Lisp/uffi-1.6.0/src/ libraries.lisp ... ;;; Safety = 3, Speed = 1, Space = 1, Float = 1, Interruptible = 0 ;;; Compilation speed = 1, Debug = 2, Fixnum safety = 3 ;;; Source level debugging is on ;;; Source file recording is on ;;; Cross referencing is on ; (TOP-LEVEL-FORM 0) ; (TOP-LEVEL-FORM 1) ; (DEFVAR UFFI::*LOADED-LIBRARIES*) ; UFFI:DEFAULT-FOREIGN-LIBRARY-TYPE ; UFFI:FOREIGN-LIBRARY-TYPES ; UFFI:FIND-FOREIGN-LIBRARY ; UFFI:LOAD-FOREIGN-LIBRARY ; UFFI::CONVERT-SUPPORTING-LIBRARIES-TO-STRING ; (TOP-LEVEL-FORM 0) ;;; Compiling file /Users/jensteich/Lisp/uffi-1.6.0/src/os.lisp ... ;;; Safety = 3, Speed = 1, Space = 1, Float = 1, Interruptible = 0 ;;; Compilation speed = 1, Debug = 2, Fixnum safety = 3 ;;; Source level debugging is on ;;; Source file recording is on ;;; Cross referencing is on ; (TOP-LEVEL-FORM 0) ; (TOP-LEVEL-FORM 1) ; UFFI:GETENV ; UFFI:RUN-SHELL-COMMAND ; (TOP-LEVEL-FORM 0) ; Loading fasl file /Users/jensteich/Lisp/uffi-1.6.0/src/strings.xfasl ; Loading fasl file /Users/jensteich/Lisp/uffi-1.6.0/src/libraries.xfasl ; Loading fasl file /Users/jensteich/Lisp/uffi-1.6.0/src/os.xfasl ;;; Compiling file /Users/jensteich/Lisp/uffi-1.6.0/src/package.lisp ... ;;; Safety = 3, Speed = 1, Space = 1, Float = 1, Interruptible = 0 ;;; Compilation speed = 1, Debug = 2, Fixnum safety = 3 ;;; Source level debugging is on ;;; Source file recording is on ;;; Cross referencing is on ; (TOP-LEVEL-FORM 0) ; (TOP-LEVEL-FORM 1) ; (DEFPACKAGE "UFFI") ; (TOP-LEVEL-FORM 0) ; Loading fasl file /Users/jensteich/Lisp/uffi-1.6.0/src/package.xfasl ;;; Compiling file /Users/jensteich/Lisp/uffi-1.6.0/src/ primitives.lisp ... ;;; Safety = 3, Speed = 1, Space = 1, Float = 1, Interruptible = 0 ;;; Compilation speed = 1, Debug = 2, Fixnum safety = 3 ;;; Source level debugging is on ;;; Source file recording is on ;;; Cross referencing is on ; (TOP-LEVEL-FORM 0) ; (TOP-LEVEL-FORM 1) ; UFFI:DEF-CONSTANT ; UFFI:DEF-TYPE ; UFFI:NULL-CHAR-P ; UFFI:DEF-FOREIGN-TYPE ; (DEFVAR UFFI::+TYPE-CONVERSION-HASH+) ; (DEFVAR UFFI::*TYPE-CONVERSION-LIST*) ; (TOP-LEVEL-FORM 8) ; (TOP-LEVEL-FORM 9) ; UFFI::BASIC-CONVERT-FROM-UFFI-TYPE ; UFFI::%CONVERT-FROM-UFFI-TYPE ; UFFI::CONVERT-FROM-UFFI-TYPE ; (TOP-LEVEL-FORM 13) ; (TOP-LEVEL-FORM 13) ; UFFI::MAKE-LISP-NAME ; (TOP-LEVEL-FORM 15) ; (TOP-LEVEL-FORM 15) ; (TOP-LEVEL-FORM 0) ; Loading fasl file /Users/jensteich/Lisp/uffi-1.6.0/src/ primitives.xfasl ;;; Compiling file /Users/jensteich/Lisp/uffi-1.6.0/src/objects.lisp ... ;;; Safety = 3, Speed = 1, Space = 1, Float = 1, Interruptible = 0 ;;; Compilation speed = 1, Debug = 2, Fixnum safety = 3 ;;; Source level debugging is on ;;; Source file recording is on ;;; Cross referencing is on ; (TOP-LEVEL-FORM 0) ; (TOP-LEVEL-FORM 1) ; UFFI:SIZE-OF-FOREIGN-TYPE ; UFFI:ALLOCATE-FOREIGN-OBJECT ; UFFI:FREE-FOREIGN-OBJECT ; UFFI:NULL-POINTER-P ; UFFI:MAKE-NULL-POINTER ; UFFI:MAKE-POINTER ; UFFI:CHAR-ARRAY-TO-POINTER ; UFFI:DEREF-POINTER ; UFFI:ENSURE-CHAR-CHARACTER ; UFFI:ENSURE-CHAR-INTEGER ; UFFI:ENSURE-CHAR-STORABLE ; UFFI:POINTER-ADDRESS ; UFFI:WITH-FOREIGN-OBJECT ; UFFI:WITH-FOREIGN-OBJECTS ; UFFI:WITH-CAST-POINTER ; UFFI:DEF-FOREIGN-VAR ; UFFI:DEF-POINTER-VAR ; (TOP-LEVEL-FORM 0) ;;; Compiling file /Users/jensteich/Lisp/uffi-1.6.0/src/ aggregates.lisp ... ;;; Safety = 3, Speed = 1, Space = 1, Float = 1, Interruptible = 0 ;;; Compilation speed = 1, Debug = 2, Fixnum safety = 3 ;;; Source level debugging is on ;;; Source file recording is on ;;; Cross referencing is on ; (TOP-LEVEL-FORM 0) ; (TOP-LEVEL-FORM 1) ; UFFI:DEF-ENUM ; UFFI:DEF-ARRAY-POINTER ; UFFI::PROCESS-STRUCT-FIELDS ; UFFI:DEF-STRUCT ; UFFI:GET-SLOT-VALUE ; UFFI:GET-SLOT-POINTER ; UFFI:DEREF-ARRAY ; UFFI:DEF-UNION ; UFFI:CONVERT-FROM-FOREIGN-USB8 ; (TOP-LEVEL-FORM 0) ;;; Compiling file /Users/jensteich/Lisp/uffi-1.6.0/src/ functions.lisp ... ;;; Safety = 3, Speed = 1, Space = 1, Float = 1, Interruptible = 0 ;;; Compilation speed = 1, Debug = 2, Fixnum safety = 3 ;;; Source level debugging is on ;;; Source file recording is on ;;; Cross referencing is on ; (TOP-LEVEL-FORM 0) ; (TOP-LEVEL-FORM 1) ; UFFI::PROCESS-FUNCTION-ARGS ; UFFI::PROCESS-ONE-FUNCTION-ARG ; UFFI::ALLEGRO-CONVERT-RETURN-TYPE ; UFFI::FUNCALLABLE-LAMBDA-LIST ; UFFI::CONVERT-LISPWORKS-ARGS ; UFFI::PREPROCESS-NAMES ; UFFI::PREPROCESS-ARGS ; UFFI:DEF-FUNCTION ; UFFI::%DEF-FUNCTION ; (TOP-LEVEL-FORM 0) ; Loading fasl file /Users/jensteich/Lisp/uffi-1.6.0/src/functions.xfasl ; Loading fasl file /Users/jensteich/Lisp/uffi-1.6.0/src/ aggregates.xfasl ; Loading fasl file /Users/jensteich/Lisp/uffi-1.6.0/src/objects.xfasl ;;; Compiling file /Users/jensteich/Lisp/uffi-1.6.0/src/strings.lisp ... ;;; Safety = 3, Speed = 1, Space = 1, Float = 1, Interruptible = 0 ;;; Compilation speed = 1, Debug = 2, Fixnum safety = 3 ;;; Source level debugging is on ;;; Source file recording is on ;;; Cross referencing is on ; (TOP-LEVEL-FORM 0) ; (TOP-LEVEL-FORM 1) ; (DEFVAR UFFI:+NULL-CSTRING-POINTER+) ; UFFI:CONVERT-FROM-CSTRING ; UFFI:CONVERT-TO-CSTRING ; UFFI:FREE-CSTRING ; UFFI:WITH-CSTRING ; UFFI:WITH-CSTRINGS ; UFFI:CONVERT-TO-FOREIGN-STRING ; UFFI:CONVERT-FROM-FOREIGN-STRING ; UFFI:ALLOCATE-FOREIGN-STRING ; UFFI:FOREIGN-STRING-LENGTH ; UFFI:WITH-FOREIGN-STRING ; UFFI:WITH-FOREIGN-STRINGS ; (SUBFUNCTION UFFI::STRLEN (FLI:DEFINE-FOREIGN-FUNCTION UFFI::STRLEN)) ; (FLI:DEFINE-FOREIGN-FUNCTION UFFI::STRLEN) ; (FLI:DEFINE-FOREIGN-FUNCTION UFFI::STRLEN) ; (DEFTYPE UFFI::CHAR-PTR-DEF) ; UFFI::FAST-NATIVE-TO-STRING ; (TOP-LEVEL-FORM 0) ;;; Compiling file /Users/jensteich/Lisp/uffi-1.6.0/src/ libraries.lisp ... ;;; Safety = 3, Speed = 1, Space = 1, Float = 1, Interruptible = 0 ;;; Compilation speed = 1, Debug = 2, Fixnum safety = 3 ;;; Source level debugging is on ;;; Source file recording is on ;;; Cross referencing is on ; (TOP-LEVEL-FORM 0) ; (TOP-LEVEL-FORM 1) ; (DEFVAR UFFI::*LOADED-LIBRARIES*) ; UFFI:DEFAULT-FOREIGN-LIBRARY-TYPE ; UFFI:FOREIGN-LIBRARY-TYPES ; UFFI:FIND-FOREIGN-LIBRARY ; UFFI:LOAD-FOREIGN-LIBRARY ; UFFI::CONVERT-SUPPORTING-LIBRARIES-TO-STRING ; (TOP-LEVEL-FORM 0) ;;; Compiling file /Users/jensteich/Lisp/uffi-1.6.0/src/os.lisp ... ;;; Safety = 3, Speed = 1, Space = 1, Float = 1, Interruptible = 0 ;;; Compilation speed = 1, Debug = 2, Fixnum safety = 3 ;;; Source level debugging is on ;;; Source file recording is on ;;; Cross referencing is on ; (TOP-LEVEL-FORM 0) ; (TOP-LEVEL-FORM 1) ; UFFI:GETENV ; UFFI:RUN-SHELL-COMMAND ; (TOP-LEVEL-FORM 0) ; Loading fasl file /Users/jensteich/Lisp/uffi-1.6.0/src/strings.xfasl ; Loading fasl file /Users/jensteich/Lisp/uffi-1.6.0/src/libraries.xfasl ; Loading fasl file /Users/jensteich/Lisp/uffi-1.6.0/src/os.xfasl ; Loading fasl file /Users/jensteich/Lisp/cl-base64-3.3.2/package.xfasl ; Loading fasl file /Users/jensteich/Lisp/cl-base64-3.3.2/encode.xfasl ; Loading fasl file /Users/jensteich/Lisp/cl-base64-3.3.2/decode.xfasl ;;; Compiling file /Users/jensteich/Lisp/elephant/src/utils/ package.lisp ... ;;; Safety = 3, Speed = 1, Space = 1, Float = 1, Interruptible = 0 ;;; Compilation speed = 1, Debug = 2, Fixnum safety = 3 ;;; Source level debugging is on ;;; Source file recording is on ;;; Cross referencing is on ; (TOP-LEVEL-FORM 0) ; (TOP-LEVEL-FORM 1) ; (DEFPACKAGE "ELEPHANT-UTILS") ; (TOP-LEVEL-FORM 0) ; Loading fasl file /Users/jensteich/Lisp/elephant/src/utils/ package.xfasl ;;; Compiling file /Users/jensteich/Lisp/elephant/src/utils/ convenience.lisp ... ;;; Safety = 3, Speed = 1, Space = 1, Float = 1, Interruptible = 0 ;;; Compilation speed = 1, Debug = 2, Fixnum safety = 3 ;;; Source level debugging is on ;;; Source file recording is on ;;; Cross referencing is on ; (TOP-LEVEL-FORM 0) ; (TOP-LEVEL-FORM 1) ; ELEPHANT-UTILS:WITH-GENSYMS ; ELEPHANT-UTILS:DO-SUBSETS ; ELEPHANT-UTILS:SUBSETS ; ELEPHANT-UTILS:REMOVE-KEYWORDS ; ELEPHANT-UTILS::CONCAT-SEPARATED-STRINGS ; ELEPHANT-UTILS::APPEND-SUBLISTS ; ELEPHANT-UTILS:IFRET ; ELEPHANT-UTILS:AIF ; ELEPHANT-UTILS:AWHEN ; ELEPHANT-UTILS:MKLIST ; ELEPHANT-UTILS:REMOVE-INDEXED-ELEMENT-AND-ADJUST ; (TOP-LEVEL-FORM 0) ; Loading fasl file /Users/jensteich/Lisp/elephant/src/utils/ convenience.xfasl ;;; Compiling file /Users/jensteich/Lisp/elephant/src/utils/ locks.lisp ... ;;; Safety = 3, Speed = 1, Space = 1, Float = 1, Interruptible = 0 ;;; Compilation speed = 1, Debug = 2, Fixnum safety = 3 ;;; Source level debugging is on ;;; Source file recording is on ;;; Cross referencing is on ; (TOP-LEVEL-FORM 0) ; (TOP-LEVEL-FORM 1) ; ELEPHANT-UTILS:ELE-MAKE-LOCK ; ELEPHANT-UTILS:ELE-WITH-LOCK ; ELEPHANT-UTILS:ELE-MAKE-FAST-LOCK ; ELEPHANT-UTILS:ELE-WITH-FAST-LOCK ; ELEPHANT-UTILS:ELE-THREAD-HASH-KEY ; (TOP-LEVEL-FORM 0) ; Loading fasl file /Users/jensteich/Lisp/elephant/src/utils/locks.xfasl ;;; Compiling file /Users/jensteich/Lisp/elephant/src/utils/os.lisp ... ;;; Safety = 3, Speed = 1, Space = 1, Float = 1, Interruptible = 0 ;;; Compilation speed = 1, Debug = 2, Fixnum safety = 3 ;;; Source level debugging is on ;;; Source file recording is on ;;; Cross referencing is on ; (TOP-LEVEL-FORM 0) ; (TOP-LEVEL-FORM 1) ; ELEPHANT-UTILS::IN-DIRECTORY ; ELEPHANT-UTILS:LAUNCH-BACKGROUND-PROGRAM ;;;*** Warning in ELEPHANT-UTILS:KILL-BACKGROUND-PROGRAM: PROCESS- HANDLE is bound but not referenced ; ELEPHANT-UTILS:KILL-BACKGROUND-PROGRAM ; (TOP-LEVEL-FORM 0) Warning: COMPILE-FILE warned while performing # on #. ; Loading fasl file /Users/jensteich/Lisp/elephant/src/utils/os.xfasl ; $ gcc -bundle -fPIC -Wall -O2 -g /Users/jensteich/Lisp/elephant/src/ memutil/libmemutil.c -o /Users/jensteich/Lisp/elephant/src/memutil/ libmemutil.dylib -lm ; gcc -bundle -fPIC -Wall -O2 -g /Users/jensteich/Lisp/elephant/src/ memutil/libmemutil.c -o /Users/jensteich/Lisp/elephant/src/memutil/ libmemutil.dylib -lm Attempting to load libmemutil.dylib... Loaded /Users/jensteich/Lisp/elephant/src/memutil/libmemutil.dylib ;;; Compiling file /Users/jensteich/Lisp/elephant/src/memutil/ memutil.lisp ... ;;; Safety = 3, Speed = 1, Space = 1, Float = 1, Interruptible = 0 ;;; Compilation speed = 1, Debug = 2, Fixnum safety = 3 ;;; Source level debugging is on ;;; Source file recording is on ;;; Cross referencing is on ; (TOP-LEVEL-FORM 0) ; (DEFPACKAGE "ELEPHANT-MEMUTIL") ; (TOP-LEVEL-FORM 2) ;;;*** Warning in (DEFTYPE ELEPHANT-MEMUTIL:POINTER-INT): (DEFTYPE ELEPHANT-MEMUTIL:POINTER-INT) defined more than once in /Users/ jensteich/Lisp/elephant/src/memutil/memutil.lisp. ; (DEFTYPE ELEPHANT-MEMUTIL:POINTER-INT) ;;;*** Warning in (DEFTYPE ELEPHANT-MEMUTIL:POINTER-VOID): (DEFTYPE ELEPHANT-MEMUTIL:POINTER-VOID) defined more than once in /Users/ jensteich/Lisp/elephant/src/memutil/memutil.lisp. ; (DEFTYPE ELEPHANT-MEMUTIL:POINTER-VOID) ; (FLI:DEFINE-FOREIGN-TYPE ELEPHANT-MEMUTIL:ARRAY-OR-POINTER-CHAR) ;;;*** Warning in (DEFTYPE ELEPHANT-MEMUTIL:ARRAY-OR-POINTER-CHAR): (DEFTYPE ELEPHANT-MEMUTIL:ARRAY-OR-POINTER-CHAR) defined more than once in /Users/jensteich/Lisp/elephant/src/memutil/memutil.lisp. ; (DEFTYPE ELEPHANT-MEMUTIL:ARRAY-OR-POINTER-CHAR) ; (SUBFUNCTION ELEPHANT-MEMUTIL::COPY-BUFS (FLI:DEFINE-FOREIGN-FUNCTION ELEPHANT-MEMUTIL::COPY-BUFS)) ; (FLI:DEFINE-FOREIGN-FUNCTION ELEPHANT-MEMUTIL::COPY-BUFS) ; (FLI:DEFINE-FOREIGN-FUNCTION ELEPHANT-MEMUTIL::COPY-BUFS) ; (DEFVAR ELEPHANT-MEMUTIL:+NULL-VOID+) ; (DEFVAR ELEPHANT-MEMUTIL:+NULL-CHAR+) ; (DEFVAR ELEPHANT-MEMUTIL::*BUFFER-STREAMS*) ; (DEFVAR ELEPHANT-MEMUTIL::*BUFFER-STREAMS-LOCK*) ; (SUBFUNCTION (DEFSETF ELEPHANT-MEMUTIL:BUFFER-STREAM-LENGTH) (DEFSTRUCT ELEPHANT-MEMUTIL:BUFFER-STREAM)) ; (SUBFUNCTION (DEFSETF ELEPHANT-MEMUTIL::BUFFER-STREAM-POSITION) (DEFSTRUCT ELEPHANT-MEMUTIL:BUFFER-STREAM)) ; (SUBFUNCTION (DEFSETF ELEPHANT-MEMUTIL:BUFFER-STREAM-SIZE) (DEFSTRUCT ELEPHANT-MEMUTIL:BUFFER-STREAM)) ; (SUBFUNCTION (DEFSETF ELEPHANT-MEMUTIL:BUFFER-STREAM-BUFFER) (DEFSTRUCT ELEPHANT-MEMUTIL:BUFFER-STREAM)) ; (SUBFUNCTION ELEPHANT-MEMUTIL:MAKE-BUFFER-STREAM (DEFSTRUCT ELEPHANT-MEMUTIL:BUFFER-STREAM)) ; ELEPHANT-MEMUTIL::GRAB-BUFFER-STREAM ;;;*** Warning in ELEPHANT-MEMUTIL::RETURN-BUFFER-STREAM: Inline expansion for ELEPHANT-MEMUTIL:RESET-BUFFER-STREAM not found ;;;*** Warning in ELEPHANT-MEMUTIL::RETURN-BUFFER-STREAM: Inline expansion for ELEPHANT-MEMUTIL:RESET-BUFFER-STREAM not found ; ELEPHANT-MEMUTIL::RETURN-BUFFER-STREAM ; ELEPHANT-MEMUTIL:WITH-BUFFER-STREAMS ; (SUBFUNCTION ELEPHANT-MEMUTIL::READ-INT32 (FLI:DEFINE-FOREIGN-FUNCTION ELEPHANT-MEMUTIL::READ-INT32)) ; (FLI:DEFINE-FOREIGN-FUNCTION ELEPHANT-MEMUTIL::READ-INT32) ; (FLI:DEFINE-FOREIGN-FUNCTION ELEPHANT-MEMUTIL::READ-INT32) ; (SUBFUNCTION ELEPHANT-MEMUTIL::READ-UINT32 (FLI:DEFINE-FOREIGN-FUNCTION ELEPHANT-MEMUTIL::READ-UINT32)) ; (FLI:DEFINE-FOREIGN-FUNCTION ELEPHANT-MEMUTIL::READ-UINT32) ; (FLI:DEFINE-FOREIGN-FUNCTION ELEPHANT-MEMUTIL::READ-UINT32) ; (SUBFUNCTION ELEPHANT-MEMUTIL::READ-INT64 (FLI:DEFINE-FOREIGN-FUNCTION ELEPHANT-MEMUTIL::READ-INT64)) ; (FLI:DEFINE-FOREIGN-FUNCTION ELEPHANT-MEMUTIL::READ-INT64) ; (FLI:DEFINE-FOREIGN-FUNCTION ELEPHANT-MEMUTIL::READ-INT64) ; (SUBFUNCTION ELEPHANT-MEMUTIL::READ-UINT64 (FLI:DEFINE-FOREIGN-FUNCTION ELEPHANT-MEMUTIL::READ-UINT64)) ; (FLI:DEFINE-FOREIGN-FUNCTION ELEPHANT-MEMUTIL::READ-UINT64) ; (FLI:DEFINE-FOREIGN-FUNCTION ELEPHANT-MEMUTIL::READ-UINT64) ; (SUBFUNCTION ELEPHANT-MEMUTIL::READ-FLOAT (FLI:DEFINE-FOREIGN-FUNCTION ELEPHANT-MEMUTIL::READ-FLOAT)) ; (SUBFUNCTION ELEPHANT-MEMUTIL::READ-FLOAT (FLI:DEFINE-FOREIGN-FUNCTION ELEPHANT-MEMUTIL::READ-FLOAT)) ; (FLI:DEFINE-FOREIGN-FUNCTION ELEPHANT-MEMUTIL::READ-FLOAT) ; (FLI:DEFINE-FOREIGN-FUNCTION ELEPHANT-MEMUTIL::READ-FLOAT) ; (SUBFUNCTION ELEPHANT-MEMUTIL::READ-DOUBLE (FLI:DEFINE-FOREIGN-FUNCTION ELEPHANT-MEMUTIL::READ-DOUBLE)) ; (SUBFUNCTION ELEPHANT-MEMUTIL::READ-DOUBLE (FLI:DEFINE-FOREIGN-FUNCTION ELEPHANT-MEMUTIL::READ-DOUBLE)) ; (FLI:DEFINE-FOREIGN-FUNCTION ELEPHANT-MEMUTIL::READ-DOUBLE) ; (FLI:DEFINE-FOREIGN-FUNCTION ELEPHANT-MEMUTIL::READ-DOUBLE) ; (SUBFUNCTION ELEPHANT-MEMUTIL::WRITE-INT32 (FLI:DEFINE-FOREIGN-FUNCTION ELEPHANT-MEMUTIL::WRITE-INT32)) ; (FLI:DEFINE-FOREIGN-FUNCTION ELEPHANT-MEMUTIL::WRITE-INT32) ; (FLI:DEFINE-FOREIGN-FUNCTION ELEPHANT-MEMUTIL::WRITE-INT32) ; (SUBFUNCTION ELEPHANT-MEMUTIL::WRITE-UINT32 (FLI:DEFINE-FOREIGN-FUNCTION ELEPHANT-MEMUTIL::WRITE-UINT32)) ; (FLI:DEFINE-FOREIGN-FUNCTION ELEPHANT-MEMUTIL::WRITE-UINT32) ; (FLI:DEFINE-FOREIGN-FUNCTION ELEPHANT-MEMUTIL::WRITE-UINT32) ; (SUBFUNCTION ELEPHANT-MEMUTIL::WRITE-INT64 (FLI:DEFINE-FOREIGN-FUNCTION ELEPHANT-MEMUTIL::WRITE-INT64)) ; (FLI:DEFINE-FOREIGN-FUNCTION ELEPHANT-MEMUTIL::WRITE-INT64) ; (FLI:DEFINE-FOREIGN-FUNCTION ELEPHANT-MEMUTIL::WRITE-INT64) ; (SUBFUNCTION ELEPHANT-MEMUTIL::WRITE-UINT64 (FLI:DEFINE-FOREIGN-FUNCTION ELEPHANT-MEMUTIL::WRITE-UINT64)) ; (FLI:DEFINE-FOREIGN-FUNCTION ELEPHANT-MEMUTIL::WRITE-UINT64) ; (FLI:DEFINE-FOREIGN-FUNCTION ELEPHANT-MEMUTIL::WRITE-UINT64) ; (SUBFUNCTION ELEPHANT-MEMUTIL::WRITE-FLOAT (FLI:DEFINE-FOREIGN-FUNCTION ELEPHANT-MEMUTIL::WRITE-FLOAT)) ; (SUBFUNCTION ELEPHANT-MEMUTIL::WRITE-FLOAT (FLI:DEFINE-FOREIGN-FUNCTION ELEPHANT-MEMUTIL::WRITE-FLOAT)) ; (FLI:DEFINE-FOREIGN-FUNCTION ELEPHANT-MEMUTIL::WRITE-FLOAT) ; (FLI:DEFINE-FOREIGN-FUNCTION ELEPHANT-MEMUTIL::WRITE-FLOAT) ; (SUBFUNCTION ELEPHANT-MEMUTIL::WRITE-DOUBLE (FLI:DEFINE-FOREIGN-FUNCTION ELEPHANT-MEMUTIL::WRITE-DOUBLE)) ; (SUBFUNCTION ELEPHANT-MEMUTIL::WRITE-DOUBLE (FLI:DEFINE-FOREIGN-FUNCTION ELEPHANT-MEMUTIL::WRITE-DOUBLE)) ; (FLI:DEFINE-FOREIGN-FUNCTION ELEPHANT-MEMUTIL::WRITE-DOUBLE) ; (FLI:DEFINE-FOREIGN-FUNCTION ELEPHANT-MEMUTIL::WRITE-DOUBLE) ; (SUBFUNCTION ELEPHANT-MEMUTIL::OFFSET-CHAR-POINTER (FLI:DEFINE-FOREIGN-FUNCTION ELEPHANT-MEMUTIL::OFFSET-CHAR-POINTER)) ; (SUBFUNCTION ELEPHANT-MEMUTIL::OFFSET-CHAR-POINTER (FLI:DEFINE-FOREIGN-FUNCTION ELEPHANT-MEMUTIL::OFFSET-CHAR-POINTER)) ; (FLI:DEFINE-FOREIGN-FUNCTION ELEPHANT-MEMUTIL::OFFSET-CHAR-POINTER) ; (FLI:DEFINE-FOREIGN-FUNCTION ELEPHANT-MEMUTIL::OFFSET-CHAR-POINTER) ; ELEPHANT-MEMUTIL:BYTE-LENGTH ; (SUBFUNCTION ELEPHANT-MEMUTIL::COPY-STR-TO-BUF (FLI:DEFINE-FOREIGN-FUNCTION ELEPHANT-MEMUTIL::COPY-STR-TO-BUF)) ; (SUBFUNCTION ELEPHANT-MEMUTIL::COPY-STR-TO-BUF (FLI:DEFINE-FOREIGN-FUNCTION ELEPHANT-MEMUTIL::COPY-STR-TO-BUF)) ; (FLI:DEFINE-FOREIGN-FUNCTION ELEPHANT-MEMUTIL::COPY-STR-TO-BUF) ; (FLI:DEFINE-FOREIGN-FUNCTION ELEPHANT-MEMUTIL::COPY-STR-TO-BUF) ; ELEPHANT-MEMUTIL::PROCESS-STRUCT-SLOT-DEFS ; ELEPHANT-MEMUTIL::WITH-STRUCT-SLOTS ;;;*** Warning in ELEPHANT-MEMUTIL:RESIZE-BUFFER-STREAM: Inline expansion for ELEPHANT-MEMUTIL::COPY-BUFS not found ;;;*** Warning in ELEPHANT-MEMUTIL:RESIZE-BUFFER-STREAM: Inline expansion for ELEPHANT-MEMUTIL::COPY-BUFS not found ;;;*** Warning in ELEPHANT-MEMUTIL:RESIZE-BUFFER-STREAM: Inline expansion for ELEPHANT-MEMUTIL::COPY-BUFS not found ; ELEPHANT-MEMUTIL:RESIZE-BUFFER-STREAM ;;;*** Warning in ELEPHANT-MEMUTIL:RESIZE-BUFFER-STREAM-NO-COPY: symbol-macro SIZE is bound but not referenced ; ELEPHANT-MEMUTIL:RESIZE-BUFFER-STREAM-NO-COPY ; ELEPHANT-MEMUTIL:RESET-BUFFER-STREAM ; ELEPHANT-MEMUTIL:RESET-BUFFER-STREAM ; ELEPHANT-MEMUTIL:BUFFER-WRITE-BYTE ; ELEPHANT-MEMUTIL:BUFFER-WRITE-BYTE ; ELEPHANT-MEMUTIL:BUFFER-WRITE-INT32 ; ELEPHANT-MEMUTIL:BUFFER-WRITE-INT32 ; ELEPHANT-MEMUTIL:BUFFER-WRITE-UINT32 ; ELEPHANT-MEMUTIL:BUFFER-WRITE-UINT32 ; ELEPHANT-MEMUTIL:BUFFER-WRITE-INT64 ; ELEPHANT-MEMUTIL:BUFFER-WRITE-INT64 ; ELEPHANT-MEMUTIL:BUFFER-WRITE-UINT64 ; ELEPHANT-MEMUTIL:BUFFER-WRITE-UINT64 ; ELEPHANT-MEMUTIL:BUFFER-WRITE-FLOAT ; ELEPHANT-MEMUTIL:BUFFER-WRITE-FLOAT ; ELEPHANT-MEMUTIL:BUFFER-WRITE-DOUBLE ; ELEPHANT-MEMUTIL:BUFFER-WRITE-DOUBLE ; ELEPHANT-MEMUTIL:BUFFER-WRITE-STRING ; ELEPHANT-MEMUTIL:BUFFER-WRITE-STRING ; ELEPHANT-MEMUTIL:BUFFER-READ-BYTE ; ELEPHANT-MEMUTIL:BUFFER-READ-BYTE ; ELEPHANT-MEMUTIL::BUFFER-READ-BYTE-VECTOR ; ELEPHANT-MEMUTIL::BUFFER-WRITE-BYTE-VECTOR ; ELEPHANT-MEMUTIL:BUFFER-READ-TO-ARRAY-OFFSET ; ELEPHANT-MEMUTIL:BUFFER-WRITE-FROM-ARRAY-OFFSET ; ELEPHANT-MEMUTIL:BUFFER-WRITE-OID ; ELEPHANT-MEMUTIL:BUFFER-WRITE-OID ; ELEPHANT-MEMUTIL:BUFFER-READ-OID ; ELEPHANT-MEMUTIL:BUFFER-READ-OID ;;;*** Warning in ELEPHANT-MEMUTIL:BUFFER-READ-INT: Inline expansion for ELEPHANT-MEMUTIL:BUFFER-READ-INT32 not found ;;;*** Warning in ELEPHANT-MEMUTIL:BUFFER-READ-INT: Inline expansion for ELEPHANT-MEMUTIL:BUFFER-READ-INT32 not found ; ELEPHANT-MEMUTIL:BUFFER-READ-INT ; ELEPHANT-MEMUTIL:BUFFER-READ-FIXNUM ; ELEPHANT-MEMUTIL:BUFFER-READ-FIXNUM ; ELEPHANT-MEMUTIL:BUFFER-WRITE-INT ;;;*** Warning in ELEPHANT-MEMUTIL:BUFFER-READ-UINT: Inline expansion for ELEPHANT-MEMUTIL:BUFFER-READ-UINT32 not found ;;;*** Warning in ELEPHANT-MEMUTIL:BUFFER-READ-UINT: Inline expansion for ELEPHANT-MEMUTIL:BUFFER-READ-UINT32 not found ; ELEPHANT-MEMUTIL:BUFFER-READ-UINT ; ELEPHANT-MEMUTIL:BUFFER-WRITE-UINT ; (DEFCONSTANT ELEPHANT-MEMUTIL::+2^32+) ; (DEFCONSTANT ELEPHANT-MEMUTIL::+2^64+) ; ELEPHANT-MEMUTIL:BUFFER-READ-FIXNUM32 ; ELEPHANT-MEMUTIL:BUFFER-READ-INT32 ; ELEPHANT-MEMUTIL:BUFFER-READ-INT32 ; ELEPHANT-MEMUTIL:BUFFER-READ-UINT32 ; ELEPHANT-MEMUTIL:BUFFER-READ-UINT32 ; ELEPHANT-MEMUTIL:BUFFER-READ-FIXNUM64 ; ELEPHANT-MEMUTIL:BUFFER-READ-INT64 ; ELEPHANT-MEMUTIL:BUFFER-READ-INT64 ; ELEPHANT-MEMUTIL:BUFFER-READ-UINT64 ; ELEPHANT-MEMUTIL:BUFFER-READ-UINT64 ; ELEPHANT-MEMUTIL:BUFFER-READ-FLOAT ; ELEPHANT-MEMUTIL:BUFFER-READ-FLOAT ; ELEPHANT-MEMUTIL:BUFFER-READ-DOUBLE ; ELEPHANT-MEMUTIL:BUFFER-READ-DOUBLE ; ELEPHANT-MEMUTIL:BUFFER-READ-UCS1-STRING ; ELEPHANT-MEMUTIL:BUFFER-READ-UCS1-STRING ; ELEPHANT-MEMUTIL:BUFFER-READ-UCS2-STRING ; ELEPHANT-MEMUTIL:BUFFER-READ-UCS2-STRING ; (DEFPARAMETER ELEPHANT-MEMUTIL::+LITTLE-ENDIAN+) ; ELEPHANT-MEMUTIL:LITTLE-ENDIAN-P ; (TOP-LEVEL-FORM 0) Warning: COMPILE-FILE warned while performing # on #. Warning: COMPILE-FILE failed while performing # on #. ; Loading fasl file /Users/jensteich/Lisp/elephant/src/memutil/ memutil.xfasl ;;; Compiling file /Users/jensteich/Lisp/elephant/src/elephant/ package.lisp ... ;;; Safety = 3, Speed = 1, Space = 1, Float = 1, Interruptible = 0 ;;; Compilation speed = 1, Debug = 2, Fixnum safety = 3 ;;; Source level debugging is on ;;; Source file recording is on ;;; Cross referencing is on ; (TOP-LEVEL-FORM 0) ; (TOP-LEVEL-FORM 1) ; (DEFPACKAGE "ELEPHANT") ; (TOP-LEVEL-FORM 3) ; (DEFPACKAGE "ELEPHANT-USER") ; (TOP-LEVEL-FORM 0) ; Loading fasl file /Users/jensteich/Lisp/elephant/src/elephant/ package.xfasl ;;; Compiling file /Users/jensteich/Lisp/elephant/src/elephant/ variables.lisp ... ;;; Safety = 3, Speed = 1, Space = 1, Float = 1, Interruptible = 0 ;;; Compilation speed = 1, Debug = 2, Fixnum safety = 3 ;;; Source level debugging is on ;;; Source file recording is on ;;; Cross referencing is on ; (TOP-LEVEL-FORM 0) ; (TOP-LEVEL-FORM 1) ; (DEFVAR ELEPHANT::*ELEPHANT-CODE-VERSION*) ; (DEFVAR ELEPHANT::*ELEPHANT-UNMARKED-CODE-VERSION*) ; (DEFVAR ELEPHANT::*ELEPHANT-PROPERTIES-LABEL*) ; (DEFVAR ELEPHANT::*USER-CONFIGURABLE-PARAMETERS*) ; (DEFVAR ELEPHANT::*CIRCULARITY-INITIAL-HASH-SIZE*) ; (DEFPARAMETER ELEPHANT::*MAP-USING-DEGREE2*) ; (DEFVAR ELEPHANT::*BERKELEY-DB-CACHESIZE*) ; (DEFVAR ELEPHANT:*STORE-CONTROLLER*) ; (DEFVAR ELEPHANT::*CURRENT-TRANSACTION*) ; (DEFVAR ELEPHANT::*WARN-ON-MANUAL-CLASS-FINALIZATION*) ; (TOP-LEVEL-FORM 12) ; (TOP-LEVEL-FORM 0) ; Loading fasl file /Users/jensteich/Lisp/elephant/src/elephant/ variables.xfasl ;;; Compiling file /Users/jensteich/Lisp/elephant/src/elephant/ transactions.lisp ... ;;; Safety = 3, Speed = 1, Space = 1, Float = 1, Interruptible = 0 ;;; Compilation speed = 1, Debug = 2, Fixnum safety = 3 ;;; Source level debugging is on ;;; Source file recording is on ;;; Cross referencing is on ; (TOP-LEVEL-FORM 0) ; (TOP-LEVEL-FORM 1) ; (DEFGENERIC ELEPHANT::EXECUTE-TRANSACTION) ; ELEPHANT::MAKE-TRANSACTION-RECORD ; ELEPHANT::TRANSACTION-STORE ; ELEPHANT::TRANSACTION-OBJECT ; ELEPHANT::TRANSACTION-OBJECT-P ; ELEPHANT::OWNED-TXN-P ; (SUBFUNCTION (DEFCLASS ELEPHANT::TRANSACTION-RETRY-COUNT-EXCEEDED) (DEFINE-CONDITION ELEPHANT::TRANSACTION-RETRY-COUNT-EXCEEDED)) ; (DEFINE-CONDITION ELEPHANT::TRANSACTION-RETRY-COUNT-EXCEEDED) ; ELEPHANT:WITH-TRANSACTION ; ELEPHANT:ENSURE-TRANSACTION ; ELEPHANT::WITH-BATCH-TRANSACTION ; (DEFGENERIC ELEPHANT:CONTROLLER-START-TRANSACTION) ; (DEFGENERIC ELEPHANT:CONTROLLER-COMMIT-TRANSACTION) ; (DEFGENERIC ELEPHANT:CONTROLLER-ABORT-TRANSACTION) ; (TOP-LEVEL-FORM 0) ; Loading fasl file /Users/jensteich/Lisp/elephant/src/elephant/ transactions.xfasl ;;; Compiling file /Users/jensteich/Lisp/elephant/src/elephant/ metaclasses.lisp ... ;;; Safety = 3, Speed = 1, Space = 1, Float = 1, Interruptible = 0 ;;; Compilation speed = 1, Debug = 2, Fixnum safety = 3 ;;; Source level debugging is on ;;; Source file recording is on ;;; Cross referencing is on ; (TOP-LEVEL-FORM 0) ; (TOP-LEVEL-FORM 1) ; (DEFCLASS ELEPHANT:PERSISTENT) ; (METHOD PRINT-OBJECT (ELEPHANT:PERSISTENT T)) ; (DEFCLASS ELEPHANT:PERSISTENT-METACLASS) ; ELEPHANT:DEFPCLASS ; ELEPHANT::ADD-PERSISTENT-METACLASS-ARGUMENT ; (METHOD ELEPHANT::PERSISTENT-SLOTS (STANDARD-CLASS)) ; (METHOD ELEPHANT::PERSISTENT-SLOTS (ELEPHANT:PERSISTENT-METACLASS)) ; (METHOD ELEPHANT::OLD-PERSISTENT-SLOTS (ELEPHANT:PERSISTENT- METACLASS)) ; (METHOD ELEPHANT::UPDATE-PERSISTENT-SLOTS (ELEPHANT:PERSISTENT- METACLASS T)) ; (DEFCLASS ELEPHANT::PERSISTENT-SLOT-DEFINITION) ; (DEFCLASS ELEPHANT::PERSISTENT-DIRECT-SLOT-DEFINITION) ; (DEFCLASS ELEPHANT::PERSISTENT-EFFECTIVE-SLOT-DEFINITION) ; (DEFCLASS ELEPHANT::TRANSIENT-SLOT-DEFINITION) ; (DEFCLASS ELEPHANT::TRANSIENT-DIRECT-SLOT-DEFINITION) ; (DEFCLASS ELEPHANT::TRANSIENT-EFFECTIVE-SLOT-DEFINITION) ; (DEFGENERIC ELEPHANT::TRANSIENT) ; (DEFCLASS ELEPHANT::INDEXING-RECORD) ; (METHOD PRINT-OBJECT (ELEPHANT::INDEXING-RECORD T)) ; (METHOD ELEPHANT::INDEXED-RECORD (STANDARD-CLASS)) ; (METHOD ELEPHANT::INDEXED-RECORD (ELEPHANT:PERSISTENT-METACLASS)) ; (METHOD ELEPHANT::OLD-INDEXED-RECORD (ELEPHANT:PERSISTENT-METACLASS)) ; (METHOD ELEPHANT::UPDATE-INDEXED-RECORD (ELEPHANT:PERSISTENT- METACLASS T)) ; (METHOD ELEPHANT::MAKE-NEW-INDEXED-RECORD (T T T)) ; (METHOD ELEPHANT::REMOVED-INDEXING? (ELEPHANT:PERSISTENT-METACLASS)) ; ELEPHANT::INDEXED-SLOT-NAMES-FROM-DEFS ; (METHOD ELEPHANT::REGISTER-INDEXED-SLOT (ELEPHANT:PERSISTENT- METACLASS T)) ; (METHOD ELEPHANT::UNREGISTER-INDEXED-SLOT (T T)) ; (METHOD ELEPHANT::REGISTER-DERIVED-INDEX (T T)) ; (METHOD ELEPHANT::UNREGISTER-DERIVED-INDEX (T T)) ; (METHOD ELEPHANT::INDEXED (ELEPHANT:PERSISTENT-METACLASS)) ; (METHOD ELEPHANT::PREVIOUSLY-INDEXED (ELEPHANT:PERSISTENT-METACLASS)) ; (METHOD ELEPHANT::INDEXED (STANDARD-SLOT-DEFINITION)) ; (METHOD ELEPHANT::INDEXED (STANDARD-CLASS)) ; (DEFVAR ELEPHANT::*INHIBIT-INDEXING-LIST*) ; ELEPHANT::INHIBIT-INDEXING ; ELEPHANT::UNINHIBIT-INDEXING ; (METHOD SLOT-DEFINITION-ALLOCATION (ELEPHANT::PERSISTENT-SLOT- DEFINITION)) ; (METHOD (SETF SLOT-DEFINITION-ALLOCATION) (T ELEPHANT::PERSISTENT- SLOT-DEFINITION)) ; (METHOD CLOS:DIRECT-SLOT-DEFINITION-CLASS (ELEPHANT:PERSISTENT- METACLASS)) ; (METHOD VALIDATE-SUPERCLASS (ELEPHANT:PERSISTENT-METACLASS STANDARD- CLASS)) ; (METHOD VALIDATE-SUPERCLASS (STANDARD-CLASS ELEPHANT:PERSISTENT- METACLASS)) ; (DEFGENERIC ELEPHANT::PERSISTENT-P) ; (METHOD CLOS:EFFECTIVE-SLOT-DEFINITION-CLASS (ELEPHANT:PERSISTENT- METACLASS)) ; ELEPHANT::ENSURE-TRANSIENT-CHAIN ; (METHOD CLOS::COMPUTE-EFFECTIVE-SLOT-DEFINITION-INITARGS (ELEPHANT:PERSISTENT-METACLASS T T)) ; ELEPHANT::FIND-SLOT-DEF-BY-NAME ; ELEPHANT::PERSISTENT-SLOT-DEFS ; ELEPHANT::TRANSIENT-SLOT-DEFS ; ELEPHANT::PERSISTENT-SLOT-NAMES ; ELEPHANT::TRANSIENT-SLOT-NAMES ; (TOP-LEVEL-FORM 0) ; Loading fasl file /Users/jensteich/Lisp/elephant/src/elephant/ metaclasses.xfasl ;;; Compiling file /Users/jensteich/Lisp/elephant/src/elephant/ classes.lisp ... ;;; Safety = 3, Speed = 1, Space = 1, Float = 1, Interruptible = 0 ;;; Compilation speed = 1, Debug = 2, Fixnum safety = 3 ;;; Source level debugging is on ;;; Source file recording is on ;;; Cross referencing is on ; (TOP-LEVEL-FORM 0) ; (TOP-LEVEL-FORM 1) ; (DEFVAR ELEPHANT::*DEBUG-SI*) ; (METHOD INITIALIZE-INSTANCE :BEFORE (ELEPHANT:PERSISTENT)) ; (DEFCLASS ELEPHANT:PERSISTENT-OBJECT) ; (METHOD SHARED-INITIALIZE :AROUND (ELEPHANT:PERSISTENT-METACLASS T)) ; (METHOD CLOS:FINALIZE-INHERITANCE :AROUND (ELEPHANT:PERSISTENT- METACLASS)) ; (METHOD REINITIALIZE-INSTANCE :AROUND (ELEPHANT:PERSISTENT-METACLASS)) ; (METHOD SHARED-INITIALIZE :AROUND (ELEPHANT:PERSISTENT-OBJECT T)) ; ELEPHANT::INITIALIZE-PERSISTENT-SLOTS ; (METHOD UPDATE-INSTANCE-FOR-REDEFINED-CLASS :AROUND (ELEPHANT:PERSISTENT-OBJECT T T T)) ; (METHOD CHANGE-CLASS :AROUND (ELEPHANT:PERSISTENT STANDARD-CLASS)) ; (METHOD CHANGE-CLASS :AROUND (STANDARD-OBJECT ELEPHANT:PERSISTENT- METACLASS)) ; (METHOD UPDATE-INSTANCE-FOR-DIFFERENT-CLASS :AROUND (ELEPHANT:PERSISTENT ELEPHANT:PERSISTENT)) ; (METHOD CLOS:SLOT-VALUE-USING-CLASS (ELEPHANT:PERSISTENT-METACLASS ELEPHANT:PERSISTENT-OBJECT ELEPHANT::PERSISTENT-SLOT-DEFINITION)) ; (METHOD (SETF CLOS:SLOT-VALUE-USING-CLASS) (T ELEPHANT:PERSISTENT-METACLASS ELEPHANT:PERSISTENT-OBJECT ELEPHANT::PERSISTENT-SLOT-DEFINITION)) ; (METHOD CLOS:SLOT-BOUNDP-USING-CLASS (ELEPHANT:PERSISTENT-METACLASS ELEPHANT:PERSISTENT-OBJECT ELEPHANT::PERSISTENT-SLOT-DEFINITION)) ; (METHOD CLOS:SLOT-BOUNDP-USING-CLASS (ELEPHANT:PERSISTENT-METACLASS ELEPHANT:PERSISTENT-OBJECT SYMBOL)) ; (METHOD CLOS:SLOT-MAKUNBOUND-USING-CLASS (ELEPHANT:PERSISTENT-METACLASS ELEPHANT:PERSISTENT-OBJECT ELEPHANT::PERSISTENT-SLOT-DEFINITION)) ; ELEPHANT::VALID-PERSISTENT-REFERENCE-P ; (SUBFUNCTION (DEFCLASS ELEPHANT:CROSS-REFERENCE-ERROR) (DEFINE-CONDITION ELEPHANT:CROSS-REFERENCE-ERROR)) ; (DEFINE-CONDITION ELEPHANT:CROSS-REFERENCE-ERROR) ; (DEFINE-CONDITION ELEPHANT:CROSS-REFERENCE-ERROR) ; ELEPHANT::SIGNAL-CROSS-REFERENCE-ERROR ; (METHOD CLOS:SLOT-VALUE-USING-CLASS (ELEPHANT:PERSISTENT-METACLASS ELEPHANT:PERSISTENT-OBJECT T)) ; (METHOD (SETF CLOS:SLOT-VALUE-USING-CLASS) (T ELEPHANT:PERSISTENT-METACLASS ELEPHANT:PERSISTENT-OBJECT T)) ; (METHOD CLOS:SLOT-MAKUNBOUND-USING-CLASS (ELEPHANT:PERSISTENT-METACLASS ELEPHANT:PERSISTENT-OBJECT T)) ; (TOP-LEVEL-FORM 0) ; Loading fasl file /Users/jensteich/Lisp/elephant/src/elephant/ classes.xfasl ;;; Compiling file /Users/jensteich/Lisp/elephant/src/elephant/ cache.lisp ... ;;; Safety = 3, Speed = 1, Space = 1, Float = 1, Interruptible = 0 ;;; Compilation speed = 1, Debug = 2, Fixnum safety = 3 ;;; Source level debugging is on ;;; Source file recording is on ;;; Cross referencing is on ; (TOP-LEVEL-FORM 0) ; (TOP-LEVEL-FORM 1) ; ELEPHANT::MAKE-CACHE-TABLE ; ELEPHANT::GET-CACHE ;;;*** Warning in ELEPHANT::MAKE-FINALIZER: KEY is bound but not referenced ;;;*** Warning in ELEPHANT::MAKE-FINALIZER: CACHE is bound but not referenced ; ELEPHANT::MAKE-FINALIZER ; ELEPHANT::SETF-CACHE ; (DEFSETF ELEPHANT::GET-CACHE) ; (TOP-LEVEL-FORM 0) Warning: COMPILE-FILE warned while performing # on #. ; Loading fasl file /Users/jensteich/Lisp/elephant/src/elephant/ cache.xfasl ;;; Compiling file /Users/jensteich/Lisp/elephant/src/elephant/ serializer.lisp ... ;;; Safety = 3, Speed = 1, Space = 1, Float = 1, Interruptible = 0 ;;; Compilation speed = 1, Debug = 2, Fixnum safety = 3 ;;; Source level debugging is on ;;; Source file recording is on ;;; Cross referencing is on ; (TOP-LEVEL-FORM 0) ; (TOP-LEVEL-FORM 1) ; ELEPHANT::SERIALIZE ; ELEPHANT::DESERIALIZE ; (DEFGENERIC ELEPHANT:STRUCT-CONSTRUCTOR) ; (METHOD ELEPHANT:STRUCT-CONSTRUCTOR (T)) ; ELEPHANT::SERIALIZE-TO-BASE64-STRING ; ELEPHANT::CONVERT-BUFFER-TO-BASE64-STRING ; ELEPHANT::DESERIALIZE-FROM-BASE64-STRING ; ELEPHANT::CONVERT-BUFFER-FROM-BASE64-STRING ; (DEFCONSTANT ELEPHANT::+RESERVED-DBINFO+) ; (DEFCONSTANT ELEPHANT::+ELEPHANT-VERSION+) ; (DEFCONSTANT ELEPHANT::+ELEPHANT-SERIALIZER-VERSION+) ; ELEPHANT::SERIALIZE-DATABASE-VERSION-KEY ; ELEPHANT::SERIALIZE-DATABASE-VERSION-VALUE ; ELEPHANT::DESERIALIZE-DATABASE-VERSION-VALUE ; ELEPHANT::SERIALIZE-DATABASE-SERIALIZER-VERSION-KEY ; ELEPHANT::SERIALIZE-DATABASE-SERIALIZER-VERSION-VALUE ; ELEPHANT::DESERIALIZE-DATABASE-SERIALIZER-VERSION-VALUE ; ELEPHANT::SERIALIZE-RESERVED-TAG ; ELEPHANT::SERIALIZE-SYSTEM-TAG ; ELEPHANT::SERIALIZE-SYSTEM-INTEGER ; ELEPHANT::DESERIALIZE-SYSTEM-INTEGER ; ELEPHANT::SLOTS-AND-VALUES ; ELEPHANT::STRUCT-SLOTS-AND-VALUES ; (TOP-LEVEL-FORM 25) ; (DEFVAR ELEPHANT::ARRAY-TYPE-TO-BYTE) ; (DEFVAR ELEPHANT::BYTE-TO-ARRAY-TYPE) ; (TOP-LEVEL-FORM 28) ; (TOP-LEVEL-FORM 29) ; (TOP-LEVEL-FORM 30) ; (TOP-LEVEL-FORM 31) ; (TOP-LEVEL-FORM 32) ; (TOP-LEVEL-FORM 33) ; (TOP-LEVEL-FORM 34) ; (TOP-LEVEL-FORM 35) ; (TOP-LEVEL-FORM 36) ; ELEPHANT::TYPE= ; (TOP-LEVEL-FORM 38) ; (TOP-LEVEL-FORM 39) ; ELEPHANT::ARRAY-TYPE-FROM-BYTE ; ELEPHANT::BYTE-FROM-ARRAY-TYPE ; ELEPHANT::INT-BYTE-SPEC ; (TOP-LEVEL-FORM 0) ; Loading fasl file /Users/jensteich/Lisp/elephant/src/elephant/ serializer.xfasl ;;; Compiling file /Users/jensteich/Lisp/elephant/src/elephant/ controller.lisp ... ;;; Safety = 3, Speed = 1, Space = 1, Float = 1, Interruptible = 0 ;;; Compilation speed = 1, Debug = 2, Fixnum safety = 3 ;;; Source level debugging is on ;;; Source file recording is on ;;; Cross referencing is on ; (TOP-LEVEL-FORM 0) ; (TOP-LEVEL-FORM 1) ; (DEFVAR ELEPHANT::*ELEPHANT-DATA-STORES*) ; (DEFVAR ELEPHANT::*ELEPHANT-CONTROLLER-INIT*) ; ELEPHANT::REGISTER-DATA-STORE-CON-INIT ; ELEPHANT::LOOKUP-DATA-STORE-CON-INIT ; (DEFVAR ELEPHANT::*DBCONNECTION-SPEC*) ; (DEFVAR ELEPHANT::*DBCONNECTION-LOCK*) ; (DEFGENERIC ELEPHANT::GET-CON) ; (SUBFUNCTION (DEFCLASS ELEPHANT:CONTROLLER-LOST-ERROR) (DEFINE-CONDITION ELEPHANT:CONTROLLER-LOST-ERROR)) ; (DEFINE-CONDITION ELEPHANT:CONTROLLER-LOST-ERROR) ; ELEPHANT::SIGNAL-CONTROLLER-LOST-ERROR ; (METHOD ELEPHANT::GET-CON (ELEPHANT:PERSISTENT)) ; ELEPHANT::GET-CONTROLLER ; ELEPHANT::BUILD-CONTROLLER ; ELEPHANT::LOAD-DATA-STORE ; ELEPHANT::SATISFY-ASDF-DEPENDENCIES ; ELEPHANT::GET-USER-CONFIGURATION-PARAMETER ;;;*** Warning in ELEPHANT::INITIALIZE-USER-PARAMETERS: VARIABLE is bound but not referenced ; ELEPHANT::INITIALIZE-USER-PARAMETERS ; (DEFCLASS ELEPHANT:STORE-CONTROLLER) ; (METHOD PRINT-OBJECT (ELEPHANT:STORE-CONTROLLER T)) ; ELEPHANT::CACHE-INSTANCE ; ELEPHANT::GET-CACHED-INSTANCE ; (METHOD ELEPHANT:FLUSH-INSTANCE-CACHE (ELEPHANT:STORE-CONTROLLER)) ; (DEFGENERIC ELEPHANT::DATABASE-VERSION) ; (METHOD ELEPHANT::DATABASE-VERSION :AROUND (T)) ; ELEPHANT::PRIOR-VERSION-P ; (DEFPARAMETER ELEPHANT::*ELEPHANT-UPGRADE-TABLE*) ; (METHOD ELEPHANT::UP-TO-DATE-P (ELEPHANT:STORE-CONTROLLER)) ; (METHOD ELEPHANT::UPGRADABLE-P (ELEPHANT:STORE-CONTROLLER)) ; (DEFGENERIC ELEPHANT:UPGRADE) ; (METHOD ELEPHANT:UPGRADE (ELEPHANT:STORE-CONTROLLER T)) ; (METHOD ELEPHANT::INITIALIZE-SERIALIZER (ELEPHANT:STORE-CONTROLLER)) ; (DEFVAR ELEPHANT:*ALWAYS-CONVERT*) ; (DEFPARAMETER ELEPHANT::*LEGACY-SYMBOL-CONVERSIONS*) ; ELEPHANT:ADD-SYMBOL-CONVERSION ; ELEPHANT::MAP-LEGACY-SYMBOLS ; (DEFPARAMETER ELEPHANT::*LEGACY-PACKAGE-CONVERSIONS*) ; ELEPHANT:ADD-PACKAGE-CONVERSION ; ELEPHANT::MAP-LEGACY-PACKAGE-NAMES ; ELEPHANT::MAP-LEGACY-NAMES ; ELEPHANT:TRANSLATE-AND-INTERN-SYMBOL ; (DEFGENERIC ELEPHANT::OPEN-CONTROLLER) ; (DEFGENERIC ELEPHANT::CLOSE-CONTROLLER) ; (METHOD ELEPHANT::CLOSE-CONTROLLER :AFTER (ELEPHANT:STORE-CONTROLLER)) ; (DEFGENERIC ELEPHANT::CONNECTION-IS-INDEED-OPEN) ; (DEFGENERIC ELEPHANT::NEXT-OID) ; (DEFGENERIC ELEPHANT:OPTIMIZE-LAYOUT) ; (DEFGENERIC ELEPHANT::PERSISTENT-SLOT-READER) ; (DEFGENERIC ELEPHANT::PERSISTENT-SLOT-WRITER) ; (DEFGENERIC ELEPHANT::PERSISTENT-SLOT-BOUNDP) ; (DEFGENERIC ELEPHANT::PERSISTENT-SLOT-MAKUNBOUND) ; ELEPHANT:OPEN-STORE ; ELEPHANT:CLOSE-STORE ; ELEPHANT:WITH-OPEN-STORE ; ELEPHANT:ADD-TO-ROOT ; ELEPHANT:GET-FROM-ROOT ; ELEPHANT:ROOT-EXISTSP ; ELEPHANT:REMOVE-FROM-ROOT ; ELEPHANT:MAP-ROOT ; (DEFGENERIC ELEPHANT:DROP-POBJECT) ; (METHOD ELEPHANT:DROP-POBJECT (ELEPHANT:PERSISTENT-OBJECT)) ; (DEFVAR ELEPHANT::*RESTRICTED-PROPERTIES*) ; (METHOD ELEPHANT::CONTROLLER-PROPERTIES (ELEPHANT:STORE-CONTROLLER)) ; (METHOD ELEPHANT::SET-ELE-PROPERTY (T T)) ; (METHOD ELEPHANT::GET-ELE-PROPERTY (T)) ; (TOP-LEVEL-FORM 0) Warning: COMPILE-FILE warned while performing # on #. ; Loading fasl file /Users/jensteich/Lisp/elephant/src/elephant/ controller.xfasl ;;; Compiling file /Users/jensteich/Lisp/elephant/src/elephant/ collections.lisp ... ;;; Safety = 3, Speed = 1, Space = 1, Float = 1, Interruptible = 0 ;;; Compilation speed = 1, Debug = 2, Fixnum safety = 3 ;;; Source level debugging is on ;;; Source file recording is on ;;; Cross referencing is on ; (TOP-LEVEL-FORM 0) ; (TOP-LEVEL-FORM 1) ; (DEFCLASS ELEPHANT:PERSISTENT-COLLECTION) ; ELEPHANT:MAKE-BTREE ; (DEFGENERIC ELEPHANT::BUILD-BTREE) ; (DEFCLASS ELEPHANT:BTREE) ; (DEFGENERIC ELEPHANT:GET-VALUE) ; (DEFGENERIC (SETF ELEPHANT:GET-VALUE)) ; (DEFGENERIC ELEPHANT:REMOVE-KV) ; (DEFGENERIC ELEPHANT:EXISTSP) ; (METHOD ELEPHANT:OPTIMIZE-LAYOUT (T)) ; (DEFGENERIC ELEPHANT:DROP-BTREE) ; ELEPHANT:MAKE-INDEXED-BTREE ; (DEFGENERIC ELEPHANT::BUILD-INDEXED-BTREE) ; (DEFCLASS ELEPHANT:INDEXED-BTREE) ; (DEFGENERIC ELEPHANT:ADD-INDEX) ; (DEFGENERIC ELEPHANT:GET-INDEX) ; (DEFGENERIC ELEPHANT:REMOVE-INDEX) ; (DEFGENERIC ELEPHANT:MAP-INDICES) ; (DEFGENERIC ELEPHANT::BUILD-BTREE-INDEX) **++++ Error in (DEFCLASS ELEPHANT:BTREE-INDEX): Invalid allocation type INSTANCE for slot-definition-allocation ;;;*** Warning in (METHOD SHARED-INITIALIZE :AFTER (ELEPHANT:BTREE-INDEX T)): Ignoring type declaration with illegal type ELEPHANT:BTREE-INDEX ; (METHOD SHARED-INITIALIZE :AFTER (ELEPHANT:BTREE-INDEX T)) ; (DEFGENERIC ELEPHANT:GET-PRIMARY-KEY) ;;;*** Warning in (METHOD (SETF ELEPHANT:GET-VALUE) (T T ELEPHANT:BTREE-INDEX)): Ignoring type declaration with illegal type ELEPHANT:BTREE-INDEX ; (METHOD (SETF ELEPHANT:GET-VALUE) (T T ELEPHANT:BTREE-INDEX)) ;;;*** Warning in (METHOD ELEPHANT:REMOVE-KV (T ELEPHANT:BTREE- INDEX)): Ignoring type declaration with illegal type ELEPHANT:BTREE- INDEX ; (METHOD ELEPHANT:REMOVE-KV (T ELEPHANT:BTREE-INDEX)) ; (DEFCLASS ELEPHANT:CURSOR) ; (DEFGENERIC ELEPHANT:MAKE-CURSOR) ; (DEFGENERIC ELEPHANT:MAKE-SIMPLE-CURSOR) ; (DEFGENERIC ELEPHANT:CURSOR-CLOSE) ; (DEFGENERIC ELEPHANT:CURSOR-DUPLICATE) ; (DEFGENERIC ELEPHANT:CURSOR-CURRENT) ; (DEFGENERIC ELEPHANT:CURSOR-FIRST) ; (DEFGENERIC ELEPHANT:CURSOR-LAST) ; (DEFGENERIC ELEPHANT:CURSOR-NEXT) ; (DEFGENERIC ELEPHANT:CURSOR-PREV) ; (DEFGENERIC ELEPHANT:CURSOR-SET) ; (DEFGENERIC ELEPHANT:CURSOR-SET-RANGE) ; (DEFGENERIC ELEPHANT:CURSOR-GET-BOTH) ; (DEFGENERIC ELEPHANT:CURSOR-GET-BOTH-RANGE) ; (DEFGENERIC ELEPHANT:CURSOR-DELETE) ; (DEFGENERIC ELEPHANT:CURSOR-PUT) ; (DEFCLASS ELEPHANT:SECONDARY-CURSOR) ; (DEFGENERIC ELEPHANT:CURSOR-PCURRENT) ; (DEFGENERIC ELEPHANT:CURSOR-PFIRST) ; (DEFGENERIC ELEPHANT:CURSOR-PLAST) ; (DEFGENERIC ELEPHANT:CURSOR-PNEXT) ; (DEFGENERIC ELEPHANT:CURSOR-PPREV) ; (DEFGENERIC ELEPHANT:CURSOR-PSET) ; (DEFGENERIC ELEPHANT:CURSOR-PSET-RANGE) ; (DEFGENERIC ELEPHANT:CURSOR-PGET-BOTH) ; (DEFGENERIC ELEPHANT:CURSOR-PGET-BOTH-RANGE) ; (DEFGENERIC ELEPHANT:CURSOR-NEXT-DUP) ; (DEFGENERIC ELEPHANT:CURSOR-NEXT-NODUP) ; (DEFGENERIC ELEPHANT:CURSOR-PNEXT-DUP) ; (DEFGENERIC ELEPHANT:CURSOR-PNEXT-NODUP) ; (DEFGENERIC ELEPHANT:CURSOR-PREV-DUP) ; (METHOD ELEPHANT:CURSOR-PREV-DUP (ELEPHANT:CURSOR)) ; (DEFGENERIC ELEPHANT:CURSOR-PREV-NODUP) ; (DEFGENERIC ELEPHANT:CURSOR-PPREV-DUP) ; (METHOD ELEPHANT:CURSOR-PPREV-DUP (ELEPHANT:CURSOR)) ; (DEFGENERIC ELEPHANT:CURSOR-PPREV-NODUP) ; ELEPHANT:WITH-BTREE-CURSOR ; (METHOD ELEPHANT:DROP-BTREE (ELEPHANT:BTREE)) ; ELEPHANT::LISP-COMPARE<= ; ELEPHANT::LISP-COMPARE-EQUAL ; (DEFGENERIC ELEPHANT:MAP-BTREE) ;;;*** Warning in (SUBFUNCTION 2 (METHOD ELEPHANT:MAP-BTREE (T ELEPHANT:BTREE))): Failed to find name ELEPHANT::K in declaration (DYNAMIC-EXTENT ELEPHANT ::EXISTS? ELEPHANT ::K ELEPHANT ::V). ;;;*** Warning in (SUBFUNCTION 2 (METHOD ELEPHANT:MAP-BTREE (T ELEPHANT:BTREE))): Failed to find name ELEPHANT::V in declaration (DYNAMIC-EXTENT ELEPHANT ::EXISTS? ELEPHANT ::K ELEPHANT ::V). ; (METHOD ELEPHANT:MAP-BTREE (T ELEPHANT:BTREE)) ; (DEFGENERIC ELEPHANT:MAP-INDEX) ;;;*** Warning in (METHOD ELEPHANT:MAP-INDEX (T ELEPHANT:BTREE- INDEX)): Ignoring type declaration with illegal type ELEPHANT:BTREE- INDEX ; (METHOD ELEPHANT:MAP-INDEX (T ELEPHANT:BTREE-INDEX)) ; ELEPHANT::PSET-RANGE-FOR-DESCENDING ; ELEPHANT::PPREV-DUP-HACK ; (METHOD ELEPHANT:EMPTY-BTREE-P (ELEPHANT:BTREE)) ; ELEPHANT::PRINT-BTREE-ENTRY ; ELEPHANT:DUMP-BTREE ; ELEPHANT::PRINT-BTREE-KEY-AND-TYPE ; ELEPHANT:BTREE-KEYS ; (METHOD ELEPHANT:BTREE-DIFFER-P (ELEPHANT:BTREE ELEPHANT:BTREE)) ; (TOP-LEVEL-FORM 0) ; *** 1 error detected, no fasl file produced. Warning: COMPILE-FILE warned while performing # on #. Warning: COMPILE-FILE failed while performing # on #. Error: erred while invoking # on # 1 (continue) Retry performing # on #. 2 Continue, treating # on # as having been successful. 3 (abort) Return to level 0. 4 Return to top loop level 0. Type :b for backtrace, :c