From 403621c13912cb61678cf6084ed7266259f02d0d Mon Sep 17 00:00:00 2001 From: Alex Lin Date: Thu, 25 Jan 2018 13:25:29 -0600 Subject: [PATCH] Pointers to STLs cannot be checkpointed. #552 sometimes the TMM allocate routines fail. I added error checking to stop a core dump. More investigation is needed to determine why the allocation is failing. --- include/trick/checkpoint_map.hh | 166 +++++++++++++---------- include/trick/checkpoint_pair.hh | 46 ++++--- include/trick/checkpoint_queue.hh | 68 ++++++---- include/trick/checkpoint_sequence_stl.hh | 36 ++--- include/trick/checkpoint_stack.hh | 34 +++-- 5 files changed, 195 insertions(+), 155 deletions(-) diff --git a/include/trick/checkpoint_map.hh b/include/trick/checkpoint_map.hh index cd58c6c8..8c2cdf82 100644 --- a/include/trick/checkpoint_map.hh +++ b/include/trick/checkpoint_map.hh @@ -55,22 +55,26 @@ int checkpoint_map_ik_id(STL & in_map , std::string object_name , std::string va var_declare << type_string << " " << object_name << "_" << var_name << "_keys[" << cont_size << "]" ; keys = (typename STL::key_type *)TMM_declare_var_s(var_declare.str().c_str()) ; - TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name + "_keys").c_str()) ; - //message_publish(1, "HERE with %s\n", var_declare) ; + if ( keys ) { + TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name + "_keys").c_str()) ; + //message_publish(1, "HERE with %s\n", var_declare) ; - var_declare.str("") ; - var_declare.clear() ; - type_string = stl_type_name_convert(abi::__cxa_demangle(typeid(*items).name(), 0, 0, &status )) ; - var_declare << type_string << " " - << object_name << "_" << var_name << "_data[" << cont_size << "]" ; - items = (typename STL::mapped_type *)TMM_declare_var_s(var_declare.str().c_str()) ; - TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name + "_data").c_str()) ; - //message_publish(1, "HERE with %s\n", var_declare) ; + var_declare.str("") ; + var_declare.clear() ; + type_string = stl_type_name_convert(abi::__cxa_demangle(typeid(*items).name(), 0, 0, &status )) ; + var_declare << type_string << " " + << object_name << "_" << var_name << "_data[" << cont_size << "]" ; + items = (typename STL::mapped_type *)TMM_declare_var_s(var_declare.str().c_str()) ; + if ( items ) { + TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name + "_data").c_str()) ; + //message_publish(1, "HERE with %s\n", var_declare) ; - /* copy the contents of the map the 2 arrays */ - for ( iter = in_map.begin() , ii = 0 ; iter != in_map.end() ; iter++ , ii++ ) { - keys[ii] = iter->first ; - items[ii] = iter->second ; + /* copy the contents of the map the 2 arrays */ + for ( iter = in_map.begin() , ii = 0 ; iter != in_map.end() ; iter++ , ii++ ) { + keys[ii] = iter->first ; + items[ii] = iter->second ; + } + } } } return 0 ; @@ -111,29 +115,33 @@ int checkpoint_map_ik_sd(STL & in_map , std::string object_name , std::string va var_declare << type_string << " " << object_name << "_" << var_name << "_keys[" << cont_size << "]" ; keys = (typename STL::key_type *)TMM_declare_var_s(var_declare.str().c_str()) ; - TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name + "_keys").c_str()) ; - //message_publish(1, "HERE with %s\n", var_declare) ; + if ( keys ) { + TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name + "_keys").c_str()) ; + //message_publish(1, "HERE with %s\n", var_declare) ; - var_declare.str("") ; - var_declare.clear() ; - var_declare << "std::string " - << object_name << "_" << var_name << "_data[" << cont_size << "]" ; - items = (std::string *)TMM_declare_var_s(var_declare.str().c_str()) ; - TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name + "_data").c_str()) ; - //message_publish(1, "HERE with %s\n", var_declare) ; + var_declare.str("") ; + var_declare.clear() ; + var_declare << "std::string " + << object_name << "_" << var_name << "_data[" << cont_size << "]" ; + items = (std::string *)TMM_declare_var_s(var_declare.str().c_str()) ; + if ( items ) { + TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name + "_data").c_str()) ; + //message_publish(1, "HERE with %s\n", var_declare) ; - /* copy the contents of the map the 2 arrays */ - for ( iter = in_map.begin() , ii = 0 ; iter != in_map.end() ; iter++ , ii++ ) { - keys[ii] = iter->first ; + /* copy the contents of the map the 2 arrays */ + for ( iter = in_map.begin() , ii = 0 ; iter != in_map.end() ; iter++ , ii++ ) { + keys[ii] = iter->first ; - std::ostringstream sub_elements ; - sub_elements << object_name << "_" << var_name << "_data_" << ii ; - items[ii] = sub_elements.str() ; + std::ostringstream sub_elements ; + sub_elements << object_name << "_" << var_name << "_data_" << ii ; + items[ii] = sub_elements.str() ; - std::ostringstream index_string ; - index_string << ii ; - //message_publish(1, "recursive call to checkpoint_stl %s\n", __PRETTY_FUNCTION__) ; - checkpoint_stl( iter->second , object_name + "_" + var_name + "_data" , index_string.str() ) ; + std::ostringstream index_string ; + index_string << ii ; + //message_publish(1, "recursive call to checkpoint_stl %s\n", __PRETTY_FUNCTION__) ; + checkpoint_stl( iter->second , object_name + "_" + var_name + "_data" , index_string.str() ) ; + } + } } } return 0 ; @@ -173,30 +181,34 @@ int checkpoint_map_sk_id(STL & in_map , std::string object_name , std::string va var_declare << "std::string " << object_name << "_" << var_name << "_keys[" << cont_size << "]" ; keys = (std::string *)TMM_declare_var_s(var_declare.str().c_str()) ; - TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name + "_keys").c_str()) ; - //message_publish(1, "HERE with %s\n", var_declare) ; + if ( keys ) { + TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name + "_keys").c_str()) ; + //message_publish(1, "HERE with %s\n", var_declare) ; - var_declare.str("") ; - var_declare.clear() ; - std::string type_string = stl_type_name_convert(abi::__cxa_demangle(typeid(*items).name(), 0, 0, &status )) ; - var_declare << type_string << " " - << object_name << "_" << var_name << "_data[" << cont_size << "]" ; - items = (typename STL::mapped_type *)TMM_declare_var_s(var_declare.str().c_str()) ; - TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name + "_data").c_str()) ; - //message_publish(1, "HERE with %s\n", var_declare) ; + var_declare.str("") ; + var_declare.clear() ; + std::string type_string = stl_type_name_convert(abi::__cxa_demangle(typeid(*items).name(), 0, 0, &status )) ; + var_declare << type_string << " " + << object_name << "_" << var_name << "_data[" << cont_size << "]" ; + items = (typename STL::mapped_type *)TMM_declare_var_s(var_declare.str().c_str()) ; + if ( items ) { + TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name + "_data").c_str()) ; + //message_publish(1, "HERE with %s\n", var_declare) ; - /* copy the contents of the map the 2 arrays */ - for ( iter = in_map.begin() , ii = 0 ; iter != in_map.end() ; iter++ , ii++ ) { - std::ostringstream sub_elements ; - sub_elements << object_name << "_" << var_name << "_keys_" << ii ; - keys[ii] = sub_elements.str() ; + /* copy the contents of the map the 2 arrays */ + for ( iter = in_map.begin() , ii = 0 ; iter != in_map.end() ; iter++ , ii++ ) { + std::ostringstream sub_elements ; + sub_elements << object_name << "_" << var_name << "_keys_" << ii ; + keys[ii] = sub_elements.str() ; - std::ostringstream index_string ; - index_string << ii ; - checkpoint_stl( const_cast(iter->first) , - object_name + "_" + var_name + "_keys", index_string.str() ) ; + std::ostringstream index_string ; + index_string << ii ; + checkpoint_stl( const_cast(iter->first) , + object_name + "_" + var_name + "_keys", index_string.str() ) ; - items[ii] = iter->second ; + items[ii] = iter->second ; + } + } } } return 0 ; @@ -235,33 +247,37 @@ int checkpoint_map_stl_sk_sd(STL & in_map , std::string object_name , std::strin var_declare << "std::string " << object_name << "_" << var_name << "_keys[" << cont_size << "]" ; keys = (std::string *)TMM_declare_var_s(var_declare.str().c_str()) ; - TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name + "_keys").c_str()) ; - //message_publish(1, "HERE with %s\n", var_declare) ; + if ( keys ) { + TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name + "_keys").c_str()) ; + //message_publish(1, "HERE with %s\n", var_declare) ; - var_declare.str("") ; - var_declare.clear() ; - var_declare << "std::string " - << object_name << "_" << var_name << "_data[" << cont_size << "]" ; - items = (std::string *)TMM_declare_var_s(var_declare.str().c_str()) ; - TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name + "_data").c_str()) ; - //message_publish(1, "HERE with %s\n", var_declare) ; + var_declare.str("") ; + var_declare.clear() ; + var_declare << "std::string " + << object_name << "_" << var_name << "_data[" << cont_size << "]" ; + items = (std::string *)TMM_declare_var_s(var_declare.str().c_str()) ; + if ( items ) { + TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name + "_data").c_str()) ; + //message_publish(1, "HERE with %s\n", var_declare) ; - /* copy the contents of the map the 2 arrays */ - for ( iter = in_map.begin() , ii = 0 ; iter != in_map.end() ; iter++ , ii++ ) { - std::ostringstream sub_elements ; - sub_elements << object_name << "_" << var_name << "_keys_" << ii ; - keys[ii] = sub_elements.str() ; + /* copy the contents of the map the 2 arrays */ + for ( iter = in_map.begin() , ii = 0 ; iter != in_map.end() ; iter++ , ii++ ) { + std::ostringstream sub_elements ; + sub_elements << object_name << "_" << var_name << "_keys_" << ii ; + keys[ii] = sub_elements.str() ; - std::ostringstream index_string ; - index_string << ii ; - checkpoint_stl( const_cast(iter->first) , - object_name + "_" + var_name + "_keys", index_string.str() ) ; + std::ostringstream index_string ; + index_string << ii ; + checkpoint_stl( const_cast(iter->first) , + object_name + "_" + var_name + "_keys", index_string.str() ) ; - sub_elements << object_name << "_" << var_name << "_data_" << ii ; - items[ii] = sub_elements.str() ; + sub_elements << object_name << "_" << var_name << "_data_" << ii ; + items[ii] = sub_elements.str() ; - checkpoint_stl( iter->second , - object_name + "_" + var_name + "_data", index_string.str() ) ; + checkpoint_stl( iter->second , + object_name + "_" + var_name + "_data", index_string.str() ) ; + } + } } } return 0 ; diff --git a/include/trick/checkpoint_pair.hh b/include/trick/checkpoint_pair.hh index 7591846e..5b710c51 100644 --- a/include/trick/checkpoint_pair.hh +++ b/include/trick/checkpoint_pair.hh @@ -38,17 +38,21 @@ int checkpoint_stl(std::pair & in_pair , std::string object_name var_declare << type_string << " " << object_name << "_" << var_name << "_first[1]" ; first = (FIRST *)TMM_declare_var_s(var_declare.str().c_str()) ; - TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name + "_first").c_str()) ; - first[0] = in_pair.first ; + if ( first ) { + TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name + "_first").c_str()) ; + first[0] = in_pair.first ; - var_declare.str("") ; - var_declare.clear() ; - type_string = stl_type_name_convert(abi::__cxa_demangle(typeid(*second).name(), 0, 0, &status )) ; - var_declare << type_string << " " - << object_name << "_" << var_name << "_second[1]" ; - second = (SECOND *)TMM_declare_var_s(var_declare.str().c_str()) ; - TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name + "_second").c_str()) ; - second[0] = in_pair.second ; + var_declare.str("") ; + var_declare.clear() ; + type_string = stl_type_name_convert(abi::__cxa_demangle(typeid(*second).name(), 0, 0, &status )) ; + var_declare << type_string << " " + << object_name << "_" << var_name << "_second[1]" ; + second = (SECOND *)TMM_declare_var_s(var_declare.str().c_str()) ; + if ( second ) { + TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name + "_second").c_str()) ; + second[0] = in_pair.second ; + } + } return 0 ; } @@ -69,16 +73,20 @@ int checkpoint_stl(std::pair & in_pair , std::string object_name var_declare << type_string << " " << object_name << "_" << var_name << "_first[1]" ; first = (FIRST *)TMM_declare_var_s(var_declare.str().c_str()) ; - TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name + "_first").c_str()) ; - first[0] = in_pair.first ; + if ( first ) { + TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name + "_first").c_str()) ; + first[0] = in_pair.first ; - var_declare.str("") ; - var_declare.clear() ; - var_declare << "std::string " - << object_name << "_" << var_name << "_second[1]" ; - second = (std::string *)TMM_declare_var_s(var_declare.str().c_str()) ; - TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name + "_second").c_str()) ; - checkpoint_stl( in_pair.second , object_name + "_" + var_name , "second" ) ; + var_declare.str("") ; + var_declare.clear() ; + var_declare << "std::string " + << object_name << "_" << var_name << "_second[1]" ; + second = (std::string *)TMM_declare_var_s(var_declare.str().c_str()) ; + if ( second ) { + TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name + "_second").c_str()) ; + checkpoint_stl( in_pair.second , object_name + "_" + var_name , "second" ) ; + } + } return 0 ; } diff --git a/include/trick/checkpoint_queue.hh b/include/trick/checkpoint_queue.hh index f46af853..3cf1ee64 100644 --- a/include/trick/checkpoint_queue.hh +++ b/include/trick/checkpoint_queue.hh @@ -47,12 +47,14 @@ int checkpoint_stl(std::queue & in_stl , std::string object var_declare << type_string << " " << object_name << "_" << var_name << "[" << cont_size << "]" ; items = (ITEM_TYPE *)TMM_declare_var_s(var_declare.str().c_str()) ; - TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name).c_str()) ; - //message_publish(1, "CHECKPOINT_STL_STACK with %s\n", var_declare) ; + if ( items ) { + TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name).c_str()) ; + //message_publish(1, "CHECKPOINT_STL_STACK with %s\n", var_declare) ; - for ( ii = 0 ; ii < cont_size ; ii++ ) { - items[ii] = temp_queue.front() ; - temp_queue.pop() ; + for ( ii = 0 ; ii < cont_size ; ii++ ) { + items[ii] = temp_queue.front() ; + temp_queue.pop() ; + } } } @@ -78,18 +80,20 @@ int checkpoint_stl(std::queue & in_stl , std::string object var_declare << "std::string " << object_name << "_" << var_name << "[" << cont_size << "]" ; items = (std::string *)TMM_declare_var_s(var_declare.str().c_str()) ; - TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name).c_str()) ; - //message_publish(1, "CHECKPOINT_STL_STACK with %s\n", var_declare) ; + if ( items ) { + TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name).c_str()) ; + //message_publish(1, "CHECKPOINT_STL_STACK with %s\n", var_declare) ; - for ( ii = 0 ; ii < cont_size ; ii++ ) { - std::ostringstream sub_elements ; - sub_elements << object_name << "_" << var_name << "_" << ii ; - items[ii] = sub_elements.str() ; + for ( ii = 0 ; ii < cont_size ; ii++ ) { + std::ostringstream sub_elements ; + sub_elements << object_name << "_" << var_name << "_" << ii ; + items[ii] = sub_elements.str() ; - std::ostringstream index_string ; - index_string << ii ; - checkpoint_stl (temp_queue.front(), object_name + "_" + var_name, index_string.str()) ; - temp_queue.pop() ; + std::ostringstream index_string ; + index_string << ii ; + checkpoint_stl (temp_queue.front(), object_name + "_" + var_name, index_string.str()) ; + temp_queue.pop() ; + } } } return 0 ; @@ -116,12 +120,14 @@ int checkpoint_stl(std::priority_queue & in_stl var_declare << type_string << " " << object_name << "_" << var_name << "[" << cont_size << "]" ; items = (ITEM_TYPE *)TMM_declare_var_s(var_declare.str().c_str()) ; - TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name).c_str()) ; - //message_publish(1, "CHECKPOINT_STL_STACK with %s\n", var_declare) ; + if ( items ) { + TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name).c_str()) ; + //message_publish(1, "CHECKPOINT_STL_STACK with %s\n", var_declare) ; - for ( ii = 0 ; ii < cont_size ; ii++ ) { - items[ii] = temp_queue.top() ; - temp_queue.pop() ; + for ( ii = 0 ; ii < cont_size ; ii++ ) { + items[ii] = temp_queue.top() ; + temp_queue.pop() ; + } } } @@ -148,18 +154,20 @@ int checkpoint_stl(std::priority_queue & in_stl var_declare << "std::string " << object_name << "_" << var_name << "[" << cont_size << "]" ; items = (std::string *)TMM_declare_var_s(var_declare.str().c_str()) ; - TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name).c_str()) ; - //message_publish(1, "CHECKPOINT_STL_STACK with %s\n", var_declare) ; + if ( items ) { + TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name).c_str()) ; + //message_publish(1, "CHECKPOINT_STL_STACK with %s\n", var_declare) ; - for ( ii = 0 ; ii < cont_size ; ii++ ) { - std::ostringstream sub_elements ; - sub_elements << object_name << "_" << var_name << "_" << ii ; - items[ii] = sub_elements.str() ; + for ( ii = 0 ; ii < cont_size ; ii++ ) { + std::ostringstream sub_elements ; + sub_elements << object_name << "_" << var_name << "_" << ii ; + items[ii] = sub_elements.str() ; - std::ostringstream index_string ; - index_string << ii ; - checkpoint_stl (const_cast< ITEM_TYPE &>(temp_queue.top()), object_name + "_" + var_name, index_string.str()) ; - temp_queue.pop() ; + std::ostringstream index_string ; + index_string << ii ; + checkpoint_stl (const_cast< ITEM_TYPE &>(temp_queue.top()), object_name + "_" + var_name, index_string.str()) ; + temp_queue.pop() ; + } } } diff --git a/include/trick/checkpoint_sequence_stl.hh b/include/trick/checkpoint_sequence_stl.hh index e135dd5e..1f992864 100644 --- a/include/trick/checkpoint_sequence_stl.hh +++ b/include/trick/checkpoint_sequence_stl.hh @@ -50,12 +50,14 @@ int checkpoint_sequence_i(STL & in_stl , std::string object_name , std::string v var_declare << type_string << " " << object_name << "_" << var_name << "[" << cont_size << "]" ; items = (typename STL::value_type *)TMM_declare_var_s(var_declare.str().c_str()) ; - TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name).c_str()) ; - //message_publish(1, "CHECKPOINT_SEQUENCE_STL with %s\n", var_declare) ; + if ( items ) { + TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name).c_str()) ; + //message_publish(1, "CHECKPOINT_SEQUENCE_STL with %s\n", var_declare) ; - /* copy the contents of the stl */ - for ( ii = 0 , it = in_stl.begin() , end = in_stl.end() ; it != end ; it++ , ii++ ) { - items[ii] = *it ; + /* copy the contents of the stl */ + for ( ii = 0 , it = in_stl.begin() , end = in_stl.end() ; it != end ; it++ , ii++ ) { + items[ii] = *it ; + } } } @@ -84,19 +86,21 @@ int checkpoint_sequence_s(STL & in_stl , std::string object_name , std::string v var_declare << "std::string " << object_name << "_" << var_name << "[" << cont_size << "]" ; items = (std::string *)TMM_declare_var_s(var_declare.str().c_str()) ; - TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name).c_str()) ; - //message_publish(1, "CHECKPOINT_SEQUENCE_STL_STL with %s\n", var_declare.str().c_str()) ; + if ( items ) { + TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name).c_str()) ; + //message_publish(1, "CHECKPOINT_SEQUENCE_STL_STL with %s\n", var_declare.str().c_str()) ; - /* create the names of the sub stl checkpoint names we're going to be using */ - for ( ii = 0 , it = in_stl.begin() , end = in_stl.end() ; it != end ; it++ , ii++ ) { - std::ostringstream sub_elements ; - sub_elements << object_name << "_" << var_name << "_" << ii ; - items[ii] = sub_elements.str() ; + /* create the names of the sub stl checkpoint names we're going to be using */ + for ( ii = 0 , it = in_stl.begin() , end = in_stl.end() ; it != end ; it++ , ii++ ) { + std::ostringstream sub_elements ; + sub_elements << object_name << "_" << var_name << "_" << ii ; + items[ii] = sub_elements.str() ; - std::ostringstream index_string ; - index_string << ii ; - //message_publish(1, "recursive call to checkpoint_stl %s\n", __PRETTY_FUNCTION__) ; - checkpoint_stl( (*it) , object_name + "_" + var_name , index_string.str() ) ; + std::ostringstream index_string ; + index_string << ii ; + //message_publish(1, "recursive call to checkpoint_stl %s\n", __PRETTY_FUNCTION__) ; + checkpoint_stl( (*it) , object_name + "_" + var_name , index_string.str() ) ; + } } } return 0 ; diff --git a/include/trick/checkpoint_stack.hh b/include/trick/checkpoint_stack.hh index 4dca87e5..84d66304 100644 --- a/include/trick/checkpoint_stack.hh +++ b/include/trick/checkpoint_stack.hh @@ -44,12 +44,14 @@ int checkpoint_stl(std::stack & in_stl , std::string object var_declare << type_string << " " << object_name << "_" << var_name << "[" << cont_size << "]" ; items = (ITEM_TYPE *)TMM_declare_var_s(var_declare.str().c_str()) ; - TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name).c_str()) ; - //message_publish(1, "CHECKPOINT_STL_STACK with %s\n", var_declare) ; + if ( items ) { + TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name).c_str()) ; + //message_publish(1, "CHECKPOINT_STL_STACK with %s\n", var_declare) ; - for ( ii = 0 ; ii < cont_size ; ii++ ) { - items[ii] = temp_stack.top() ; - temp_stack.pop() ; + for ( ii = 0 ; ii < cont_size ; ii++ ) { + items[ii] = temp_stack.top() ; + temp_stack.pop() ; + } } } @@ -75,18 +77,20 @@ int checkpoint_stl(std::stack & in_stl , std::string object var_declare << "std::string " << object_name << "_" << var_name << "[" << cont_size << "]" ; items = (std::string *)TMM_declare_var_s(var_declare.str().c_str()) ; - TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name).c_str()) ; - //message_publish(1, "CHECKPOINT_STL_STACK with %s\n", var_declare) ; + if ( items ) { + TMM_add_checkpoint_alloc_dependency(std::string(object_name + "_" + var_name).c_str()) ; + //message_publish(1, "CHECKPOINT_STL_STACK with %s\n", var_declare) ; - for ( ii = 0 ; ii < cont_size ; ii++ ) { - std::ostringstream sub_elements ; - sub_elements << object_name << "_" << var_name << "_" << ii ; - items[ii] = sub_elements.str() ; + for ( ii = 0 ; ii < cont_size ; ii++ ) { + std::ostringstream sub_elements ; + sub_elements << object_name << "_" << var_name << "_" << ii ; + items[ii] = sub_elements.str() ; - std::ostringstream index_string ; - index_string << ii ; - checkpoint_stl (temp_stack.top(), object_name + "_" + var_name, index_string.str()) ; - temp_stack.pop() ; + std::ostringstream index_string ; + index_string << ii ; + checkpoint_stl (temp_stack.top(), object_name + "_" + var_name, index_string.str()) ; + temp_stack.pop() ; + } } }