fuse_server.cpp
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include <fvutils/net/fuse_server.h>
00025 #include <fvutils/net/fuse_server_client_thread.h>
00026
00027 #include <core/threading/thread_collector.h>
00028 #include <netcomm/utils/acceptor_thread.h>
00029
00030 #include <algorithm>
00031
00032 using namespace fawkes;
00033
00034 namespace firevision {
00035 #if 0
00036 }
00037 #endif
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054 FuseServer::FuseServer(unsigned short int port, ThreadCollector *collector)
00055 : Thread("FuseServer", Thread::OPMODE_WAITFORWAKEUP)
00056 {
00057 __thread_collector = collector;
00058
00059 __acceptor_thread = new NetworkAcceptorThread(this, port, "FuseNetworkAcceptorThread");
00060 if (__thread_collector) {
00061 __thread_collector->add(__acceptor_thread);
00062 } else {
00063 __acceptor_thread->start();
00064 }
00065 }
00066
00067
00068
00069 FuseServer::~FuseServer()
00070 {
00071 if ( __thread_collector ) {
00072 __thread_collector->remove(__acceptor_thread);
00073 } else {
00074 __acceptor_thread->cancel();
00075 __acceptor_thread->join();
00076 }
00077
00078 for (__cit = __clients.begin(); __cit != __clients.end(); ++__cit) {
00079 if ( __thread_collector ) {
00080
00081 __thread_collector->remove(*__cit);
00082 } else {
00083 (*__cit)->cancel();
00084 (*__cit)->join();
00085 }
00086 delete *__cit;
00087 }
00088 __clients.clear();
00089
00090 delete __acceptor_thread;
00091 }
00092
00093
00094 void
00095 FuseServer::add_connection(StreamSocket *s) throw()
00096 {
00097 FuseServerClientThread *client = new FuseServerClientThread(this, s);
00098 if ( __thread_collector) {
00099 __thread_collector->add(client);
00100 } else {
00101 client->start();
00102 }
00103 __clients.push_back_locked(client);
00104 }
00105
00106
00107
00108
00109
00110 void
00111 FuseServer::connection_died(FuseServerClientThread *client) throw()
00112 {
00113 __dead_clients.push_back_locked(client);
00114 wakeup();
00115 }
00116
00117
00118 void
00119 FuseServer::loop()
00120 {
00121
00122 __dead_clients.lock();
00123 __clients.lock();
00124
00125 LockList<FuseServerClientThread *>::iterator dcit;
00126
00127 while ( ! __dead_clients.empty() ) {
00128 dcit = __dead_clients.begin();
00129
00130 if ( __thread_collector ) {
00131
00132 __thread_collector->remove(*dcit);
00133 } else {
00134 (*dcit)->cancel();
00135 (*dcit)->join();
00136 }
00137 if ( (__cit = find(__clients.begin(), __clients.end(), *dcit)) != __clients.end() ) {
00138 __clients.erase(__cit);
00139 }
00140
00141 FuseServerClientThread *tc = *dcit;
00142 __dead_clients.erase(dcit);
00143 delete tc;
00144 }
00145
00146 __clients.unlock();
00147 __dead_clients.unlock();
00148 }
00149
00150 }