GSI Object Oriented Online Offline (Go4)  GO4-5.3.2
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
TGo4DataRunnable.cxx
Go to the documentation of this file.
1 // $Id: TGo4DataRunnable.cxx 999 2013-07-25 11:58:59Z linev $
2 //-----------------------------------------------------------------------
3 // The GSI Online Offline Object Oriented (Go4) Project
4 // Experiment Data Processing at EE department, GSI
5 //-----------------------------------------------------------------------
6 // Copyright (C) 2000- GSI Helmholtzzentrum f�r Schwerionenforschung GmbH
7 // Planckstr. 1, 64291 Darmstadt, Germany
8 // Contact: http://go4.gsi.de
9 //-----------------------------------------------------------------------
10 // This software can be used under the license agreements as stated
11 // in Go4License.txt file which is part of the distribution.
12 //-----------------------------------------------------------------------
13 
14 #include "TGo4DataRunnable.h"
15 
16 #include <signal.h>
17 
18 #include "TGo4Log.h"
19 #include "TGo4Thread.h"
20 #include "TGo4BufferQueue.h"
22 #include "TGo4Socket.h"
23 #include "TGo4TaskHandler.h"
25 #include "TGo4Task.h"
26 #include "TGo4ComDisconnectSlave.h"
27 
29  TGo4ThreadManager* man,
30  TGo4TaskHandler* hand,
31  Bool_t receivermode)
32  :TGo4TaskHandlerRunnable(name,man,hand,receivermode)
33 {
36 }
37 
39 {
40 }
41 
42 Int_t TGo4DataRunnable::Run(void* ptr)
43 {
44  if(!CheckTransportOpen()) return 0;
45  if(fbReceiverMode)
46  {
47  Int_t rev=fxTransport->ReceiveBuffer();
48  if(rev>=0)
49  {
50  TBuffer* buf=const_cast<TBuffer*> (fxTransport->GetBuffer());
51  Int_t val=0;
52  if(CheckStopBuffer(buf,&val)) return 0; // stop for disconnect mode
54  if(val>=0 && comvalue==kComQuit)
55  {
56  //std::cout <<"QQQQQQQQQ Data Runnable has QUIT "<< std::endl;
57  GetThread()->Stop();
58  TGo4Command* qcommand = new TGo4ComDisconnectSlave;
59  TGo4Task* cli = dynamic_cast<TGo4Task*>(fxManager);
60  if(cli) cli->SubmitLocalCommand(qcommand);
61  return 0;
62  }
63  else
64  {
65  fxBufferQueue->AddBuffer(buf, kTRUE);
66  }
67  }
68  else
69  {
70  // error
72  //if (TGo4SocketSignalHandler::fgxLastSignal == kSigWindowChanged)
73  {
74  // TSocket error because of window resize, do not abort!
75  TGo4Log::Debug(" %s: caught SIGWINCH ",GetName());
77  //TGo4SocketSignalHandler::fgxLastSignal = (ESignals) 0;
78  }
79  else if(fxManager->IsTerminating())
80  {
81  //std::cout <<"Receive error in "<<GetName()<< " while threadmanager is terminating. Ignored!" << std::endl;
82  TGo4Log::Debug("Receive Error in %s during threadmanager termination. Ignored.",GetName());
83  GetThread()->Stop();
84 
85  }
86  else
87  {
88  TGo4Log::Debug(" !!!Receive Error in %s!!!",
89  GetName());
90  //GetThread()->Stop(); std::cout <<"Stopped data runnable. no termination" << std::endl;
92  }
93 
94  } // end if(rev>=0)
95 
96  }
97  else
98  {
99  // get next command from queue or wait for it
100  TBuffer* buf= fxBufferQueue->WaitBuffer();
101  if (buf)
102  // check if there is really an object from queue
103  {
104  CheckStopBuffer(buf);
105  fxTransport->SendBuffer(buf);
106  fxBufferQueue->FreeBuffer(buf); // will delete it or put it back into own free buffer list
107  }
108  }
109  return 0;
110 }
Go4EmergencyCommand_t
Bool_t SubmitLocalCommand(TGo4Command *com)
Definition: TGo4Task.cxx:546
TGo4ThreadManager * fxManager
Definition: TGo4Runnable.h:71
const TBuffer * GetBuffer() const
Definition: TGo4Socket.h:58
Int_t SendBuffer(TBuffer *buf)
Definition: TGo4Socket.cxx:236
Bool_t Stop()
Definition: TGo4Thread.cxx:328
TGo4Thread * GetThread() const
Definition: TGo4Runnable.h:45
TGo4Socket * GetDataTransport() const
static void SetLastSignal(Int_t v=0)
TBuffer * WaitBuffer()
virtual ~TGo4DataRunnable()
TGo4Queue * GetDataQueue() const
Int_t ReceiveBuffer()
Definition: TGo4Socket.cxx:289
void AddBuffer(TBuffer *buffer, Bool_t clone=kFALSE)
Bool_t CheckStopBuffer(TBuffer *buf, Int_t *result=0)
virtual Int_t Run(void *ptr)
Bool_t IsTerminating() const
void FreeBuffer(TBuffer *buffer)
static void Debug(const char *text,...)
Definition: TGo4Log.cxx:270