diff --git a/client.html b/client.html
index 92c1be0..01611d8 100644
--- a/client.html
+++ b/client.html
@@ -425,6 +425,7 @@ function getLockType(type) {
return null;
}
+/*
function isLocked(lockType, lockName, start, end) {
if (lockType == "range") {
var rlock = getRangeLock(lockname, start, end);
@@ -441,7 +442,7 @@ function isLocked(lockType, lockName, start, end) {
return true;
}
}
-
+*/
function loadTest(tname) {
if(tname == '') {
@@ -1066,6 +1067,7 @@ function lookForWork() {
}
}
+/*
function getRangeLock(name, start, end) {
log("getRangeLock for (" + name + " from " + start + " to " + end + ")");
if (!rangeLocks[name]) {
@@ -1116,6 +1118,7 @@ function getRangeLock(name, start, end) {
}
}
+*/
function makeRangeLock(tlock, suggestedSize) {
suggestedSize--;
@@ -1169,6 +1172,7 @@ function makeRangeLock(tlock, suggestedSize) {
}
}
+/*
function genRangeCell(name, start, end, next) {
var c = new Object();
c.name = name;
@@ -1178,7 +1182,7 @@ function genRangeCell(name, start, end, next) {
c.locked = false;
c.done = false;
return c;
-}
+} */
var map_test = null;
var reduce = null;
diff --git a/cortexLocks.js b/cortexLocks.js
index 41462e3..70bd618 100644
--- a/cortexLocks.js
+++ b/cortexLocks.js
@@ -29,9 +29,9 @@ function execLockFn(family, fnName, args) {
}
/**** Lock Functions
- * retriveLock(details) # get lock data strict (lookup?)
- * removeLocks(owner)
- * isLocked(details)
+ * BR retriveLock(details) # get lock data struct (lookup?)
+ * BR removeLocks(addr/owner)
+ * BR isLocked(details)
* getLock(details) # aquire lock (aquire?)
* equals(a, b)
* lock
@@ -44,16 +44,127 @@ function (args) {
return args["locks"][args["name"]];
});
+function genRangeCell(name, start, end, next) {
+ var c = new Object();
+ c.name = name;
+ c.start=start;
+ c.end = end;
+ c.next = next;
+ c.locked = false;
+ c.done = false;
+ return c;
+}
+
+function getRangeLock(rangeLocks, name, start, end) {
+ log("getRangeLock for (" + name + " from " + start + " to " + end + ")");
+ if (!rangeLocks[name]) {
+ log("no locks for " + name + ", so MAKING");
+ rangeLocks[name] = genRangeCell(name, start, end);
+ return rangeLocks[name];
+ }
+ log("locks exist for " + name + " so SEARCHING forward");
+ var rlock = rangeLocks[name];
+
+ if(end < rlock.start) {
+ log("Space before first lock, MAKING HERE");
+ rangeLocks[name] = genRangeCell(name, start, end);
+ rangeLocks[name].next = rlock;
+ return rangeLocks[name];
+ }
+
+ while(rlock.next && rlock.start < rlock.end+1) {
+ log("looking at (" + rlock.start + " to " + rlock.end + ")");
+ if (rlock.start == start && rlock.end == end) {
+ log("FOUND IT");
+ return rlock;
+ }
+
+ if (rlock.end < start && rlock.next.start > end) {
+ log("GAP between (" + rlock.start + " to " + rlock.end + ") and (" + rlock.next.start + " to " + rlock.next.end + ") where we should be so MAKING THERE");
+ var nlock = rlock.next;
+ rlock.next = genRangeCell(name, start, end);
+ rlock.next.next = nlock;
+ return rlock.next;
+ }
+
+ rlock = rlock.next;
+ }
+ log("SEARCH ended");
+ if (rlock.start == start && rlock.end == end) {
+ log("Found it!");
+ return rlock;
+ } else {
+ if (rlock.end < start) {
+ log("There is space at the end to make what we want");
+ rlock.next = genRangeCell(name, start, end);
+ return rlock.next;
+ } else {
+ log("search ended after what we wanted, FAIL");
+ return null;
+ }
+ }
+
+}
+
registerLockFn("range", "lookup",
function (args) {
- /******* vvvvvvvvvv *********/
- var l = getRangeLock(struct.name, struct.start, struct.end);
+ var l = getRangeLock(arg['locks'] , args['name'], args['start'], args'[end']);
if (l == null)
error("retrieveLock for range got null");
return l;
});
+registerLockFn("basic", "isLocked",
+function(args) {
+ var locks = args['locks'];
+ if (locks[args['name']] == null)
+ return false;
+ else
+ return locks[args['name']].locked;
+});
+
+registerLockFn("range", "isLocked",
+function (args) {
+ var rlock = getRangeLock(args['locks'], args['name'], args['start'], args['end']);
+ if (rlock)
+ return rlock.locked;
+ else
+ return false;
+});
+
+
+registerLockFn("basic", "removeLocks",
+function(args) {
+ for(var i in args['locks']) {
+ var lock = args['locks'][i];
+ if (!lock)
+ continue;
+ if (lock.addr == addr) {
+ lock.locked = false;
+ }
+ }
+});
+
+
+registerLockFn("range", "removeLocks",
+function(args) {
+ for(var i in args['locks']) {
+ log("freeing " + i + " locks");
+ var rlock = args['locks'][i];
+ while (rlock != null) {
+ log("looking at " + i + " (" + rlock.start + " to " + rlock.end + ") : " + rlock.addr);
+ if (rlock.addr == args['addr']) {
+ log("unlocking");
+ rlock.locked = false;
+ }
+ rlock = rlock.next;
+ }
+ }
+});
+
+
+
/**** Logical Lock using functions
* grant(resp, lock
* deny(resp, lock
@@ -109,7 +220,7 @@ function handleAddLock(resp) {
}
} else if(resp['type'] == "range" && lock.addr == null) {
log("Add range lock: " + resp['name'] + " (" + resp['start'] + " to " + resp['end'] + ") : ");
- var lock = getRangeLock(resp['name'], resp['start'], resp['end']);
+ var lock = getRangeLock(LOCKS, resp['name'], resp['start'], resp['end']);
lock.addr = resp['addr'];
lock.locked = resp['locked'];
@@ -119,22 +230,10 @@ function handleAddLock(resp) {
}
}
+addMessageHandler("addLock", handlerAddLock());
+
-function removeNodeRangeLocks(addr) {
- for(var i in rangeLocks) {
- log("freeing " + i + " locks");
- var rlock = rangeLocks[i];
- while (rlock != null) {
- log("looking at " + i + " (" + rlock.start + " to " + rlock.end + ") : " + rlock.addr);
- if (rlock.addr == addr) {
- log("unlocking");
- rlock.locked = false;
- }
- rlock = rlock.next;
- }
- }
-}
function removeNodeLocks(addr) {
removeNodeRangeLocks(resp['addr']);
@@ -142,14 +241,7 @@ function removeNodeLocks(addr) {
addMsgHandler("deadNode",
function (resp) {
- for(var i in testLocks) {
- var lock = testLocks[i];
- if (!lock)
- continue;
- if (lock.addr == addr) {
- lock.locked = false;
- }
- }
+ BASIC
removeNodeLocks(resp['addr']);
});