blob: 03069ae0485e05ec73817bc2a0e5a160555ca7b5 [file] [log] [blame]
Mark Sleee8540632006-05-30 09:24:40 +00001#include "server/TSimpleServer.h"
Mark Slee8d7e1f62006-06-07 06:48:56 +00002#include "transport/TBufferedTransport.h"
3#include "transport/TTransportException.h"
Mark Sleee8540632006-05-30 09:24:40 +00004#include <string>
Mark Slee8d7e1f62006-06-07 06:48:56 +00005#include <iostream>
Mark Sleee8540632006-05-30 09:24:40 +00006using namespace std;
7
Mark Slee8d7e1f62006-06-07 06:48:56 +00008/**
9 * A simple single-threaded application server. Perfect for unit tests!
10 *
11 * @author Mark Slee <mcslee@facebook.com>
12 */
Mark Sleee8540632006-05-30 09:24:40 +000013void TSimpleServer::run() {
Mark Slee8d7e1f62006-06-07 06:48:56 +000014 TTransport* client = NULL;
Mark Sleee8540632006-05-30 09:24:40 +000015
Mark Slee8d7e1f62006-06-07 06:48:56 +000016 try {
17 // Start the server listening
18 serverTransport_->listen();
19 } catch (TTransportException& ttx) {
20 cerr << "TSimpleServer::run() listen(): " << ttx.getMessage() << endl;
Mark Sleee8540632006-05-30 09:24:40 +000021 return;
22 }
23
24 // Fetch client from server
25 while (true) {
Mark Slee8d7e1f62006-06-07 06:48:56 +000026 try {
27 client = serverTransport_->accept();
28 if (client != NULL) {
29 // Process for as long as we can keep the processor happy!
30 TBufferedTransport bufferedClient(client);
31 while (processor_->process(&bufferedClient)) {}
Mark Sleee8540632006-05-30 09:24:40 +000032 }
Mark Slee8d7e1f62006-06-07 06:48:56 +000033 } catch (TTransportException& ttx) {
34 if (client != NULL) {
35 cerr << "TSimpleServer client died: " << ttx.getMessage() << endl;
Mark Sleee8540632006-05-30 09:24:40 +000036 }
Mark Sleee8540632006-05-30 09:24:40 +000037 }
38
Mark Slee8d7e1f62006-06-07 06:48:56 +000039 // Clean up the client
40 if (client != NULL) {
41
42 // Ensure no resource leaks
43 client->close();
44
45 // Ensure no memory leaks
46 delete client;
47
48 // Ensure we don't try to double-free on the next pass
49 client = NULL;
50 }
Mark Sleee8540632006-05-30 09:24:40 +000051 }
52
Mark Slee8d7e1f62006-06-07 06:48:56 +000053 // TODO(mcslee): Could this be a timeout case? Or always the real thing?
Mark Sleee8540632006-05-30 09:24:40 +000054}