Re: unexpected _child(lose) for a detached session from _start

Rocco Caputo <[email protected]>
Newsgroups gmane.comp.lang.perl.poe
Message-ID <[email protected]>
Agreed, a _child(lose) before the _child(create) is bad.

It should either be a _child(create)/_child(lose) pair, or nothing in  
this case.  I'm tempted to go with "nothing" since it would be hard to  
fix the create/lose timing.  Also the new(detached => 1) seems good,  
but I admit I haven't given it much though yet.  Sometimes I change my  
mind after thinking about things too hard.

If you haven't already, please submit this to [email protected].   
I'm liable to forget about POE bugs, patches, tests, etc. if they're  
not in POE's bug tracker.

Thank you again for all your help.

-- 
Rocco Caputo - [email protected]


On Nov 19, 2009, at 14:00, Olivier Mengué wrote:

> Hi POE fellows,
>
> I'm in the process of rewriting the backend of my  
> POE::Component::Schedule
> to make the backend session independent of others session in the  
> system. The
> point is that session is just backend stuff, so it should not fire  
> _child
> events to the session from which the API may have been called. Also,  
> the
> schedule session is a singleton that may be used by multiple  
> session, so it
> has no reason for being attached to a particular session.
> To achieve that, I'm calling POE::Kernel->detach_myself in the _start
> handler of the session. POE does'nt fire _child(create) as I expected.
> However I also found out that POE still fires _child(lose).
>
> My opinion is that POE should not fire a _child(lose) event if the  
> session
> is detached from its parent in the _start handler as a 'lose' without
> 'create'/'gain' is inconsistent.
> Also it would be better if 'detach => 1' was an argument to
> POE::Session->create(): it would make the 'not attached'  
> particularity of
> this session more explicit for people reading the code.
>
> Here is a test case that shows the current flawed behavior (tested  
> with POE
> 1.006, POE 1.280):
>
> use strict;
> use warnings;
>
> use Test::More tests => 7;
> use POE;
>
> my $_child_fired = 0;
>
> POE::Session->create(
>    inline_states => {
>        _start => sub {
>            $_[KERNEL]->alias_set('First');
>            pass "_start First";
>            POE::Session->create(
>                inline_states => {
>                    _start => sub {
>                        $_[KERNEL]->alias_set('Second');
>                        pass "_start Second";
>                    },
>                },
>            );
>            POE::Session->create(
>                inline_states => {
>                    _start => sub {
>                        $_[KERNEL]->alias_set('Detached');
>                        pass "_start Detached";
>                        diag "Detaching session 'Detached' from its  
> parent";
>                        $_[KERNEL]->detach_myself;
>                    },
>                },
>            );
>        },
>        _child => sub {
>            $_child_fired++;
>            ok($_[KERNEL]->alias_list($_[ARG1]) ne 'Detached',
>                "$_[STATE]($_[ARG0]) fired for "
>                  .$_[KERNEL]->alias_list($_[ARG1]->ID));
>        },
>    },
> );
>
> POE::Kernel->run();
>
> pass "_child not fired for session detached in _start" unless  
> $_child_fired
> != 2;
> pass "Stopped";
>
>
> Olivier Mengué
> http://o.mengue.free.fr/
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.