#include <stdio.h>
#include <stdint.h>
#include <assert.h>
#include "midasServer.h"
#include <TROOT.h>
#include <TSemaphore.h>
#include <TFolder.h>
#include <TSocket.h>
#include <TServerSocket.h>
#include <TThread.h>
#include <TMessage.h>
#include <TObjString.h>
#include <TObjArray.h>
#include <TH1.h>
#include <TCutG.h>
#include "RootLock.h"
#include <map>
#include <string>
Go to the source code of this file.
Defines | |
#define | XPOINTER_T uint32_t |
Functions | |
void | VerboseMidasServer (bool verbose) |
TFolder * | ReadFolderPointer (TSocket *fSocket) |
void | root_server_thread (void *arg) |
void | root_socket_server (void *arg) |
void | StartMidasServer (int port) |
Variables | |
static bool | gVerbose = false |
static std::map< XPOINTER_T, std::string > | gPointers |
static std::map< std::string, XPOINTER_T > | gRevPointers |
static XPOINTER_T | gLastPointer = 0 |
TFolder * | gManaHistosFolder = NULL |
#define XPOINTER_T uint32_t |
Definition at line 49 of file midasServer.cxx.
Referenced by ReadFolderPointer(), and root_server_thread().
TFolder* ReadFolderPointer | ( | TSocket * | fSocket | ) |
Definition at line 55 of file midasServer.cxx.
References gManaHistosFolder, gPointers, gVerbose, and XPOINTER_T.
Referenced by root_server_thread().
00056 { 00057 //read pointer to current folder 00058 TMessage *m = 0; 00059 fSocket->Recv(m); 00060 XPOINTER_T p; 00061 *m >> p; 00062 00063 const char* name = gPointers[p].c_str(); 00064 00065 if (gVerbose) 00066 printf("converted %d to \'%s\'\n", p, name); 00067 00068 TObject* obj = gROOT->FindObjectAny(name); 00069 00070 if (!obj) 00071 obj = gManaHistosFolder; 00072 00073 return (TFolder*) obj; 00074 }
void root_server_thread | ( | void * | arg | ) |
Definition at line 78 of file midasServer.cxx.
References gLastPointer, gManaHistosFolder, gPointers, gRevPointers, gVerbose, ReadFolderPointer(), LockRootGuard::Unlock(), and XPOINTER_T.
Referenced by root_socket_server(), and socket_listener().
00082 { 00083 char request[256]; 00084 00085 TSocket *sock = (TSocket *) arg; 00086 TMessage message(kMESS_OBJECT); 00087 00088 do { 00089 00090 /* close connection if client has disconnected */ 00091 int rd = sock->Recv(request, sizeof(request)); 00092 if (rd <= 0) { 00093 // printf("Closed connection to %s\n", sock->GetInetAddress().GetHostName()); 00094 sock->Close(); 00095 delete sock; 00096 return; 00097 } 00098 00099 if (gVerbose) 00100 printf("Request %s\n", request); 00101 00102 if (strcmp(request, "GetListOfFolders") == 0) { 00103 00104 LockRootGuard lock; 00105 00106 TFolder *folder = ReadFolderPointer(sock); 00107 if (folder == NULL) { 00108 message.Reset(kMESS_OBJECT); 00109 message.WriteObject(NULL); 00110 lock.Unlock(); 00111 sock->Send(message); 00112 continue; 00113 } 00114 //get folder names 00115 TObject *obj; 00116 TObjArray *names = new TObjArray(100); 00117 00118 TCollection *folders = folder->GetListOfFolders(); 00119 TIterator *iterFolders = folders->MakeIterator(); 00120 while ((obj = iterFolders->Next()) != NULL) 00121 names->Add(new TObjString(obj->GetName())); 00122 00123 //write folder names 00124 message.Reset(kMESS_OBJECT); 00125 message.WriteObject(names); 00126 sock->Send(message); 00127 00128 for (int i = 0; i < names->GetLast() + 1; i++) 00129 delete(TObjString *) names->At(i); 00130 00131 delete names; 00132 00133 } else if (strncmp(request, "FindObject", 10) == 0) { 00134 00135 LockRootGuard lock; 00136 00137 TFolder *folder = ReadFolderPointer(sock); 00138 00139 //get object 00140 TObject *obj; 00141 if (strncmp(request + 10, "Any", 3) == 0) 00142 obj = folder->FindObjectAny(request + 14); 00143 else 00144 obj = folder->FindObject(request + 11); 00145 00146 //write object 00147 if (!obj) 00148 sock->Send("Error"); 00149 else { 00150 message.Reset(kMESS_OBJECT); 00151 message.WriteObject(obj); 00152 00153 lock.Unlock(); 00154 sock->Send(message); 00155 } 00156 00157 } else if (strncmp(request, "FindFullPathName", 16) == 0) { 00158 00159 LockRootGuard lock; 00160 00161 TFolder *folder = ReadFolderPointer(sock); 00162 00163 //find path 00164 const char *path = folder->FindFullPathName(request + 17); 00165 00166 //write path 00167 if (!path) { 00168 sock->Send("Error"); 00169 } else { 00170 TObjString *obj = new TObjString(path); 00171 message.Reset(kMESS_OBJECT); 00172 message.WriteObject(obj); 00173 lock.Unlock(); 00174 sock->Send(message); 00175 delete obj; 00176 } 00177 00178 } else if (strncmp(request, "GetPointer", 10) == 0) { 00179 00180 //find object 00181 XPOINTER_T p = 0; 00182 TObject *obj = gROOT->FindObjectAny(request + 11); 00183 00184 //write pointer 00185 message.Reset(kMESS_ANY); 00186 00187 if (obj) 00188 { 00189 const char* name = obj->GetName(); 00190 p = gRevPointers[name]; 00191 if (p==0) 00192 { 00193 p = ++gLastPointer; 00194 gPointers[p] = name; 00195 gRevPointers[name] = p; 00196 } 00197 00198 if (gVerbose) 00199 printf("give %d for \'%s\'\n", p, name); 00200 } 00201 00202 message << p; 00203 sock->Send(message); 00204 00205 } else if (strncmp(request, "Command", 7) == 0) { 00206 char objName[100], method[100]; 00207 sock->Recv(objName, sizeof(objName)); 00208 sock->Recv(method, sizeof(method)); 00209 00210 LockRootGuard lock; 00211 00212 TObject *object = gROOT->FindObjectAny(objName); 00213 if (object && object->InheritsFrom(TH1::Class()) 00214 && strcmp(method, "Reset") == 0) 00215 static_cast < TH1 * >(object)->Reset(); 00216 00217 } else if (strncmp(request, "SetCut", 6) == 0) { 00218 00219 //read new settings for a cut 00220 char name[256]; 00221 sock->Recv(name, sizeof(name)); 00222 00223 LockRootGuard lock; 00224 00225 TCutG *cut = (TCutG *) gManaHistosFolder->FindObjectAny(name); 00226 00227 TMessage *m = 0; 00228 sock->Recv(m); 00229 TCutG *newc = ((TCutG *) m->ReadObject(m->GetClass())); 00230 00231 if (cut) { 00232 fprintf(stderr, "root server thread: changing cut %s\n", newc->GetName()); 00233 newc->TAttMarker::Copy(*cut); 00234 newc->TAttFill::Copy(*cut); 00235 newc->TAttLine::Copy(*cut); 00236 newc->TNamed::Copy(*cut); 00237 cut->Set(newc->GetN()); 00238 for (int i = 0; i < cut->GetN(); ++i) { 00239 cut->SetPoint(i, newc->GetX()[i], newc->GetY()[i]); 00240 } 00241 } else { 00242 fprintf(stderr, "root server thread: ignoring receipt of unknown cut \'%s\'\n", 00243 newc->GetName()); 00244 } 00245 delete newc; 00246 00247 } else { 00248 fprintf(stderr, "midasServer: Received unknown request \"%s\"\n", request); 00249 } 00250 00251 } while (1); 00252 }
void root_socket_server | ( | void * | arg | ) |
Definition at line 256 of file midasServer.cxx.
References root_server_thread().
Referenced by StartMidasServer(), and StartNetDirectoryServer().
00257 { 00258 // Server loop listening for incoming network connections on specified port. 00259 // Starts a searver_thread for each connection. 00260 int port; 00261 00262 port = *(int *) arg; 00263 00264 printf("MIDAS ROOT server listening on port %d...\n", port); 00265 TServerSocket *lsock = new TServerSocket(port, kTRUE); 00266 00267 do { 00268 TSocket *sock = lsock->Accept(); 00269 00270 if (sock==NULL) { 00271 fprintf(stderr, "MIDAS ROOT server accept() error\n"); 00272 break; 00273 } 00274 00275 // printf("Established connection to %s\n", sock->GetInetAddress().GetHostName()); 00276 00277 TThread *thread = new TThread("Server", root_server_thread, (void*)sock); 00278 thread->Run(); 00279 #if 0 00280 LPDWORD lpThreadId = 0; 00281 CloseHandle(CreateThread(NULL, 1024, &root_server_thread, sock, 0, lpThreadId)); 00282 #endif 00283 } while (1); 00284 }
void StartMidasServer | ( | int | port | ) |
Definition at line 290 of file midasServer.cxx.
References gManaHistosFolder, root_socket_server(), and StartLockRootTimer().
Referenced by main().
00291 { 00292 /* create the folder for analyzer histograms */ 00293 gManaHistosFolder = gROOT->GetRootFolder()->AddFolder("histos", "MIDAS Analyzer Histograms"); 00294 gROOT->GetListOfBrowsables()->Add(gManaHistosFolder, "histos"); 00295 00296 StartLockRootTimer(); 00297 00298 static int pport = port; 00299 00300 TThread *thread = new TThread("server_loop", root_socket_server, (void*)&pport); 00301 thread->Run(); 00302 00303 #if 0 00304 LPDWORD lpThreadId = 0; 00305 CloseHandle(CreateThread(NULL, 1024, &root_socket_server, &pport, 0, lpThreadId)); 00306 #endif 00307 }
void VerboseMidasServer | ( | bool | verbose | ) |
Definition at line 37 of file midasServer.cxx.
References gVerbose.
XPOINTER_T gLastPointer = 0 [static] |
Definition at line 53 of file midasServer.cxx.
Referenced by root_server_thread().
TFolder* gManaHistosFolder = NULL |
Definition at line 288 of file midasServer.cxx.
Referenced by endRun(), HandleSample(), main(), ReadFolderPointer(), root_server_thread(), and StartMidasServer().
std::map<XPOINTER_T,std::string> gPointers [static] |
Definition at line 51 of file midasServer.cxx.
Referenced by ReadFolderPointer(), and root_server_thread().
std::map<std::string,XPOINTER_T> gRevPointers [static] |
Definition at line 52 of file midasServer.cxx.
Referenced by root_server_thread().
bool gVerbose = false [static] |
Definition at line 35 of file midasServer.cxx.
Referenced by ReadFolderPointer(), root_server_thread(), and VerboseMidasServer().