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 [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en