[Dfsm-devel] dFSM/src/libdfsm sm_route_table.cpp,1.10,1.11 sm_seq.cpp,1.4,1.5 tinput.cpp,1.20,1.21
Status: Beta
Brought to you by:
amoreno
|
From: Andreu M. <am...@us...> - 2004-03-30 15:24:10
|
Update of /cvsroot/dfsm/dFSM/src/libdfsm In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv14192/src/libdfsm Modified Files: sm_route_table.cpp sm_seq.cpp tinput.cpp Log Message: Events are now total ordered. Solved bug in using the same semaphore for sm_route_table and sm_seq Index: tinput.cpp =================================================================== RCS file: /cvsroot/dfsm/dFSM/src/libdfsm/tinput.cpp,v retrieving revision 1.20 retrieving revision 1.21 diff -C2 -d -r1.20 -r1.21 *** tinput.cpp 26 Mar 2004 12:36:52 -0000 1.20 --- tinput.cpp 30 Mar 2004 15:12:31 -0000 1.21 *************** *** 30,33 **** --- 30,36 ---- * $Revision$ * $Log$ + * Revision 1.21 2004/03/30 15:12:31 amoreno + * Events are now total ordered. Solved bug in using the same semaphore for sm_route_table and sm_seq + * * Revision 1.20 2004/03/26 12:36:52 amoreno * Improvement buffer used in tInput::send_to *************** *** 143,147 **** // We should protect against a user mistake in "len". // Retornar coses - // TODO: Total order of events is not guaranteed. Some blocked tool is needed int tInput::send_to(u_int16_t id_msg, const char *data=0,u_int16_t len=0) { --- 146,149 ---- *************** *** 153,158 **** --- 155,183 ---- char *ptr; + if (sizeof(msg)>MAX_PACKET_SIZE) + { + // FIXME: Throw an exception + FSMLOG(0) << "ERROR!: Max. packet size exceeded. Message not sent." << endl; + return 0; + } + msg=new unsigned char[sizeof(tEvent::Event)+len]; + if (msg == NULL) + { + // FIXME: Throw an exception + FSMLOG(0) << "ERROR!: Unable to allocate memory for messaget." << endl; + return 0; + } + event=(tEvent::Event *)msg; + // Compose message. A (tEvent::Event)header + (char *)data + event->id_msg = id_msg; + event->id_sender = atoi(tInput::socket_name); + event->n_seq = tInput::sm_seq->get_n_seq_lock(); //Lock to achive total order of messages + event->size=len; + ptr=(char *)((tEvent::Event *)msg+1); + memcpy(ptr,data,len); + + vector<u_int16_t>::iterator vns_i; vector<u_int16_t> vns = tInput::sm->get_msg_machine(id_msg); *************** *** 161,165 **** char tmp[5]; ! for (vns_i=vns.begin(); vns_i!=vns.end(); ++vns_i) { // Create a socket for the client sockfd = socket(AF_UNIX, SOCK_STREAM, 0); --- 186,191 ---- char tmp[5]; ! for (vns_i=vns.begin(); vns_i!=vns.end(); ++vns_i) ! { // Create a socket for the client sockfd = socket(AF_UNIX, SOCK_STREAM, 0); *************** *** 187,226 **** // Now we can read/write via sockfd FSMLOG(3) <<"Connected to "<<address.sun_path<<endl; ! //msg=new unsigned char[sizeof(tEvent::Event)+len]; ! event=(tEvent::Event *)msg; ! if (msg != NULL) ! { ! // Compose message. A (tEvent::Event)header + (char *)data ! event->id_msg = id_msg; ! event->id_sender = atoi(tInput::socket_name); ! event->n_seq = tInput::sm_seq->get_n_seq(); ! event->size=len; ! ptr=(char *)((tEvent::Event *)msg+1); ! memcpy(ptr,data,len); ! } ! if (sizeof(msg)>MAX_PACKET_SIZE) { ! // FIXME: Throw an exception ! FSMLOG(0) << "ERROR!: Max. packet size exceeded. Message not sent." << endl; } else { ! bytes_sent=write(sockfd, msg, sizeof(tEvent::Event)+len) ; ! if(bytes_sent == -1) { ! // Unregister machine (socket), clean exit. ! FSMLOG(2) <<"Error sending: "<<strerror(errno)<<endl; ! tInput::unregister_machine((*vns_i)); ! } ! else ! { ! FSMLOG(3)<<"Sent "<<len<<" data bytes to "<<address.sun_path<<endl; ! tFSM::monitor->push_send_event(id_msg); ! } } - close(sockfd); - //delete[] msg ; - } } delete[] msg ; return bytes_sent; --- 213,235 ---- // Now we can read/write via sockfd FSMLOG(3) <<"Connected to "<<address.sun_path<<endl; ! ! bytes_sent=write(sockfd, msg, sizeof(tEvent::Event)+len) ; ! if(bytes_sent == -1) { ! // Unregister machine (socket), clean exit. ! FSMLOG(2) <<"Error sending: "<<strerror(errno)<<endl; ! tInput::unregister_machine((*vns_i)); } else { ! FSMLOG(3)<<"Sent "<<len<<" data bytes to "<<address.sun_path<<endl; ! tFSM::monitor->push_send_event(id_msg); } } + close(sockfd); + //delete[] msg ; + } + tInput::sm_seq->get_n_seq_unlock(); delete[] msg ; return bytes_sent; Index: sm_route_table.cpp =================================================================== RCS file: /cvsroot/dfsm/dFSM/src/libdfsm/sm_route_table.cpp,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -d -r1.10 -r1.11 *** sm_route_table.cpp 8 Jan 2004 14:35:41 -0000 1.10 --- sm_route_table.cpp 30 Mar 2004 15:12:31 -0000 1.11 *************** *** 30,33 **** --- 30,36 ---- * $Revision$ * $Log$ + * Revision 1.11 2004/03/30 15:12:31 amoreno + * Events are now total ordered. Solved bug in using the same semaphore for sm_route_table and sm_seq + * * Revision 1.10 2004/01/08 14:35:41 amoreno * Improvement in dump route table *************** *** 87,91 **** // Init semaphore ! tsm_route_table::sem = new tSemaphore(); tsm_route_table::sem->binary_semaphore_wait(); --- 90,94 ---- // Init semaphore ! tsm_route_table::sem = new tSemaphore(SM_SEMAPHORE_KEY); tsm_route_table::sem->binary_semaphore_wait(); Index: sm_seq.cpp =================================================================== RCS file: /cvsroot/dfsm/dFSM/src/libdfsm/sm_seq.cpp,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** sm_seq.cpp 3 Aug 2003 21:12:07 -0000 1.4 --- sm_seq.cpp 30 Mar 2004 15:12:31 -0000 1.5 *************** *** 30,33 **** --- 30,36 ---- * $Revision$ * $Log$ + * Revision 1.5 2004/03/30 15:12:31 amoreno + * Events are now total ordered. Solved bug in using the same semaphore for sm_route_table and sm_seq + * * Revision 1.4 2003/08/03 21:12:07 jvalduvieco * Major cleaning: *************** *** 57,61 **** // Init semaphore ! tsm_seq::sem = new tSemaphore(); tsm_seq::sem->binary_semaphore_wait(); --- 60,64 ---- // Init semaphore ! tsm_seq::sem = new tSemaphore(SEQ_SEMAPHORE_KEY); tsm_seq::sem->binary_semaphore_wait(); *************** *** 82,86 **** } ! u_int32_t tsm_seq::get_n_seq() { u_int32_t r; --- 85,89 ---- } ! u_int32_t tsm_seq::get_n_seq_lock() { u_int32_t r; *************** *** 88,92 **** r = *(tsm_seq::shared_memory)+1; *(tsm_seq::shared_memory) = r; - tsm_seq::sem->binary_semaphore_post(); return r; } --- 91,100 ---- r = *(tsm_seq::shared_memory)+1; *(tsm_seq::shared_memory) = r; return r; } + + bool tsm_seq::get_n_seq_unlock() + { + tsm_seq::sem->binary_semaphore_post(); + return true; + } |