[Gd-chatter] r11581 - trunk/libraries/network/web-framework

hannes at gwydiondylan.org hannes at gwydiondylan.org
Wed Dec 26 11:37:17 CET 2007


Author: hannes
Date: Wed Dec 26 11:37:14 2007
New Revision: 11581

Modified:
   trunk/libraries/network/web-framework/storage.dylan
Log:
Job: minor
use a read-write-lock instead of a recursive lock

Modified: trunk/libraries/network/web-framework/storage.dylan
==============================================================================
--- trunk/libraries/network/web-framework/storage.dylan	(original)
+++ trunk/libraries/network/web-framework/storage.dylan	Wed Dec 26 11:37:14 2007
@@ -3,7 +3,7 @@
 
 define variable *directory* = "/";
 
-define constant $database-lock = make(<recursive-lock>);
+define constant $database-lock = make(<read-write-lock>);
 
 define sideways method process-config-element
     (node :: <xml-element>, name == #"web-framework")
@@ -21,25 +21,29 @@
  { getter-and-setter(?:name; constant ?args:* slot ?slot-name:name :: ?slot-type:expression ?rest:*; ?slots:*) }
     => { define method ?slot-name (object :: ?name) => (res :: ?slot-type)
            //format-out("accessing constant slot of %s\n", object.object-class);
-           with-lock($database-lock)
-             "%" ## ?slot-name(object);
-           end;
+           let res = #f;
+           wait-for($database-lock, mode: #"read");
+           res := "%" ## ?slot-name(object);
+           release($database-lock);
+           res;
          end;
          getter-and-setter(?name; ?slots);
         }
  { getter-and-setter(?:name; ?args:* slot ?slot-name:name :: ?slot-type:expression ?rest:*; ?slots:*) }
     => { define method ?slot-name (object :: ?name) => (res :: ?slot-type)
            //format-out("reading slot of %s\n", object.object-class);
-           with-lock($database-lock)
-             "%" ## ?slot-name(object);
-           end;
+           let res = #f;
+           wait-for($database-lock, mode: #"read");
+           res := "%" ## ?slot-name(object);
+           release($database-lock);
+           res;
          end;
          define method ?slot-name ## "-setter" (new-val :: ?slot-type, object :: ?name) => (res :: ?slot-type)
              //format-out("writing slot of %s\n", object.object-class);
-
-             with-lock($database-lock)
-               "%" ## ?slot-name ## "-setter"(new-val, object);
-             end;
+             wait-for($database-lock, mode: #"write");
+             "%" ## ?slot-name ## "-setter"(new-val, object);
+             release($database-lock);
+             new-val;
          end;
          getter-and-setter(?name; ?slots);
        }
@@ -107,35 +111,38 @@
       ?body:body
     end }
  =>  { begin
-         with-lock($database-lock)
-           let ?variable = storage(?type);
-           ?body
-         end
+         wait-for($database-lock, mode: #"read");
+         let ?variable = storage(?type);
+         ?body;
+         release($database-lock);
        end }
    { with-storage ()
        ?body:body
      end }
  => { begin
-         with-lock($database-lock)
-           ?body;
-         end;
+         wait-for ($database-lock, mode: #"read");
+         ?body;
+         release($database-lock);
       end }
 end;
 
 define open generic save (object :: <object>) => ();
 
 define method save (object) => ()
-  with-lock($database-lock)
-    add-object(storage(object.object-class), object);
-  end;
+  add-object(storage(object.object-class), object);
 end;
 
 define method add-object (list :: <collection>, ele :: <object>)
+  wait-for($database-lock, mode: #"write");
   *storage*[ele.object-class] := add!(list, ele);
+  release($database-lock);
 end;
 
 define method add-object (table :: <table>, ele :: <object>)
-  table[ele.key] := ele
+  let key = ele.key;
+  wait-for($database-lock, mode: #"write");
+  table[key] := ele;
+  release($database-lock);
 end;
 
 define class <storage> (<object>)
@@ -160,9 +167,9 @@
 end;
 
 define method dump-data () => ()
-  with-lock ($database-lock)
-    really-dump-all-data();
-  end;
+  wait-for ($database-lock, mode: #"write");
+  really-dump-all-data();
+  release($database-lock);
 end;
 
 define method restore (directory :: <string>, filename :: <string>) => ()
@@ -172,10 +179,10 @@
                   direction: #"input");
   let storage-root = dood-root(dood);
   dood-close(dood);
-  with-lock ($database-lock)
-    *storage* := storage-root.hash-table;
-    *version* := storage-root.table-version;
-  end;
+  wait-for ($database-lock, mode: #"write");
+  *storage* := storage-root.hash-table;
+  *version* := storage-root.table-version;
+  release($database-lock);
   format-out("Restored %= %=\n", directory, filename);
   for (class in key-sequence(*storage*))
     setup(class);



More information about the chatter mailing list