java - confusion in acquiring and releasing of locks -
i have following code snippet client of android emulator:
public cursor query(uri uri, string[] projection, string selection, string[] selectionargs,string sortorder) { string key = selection; string keyhash = genhash(key); log.v("provider.query","key & keyhash: "+key+" & "+keyhash); if(simpledhtutil.toforward(keyhash, currenthash, predecessorhash)){ dhtdto dto = new querytransfer(successorport, currentport, -1, key, keyhash); st.makesendrequest(dto); synchronized(biglock.lock){ simpledhtutil.cursorreset(); requiredanswers = 1; currentanswers = 0; } while(requiredanswers>currentanswers){ synchronized(biglock.lock){ try{ if(requiredanswers>currentanswers){ log.d("provider.externalquerylock","ca: "+currentanswers+"ra: "+requiredanswers+" waiting... "+biglock.lock); biglock.lock.wait(); log.d("provider.externalquerylock","woke up"); } }catch(interruptedexception e){ log.e("provider.query", "interruptedexception",e); } } } return simpledhtutil.getcursor(); }
the following code in server of same avd:
private void acceptanswer(queryacknowledge qa) { // object lock = simpledhtprovider.externalquerylock; synchronized(biglock.lock){ simpledhtprovider.currentanswers += 1; log.d("receivertask.acceptanswer","got result. current count: "+simpledhtprovider.currentanswers); simpledhtutil.addvalues(qa.getrecords()); log.d("receivertask.acceptanswer","aggregated result. net count: "+simpledhtutil.getcursor().getcount()); biglock.lock.notifyall(); log.d("receivertask.acceptanswer","lock released: "+biglock.lock); } }
now problem when releasing lock in server code, want lock in client notified , awoken. happens >80% of time. gets stuck. find android log below. also, currentanswers , requiredanswers being handled client, i.e., these variables static , volatile in client , biglock enum 1 value lock.
client log:
04-14 08:14:07.172: v/provider.query(2699): key & keyhash: 6olnuimwiuam4ywn183cwtz0te5aq6r7 & 837cccd1cac03a9c4c9169fad595a997d2673920 04-14 08:14:07.202: d/provider.externalquerylock(2699): ca: 0ra: 1 waiting... lock
server log:
04-14 08:14:07.192: d/receivertask.acceptanswer(2699): got result. current count: 2 04-14 08:14:07.192: d/receivertask.acceptanswer(2699): aggregated result. net count: 2 04-14 08:14:07.192: d/receivertask.acceptanswer(2699): lock released: lock
the problem here resetting cursor after sending request client assuming server receive reply after resetting cursor in next line.
the correct order first reset cursor , send request.
Comments
Post a Comment