| Marc Slemko | 3ea0033 | 2006-08-17 01:11:13 +0000 | [diff] [blame] | 1 | #include <concurrency/ThreadManager.h> | 
 | 2 | #include <concurrency/PosixThreadFactory.h> | 
 | 3 | #include <concurrency/Monitor.h> | 
 | 4 | #include <concurrency/Util.h> | 
| Mark Slee | b9ff32a | 2006-11-16 01:00:24 +0000 | [diff] [blame] | 5 | #include <concurrency/Mutex.h> | 
| Marc Slemko | 3ea0033 | 2006-08-17 01:11:13 +0000 | [diff] [blame] | 6 | #include <protocol/TBinaryProtocol.h> | 
 | 7 | #include <server/TSimpleServer.h> | 
 | 8 | #include <server/TThreadPoolServer.h> | 
| Mark Slee | 739dbe5 | 2007-02-01 22:55:30 +0000 | [diff] [blame] | 9 | #include <server/TThreadedServer.h> | 
| Marc Slemko | 3ea0033 | 2006-08-17 01:11:13 +0000 | [diff] [blame] | 10 | #include <transport/TServerSocket.h> | 
 | 11 | #include <transport/TSocket.h> | 
| Mark Slee | d717347 | 2006-10-25 19:52:10 +0000 | [diff] [blame] | 12 | #include <transport/TTransportUtils.h> | 
| Aditya Agarwal | 25b2936 | 2006-12-09 00:58:15 +0000 | [diff] [blame] | 13 | #include <transport/TFileTransport.h> | 
| Aditya Agarwal | e9ef8d7 | 2006-12-08 23:52:57 +0000 | [diff] [blame] | 14 | #include <TLogging.h> | 
| Aditya Agarwal | 3950f47 | 2006-10-11 02:50:15 +0000 | [diff] [blame] | 15 |  | 
 | 16 | #include "Service.h" | 
| Marc Slemko | 3ea0033 | 2006-08-17 01:11:13 +0000 | [diff] [blame] | 17 |  | 
 | 18 | #include <iostream> | 
 | 19 | #include <set> | 
 | 20 | #include <stdexcept> | 
 | 21 | #include <sstream> | 
 | 22 |  | 
| Mark Slee | b9ff32a | 2006-11-16 01:00:24 +0000 | [diff] [blame] | 23 | #include <map> | 
 | 24 | #include <ext/hash_map> | 
 | 25 | using __gnu_cxx::hash_map; | 
 | 26 | using __gnu_cxx::hash; | 
 | 27 |  | 
| Marc Slemko | 3ea0033 | 2006-08-17 01:11:13 +0000 | [diff] [blame] | 28 | using namespace std; | 
| Mark Slee | f4f18ec | 2007-05-16 21:22:34 +0000 | [diff] [blame] | 29 | using namespace boost; | 
| Marc Slemko | 3ea0033 | 2006-08-17 01:11:13 +0000 | [diff] [blame] | 30 |  | 
 | 31 | using namespace facebook::thrift; | 
 | 32 | using namespace facebook::thrift::protocol; | 
 | 33 | using namespace facebook::thrift::transport; | 
 | 34 | using namespace facebook::thrift::server; | 
| Mark Slee | b9ff32a | 2006-11-16 01:00:24 +0000 | [diff] [blame] | 35 | using namespace facebook::thrift::concurrency; | 
| Marc Slemko | 3ea0033 | 2006-08-17 01:11:13 +0000 | [diff] [blame] | 36 |  | 
 | 37 | using namespace test::stress; | 
 | 38 |  | 
| Mark Slee | b9ff32a | 2006-11-16 01:00:24 +0000 | [diff] [blame] | 39 | struct eqstr { | 
 | 40 |   bool operator()(const char* s1, const char* s2) const { | 
 | 41 |     return strcmp(s1, s2) == 0; | 
 | 42 |   } | 
 | 43 | }; | 
 | 44 |  | 
 | 45 | struct ltstr { | 
 | 46 |   bool operator()(const char* s1, const char* s2) const { | 
 | 47 |     return strcmp(s1, s2) < 0; | 
 | 48 |   } | 
 | 49 | }; | 
 | 50 |  | 
 | 51 |  | 
| David Reiss | 0c90f6f | 2008-02-06 22:18:40 +0000 | [diff] [blame^] | 52 | // typedef hash_map<const char*, int, hash<const char*>, eqstr> count_map; | 
 | 53 | typedef map<const char*, int, ltstr> count_map; | 
