root/dmtcpmessagetypes.cpp
/* [<][>][^][v][top][bottom][index][help] */
DEFINITIONS
This source file includes following definitions.
- currentState
- setCurrentState
- theCheckpointInterval
- assertValid
- isValid
- poison
- value
- toString
1 /****************************************************************************
2 * Copyright (C) 2006-2010 by Jason Ansel, Kapil Arya, and Gene Cooperman *
3 * jansel@csail.mit.edu, kapil@ccs.neu.edu, gene@ccs.neu.edu *
4 * *
5 * This file is part of DMTCP. *
6 * *
7 * DMTCP is free software: you can redistribute it and/or *
8 * modify it under the terms of the GNU Lesser General Public License as *
9 * published by the Free Software Foundation, either version 3 of the *
10 * License, or (at your option) any later version. *
11 * *
12 * DMTCP is distributed in the hope that it will be useful, *
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
15 * GNU Lesser General Public License for more details. *
16 * *
17 * You should have received a copy of the GNU Lesser General Public *
18 * License along with DMTCP:dmtcp/src. If not, see *
19 * <http://www.gnu.org/licenses/>. *
20 ****************************************************************************/
21
22 #include "dmtcpmessagetypes.h"
23
24 using namespace dmtcp;
25
26 static WorkerState theState ( WorkerState::RUNNING );
27
28 WorkerState WorkerState::currentState()
29 {
30 return theState;
31 }
32
33 void WorkerState::setCurrentState ( const WorkerState& theValue )
34 {
35 theState = theValue;
36 }
37
38 DmtcpMessage::DmtcpMessage ( DmtcpMessageType t /*= DMT_NULL*/ )
39 :_msgSize ( sizeof ( DmtcpMessage ) )
40 ,extraBytes ( 0 )
41 ,type ( t )
42 ,state ( WorkerState::currentState() )
43 ,from ( UniquePid::ThisProcess() )
44 ,virtualPid ( -1 )
45 ,realPid ( -1 )
46 ,keyLen ( 0 )
47 ,valLen ( 0 )
48 ,numPeers(0)
49 ,isRunning(0)
50 ,coordCmd('\0')
51 ,coordCmdStatus(CoordCmdStatus::NOERROR)
52 ,coordTimeStamp(0)
53 ,theCheckpointInterval ( DMTCPMESSAGE_SAME_CKPT_INTERVAL )
54 {
55 // struct sockaddr_storage _addr;
56 // socklen_t _addrlen;
57 memset(&compGroup, 0, sizeof(compGroup));
58 memset(&ipAddr, 0, sizeof ipAddr);
59 memset(nsid, 0, sizeof nsid);
60 strncpy ( _magicBits,DMTCP_MAGIC_STRING,sizeof ( _magicBits ) );
61 }
62
63 void DmtcpMessage::assertValid() const
64 {
65 JASSERT ( strcmp ( DMTCP_MAGIC_STRING,_magicBits ) == 0 )( _magicBits )
66 .Text ( "read invalid message, _magicBits mismatch."
67 " Did DMTCP coordinator die uncleanly?" );
68 JASSERT ( _msgSize == sizeof ( DmtcpMessage ) ) ( _msgSize ) ( sizeof ( DmtcpMessage ) )
69 .Text ( "read invalid message, size mismatch." );
70 }
71
72 bool DmtcpMessage::isValid() const
73 {
74 if (strcmp(DMTCP_MAGIC_STRING, _magicBits) == 0) {
75 JNOTE("read invalid message, _magicBits mismatch."
76 " Closing remote connection.") (_magicBits);
77 return false;
78 }
79 if (_msgSize == sizeof(DmtcpMessage)) {
80 JNOTE("read invalid message, size mismatch. Closing remote connection.")
81 (_msgSize) (sizeof(DmtcpMessage));
82 return false;
83 }
84 return true;
85 }
86
87 void DmtcpMessage::poison() { memset ( _magicBits,0,sizeof ( _magicBits ) ); }
88
89
90 WorkerState::eWorkerState WorkerState::value() const
91 {
92 JASSERT(_state < _MAX) (_state);
93 return (eWorkerState) _state;
94 }
95
96 ostream& dmtcp::operator << ( dmtcp::ostream& o, const WorkerState& s )
97 {
98 o << "WorkerState::";
99 switch ( s.value() )
100 {
101 #define OSHIFTPRINTF(name) case WorkerState::name: o << #name; break;
102
103 OSHIFTPRINTF ( UNKNOWN )
104 OSHIFTPRINTF ( RUNNING )
105 OSHIFTPRINTF ( SUSPENDED )
106 OSHIFTPRINTF ( FD_LEADER_ELECTION )
107 OSHIFTPRINTF ( NAME_SERVICE_DATA_REGISTERED)
108 OSHIFTPRINTF ( DONE_QUERYING)
109 OSHIFTPRINTF ( DRAINED )
110 OSHIFTPRINTF ( RESTARTING )
111 OSHIFTPRINTF ( CHECKPOINTED )
112 OSHIFTPRINTF ( REFILLED )
113 default:
114 JASSERT ( false ) .Text ( "Invalid WorkerState" );
115 o << (int)s.value();
116 }
117 return o;
118 }
119
120 const char* WorkerState::toString() const{
121 switch(_state){
122 case UNKNOWN: return "UNKNOWN";
123 case RUNNING: return "RUNNING";
124 case SUSPENDED: return "SUSPENDED";
125 case FD_LEADER_ELECTION: return "FD_LEADER_ELECTION";
126 case NAME_SERVICE_DATA_REGISTERED: return "NAME_SERVICE_DATA_REGISTERED";
127 case DONE_QUERYING: return "DONE_QUERYING";
128 case DRAINED: return "DRAINED";
129 case RESTARTING: return "RESTARTING";
130 case CHECKPOINTED: return "CHECKPOINTED";
131 case REFILLED: return "REFILLED";
132 default: return "???";
133 }
134 }
135
136 ostream& dmtcp::operator << ( dmtcp::ostream& o, const DmtcpMessageType & s )
137 {
138 // o << "DmtcpMessageType: ";
139 switch ( s )
140 {
141 #undef OSHIFTPRINTF
142 #define OSHIFTPRINTF(name) case name: o << #name; break;
143
144 OSHIFTPRINTF ( DMT_NULL )
145 OSHIFTPRINTF ( DMT_NEW_WORKER )
146 OSHIFTPRINTF ( DMT_NAME_SERVICE_WORKER )
147 OSHIFTPRINTF ( DMT_RESTART_WORKER )
148 OSHIFTPRINTF ( DMT_ACCEPT )
149 OSHIFTPRINTF ( DMT_REJECT_NOT_RESTARTING )
150 OSHIFTPRINTF ( DMT_REJECT_WRONG_COMP )
151 OSHIFTPRINTF ( DMT_REJECT_NOT_RUNNING )
152
153 OSHIFTPRINTF ( DMT_UPDATE_PROCESS_INFO_AFTER_FORK )
154 OSHIFTPRINTF ( DMT_UPDATE_PROCESS_INFO_AFTER_INIT_OR_EXEC )
155 OSHIFTPRINTF ( DMT_GET_CKPT_DIR )
156 OSHIFTPRINTF ( DMT_GET_CKPT_DIR_RESULT )
157 OSHIFTPRINTF ( DMT_UPDATE_CKPT_DIR )
158
159 OSHIFTPRINTF ( DMT_USER_CMD )
160 OSHIFTPRINTF ( DMT_USER_CMD_RESULT )
161 OSHIFTPRINTF ( DMT_CKPT_FILENAME )
162 OSHIFTPRINTF ( DMT_UNIQUE_CKPT_FILENAME )
163
164 //OSHIFTPRINTF ( DMT_RESTART_PROCESS )
165 //OSHIFTPRINTF ( DMT_RESTART_PROCESS_REPLY )
166
167 OSHIFTPRINTF ( DMT_DO_SUSPEND )
168 OSHIFTPRINTF ( DMT_DO_FD_LEADER_ELECTION )
169 OSHIFTPRINTF ( DMT_DO_DRAIN )
170 OSHIFTPRINTF ( DMT_DO_CHECKPOINT )
171 #ifdef COORD_NAMESERVICE
172 OSHIFTPRINTF ( DMT_DO_REGISTER_NAME_SERVICE_DATA )
173 OSHIFTPRINTF ( DMT_DO_SEND_QUERIES )
174 #endif
175 OSHIFTPRINTF ( DMT_DO_REFILL )
176 OSHIFTPRINTF ( DMT_DO_RESUME )
177 OSHIFTPRINTF ( DMT_KILL_PEER )
178
179 #ifdef COORD_NAMESERVICE
180 OSHIFTPRINTF ( DMT_REGISTER_NAME_SERVICE_DATA )
181 OSHIFTPRINTF ( DMT_REGISTER_NAME_SERVICE_DATA_SYNC )
182 OSHIFTPRINTF ( DMT_REGISTER_NAME_SERVICE_DATA_SYNC_RESPONSE )
183 OSHIFTPRINTF ( DMT_NAME_SERVICE_QUERY )
184 OSHIFTPRINTF ( DMT_NAME_SERVICE_QUERY_RESPONSE )
185 #endif
186
187 OSHIFTPRINTF ( DMT_OK )
188
189 default:
190 JASSERT ( false ) ( s ) .Text ( "Invalid Message Type" );
191 //o << s;
192 }
193 return o;
194 }
195