/*169:*/ //#line 10 "/usr/local/yacco2/library/thread.w" /*565:*/ //#line 24 "/usr/local/yacco2/library/macros.w" /*:565*/ //#line 11 "/usr/local/yacco2/library/thread.w" /*26:*/ //#line 404 "/usr/local/yacco2/library/intro.w" #include "yacco2.h" /*:26*/ //#line 12 "/usr/local/yacco2/library/thread.w" /*142:*/ //#line 137 "/usr/local/yacco2/library/wthread.w" #if THREAD_LIBRARY_TO_USE__ == 1 /*:142*//*143:*/ //#line 144 "/usr/local/yacco2/library/wthread.w" extern void yacco2::CREATE_MUTEX(yacco2::MUTEX&Mu){ Mu= CreateMutex(0,OFF,0); } /*:143*//*144:*/ //#line 150 "/usr/local/yacco2/library/wthread.w" extern void yacco2::LOCK_MUTEX(yacco2::MUTEX&Mu){ WaitForSingleObject(Mu,INFINITE); } /*:144*//*145:*/ //#line 156 "/usr/local/yacco2/library/wthread.w" extern void yacco2::LOCK_MUTEX_OF_CALLED_PARSER (yacco2::MUTEX&Mu,yacco2::Parser&parser,const char*Text){ /*606:*/ //#line 883 "/usr/local/yacco2/library/macros.w" if(yacco2::YACCO2_MU_GRAMMAR__){ /*389:*/ //#line 3053 "/usr/local/yacco2/library/parser.w" LOCK_MUTEX(yacco2::TRACE_MU); if(yacco2::YACCO2_MU_TRACING__){ yacco2::lrclog<<"YACCO2_MU_TRACING__::Acquired trace mu"<id__<<"::"<<" trying to acquire mutex"<id__<<"::"<<" acquired mutex"<id__<<"::"<<" trying to release mutex"<id__<<"::"<<" released mutex"<th_active_cnt__ <<" from: " <thread_no__<<"::" <thread_name() <id__<<"::"<<" trying to acquire mutex"<id__<<"::"<<" acquired mutex"<id__<<"::"<<" trying to release mutex"<id__<<"::"<<" released mutex"<id__<<"::"<<" before release mutex by pthread_cond_wait()"<<__FILE__<<__LINE__<th_active_cnt__ <<" from: " <thread_no__<<"::" <thread_name() <th_accepting_cnt__> 1){ char a[BUFFER_SIZE]; yacco2::KCHARP msg= "no arbitration code present in %s - accept token queue has %i > 1 tokens to arbitrate on"; sprintf(a,msg,ar_name.c_str(),Caller_pp->th_accepting_cnt__); Yacco2_faulty_precondition(a,__FILE__,__LINE__); exit(1); } /*:176*/ //#line 93 "/usr/local/yacco2/library/thread.w" /*31:*/ //#line 424 "/usr/local/yacco2/library/intro.w" #include "war_end_code.h" /*:31*/ //#line 94 "/usr/local/yacco2/library/thread.w" } /*:175*//*177:*/ //#line 134 "/usr/local/yacco2/library/thread.w" yacco2::worker_thread_blk::worker_thread_blk() :grammar_s_parser__(0) ,status__(0),run_cnt__(1),thd_id__(0){ static bool init_gbl(OFF); if(init_gbl==OFF){ init_gbl= ON; CREATE_MUTEX(yacco2::TH_TBL_MU); CREATE_MUTEX(yacco2::TRACE_MU); CREATE_MUTEX(yacco2::TOKEN_MU); CREATE_MUTEX(yacco2::SYM_TBL_MU); } } /*:177*//*178:*/ //#line 156 "/usr/local/yacco2/library/thread.w" yacco2::worker_thread_blk::worker_thread_blk(yacco2::Parser*Grammar_s_parser ,yacco2::Parser*Calling_parser) :grammar_s_parser__(Grammar_s_parser) ,status__(THREAD_WAITING_FOR_WORK) ,run_cnt__(1) ,thd_id__(grammar_s_parser__->thread_entry__->thd_id__){ status__= THREAD_WORKING; Parallel_thread_list_type&i= Parallel_thread_table[grammar_s_parser__->thread_entry__->thd_id__]; i.push_back(this); /*618:*/ //#line 1047 "/usr/local/yacco2/library/macros.w" if(yacco2::YACCO2_MSG__){ /*389:*/ //#line 3053 "/usr/local/yacco2/library/parser.w" LOCK_MUTEX(yacco2::TRACE_MU); if(yacco2::YACCO2_MU_TRACING__){ yacco2::lrclog<<"YACCO2_MU_TRACING__::Acquired trace mu"<grammar_s_parser__->thread_no__ <<"::"<grammar_s_parser__->thread_name() <<" th_blk*: "<grammar_s_parser__ <<" this^pp^th_blk: "<<&this->grammar_s_parser__->th_blk__ <<"pp*: "<th_blk__ <<" #: "<thread_no__ <<"::"<thread_name() <<" of grammar: "<fsm_tbl__->id__ <grammar_s_parser__->thread_no__ <<"::"<grammar_s_parser__->thread_name() <<" th_blk*: "<grammar_s_parser__ <<"pp*: "<th_blk__ <<" #: "<thread_no__ <<"::"<fsm_tbl__->id__ <grammar_s_parser__->thread_no__ <<"::"<grammar_s_parser__->thread_name() <<" th_blk*: "<grammar_s_parser__ <<"pp*: "<th_blk__ <<" #: "<thread_no__ <<"::"<fsm_tbl__->id__ < Attempting to acquire thread table Mutex"< Acquired thread table Mutex"<begin(); Parallel_thread_list_iterator_type me= k->end(); for(;m!=me;++m){ ++no_thds_to_shutdown; } } yacco2::lrclog<<"Number of threads in table to shutdown: "<begin(); Parallel_thread_list_iterator_type me= k->end(); for(;m!=me;++m){ worker_thread_blk*tb= *m; /*389:*/ //#line 3053 "/usr/local/yacco2/library/parser.w" LOCK_MUTEX(yacco2::TRACE_MU); if(yacco2::YACCO2_MU_TRACING__){ yacco2::lrclog<<"YACCO2_MU_TRACING__::Acquired trace mu"<grammar_s_parser__->thread_no__ <<"::"<grammar_s_parser__->thread_name() <<" run cnt: "<run_cnt__; switch(tb->status__){ case THREAD_WAITING_FOR_WORK:{ yacco2::lrclog<<" waiting for work"; break; } case THREAD_WORKING:{ yacco2::lrclog<<" working"; break; } case THREAD_TO_EXIT:{ yacco2::lrclog<<" thread to exit"; break; } default:{ yacco2::lrclog<<" ??? thread status: "<status__; break; } } yacco2::lrclog<<__FILE__<<__LINE__<begin(); Parallel_thread_list_iterator_type je= i->end(); for(;j!=je;++j){ worker_thread_blk*tb= *j; if(tb->status__==THREAD_WAITING_FOR_WORK){ /*389:*/ //#line 3053 "/usr/local/yacco2/library/parser.w" LOCK_MUTEX(yacco2::TRACE_MU); if(yacco2::YACCO2_MU_TRACING__){ yacco2::lrclog<<"YACCO2_MU_TRACING__::Acquired trace mu"<grammar_s_parser__->thread_no__ <<"::"<grammar_s_parser__->thread_name() <<" tb* "<grammar_s_parser__->mu__ ,*tb->grammar_s_parser__," of called thread"); tb->status__= THREAD_TO_EXIT; PP.post_event_to_requesting_grammar(*tb->grammar_s_parser__,Shutdown,PP); } else{ /*389:*/ //#line 3053 "/usr/local/yacco2/library/parser.w" LOCK_MUTEX(yacco2::TRACE_MU); if(yacco2::YACCO2_MU_TRACING__){ yacco2::lrclog<<"YACCO2_MU_TRACING__::Acquired trace mu"<grammar_s_parser__->thread_no__ <<"::"<grammar_s_parser__->thread_name() <<" tb* "<status__ <<__FILE__<<__LINE__<clear(); } Parallel_thread_table.clear(); yacco2::lrclog<<"Number of threads in table exiting: " < Attempting to release thread table Mutex"< Released thread table Mutex"<no_entries__; div_t x= div(no_of_gbl_thds,BITS_PER_WORD); if(x.rem!=0)++x.quot; no_bit_mapped_words= x.quot; } if(P_tbl.thd_id_bit_map__==0){ /*215:*/ //#line 895 "/usr/local/yacco2/library/thread.w" yacco2::Thread_entry**S_cur_thread_entry_ptr= (yacco2::Thread_entry**)&P_tbl.first_entry__; yacco2::USINT S_no_thd_entries= P_tbl.no_entries__; /*:215*/ //#line 869 "/usr/local/yacco2/library/thread.w" yacco2::ULINT(*maps)= (yacco2::ULINT(*))yacco2::BIT_MAPS_FOR_SALE__; P_tbl.thd_id_bit_map__= (yacco2::ULINT(*))&maps[yacco2::BIT_MAP_IDX__]; yacco2::BIT_MAP_IDX__+= no_bit_mapped_words; if(yacco2::BIT_MAP_IDX__> yacco2::TOTAL_NO_BIT_WORDS__){ char a[BUFFER_SIZE]; yacco2::KCHARP msg= "Err no more bit maps: %i; adjust TOTAL_NO_BIT_WORDS in Linker"; sprintf(a,msg,yacco2::BIT_MAP_IDX__); Yacco2_faulty_precondition(a,__FILE__,__LINE__); exit(1); } div_t dd; for(;S_no_thd_entries> 0;--S_no_thd_entries,++S_cur_thread_entry_ptr){ yacco2::USINT S_thd_id= (*S_cur_thread_entry_ptr)->thd_id__; dd= div(S_thd_id,BITS_PER_WORD); ULINT bit_pos_value= 1<first_entry__[Current_T_id]; T_cur_thd_id_map= T_cur_thd_id_having_T_ptr->first_thd_id__[0]; /*:216*/ //#line 836 "/usr/local/yacco2/library/thread.w" /*214:*/ //#line 891 "/usr/local/yacco2/library/thread.w" yacco2::ULINT S_cur_thd_id_map= P_tbl.thd_id_bit_map__[0]; /*:214*/ //#line 837 "/usr/local/yacco2/library/thread.w" /*217:*/ //#line 929 "/usr/local/yacco2/library/thread.w" int base_idx_for_thd_id_calc(0); int cur_bit_word_idx(0); do{ yacco2::ULINT bit_map= T_cur_thd_id_map&S_cur_thd_id_map; if(bit_map!=0){ base_idx_for_thd_id_calc= cur_bit_word_idx*BITS_PER_WORD; /*218:*/ //#line 949 "/usr/local/yacco2/library/thread.w" yacco2::ULINT bit(1); for(int bit_pos= 0;bit_pos<=BITS_PER_WORD_REL_0;++bit_pos){ if(bit_map&bit){ /*219:*/ //#line 959 "/usr/local/yacco2/library/thread.w" yacco2::USINT thd_id= base_idx_for_thd_id_calc+bit_pos; Th_list.push_back(thds->first_entry__[thd_id]); /*:219*/ //#line 953 "/usr/local/yacco2/library/thread.w" } bit<<= 1; } /*:218*/ //#line 936 "/usr/local/yacco2/library/thread.w" } ++cur_bit_word_idx; T_cur_thd_id_map= T_cur_thd_id_having_T_ptr->first_thd_id__[cur_bit_word_idx]; S_cur_thd_id_map= P_tbl.thd_id_bit_map__[cur_bit_word_idx]; }while(cur_bit_word_idx