| Mark Slee | b9ff32a | 2006-11-16 01:00:24 +0000 | [diff] [blame] | 54 |  | 
| Aditya Agarwal | 3950f47 | 2006-10-11 02:50:15 +0000 | [diff] [blame] | 55 | class Server : public ServiceIf { | 
| Marc Slemko | 3ea0033 | 2006-08-17 01:11:13 +0000 | [diff] [blame] | 56 |  public: | 
| Mark Slee | b9ff32a | 2006-11-16 01:00:24 +0000 | [diff] [blame] | 57 |   Server() {} | 
 | 58 |  | 
 | 59 |   void count(const char* method) { | 
| David Reiss | 4637990 | 2008-02-04 19:23:57 +0000 | [diff] [blame] | 60 |     Guard m(lock_); | 
| Mark Slee | b9ff32a | 2006-11-16 01:00:24 +0000 | [diff] [blame] | 61 |     int ct = counts_[method]; | 
 | 62 |     counts_[method] = ++ct; | 
 | 63 |   } | 
 | 64 |  | 
 | 65 |   void echoVoid() { | 
 | 66 |     count("echoVoid"); | 
 | 67 |     return; | 
 | 68 |   } | 
 | 69 |  | 
 | 70 |   count_map getCount() { | 
| David Reiss | 4637990 | 2008-02-04 19:23:57 +0000 | [diff] [blame] | 71 |     Guard m(lock_); | 
| Mark Slee | b9ff32a | 2006-11-16 01:00:24 +0000 | [diff] [blame] | 72 |     return counts_; | 
 | 73 |   } | 
 | 74 |  | 
| Mark Slee | 739dbe5 | 2007-02-01 22:55:30 +0000 | [diff] [blame] | 75 |   int8_t echoByte(const int8_t arg) {return arg;} | 
 | 76 |   int32_t echoI32(const int32_t arg) {return arg;} | 
 | 77 |   int64_t echoI64(const int64_t arg) {return arg;} | 
 | 78 |   void echoString(string& out, const string &arg) { | 
| Aditya Agarwal | e9ef8d7 | 2006-12-08 23:52:57 +0000 | [diff] [blame] | 79 |     if (arg != "hello") { | 
 | 80 |       T_ERROR_ABORT("WRONG STRING!!!!"); | 
 | 81 |     } | 
| Mark Slee | 739dbe5 | 2007-02-01 22:55:30 +0000 | [diff] [blame] | 82 |     out = arg; | 
| Aditya Agarwal | e9ef8d7 | 2006-12-08 23:52:57 +0000 | [diff] [blame] | 83 |   } | 
| Mark Slee | 739dbe5 | 2007-02-01 22:55:30 +0000 | [diff] [blame] | 84 |   void echoList(vector<int8_t> &out, const vector<int8_t> &arg) { out = arg; } | 
 | 85 |   void echoSet(set<int8_t> &out, const set<int8_t> &arg) { out = arg; } | 
 | 86 |   void echoMap(map<int8_t, int8_t> &out, const map<int8_t, int8_t> &arg) { out = arg; } | 
| Mark Slee | b9ff32a | 2006-11-16 01:00:24 +0000 | [diff] [blame] | 87 |  | 
 | 88 | private: | 
 | 89 |   count_map counts_; | 
 | 90 |   Mutex lock_; | 
 | 91 |  | 
| Marc Slemko | 3ea0033 | 2006-08-17 01:11:13 +0000 | [diff] [blame] | 92 | }; | 
 | 93 |  | 
 | 94 | class ClientThread: public Runnable { | 
 | 95 | public: | 
 | 96 |  | 
| Marc Slemko | d97eb61 | 2006-08-24 23:37:36 +0000 | [diff] [blame] | 97 |   ClientThread(shared_ptr<TTransport>transport, shared_ptr<ServiceClient> client, Monitor& monitor, size_t& workerCount, size_t loopCount, TType loopType) : | 
| Marc Slemko | 3ea0033 | 2006-08-17 01:11:13 +0000 | [diff] [blame] | 98 |     _transport(transport), | 
 | 99 |     _client(client), | 
 | 100 |     _monitor(monitor), | 
 | 101 |     _workerCount(workerCount), | 
| Marc Slemko | d97eb61 | 2006-08-24 23:37:36 +0000 | [diff] [blame] | 102 |     _loopCount(loopCount), | 
 | 103 |     _loopType(loopType) | 
| Marc Slemko | 3ea0033 | 2006-08-17 01:11:13 +0000 | [diff] [blame] | 104 |   {} | 
 | 105 |  | 
 | 106 |   void run() { | 
 | 107 |  | 
| David Reiss | 0c90f6f | 2008-02-06 22:18:40 +0000 | [diff] [blame^] | 108 |     // Wait for all worker threads to start | 
| Marc Slemko | 3ea0033 | 2006-08-17 01:11:13 +0000 | [diff] [blame] | 109 |  | 
 | 110 |     {Synchronized s(_monitor); | 
| David Reiss | 0c90f6f | 2008-02-06 22:18:40 +0000 | [diff] [blame^] | 111 |       while(_workerCount == 0) { | 
 | 112 |         _monitor.wait(); | 
 | 113 |       } | 
| Marc Slemko | 3ea0033 | 2006-08-17 01:11:13 +0000 | [diff] [blame] | 114 |     } | 
 | 115 |  | 
 | 116 |     _startTime = Util::currentTime(); | 
 | 117 |  | 
 | 118 |     _transport->open(); | 
 | 119 |  | 
| Marc Slemko | d97eb61 | 2006-08-24 23:37:36 +0000 | [diff] [blame] | 120 |     switch(_loopType) { | 
 | 121 |     case T_VOID: loopEchoVoid(); break; | 
 | 122 |     case T_BYTE: loopEchoByte(); break; | 
| Marc Slemko | d97eb61 | 2006-08-24 23:37:36 +0000 | [diff] [blame] | 123 |     case T_I32: loopEchoI32(); break; | 
 | 124 |     case T_I64: loopEchoI64(); break; | 
| Marc Slemko | d97eb61 | 2006-08-24 23:37:36 +0000 | [diff] [blame] | 125 |     case T_STRING: loopEchoString(); break; | 
 | 126 |     default: cerr << "Unexpected loop type" << _loopType << endl; break; | 
| Marc Slemko | 3ea0033 | 2006-08-17 01:11:13 +0000 | [diff] [blame] | 127 |     } | 
| David Reiss | 0c90f6f | 2008-02-06 22:18:40 +0000 | [diff] [blame^] | 128 |  | 
| Marc Slemko | 3ea0033 | 2006-08-17 01:11:13 +0000 | [diff] [blame] | 129 |     _endTime = Util::currentTime(); | 
 | 130 |  | 
 | 131 |     _transport->close(); | 
| David Reiss | 0c90f6f | 2008-02-06 22:18:40 +0000 | [diff] [blame^] | 132 |  | 
| Marc Slemko | 3ea0033 | 2006-08-17 01:11:13 +0000 | [diff] [blame] | 133 |     _done = true; | 
| David Reiss | 0c90f6f | 2008-02-06 22:18:40 +0000 | [diff] [blame^] | 134 |  | 
| Marc Slemko | 3ea0033 | 2006-08-17 01:11:13 +0000 | [diff] [blame] | 135 |     {Synchronized s(_monitor); | 
 | 136 |  | 
 | 137 |       _workerCount--; | 
| David Reiss | 0c90f6f | 2008-02-06 22:18:40 +0000 | [diff] [blame^] | 138 |  | 
| Mark Slee | 3e5d2d7 | 2007-06-15 01:45:56 +0000 | [diff] [blame] | 139 |       if (_workerCount == 0) { | 
| David Reiss | 0c90f6f | 2008-02-06 22:18:40 +0000 | [diff] [blame^] | 140 |  | 
 | 141 |         _monitor.notify(); | 
| Marc Slemko | 3ea0033 | 2006-08-17 01:11:13 +0000 | [diff] [blame] | 142 |       } | 
 | 143 |     } | 
 | 144 |   } | 
| Marc Slemko | d97eb61 | 2006-08-24 23:37:36 +0000 | [diff] [blame] | 145 |  | 
 | 146 |   void loopEchoVoid() { | 
| Mark Slee | 3e5d2d7 | 2007-06-15 01:45:56 +0000 | [diff] [blame] | 147 |     for (size_t ix = 0; ix < _loopCount; ix++) { | 
| Marc Slemko | d97eb61 | 2006-08-24 23:37:36 +0000 | [diff] [blame] | 148 |       _client->echoVoid(); | 
 | 149 |     } | 
 | 150 |   } | 
 | 151 |  | 
 | 152 |   void loopEchoByte() { | 
| Mark Slee | 3e5d2d7 | 2007-06-15 01:45:56 +0000 | [diff] [blame] | 153 |     for (size_t ix = 0; ix < _loopCount; ix++) { | 
| Aditya Agarwal | 3950f47 | 2006-10-11 02:50:15 +0000 | [diff] [blame] | 154 |       int8_t arg = 1; | 
 | 155 |       int8_t result; | 
| Marc Slemko | d97eb61 | 2006-08-24 23:37:36 +0000 | [diff] [blame] | 156 |       result =_client->echoByte(arg); | 
 | 157 |       assert(result == arg); | 
 | 158 |     } | 
 | 159 |   } | 
| David Reiss | 0c90f6f | 2008-02-06 22:18:40 +0000 | [diff] [blame^] | 160 |  | 
| Marc Slemko | d97eb61 | 2006-08-24 23:37:36 +0000 | [diff] [blame] | 161 |   void loopEchoI32() { | 
| Mark Slee | 3e5d2d7 | 2007-06-15 01:45:56 +0000 | [diff] [blame] | 162 |     for (size_t ix = 0; ix < _loopCount; ix++) { | 
| Aditya Agarwal | 3950f47 | 2006-10-11 02:50:15 +0000 | [diff] [blame] | 163 |       int32_t arg = 1; | 
 | 164 |       int32_t result; | 
| Marc Slemko | d97eb61 | 2006-08-24 23:37:36 +0000 | [diff] [blame] | 165 |       result =_client->echoI32(arg); | 
 | 166 |       assert(result == arg); | 
 | 167 |     } | 
 | 168 |   } | 
 | 169 |  | 
 | 170 |   void loopEchoI64() { | 
| Mark Slee | 3e5d2d7 | 2007-06-15 01:45:56 +0000 | [diff] [blame] | 171 |     for (size_t ix = 0; ix < _loopCount; ix++) { | 
| Aditya Agarwal | 3950f47 | 2006-10-11 02:50:15 +0000 | [diff] [blame] | 172 |       int64_t arg = 1; | 
 | 173 |       int64_t result; | 
| Marc Slemko | d97eb61 | 2006-08-24 23:37:36 +0000 | [diff] [blame] | 174 |       result =_client->echoI64(arg); | 
 | 175 |       assert(result == arg); | 
 | 176 |     } | 
 | 177 |   } | 
| David Reiss | 0c90f6f | 2008-02-06 22:18:40 +0000 | [diff] [blame^] | 178 |  | 
| Marc Slemko | d97eb61 | 2006-08-24 23:37:36 +0000 | [diff] [blame] | 179 |   void loopEchoString() { | 
| Mark Slee | 3e5d2d7 | 2007-06-15 01:45:56 +0000 | [diff] [blame] | 180 |     for (size_t ix = 0; ix < _loopCount; ix++) { | 
| Marc Slemko | d97eb61 | 2006-08-24 23:37:36 +0000 | [diff] [blame] | 181 |       string arg = "hello"; | 
 | 182 |       string result; | 
| Mark Slee | 739dbe5 | 2007-02-01 22:55:30 +0000 | [diff] [blame] | 183 |       _client->echoString(result, arg); | 
| Marc Slemko | d97eb61 | 2006-08-24 23:37:36 +0000 | [diff] [blame] | 184 |       assert(result == arg); | 
 | 185 |     } | 
 | 186 |   } | 
| David Reiss | 0c90f6f | 2008-02-06 22:18:40 +0000 | [diff] [blame^] | 187 |  | 
| Marc Slemko | 3ea0033 | 2006-08-17 01:11:13 +0000 | [diff] [blame] | 188 |   shared_ptr<TTransport> _transport; | 
 | 189 |   shared_ptr<ServiceClient> _client; | 
 | 190 |   Monitor& _monitor; | 
 | 191 |   size_t& _workerCount; | 
 | 192 |   size_t _loopCount; | 
| Marc Slemko | d97eb61 | 2006-08-24 23:37:36 +0000 | [diff] [blame] | 193 |   TType _loopType; | 
| Marc Slemko | 3ea0033 | 2006-08-17 01:11:13 +0000 | [diff] [blame] | 194 |   long long _startTime; | 
 | 195 |   long long _endTime; | 
 | 196 |   bool _done; | 
 | 197 |   Monitor _sleep; | 
 | 198 | }; | 
