GSI Object Oriented Online Offline (Go4) GO4-6.4.0
Loading...
Searching...
No Matches
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
25TGo4StatusRunnable::TGo4StatusRunnable(const char *name, TGo4ThreadManager *man, TGo4TaskHandler *hand, Bool_t receivermode) :
26 TGo4TaskHandlerRunnable(name,man,hand,receivermode)
27{
28 fxBufferQueue = dynamic_cast<TGo4BufferQueue*> (fxTaskHandler->GetStatusQueue() );
29 fxTransport = fxTaskHandler->GetStatusTransport();
30}
31
32
36
38{
39 if(!CheckTransportOpen()) return 0;
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);
83 fxBufferQueue->FreeBuffer(buf);
84 }
85 } // else if(fbReceiverMode)
86
87
88 return 0;
89}
90
Class containing a pointer queue for TBuffers.
static void Debug(const char *text,...) GO4_PRINTF_ARGS
User shortcut for message with prio 0.
Definition TGo4Log.cxx:281
TGo4Thread * GetThread() const
TGo4ThreadManager * fxManager
The threadmanager which is responsible for our thread.
static void SetLastSignal(Int_t v=0)
Int_t Run(void *) override
The working function which runs in the thread.
Bool_t fbReceiverMode
flag indicating operation mode of runnable, depending on client or server mode of task handler
Bool_t CheckTransportOpen()
Test if socket transport exists and is open.
Bool_t CheckStopBuffer(TBuffer *buf, Int_t *result=nullptr)
Test if buffer contains a message to stop this runnable.
TGo4TaskHandler * fxTaskHandler
link to external task handler (for server mode) 1 1
TGo4Socket * fxTransport
link to external inter-tasl transport channel
TGo4TaskHandlerRunnable(const char *name, TGo4ThreadManager *man, TGo4TaskHandler *hand, Bool_t receivermode=kTRUE)
TGo4BufferQueue * fxBufferQueue
Link to external buffer queue.
This class is responsible for the interconnection of two tasks: provided are three communication chan...
Go4 thread manager.
Bool_t Stop()
resets running flag for runnable