Subject: | replace session references with IDs as internal keys |
Currently POE::Kernel's data structures are keyed on a session's
reference. POE reuses references often, so new sessions may have the
same keys as dead ones.
This becomes a problem if we want to delay the cleanup of resources
from dead sessions. Consider events in the queue that are destined
for SESSION_REF, which has stopped. It's possible for a new session
to be created with the same SESSION_REF before the events are
dispatched. Those events would then be sent to the new SESSION_REF,
which isn't what we want.
To solve the meta-problem, we can use session IDs instead of
references as the keys into POE::Kernel's data structures. These IDs
are unique, and it can be guaranteed that they never clash.
Things to do:
Most of the public POE::Kernel methods already call the internal
_resolve_session() method, which returns a session reference for
whatever was passed to the function. It can be made to return a
session ID instead, solving a lot of this task.
_dispatch_event() currently passes the destination session to the
session's _invoke_state() method, but that's not needed. I think the
session will know its $self and can use that instead.
So... we can qknow which ID to use in the Kernel methods that are
called, and we can provide the $_[SESSION] back to each session. What
remains is to re-key the data structures on session IDs and to provide
IDs instead of session references to their accessors.