00001 #include "MsgThread.hh"
00002
00003
00004 MsgThread::MsgThread() : Thread() {}
00005
00006
00007 #define MSG_BUFFER_MAX 1024
00008
00009
00010 void MsgThread::Run()
00011 {
00012 unsigned char buf[ MSG_BUFFER_MAX ];
00013 MsgData* msg;
00014 MsgData* feedback;
00015 pid_t rpid;
00016
00017 while( 1 ) {
00018
00019 if( ( rpid = Receive( 0, buf, sizeof(buf) ) ) < 0 ) {
00020 continue;
00021
00022 if ( (*buf) == MSG_KILL_THREAD )
00023 break;
00024
00025 if ( (*buf) == MSG_DATA_ID ) {
00026
00027
00028 msg = (MsgData*)buf;
00029
00030
00031 if( msg->index == MSG_KILL_THREAD )
00032 break;
00033
00034
00035
00036 feedback = Dispatch( msg, this, rpid );
00037
00038 Reply( rpid, &feedback, sizeof(feedback) );
00039
00040 } else {
00041
00042 Reply( rpid, buf, sizeof(buf) );
00043 }
00044 }
00045
00046
00047 Reply( rpid, NULL, 0 );
00048 }
00049
00050
00051 void MsgThread::SendMsg( void* buffer, void* reply )
00052 {
00053 if ( pid < 0 ) { return; }
00054 Send( pid, buffer, reply, sizeof(buffer), sizeof(reply) );
00055 }
00056
00057
00058 void MsgThread::Stop()
00059 {
00060
00061
00062 MsgData* Kill_Msg = new MsgData();
00063
00064 if ( pid < 0 ) { return; }
00065
00066
00067 Send( pid, Kill_Msg, NULL, sizeof( Kill_Msg ), 0 );
00068
00069 _endthread();
00070
00071 pid = -1;
00072 }