midasServer.cxx File Reference

#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>
Include dependency graph for midasServer.cxx:

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 Documentation

#define XPOINTER_T   uint32_t

Definition at line 49 of file midasServer.cxx.

Referenced by ReadFolderPointer(), and root_server_thread().


Function Documentation

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 }

Here is the caller graph for this function:

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 }

Here is the call graph for this function:

Here is the caller graph for this function:

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 }

Here is the call graph for this function:

Here is the caller graph for this function:

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 }

Here is the call graph for this function:

Here is the caller graph for this function:

void VerboseMidasServer ( bool  verbose  ) 

Definition at line 37 of file midasServer.cxx.

References gVerbose.

00038 {
00039   fprintf(stderr, "VerboseMidasServer: change verbose level from %d to %d\n", gVerbose, verbose);
00040   gVerbose = verbose;
00041 }


Variable Documentation

XPOINTER_T gLastPointer = 0 [static]

Definition at line 53 of file midasServer.cxx.

Referenced by root_server_thread().

TFolder* gManaHistosFolder = NULL
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().


Generated on 12 Feb 2016 for ROOT Analyzer by  doxygen 1.6.1