| Aditya Agarwal | e9ef8d7 | 2006-12-08 23:52:57 +0000 | [diff] [blame] | 199 |  | 
 | 200 |  | 
| Marc Slemko | 3ea0033 | 2006-08-17 01:11:13 +0000 | [diff] [blame] | 201 | int main(int argc, char **argv) { | 
 | 202 |  | 
| Aditya Agarwal | e9ef8d7 | 2006-12-08 23:52:57 +0000 | [diff] [blame] | 203 |   int port = 9091; | 
| Marc Slemko | 3ea0033 | 2006-08-17 01:11:13 +0000 | [diff] [blame] | 204 |   string serverType = "thread-pool"; | 
 | 205 |   string protocolType = "binary"; | 
 | 206 |   size_t workerCount = 4; | 
| Aditya Agarwal | e9ef8d7 | 2006-12-08 23:52:57 +0000 | [diff] [blame] | 207 |   size_t clientCount = 20; | 
 | 208 |   size_t loopCount = 50000; | 
| Marc Slemko | d97eb61 | 2006-08-24 23:37:36 +0000 | [diff] [blame] | 209 |   TType loopType  = T_VOID; | 
 | 210 |   string callName = "echoVoid"; | 
| Marc Slemko | b09f588 | 2006-08-23 22:03:34 +0000 | [diff] [blame] | 211 |   bool runServer = true; | 
| Aditya Agarwal | 3950f47 | 2006-10-11 02:50:15 +0000 | [diff] [blame] | 212 |   bool logRequests = false; | 
 | 213 |   string requestLogPath = "./requestlog.tlog"; | 
| Aditya Agarwal | e9ef8d7 | 2006-12-08 23:52:57 +0000 | [diff] [blame] | 214 |   bool replayRequests = false; | 
| Marc Slemko | 3ea0033 | 2006-08-17 01:11:13 +0000 | [diff] [blame] | 215 |  | 
| Marc Slemko | b09f588 | 2006-08-23 22:03:34 +0000 | [diff] [blame] | 216 |   ostringstream usage; | 
| Marc Slemko | 3ea0033 | 2006-08-17 01:11:13 +0000 | [diff] [blame] | 217 |  | 
 | 218 |   usage << | 
| Marc Slemko | b09f588 | 2006-08-23 22:03:34 +0000 | [diff] [blame] | 219 |     argv[0] << " [--port=<port number>] [--server] [--server-type=<server-type>] [--protocol-type=<protocol-type>] [--workers=<worker-count>] [--clients=<client-count>] [--loop=<loop-count>]" << endl << | 
 | 220 |     "\tclients        Number of client threads to create - 0 implies no clients, i.e. server only.  Default is " << clientCount << endl << | 
 | 221 |     "\thelp           Prints this help text." << endl << | 
| Marc Slemko | d97eb61 | 2006-08-24 23:37:36 +0000 | [diff] [blame] | 222 |     "\tcall           Service method to call.  Default is " << callName << endl << | 
| Marc Slemko | b09f588 | 2006-08-23 22:03:34 +0000 | [diff] [blame] | 223 |     "\tloop           The number of remote thrift calls each client makes.  Default is " << loopCount << endl << | 
 | 224 |     "\tport           The port the server and clients should bind to for thrift network connections.  Default is " << port << endl << | 
 | 225 |     "\tserver         Run the Thrift server in this process.  Default is " << runServer << endl << | 
 | 226 |     "\tserver-type    Type of server, \"simple\" or \"thread-pool\".  Default is " << serverType << endl << | 
 | 227 |     "\tprotocol-type  Type of protocol, \"binary\", \"ascii\", or \"xml\".  Default is " << protocolType << endl << | 
| Aditya Agarwal | 3950f47 | 2006-10-11 02:50:15 +0000 | [diff] [blame] | 228 |     "\tlog-request    Log all request to ./requestlog.tlog. Default is " << logRequests << endl << | 
| Aditya Agarwal | e9ef8d7 | 2006-12-08 23:52:57 +0000 | [diff] [blame] | 229 |     "\treplay-request Replay requests from log file (./requestlog.tlog) Default is " << replayRequests << endl << | 
| Marc Slemko | b09f588 | 2006-08-23 22:03:34 +0000 | [diff] [blame] | 230 |     "\tworkers        Number of thread pools workers.  Only valid for thread-pool server type.  Default is " << workerCount << endl; | 
| David Reiss | 0c90f6f | 2008-02-06 22:18:40 +0000 | [diff] [blame^] | 231 |  | 
 | 232 |  | 
| Marc Slemko | 3ea0033 | 2006-08-17 01:11:13 +0000 | [diff] [blame] | 233 |   map<string, string>  args; | 
| David Reiss | 0c90f6f | 2008-02-06 22:18:40 +0000 | [diff] [blame^] | 234 |  | 
| Mark Slee | 3e5d2d7 | 2007-06-15 01:45:56 +0000 | [diff] [blame] | 235 |   for (int ix = 1; ix < argc; ix++) { | 
| Marc Slemko | 3ea0033 | 2006-08-17 01:11:13 +0000 | [diff] [blame] | 236 |  | 
 | 237 |     string arg(argv[ix]); | 
 | 238 |  | 
| Mark Slee | 3e5d2d7 | 2007-06-15 01:45:56 +0000 | [diff] [blame] | 239 |     if (arg.compare(0,2, "--") == 0) { | 
| Marc Slemko | 3ea0033 | 2006-08-17 01:11:13 +0000 | [diff] [blame] | 240 |  | 
 | 241 |       size_t end = arg.find_first_of("=", 2); | 
 | 242 |  | 
| Marc Slemko | 056f9ba | 2006-08-17 02:59:05 +0000 | [diff] [blame] | 243 |       string key = string(arg, 2, end - 2); | 
 | 244 |  | 
| Mark Slee | 3e5d2d7 | 2007-06-15 01:45:56 +0000 | [diff] [blame] | 245 |       if (end != string::npos) { | 
| David Reiss | 0c90f6f | 2008-02-06 22:18:40 +0000 | [diff] [blame^] | 246 |         args[key] = string(arg, end + 1); | 
| Marc Slemko | 3ea0033 | 2006-08-17 01:11:13 +0000 | [diff] [blame] | 247 |       } else { | 
| David Reiss | 0c90f6f | 2008-02-06 22:18:40 +0000 | [diff] [blame^] | 248 |         args[key] = "true"; | 
| Marc Slemko | 3ea0033 | 2006-08-17 01:11:13 +0000 | [diff] [blame] | 249 |       } | 
| Marc Slemko | 3ea0033 | 2006-08-17 01:11:13 +0000 | [diff] [blame] | 250 |     } else { | 
 | 251 |       throw invalid_argument("Unexcepted command line token: "+arg); | 
 | 252 |     } | 
 | 253 |   } | 
 | 254 |  | 
 | 255 |   try { | 
 | 256 |  | 
| Mark Slee | 3e5d2d7 | 2007-06-15 01:45:56 +0000 | [diff] [blame] | 257 |     if (!args["clients"].empty()) { | 
| Marc Slemko | b09f588 | 2006-08-23 22:03:34 +0000 | [diff] [blame] | 258 |       clientCount = atoi(args["clients"].c_str()); | 
 | 259 |     } | 
 | 260 |  | 
| Mark Slee | 3e5d2d7 | 2007-06-15 01:45:56 +0000 | [diff] [blame] | 261 |     if (!args["help"].empty()) { | 
| Marc Slemko | b09f588 | 2006-08-23 22:03:34 +0000 | [diff] [blame] | 262 |       cerr << usage.str(); | 
 | 263 |       return 0; | 
 | 264 |     } | 
 | 265 |  | 
| Mark Slee | 3e5d2d7 | 2007-06-15 01:45:56 +0000 | [diff] [blame] | 266 |     if (!args["loop"].empty()) { | 
| Marc Slemko | b09f588 | 2006-08-23 22:03:34 +0000 | [diff] [blame] | 267 |       loopCount = atoi(args["loop"].c_str()); | 
 | 268 |     } | 
 | 269 |  | 
| Mark Slee | 3e5d2d7 | 2007-06-15 01:45:56 +0000 | [diff] [blame] | 270 |     if (!args["call"].empty()) { | 
| Marc Slemko | d97eb61 | 2006-08-24 23:37:36 +0000 | [diff] [blame] | 271 |       callName = args["call"]; | 
 | 272 |     } | 
 | 273 |  | 
| Mark Slee | 3e5d2d7 | 2007-06-15 01:45:56 +0000 | [diff] [blame] | 274 |     if (!args["port"].empty()) { | 
| Marc Slemko | 3ea0033 | 2006-08-17 01:11:13 +0000 | [diff] [blame] | 275 |       port = atoi(args["port"].c_str()); | 
 | 276 |     } | 
 | 277 |  | 
| Mark Slee | 3e5d2d7 | 2007-06-15 01:45:56 +0000 | [diff] [blame] | 278 |     if (!args["server"].empty()) { | 
| Marc Slemko | b09f588 | 2006-08-23 22:03:34 +0000 | [diff] [blame] | 279 |       runServer = args["server"] == "true"; | 
 | 280 |     } | 
 | 281 |  | 
| Mark Slee | 3e5d2d7 | 2007-06-15 01:45:56 +0000 | [diff] [blame] | 282 |     if (!args["log-request"].empty()) { | 
| Aditya Agarwal | 3950f47 | 2006-10-11 02:50:15 +0000 | [diff] [blame] | 283 |       logRequests = args["log-request"] == "true"; | 
 | 284 |     } | 
 | 285 |  | 
| Mark Slee | 3e5d2d7 | 2007-06-15 01:45:56 +0000 | [diff] [blame] | 286 |     if (!args["replay-request"].empty()) { | 
| Aditya Agarwal | e9ef8d7 | 2006-12-08 23:52:57 +0000 | [diff] [blame] | 287 |       replayRequests = args["replay-request"] == "true"; | 
 | 288 |     } | 
 | 289 |  | 
| Mark Slee | 3e5d2d7 | 2007-06-15 01:45:56 +0000 | [diff] [blame] | 290 |     if (!args["server-type"].empty()) { | 
| Marc Slemko | 3ea0033 | 2006-08-17 01:11:13 +0000 | [diff] [blame] | 291 |       serverType = args["server-type"]; | 
| David Reiss | 0c90f6f | 2008-02-06 22:18:40 +0000 | [diff] [blame^] | 292 |  | 
| Mark Slee | 3e5d2d7 | 2007-06-15 01:45:56 +0000 | [diff] [blame] | 293 |       if (serverType == "simple") { | 
| Marc Slemko | 3ea0033 | 2006-08-17 01:11:13 +0000 | [diff] [blame] | 294 |  | 
| Mark Slee | 3e5d2d7 | 2007-06-15 01:45:56 +0000 | [diff] [blame] | 295 |       } else if (serverType == "thread-pool") { | 
| Marc Slemko | 3ea0033 | 2006-08-17 01:11:13 +0000 | [diff] [blame] | 296 |  | 
| Mark Slee | 3e5d2d7 | 2007-06-15 01:45:56 +0000 | [diff] [blame] | 297 |       } else if (serverType == "threaded") { | 
| Mark Slee | 739dbe5 | 2007-02-01 22:55:30 +0000 | [diff] [blame] | 298 |  | 
| Marc Slemko | 3ea0033 | 2006-08-17 01:11:13 +0000 | [diff] [blame] | 299 |       } else { | 
 | 300 |  | 
| David Reiss | 0c90f6f | 2008-02-06 22:18:40 +0000 | [diff] [blame^] | 301 |         throw invalid_argument("Unknown server type "+serverType); | 
| Marc Slemko | 3ea0033 | 2006-08-17 01:11:13 +0000 | [diff] [blame] | 302 |       } | 
 | 303 |     } | 
 | 304 |  | 
| Mark Slee | 3e5d2d7 | 2007-06-15 01:45:56 +0000 | [diff] [blame] | 305 |     if (!args["workers"].empty()) { | 
| Marc Slemko | 3ea0033 | 2006-08-17 01:11:13 +0000 | [diff] [blame] | 306 |       workerCount = atoi(args["workers"].c_str()); | 
 | 307 |     } | 
 | 308 |  | 
| Marc Slemko | 3ea0033 | 2006-08-17 01:11:13 +0000 | [diff] [blame] | 309 |   } catch(exception& e) { | 
 | 310 |     cerr << e.what() << endl; | 
 | 311 |     cerr << usage; | 
 | 312 |   } | 
 | 313 |  | 
| Marc Slemko | 3ea0033 | 2006-08-17 01:11:13 +0000 | [diff] [blame] | 314 |   shared_ptr<PosixThreadFactory> threadFactory = shared_ptr<PosixThreadFactory>(new PosixThreadFactory()); | 
 | 315 |  | 
| Mark Slee | b9ff32a | 2006-11-16 01:00:24 +0000 | [diff] [blame] | 316 |   // Dispatcher | 
 | 317 |   shared_ptr<Server> serviceHandler(new Server()); | 
| Marc Slemko | 3ea0033 | 2006-08-17 01:11:13 +0000 | [diff] [blame] | 318 |  | 
| Aditya Agarwal | e9ef8d7 | 2006-12-08 23:52:57 +0000 | [diff] [blame] | 319 |   if (replayRequests) { | 
 | 320 |     shared_ptr<Server> serviceHandler(new Server()); | 
 | 321 |     shared_ptr<ServiceProcessor> serviceProcessor(new ServiceProcessor(serviceHandler)); | 
| David Reiss | 0c90f6f | 2008-02-06 22:18:40 +0000 | [diff] [blame^] | 322 |  | 
| Aditya Agarwal | e9ef8d7 | 2006-12-08 23:52:57 +0000 | [diff] [blame] | 323 |     // Transports | 
 | 324 |     shared_ptr<TFileTransport> fileTransport(new TFileTransport(requestLogPath)); | 
 | 325 |     fileTransport->setChunkSize(2 * 1024 * 1024); | 
 | 326 |     fileTransport->setMaxEventSize(1024 * 16); | 
 | 327 |     fileTransport->seekToEnd(); | 
 | 328 |  | 
 | 329 |     // Protocol Factory | 
 | 330 |     shared_ptr<TProtocolFactory> protocolFactory(new TBinaryProtocolFactory()); | 
 | 331 |  | 
 | 332 |     TFileProcessor fileProcessor(serviceProcessor, | 
 | 333 |                                  protocolFactory, | 
 | 334 |                                  fileTransport); | 
 | 335 |  | 
| David Reiss | 0c90f6f | 2008-02-06 22:18:40 +0000 | [diff] [blame^] | 336 |     fileProcessor.process(0, true); | 
| Aditya Agarwal | e9ef8d7 | 2006-12-08 23:52:57 +0000 | [diff] [blame] | 337 |     exit(0); | 
 | 338 |   } | 
 | 339 |  | 
 | 340 |  | 
| Mark Slee | 3e5d2d7 | 2007-06-15 01:45:56 +0000 | [diff] [blame] | 341 |   if (runServer) { | 
| Marc Slemko | 3ea0033 | 2006-08-17 01:11:13 +0000 | [diff] [blame] | 342 |  | 
| Mark Slee | d717347 | 2006-10-25 19:52:10 +0000 | [diff] [blame] | 343 |     shared_ptr<ServiceProcessor> serviceProcessor(new ServiceProcessor(serviceHandler)); | 
| Marc Slemko | 3ea0033 | 2006-08-17 01:11:13 +0000 | [diff] [blame] | 344 |  | 
| Marc Slemko | b09f588 | 2006-08-23 22:03:34 +0000 | [diff] [blame] | 345 |     // Transport | 
 | 346 |     shared_ptr<TServerSocket> serverSocket(new TServerSocket(port)); | 
| Marc Slemko | 3ea0033 | 2006-08-17 01:11:13 +0000 | [diff] [blame] | 347 |  | 
| Aditya Agarwal | 3950f47 | 2006-10-11 02:50:15 +0000 | [diff] [blame] | 348 |     // Transport Factory | 
 | 349 |     shared_ptr<TTransportFactory> transportFactory(new TBufferedTransportFactory()); | 
 | 350 |  | 
| Mark Slee | d717347 | 2006-10-25 19:52:10 +0000 | [diff] [blame] | 351 |     // Protocol Factory | 
 | 352 |     shared_ptr<TProtocolFactory> protocolFactory(new TBinaryProtocolFactory()); | 
| Aditya Agarwal | 3950f47 | 2006-10-11 02:50:15 +0000 | [diff] [blame] | 353 |  | 
 | 354 |     if (logRequests) { | 
 | 355 |       // initialize the log file | 
| Aditya Agarwal | e9ef8d7 | 2006-12-08 23:52:57 +0000 | [diff] [blame] | 356 |       shared_ptr<TFileTransport> fileTransport(new TFileTransport(requestLogPath)); | 
 | 357 |       fileTransport->setChunkSize(2 * 1024 * 1024); | 
 | 358 |       fileTransport->setMaxEventSize(1024 * 16); | 
| David Reiss | 0c90f6f | 2008-02-06 22:18:40 +0000 | [diff] [blame^] | 359 |  | 
 | 360 |       transportFactory = | 
| Mark Slee | 79e41b8 | 2007-02-07 04:07:07 +0000 | [diff] [blame] | 361 |         shared_ptr<TTransportFactory>(new TPipedTransportFactory(fileTransport)); | 
| Aditya Agarwal | 3950f47 | 2006-10-11 02:50:15 +0000 | [diff] [blame] | 362 |     } | 
| Marc Slemko | 3ea0033 | 2006-08-17 01:11:13 +0000 | [diff] [blame] | 363 |  | 
| Marc Slemko | b09f588 | 2006-08-23 22:03:34 +0000 | [diff] [blame] | 364 |     shared_ptr<Thread> serverThread; | 
| Marc Slemko | 3ea0033 | 2006-08-17 01:11:13 +0000 | [diff] [blame] | 365 |  | 
| Mark Slee | 3e5d2d7 | 2007-06-15 01:45:56 +0000 | [diff] [blame] | 366 |     if (serverType == "simple") { | 
| David Reiss | 0c90f6f | 2008-02-06 22:18:40 +0000 | [diff] [blame^] | 367 |  | 
| Mark Slee | d717347 | 2006-10-25 19:52:10 +0000 | [diff] [blame] | 368 |       serverThread = threadFactory->newThread(shared_ptr<TServer>(new TSimpleServer(serviceProcessor, serverSocket, transportFactory, protocolFactory))); | 
| David Reiss | 0c90f6f | 2008-02-06 22:18:40 +0000 | [diff] [blame^] | 369 |  | 
| Mark Slee | 739dbe5 | 2007-02-01 22:55:30 +0000 | [diff] [blame] | 370 |     } else if (serverType == "threaded") { | 
 | 371 |  | 
 | 372 |       serverThread = threadFactory->newThread(shared_ptr<TServer>(new TThreadedServer(serviceProcessor, serverSocket, transportFactory, protocolFactory))); | 
| David Reiss | 0c90f6f | 2008-02-06 22:18:40 +0000 | [diff] [blame^] | 373 |  | 
| Mark Slee | 3e5d2d7 | 2007-06-15 01:45:56 +0000 | [diff] [blame] | 374 |     } else if (serverType == "thread-pool") { | 
| Marc Slemko | b09f588 | 2006-08-23 22:03:34 +0000 | [diff] [blame] | 375 |  | 
 | 376 |       shared_ptr<ThreadManager> threadManager = ThreadManager::newSimpleThreadManager(workerCount); | 
 | 377 |  | 
 | 378 |       threadManager->threadFactory(threadFactory); | 
| David Reiss | 0c90f6f | 2008-02-06 22:18:40 +0000 | [diff] [blame^] | 379 |       threadManager->start(); | 
| Mark Slee | d717347 | 2006-10-25 19:52:10 +0000 | [diff] [blame] | 380 |       serverThread = threadFactory->newThread(shared_ptr<TServer>(new TThreadPoolServer(serviceProcessor, serverSocket, transportFactory, protocolFactory, threadManager))); | 
| Marc Slemko | b09f588 | 2006-08-23 22:03:34 +0000 | [diff] [blame] | 381 |     } | 
 | 382 |  | 
 | 383 |     cerr << "Starting the server on port " << port << endl; | 
 | 384 |  | 
 | 385 |     serverThread->start(); | 
| David Reiss | 0c90f6f | 2008-02-06 22:18:40 +0000 | [diff] [blame^] | 386 |  | 
| Marc Slemko | b09f588 | 2006-08-23 22:03:34 +0000 | [diff] [blame] | 387 |     // If we aren't running clients, just wait forever for external clients | 
 | 388 |  | 
| Mark Slee | d717347 | 2006-10-25 19:52:10 +0000 | [diff] [blame] | 389 |     if (clientCount == 0) { | 
| Marc Slemko | b09f588 | 2006-08-23 22:03:34 +0000 | [diff] [blame] | 390 |       serverThread->join(); | 
 | 391 |     } | 
| Marc Slemko | 3ea0033 | 2006-08-17 01:11:13 +0000 | [diff] [blame] | 392 |   } | 
 | 393 |  | 
| Mark Slee | d717347 | 2006-10-25 19:52:10 +0000 | [diff] [blame] | 394 |   if (clientCount > 0) { | 
| Marc Slemko | 3ea0033 | 2006-08-17 01:11:13 +0000 | [diff] [blame] | 395 |  | 
| Marc Slemko | b09f588 | 2006-08-23 22:03:34 +0000 | [diff] [blame] | 396 |     Monitor monitor; | 
| Marc Slemko | 3ea0033 | 2006-08-17 01:11:13 +0000 | [diff] [blame] | 397 |  | 
| Marc Slemko | b09f588 | 2006-08-23 22:03:34 +0000 | [diff] [blame] | 398 |     size_t threadCount = 0; | 
| Marc Slemko | 3ea0033 | 2006-08-17 01:11:13 +0000 | [diff] [blame] | 399 |  | 
| Marc Slemko | b09f588 | 2006-08-23 22:03:34 +0000 | [diff] [blame] | 400 |     set<shared_ptr<Thread> > clientThreads; | 
| Marc Slemko | 3ea0033 | 2006-08-17 01:11:13 +0000 | [diff] [blame] | 401 |  | 
| Mark Slee | 3e5d2d7 | 2007-06-15 01:45:56 +0000 | [diff] [blame] | 402 |     if (callName == "echoVoid") { loopType = T_VOID;} | 
 | 403 |     else if (callName == "echoByte") { loopType = T_BYTE;} | 
 | 404 |     else if (callName == "echoI32") { loopType = T_I32;} | 
 | 405 |     else if (callName == "echoI64") { loopType = T_I64;} | 
 | 406 |     else if (callName == "echoString") { loopType = T_STRING;} | 
| Marc Slemko | d97eb61 | 2006-08-24 23:37:36 +0000 | [diff] [blame] | 407 |     else {throw invalid_argument("Unknown service call "+callName);} | 
 | 408 |  | 
| Mark Slee | 3e5d2d7 | 2007-06-15 01:45:56 +0000 | [diff] [blame] | 409 |     for (size_t ix = 0; ix < clientCount; ix++) { | 
| David Reiss | 0c90f6f | 2008-02-06 22:18:40 +0000 | [diff] [blame^] | 410 |  | 
| Marc Slemko | b09f588 | 2006-08-23 22:03:34 +0000 | [diff] [blame] | 411 |       shared_ptr<TSocket> socket(new TSocket("127.0.01", port)); | 
 | 412 |       shared_ptr<TBufferedTransport> bufferedSocket(new TBufferedTransport(socket, 2048)); | 
| Mark Slee | 739dbe5 | 2007-02-01 22:55:30 +0000 | [diff] [blame] | 413 |       shared_ptr<TProtocol> protocol(new TBinaryProtocol(bufferedSocket)); | 
| Mark Slee | d717347 | 2006-10-25 19:52:10 +0000 | [diff] [blame] | 414 |       shared_ptr<ServiceClient> serviceClient(new ServiceClient(protocol)); | 
| David Reiss | 0c90f6f | 2008-02-06 22:18:40 +0000 | [diff] [blame^] | 415 |  | 
| Aditya Agarwal | 3950f47 | 2006-10-11 02:50:15 +0000 | [diff] [blame] | 416 |       clientThreads.insert(threadFactory->newThread(shared_ptr<ClientThread>(new ClientThread(socket, serviceClient, monitor, threadCount, loopCount, loopType)))); | 
| Marc Slemko | b09f588 | 2006-08-23 22:03:34 +0000 | [diff] [blame] | 417 |     } | 
| David Reiss | 0c90f6f | 2008-02-06 22:18:40 +0000 | [diff] [blame^] | 418 |  | 
| Mark Slee | 3e5d2d7 | 2007-06-15 01:45:56 +0000 | [diff] [blame] | 419 |     for (std::set<shared_ptr<Thread> >::const_iterator thread = clientThreads.begin(); thread != clientThreads.end(); thread++) { | 
| Marc Slemko | b09f588 | 2006-08-23 22:03:34 +0000 | [diff] [blame] | 420 |       (*thread)->start(); | 
 | 421 |     } | 
| Marc Slemko | 3ea0033 | 2006-08-17 01:11:13 +0000 | [diff] [blame] | 422 |  | 
| Marc Slemko | b09f588 | 2006-08-23 22:03:34 +0000 | [diff] [blame] | 423 |     long long time00; | 
 | 424 |     long long time01; | 
| David Reiss | 0c90f6f | 2008-02-06 22:18:40 +0000 | [diff] [blame^] | 425 |  | 
| Marc Slemko | b09f588 | 2006-08-23 22:03:34 +0000 | [diff] [blame] | 426 |     {Synchronized s(monitor); | 
 | 427 |       threadCount = clientCount; | 
| David Reiss | 0c90f6f | 2008-02-06 22:18:40 +0000 | [diff] [blame^] | 428 |  | 
| Marc Slemko | b09f588 | 2006-08-23 22:03:34 +0000 | [diff] [blame] | 429 |       cerr << "Launch "<< clientCount << " client threads" << endl; | 
| David Reiss | 0c90f6f | 2008-02-06 22:18:40 +0000 | [diff] [blame^] | 430 |  | 
| Marc Slemko | b09f588 | 2006-08-23 22:03:34 +0000 | [diff] [blame] | 431 |       time00 =  Util::currentTime(); | 
| David Reiss | 0c90f6f | 2008-02-06 22:18:40 +0000 | [diff] [blame^] | 432 |  | 
| Marc Slemko | b09f588 | 2006-08-23 22:03:34 +0000 | [diff] [blame] | 433 |       monitor.notifyAll(); | 
| David Reiss | 0c90f6f | 2008-02-06 22:18:40 +0000 | [diff] [blame^] | 434 |  | 
| Marc Slemko | b09f588 | 2006-08-23 22:03:34 +0000 | [diff] [blame] | 435 |       while(threadCount > 0) { | 
| David Reiss | 0c90f6f | 2008-02-06 22:18:40 +0000 | [diff] [blame^] | 436 |         monitor.wait(); | 
| Marc Slemko | b09f588 | 2006-08-23 22:03:34 +0000 | [diff] [blame] | 437 |       } | 
| David Reiss | 0c90f6f | 2008-02-06 22:18:40 +0000 | [diff] [blame^] | 438 |  | 
| Marc Slemko | b09f588 | 2006-08-23 22:03:34 +0000 | [diff] [blame] | 439 |       time01 =  Util::currentTime(); | 
| Marc Slemko | 3ea0033 | 2006-08-17 01:11:13 +0000 | [diff] [blame] | 440 |     } | 
| David Reiss | 0c90f6f | 2008-02-06 22:18:40 +0000 | [diff] [blame^] | 441 |  | 
| Marc Slemko | b09f588 | 2006-08-23 22:03:34 +0000 | [diff] [blame] | 442 |     long long firstTime = 9223372036854775807LL; | 
 | 443 |     long long lastTime = 0; | 
| Marc Slemko | 3ea0033 | 2006-08-17 01:11:13 +0000 | [diff] [blame] | 444 |  | 
| Marc Slemko | b09f588 | 2006-08-23 22:03:34 +0000 | [diff] [blame] | 445 |     double averageTime = 0; | 
 | 446 |     long long minTime = 9223372036854775807LL; | 
 | 447 |     long long maxTime = 0; | 
| David Reiss | 0c90f6f | 2008-02-06 22:18:40 +0000 | [diff] [blame^] | 448 |  | 
| Mark Slee | 3e5d2d7 | 2007-06-15 01:45:56 +0000 | [diff] [blame] | 449 |     for (set<shared_ptr<Thread> >::iterator ix = clientThreads.begin(); ix != clientThreads.end(); ix++) { | 
| David Reiss | 0c90f6f | 2008-02-06 22:18:40 +0000 | [diff] [blame^] | 450 |  | 
| Marc Slemko | b09f588 | 2006-08-23 22:03:34 +0000 | [diff] [blame] | 451 |       shared_ptr<ClientThread> client = dynamic_pointer_cast<ClientThread>((*ix)->runnable()); | 
| David Reiss | 0c90f6f | 2008-02-06 22:18:40 +0000 | [diff] [blame^] | 452 |  | 
| Marc Slemko | b09f588 | 2006-08-23 22:03:34 +0000 | [diff] [blame] | 453 |       long long delta = client->_endTime - client->_startTime; | 
| David Reiss | 0c90f6f | 2008-02-06 22:18:40 +0000 | [diff] [blame^] | 454 |  | 
| Marc Slemko | b09f588 | 2006-08-23 22:03:34 +0000 | [diff] [blame] | 455 |       assert(delta > 0); | 
| Marc Slemko | 056f9ba | 2006-08-17 02:59:05 +0000 | [diff] [blame] | 456 |  | 
| Mark Slee | 3e5d2d7 | 2007-06-15 01:45:56 +0000 | [diff] [blame] | 457 |       if (client->_startTime < firstTime) { | 
| David Reiss | 0c90f6f | 2008-02-06 22:18:40 +0000 | [diff] [blame^] | 458 |         firstTime = client->_startTime; | 
| Marc Slemko | b09f588 | 2006-08-23 22:03:34 +0000 | [diff] [blame] | 459 |       } | 
| David Reiss | 0c90f6f | 2008-02-06 22:18:40 +0000 | [diff] [blame^] | 460 |  | 
| Mark Slee | 3e5d2d7 | 2007-06-15 01:45:56 +0000 | [diff] [blame] | 461 |       if (client->_endTime > lastTime) { | 
| David Reiss | 0c90f6f | 2008-02-06 22:18:40 +0000 | [diff] [blame^] | 462 |         lastTime = client->_endTime; | 
| Marc Slemko | b09f588 | 2006-08-23 22:03:34 +0000 | [diff] [blame] | 463 |       } | 
| David Reiss | 0c90f6f | 2008-02-06 22:18:40 +0000 | [diff] [blame^] | 464 |  | 
| Mark Slee | 3e5d2d7 | 2007-06-15 01:45:56 +0000 | [diff] [blame] | 465 |       if (delta < minTime) { | 
| David Reiss | 0c90f6f | 2008-02-06 22:18:40 +0000 | [diff] [blame^] | 466 |         minTime = delta; | 
| Marc Slemko | b09f588 | 2006-08-23 22:03:34 +0000 | [diff] [blame] | 467 |       } | 
| David Reiss | 0c90f6f | 2008-02-06 22:18:40 +0000 | [diff] [blame^] | 468 |  | 
| Mark Slee | 3e5d2d7 | 2007-06-15 01:45:56 +0000 | [diff] [blame] | 469 |       if (delta > maxTime) { | 
| David Reiss | 0c90f6f | 2008-02-06 22:18:40 +0000 | [diff] [blame^] | 470 |         maxTime = delta; | 
| Marc Slemko | b09f588 | 2006-08-23 22:03:34 +0000 | [diff] [blame] | 471 |       } | 
| David Reiss | 0c90f6f | 2008-02-06 22:18:40 +0000 | [diff] [blame^] | 472 |  | 
| Marc Slemko | b09f588 | 2006-08-23 22:03:34 +0000 | [diff] [blame] | 473 |       averageTime+= delta; | 
 | 474 |     } | 
| David Reiss | 0c90f6f | 2008-02-06 22:18:40 +0000 | [diff] [blame^] | 475 |  | 
| Marc Slemko | b09f588 | 2006-08-23 22:03:34 +0000 | [diff] [blame] | 476 |     averageTime /= clientCount; | 
| David Reiss | 0c90f6f | 2008-02-06 22:18:40 +0000 | [diff] [blame^] | 477 |  | 
 | 478 |  | 
| Marc Slemko | b09f588 | 2006-08-23 22:03:34 +0000 | [diff] [blame] | 479 |     cout <<  "workers :" << workerCount << ", client : " << clientCount << ", loops : " << loopCount << ", rate : " << (clientCount * loopCount * 1000) / ((double)(time01 - time00)) << endl; | 
| David Reiss | 0c90f6f | 2008-02-06 22:18:40 +0000 | [diff] [blame^] | 480 |  | 
| Mark Slee | b9ff32a | 2006-11-16 01:00:24 +0000 | [diff] [blame] | 481 |     count_map count = serviceHandler->getCount(); | 
 | 482 |     count_map::iterator iter; | 
 | 483 |     for (iter = count.begin(); iter != count.end(); ++iter) { | 
 | 484 |       printf("%s => %d\n", iter->first, iter->second); | 
 | 485 |     } | 
| Marc Slemko | b09f588 | 2006-08-23 22:03:34 +0000 | [diff] [blame] | 486 |     cerr << "done." << endl; | 
| Marc Slemko | 056f9ba | 2006-08-17 02:59:05 +0000 | [diff] [blame] | 487 |   } | 
| Marc Slemko | 056f9ba | 2006-08-17 02:59:05 +0000 | [diff] [blame] | 488 |  | 
| Marc Slemko | 3ea0033 | 2006-08-17 01:11:13 +0000 | [diff] [blame] | 489 |   return 0; | 
 | 490 | } |