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

Popular posts from this blog

windows - Single EXE to Install Python Standalone Executable for Easy Distribution -

c# - Access objects in UserControl from MainWindow in WPF -

javascript - How to name a jQuery function to make a browser's back button work? -