Boost logo

Boost :

Subject: Re: [boost] [msm]intarnal_transition_table's behavior
From: Takatoshi Kondo (redboltz_at_[hidden])
Date: 2011-07-25 03:04:12


Hi, Christophe

I found an another strange behavior on trunk.

On Fri, Jul 22, 2011 at 8:58 AM, Takatoshi Kondo <kondo_at_[hidden]> wrote:
> Hi, Christophe
>
> On Thu, 21 Jul 2011 22:34:15 +0200
> "Christophe Henry" <christophe.j.henry_at_[hidden]> wrote:
>
>> > Hello,
>> >
>> > When I was trying to answer an another thread,
>> > I encountered strange behavior.
>> > (Re: [boost] [msm]exit pseudo state and event)
>> >
>> > See 18_InternalTransitionTableTest.cpp. (attached file)
>> >
>> > I believe that internal_transition_table should work correctly
>> > without transition_table.
>> >
>> > Here is internal_transition_table.
>> >
>> > // Internal Transition table
>> > struct internal_transition_table : mpl::vector<
>> >    //               Event   Action      Guard
>> >    msmf::Internal < Event1, Action1_1  ,Guard1_1 >
>> >> {};
>> >
>> > But Event1 isn't dispatched. I don't understand why.
>> >
>> > When I add transition_table that includes the Event1,
>> > internal_transition_table works correctly.
>> >
>> > #if 1 // Why is it needed?
>> >    // Transition table
>> >    struct transition_table:mpl::vector<
>> >        //          Start     Event   Next        Action      Guard
>> >        msmf::Row < State1_1, Event1, State1_2,   msmf::none, msmf::none >
>> > // OK
>> >        // msmf::Row < State1_1, Event2, State1_2,   msmf::none, msmf::none
>> >  > // NG
>> >    > {};
>> > #endif
>> >
>> > But if transition_table don't have Event1,
>> > internal_transition_table doesn't work correctly.
>> >
>> >        msmf::Row < State1_1, Event2, State1_2,   msmf::none, msmf::none >
>> > // NG
>> >
>> > I suspect it is bug.
>> > How do you think?
>> >
>> > Thanks,
>> > Takatoshi
>>
>> Hi Takatoshi,
>>
>> you're right, it's a bug. I just fixed it in the trunk (rev. 73289).
>
> I double checked it. It works correctly.
> Thanks for fixing bug quickly.

When I executed 21_InternalTransitionEval.cpp (attached file),
the most internal transition's guards are evaluated twice on
trunk Rev:73289.

> Send Event1
Guard1_1_2
Guard1_1_1
Guard1_2
Guard1_1
Guard1_1_2 <= called again
Guard1_1_1 <= called again
Guard2
Guard1

But on Boost 1.47.0, they are called only once.

> Send Event1
Guard1_1_2
Guard1_1_1
Guard1_2
Guard1_1
Guard2
Guard1

I believe version 1.47.0 is correct.

I think this changing behavior is something concerned with your fix.
And I also checked on Rev:72879 is same behavior as 1.47.0.

Could you check it?

>
>> Thanks for the report,
>> Christophe
>>
>> PS: I'm in vacations from next week for 4 weeks, so I might be less
>> responsive as I will have a pretty bad connection.
>
> Enjoy your vacation! :)
>
> Regards,
> Takatoshi
>
>

Thanks,
Takatoshi




Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk