Howdy group, I was reading the implementation of Agent -- Agent.java, and have a question on nested send/send-off's.
When an action is being executed, send/send-off's are queued in the persistent vector `nested': static void dispatchAction(Action action){ LockingTransaction trans = LockingTransaction.getRunning(); if(trans != null) trans.enqueue(action); else if(nested.get() != null) { nested.set(nested.get().cons(action)); } else action.agent.enqueue(action); } They're only added to that vector when nested.get() isn't null. nested becomes non-null when executing an action: static void doRun(Action action){ try { nested.set(PersistentVector.EMPTY); Throwable error = null; try { Object oldval = action.agent.state; Object newval = action.fn.applyTo(RT.cons(action.agent.state, action.args)); action.agent.setState(newval); // ... ... If there's no error in the execution, pending sends will be added back into the agent's own queue: // method Action.doRun() if(error == null) { releasePendingSends(); } and nested will be reset to null with a `finally' clause: // method Action.doRun() finally { nested.set(null); } I think there is a fatal problem here, correct me if I'm wrong. If some pending actions are sent _after_ releasePendingSends() returns but _before_ the the `finally' clause getting executed, aren't they dropped? Best Regards, Guanpeng Xu -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en