|
|
Bugzilla Link |
1014 |
Created on |
Aug 10, 2012 17:43 |
Version |
svn |
OS |
Linux |
Architecture |
PC |
Extended Description
The DFC (Dispatch Fun Calls) optimization in sac4c incorrectly dispatches multithreaded XT calls to a SEQ implementation, thus blowing up the private heap manager.
Code before dfc: See that the wrapper:gigo:_XT::gen( _btf_4) call correctly points to an XT variant:
/****************************************************************************
* Cond function:
* gigo:_XT::gen__Cond_8(...) [ body ]
****************************************************************************/
sacprelude::SACarg gigo:_XT::gen__Cond_8( bool _btf_2 { ,NN } , sacprelude::SACarg hnd { ,NN } )
/*
* gen__Cond_8 :: ---
*/
{
sacprelude::SACarg _btf_0__SSA0_2 { , NN } ;
sacprelude::SACarg _btf_0__SSA0_1 { , NN } ;
sacprelude::SACarg _btf_0 { , NN } ;
SNet::SNet _btf_4 { , NN } ;
SNet::SNet _btf_5 { , NN } ;
int _btf_6 { , NN } ;
if (_btf_2)
{
_btf_4 = wrapper:SNet::unwrapSNet( hnd) ;
_btf_5 = wrapper:gigo:_XT::gen( _btf_4) ;
_btf_6 = 20;
_btf_0 = wrapper:SNet::wrapSNet( _btf_6, _btf_5) ;
}
else
{
_btf_0__SSA0_1 = _dispatch_error_( 1, sacprelude::SACarg, "gen", hnd);
}
_btf_0__SSA0_2 = ( _btf_2 ? _btf_0 : _btf_0__SSA0_1 );
return( _btf_0__SSA0_2);
}
Code after DFC: the call was incorrectly dispatched to a SEQ implementation.
/****************************************************************************
* Cond function:
* gigo:_XT::gen__Cond_8(...) [ body ]
****************************************************************************/
sacprelude::SACarg gigo:_XT::gen__Cond_8( bool _btf_2 { ,NN } , sacprelude::SACarg hnd { ,NN } )
/*
* gen__Cond_8 :: ---
*/
{
sacprelude::SACarg _btf_0__SSA0_2 { , NN } ;
sacprelude::SACarg _btf_0__SSA0_1 { , NN } ;
sacprelude::SACarg _btf_0 { , NN } ;
SNet::SNet _btf_4 { , NN } ;
SNet::SNet _btf_5 { , NN } ;
int _btf_6 { , NN } ;
if (_btf_2)
{
_btf_4 = SNet::unwrapSNet( hnd) ;
_btf_5 = gigo::gen( _btf_4) ;
_btf_6 = 20;
_btf_0 = SNet::wrapSNet( _btf_6, _btf_5) ;
}
else
{
_btf_0__SSA0_1 = _dispatch_error_( 1, sacprelude::SACarg, "gen", hnd);
}
_btf_0__SSA0_2 = ( _btf_2 ? _btf_0 : _btf_0__SSA0_1 );
return( _btf_0__SSA0_2);
}
The program then rightfully crashes in an assertion check in PHM:
gigo-lpel: fun2.c:725: SACf_gigo__gen__SACt_SNet__SNet: Assertion `SAC_MT_globally_single && "An ST/SEQ top-arena call in the MT/XT context!!"' failed.
(gdb) bt
#0 0x00144410 in __kernel_vsyscall ()
#1 0x05056df0 in raise () from /lib/libc.so.6
#2 0x05058701 in abort () from /lib/libc.so.6
#3 0x0505026b in __assert_fail () from /lib/libc.so.6
#4 0x007c607c in SACf_gigo__gen__SACt_SNet__SNet (SACl_hnd__p=0x298fce70, SACl_hnd__desc__p=0x298fce6c) at fun2.c:725
#5 0x00146cc8 in SACcw_gigo_CL_XT__gen1 (SAC_MT_self=0x8ce76a8, SAC_arg_1__p=0x298fcefc, SAC_arg_1__desc__p=0x298fcec0, SACl_hnd=0x8ceaf38, SACl_hnd__desc=0x8ceaf18) at fun1.c:1964
#6 0x00146f61 in gigo__gen1 (ret0=0x298fcefc, arg0=0x8ceaf38) at interface.c:44
#7 0x0804a076 in SNetCall__gen (hnd=0x298fcf44) at gigo.c:61
#8 SNet__gigo__gen (hnd=0x298fcf44) at gigo.c:76
#9 0x004ad46c in BoxTask (ent=0x89e2568, arg=0x89e25a8) at src/runtime/stream/entity/box.c:112
#10 0x004ade06 in SNetEntityCall (ent=0x89e2568) at src/runtime/stream/entity/entities.c:133
#11 0x004c04a2 in EntityTask (arg=0x89e2568) at src/threading/lpel/lpelif/glue_snet.c:75
#12 0x00cae18a in TaskStartup (data=0x290fd000) at src/task.c:283
#13 0x0018ae58 in co_runner () at pcl.c:377
#14 0x05066b9b in makecontext () from /lib/libc.so.6