From a3ccd10c8f6b9d19d2ddabc5ac80f54ca54d03d4 Mon Sep 17 00:00:00 2001 From: Dan Ballard Date: Mon, 28 Feb 2011 23:40:37 -0800 Subject: [PATCH] Finished lookup port, ported isLocked and removeLocks for absic and range types --- client.html | 8 ++- cortexLocks.js | 148 +++++++++++++++++++++++++++++++++++++++---------- 2 files changed, 126 insertions(+), 30 deletions(-) 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']); });