GSI Object Oriented Online Offline (Go4)  GO4-6.3.0
TGo4StatusRunnable.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 "TGo4StatusRunnable.h"
15 
16 #include "TGo4Log.h"
17 #include "TGo4ThreadManager.h"
18 #include "TGo4Thread.h"
19 #include "TGo4BufferQueue.h"
20 #include "TGo4Socket.h"
22 #include "TGo4TaskHandler.h"
24 
25 TGo4StatusRunnable::TGo4StatusRunnable(const char *name, TGo4ThreadManager *man, TGo4TaskHandler *hand, Bool_t receivermode) :
26  TGo4TaskHandlerRunnable(name,man,hand,receivermode)
27 {
30 }
31 
32 
34 {
35 }
36 
37 Int_t TGo4StatusRunnable::Run(void *ptr)
38 {
39  if(!CheckTransportOpen()) return 0;
40  if(fbReceiverMode)
41  {
42  // server side: receive status objects from client
43  Int_t rev = fxTransport->ReceiveBuffer();
44  if(rev >= 0)
45  {
46  TBuffer *buf = const_cast<TBuffer *> (fxTransport->GetBuffer());
47  if(CheckStopBuffer(buf)) return 0; // stop for disconnect mode
48  fxBufferQueue->AddBuffer(buf, kTRUE);
49  }
50  else
51  {
53  {
54  // TSocket error because of window resize, do not abort!
55  TGo4Log::Debug(" %s: caught SIGWINCH ",GetName());
57  }
58  else if(fxManager->IsTerminating())
59  {
60  TGo4Log::Debug("Receive Error in %s during threadmanager termination. Ignored.",GetName());
61  GetThread()->Stop();
62  }
63  else
64  {
65  TGo4Log::Debug(" !!!Receive Error in %s!!!",
66  GetName());
67  //GetThread()->Stop(); std::cout <<"Stopped status runnable. no termination" << std::endl;
69  }
70  }
71 
72  }
73  else
74  {
75  // client side: send status buffer to server
76  // get next status buffer from queue or wait for it
77  TBuffer *buf= fxBufferQueue->WaitBuffer();
78  if (buf)
79  // check if there is really an object from queue
80  {
81  CheckStopBuffer(buf);
82  fxTransport->SendBuffer(buf);
84  }
85  } // else if(fbReceiverMode)
86 
87 
88  return 0;
89 }
90 
TGo4Thread * GetThread() const
Definition: TGo4Runnable.h:44
TGo4ThreadManager * fxManager
Definition: TGo4Runnable.h:70
Bool_t CheckStopBuffer(TBuffer *buf, Int_t *result=nullptr)
Int_t SendBuffer(TBuffer *buf)
Definition: TGo4Socket.cxx:220
Int_t Run(void *) override
Bool_t Stop()
Definition: TGo4Thread.cxx:287
static void SetLastSignal(Int_t v=0)
TBuffer * WaitBuffer()
static void Debug(const char *text,...) GO4_PRINTF_ARGS
Definition: TGo4Log.cxx:281
Int_t ReceiveBuffer()
Definition: TGo4Socket.cxx:273
void AddBuffer(TBuffer *buffer, Bool_t clone=kFALSE)
TGo4Queue * GetStatusQueue() const
Bool_t IsTerminating() const
TGo4Socket * GetStatusTransport() const
void FreeBuffer(TBuffer *buffer)
const TBuffer * GetBuffer() const
Definition: TGo4Socket.h:59