GSI Object Oriented Online Offline (Go4)  GO4-6.3.0
TGo4DataRunnable.cxx
Go to the documentation of this file.
1 // $Id$
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 fuer 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 "TGo4Log.h"
17 #include "TGo4Thread.h"
18 #include "TGo4BufferQueue.h"
20 #include "TGo4Socket.h"
21 #include "TGo4TaskHandler.h"
23 #include "TGo4Task.h"
24 #include "TGo4ComDisconnectSlave.h"
25 
27  TGo4ThreadManager *man,
28  TGo4TaskHandler *hand,
29  Bool_t receivermode)
30  :TGo4TaskHandlerRunnable(name,man,hand,receivermode)
31 {
34 }
35 
37 {
38 }
39 
40 Int_t TGo4DataRunnable::Run(void *ptr)
41 {
42  if(!CheckTransportOpen()) return 0;
43  if(fbReceiverMode)
44  {
45  Int_t rev=fxTransport->ReceiveBuffer();
46  if(rev >= 0)
47  {
48  TBuffer *buf = const_cast<TBuffer *> (fxTransport->GetBuffer());
49  Int_t val = 0;
50  if(CheckStopBuffer(buf,&val)) return 0; // stop for disconnect mode
52  if(val >= 0 && comvalue == kComQuit)
53  {
54  GetThread()->Stop();
55  TGo4Command *qcommand = new TGo4ComDisconnectSlave;
56  TGo4Task* cli = dynamic_cast<TGo4Task*>(fxManager);
57  if(cli) cli->SubmitLocalCommand(qcommand);
58  return 0;
59  }
60  else
61  {
62  fxBufferQueue->AddBuffer(buf, kTRUE);
63  }
64  }
65  else
66  {
67  // error
69  //if (TGo4SocketSignalHandler::fgxLastSignal == kSigWindowChanged)
70  {
71  // TSocket error because of window resize, do not abort!
72  TGo4Log::Debug(" %s: caught SIGWINCH ",GetName());
74  //TGo4SocketSignalHandler::fgxLastSignal = (ESignals) 0;
75  }
76  else if(fxManager->IsTerminating())
77  {
78  TGo4Log::Debug("Receive Error in %s during threadmanager termination. Ignored.",GetName());
79  GetThread()->Stop();
80  }
81  else
82  {
83  TGo4Log::Debug(" !!!Receive Error in %s!!!", GetName());
84  //GetThread()->Stop(); std::cout <<"Stopped data runnable. no termination" << std::endl;
86  }
87 
88  } // end if(rev >= 0)
89 
90  }
91  else
92  {
93  // get next command from queue or wait for it
94  TBuffer *buf= fxBufferQueue->WaitBuffer();
95  if (buf)
96  // check if there is really an object from queue
97  {
98  CheckStopBuffer(buf);
99  fxTransport->SendBuffer(buf);
100  fxBufferQueue->FreeBuffer(buf); // will delete it or put it back into own free buffer list
101  }
102  }
103  return 0;
104 }
TGo4Thread * GetThread() const
Definition: TGo4Runnable.h:44
Go4EmergencyCommand_t
Int_t Run(void *) override
Bool_t SubmitLocalCommand(TGo4Command *com)
Definition: TGo4Task.cxx:508
TGo4ThreadManager * fxManager
Definition: TGo4Runnable.h:70
Bool_t CheckStopBuffer(TBuffer *buf, Int_t *result=nullptr)
Int_t SendBuffer(TBuffer *buf)
Definition: TGo4Socket.cxx:220
Bool_t Stop()
Definition: TGo4Thread.cxx:287
TGo4Socket * GetDataTransport() const
static void SetLastSignal(Int_t v=0)
TBuffer * WaitBuffer()
static void Debug(const char *text,...) GO4_PRINTF_ARGS
Definition: TGo4Log.cxx:281
virtual ~TGo4DataRunnable()
Int_t ReceiveBuffer()
Definition: TGo4Socket.cxx:273
void AddBuffer(TBuffer *buffer, Bool_t clone=kFALSE)
Bool_t IsTerminating() const
TGo4Queue * GetDataQueue() const
void FreeBuffer(TBuffer *buffer)
const TBuffer * GetBuffer() const
Definition: TGo4Socket.h:59