#include "TMonitor.h"
#include "TSocket.h"
#include "TList.h"
#include "TSystem.h"
#include "TSysEvtHandler.h"
#include "TTimer.h"
#include "TError.h"
class TSocketHandler : public TFileHandler {
private:
TMonitor *fMonitor;
TSocket *fSocket;
public:
TSocketHandler(TMonitor *m, TSocket *s, Int_t interest, Bool_t mainloop = kTRUE);
Bool_t Notify();
Bool_t ReadNotify() { return Notify(); }
Bool_t WriteNotify() { return Notify(); }
TSocket *GetSocket() const { return fSocket; }
};
TSocketHandler::TSocketHandler(TMonitor *m, TSocket *s,
Int_t interest, Bool_t mainloop)
: TFileHandler(s->GetDescriptor(), interest)
{
fMonitor = m;
fSocket = s;
if (mainloop)
Add();
}
Bool_t TSocketHandler::Notify()
{
fMonitor->SetReady(fSocket);
return kTRUE;
}
class TTimeOutTimer : public TTimer {
private:
TMonitor *fMonitor;
public:
TTimeOutTimer(TMonitor *m, Long_t ms);
Bool_t Notify();
};
TTimeOutTimer::TTimeOutTimer(TMonitor *m, Long_t ms)
: TTimer(ms, kTRUE)
{
fMonitor = m;
gSystem->AddTimer(this);
}
Bool_t TTimeOutTimer::Notify()
{
fMonitor->SetReady((TSocket *)-1);
Remove();
return kTRUE;
}
ClassImp(TMonitor)
TMonitor::TMonitor(Bool_t mainloop) : TObject() , TQObject()
{
R__ASSERT(gSystem);
fActive = new TList;
fDeActive = new TList;
fMainLoop = mainloop;
fInterrupt = kFALSE;
}
TMonitor::TMonitor(const TMonitor &m) : TObject() , TQObject()
{
TSocketHandler *sh = 0;
fActive = new TList;
TIter nxa(m.fActive);
while ((sh = (TSocketHandler *)nxa())) {
Int_t mask = 0;
if (sh->HasReadInterest()) mask |= 0x1;
if (sh->HasWriteInterest()) mask |= 0x2;
fActive->Add(new TSocketHandler(this, sh->GetSocket(), mask, m.fMainLoop));
}
fDeActive = new TList;
TIter nxd(m.fDeActive);
while ((sh = (TSocketHandler *)nxd())) {
Int_t mask = 0;
if (sh->HasReadInterest()) mask |= 0x1;
if (sh->HasWriteInterest()) mask |= 0x2;
fDeActive->Add(new TSocketHandler(this, sh->GetSocket(), mask, m.fMainLoop));
}
fMainLoop = m.fMainLoop;
fInterrupt = m.fInterrupt;
fReady = 0;
}
TMonitor::~TMonitor()
{
fActive->Delete();
SafeDelete(fActive);
fDeActive->Delete();
SafeDelete(fDeActive);
}
void TMonitor::Add(TSocket *sock, Int_t interest)
{
fActive->Add(new TSocketHandler(this, sock, interest, fMainLoop));
}
void TMonitor::SetInterest(TSocket *sock, Int_t interest)
{
TSocketHandler *s = 0;
if (!interest)
interest = kRead;
TIter next(fActive);
while ((s = (TSocketHandler *) next())) {
if (sock == s->GetSocket()) {
s->SetInterest(interest);
return;
}
}
TIter next1(fDeActive);
while ((s = (TSocketHandler *) next1())) {
if (sock == s->GetSocket()) {
fDeActive->Remove(s);
fActive->Add(s);
s->SetInterest(interest);
return;
}
}
fActive->Add(new TSocketHandler(this, sock, interest, fMainLoop));
}
void TMonitor::Remove(TSocket *sock)
{
TIter next(fActive);
TSocketHandler *s;
while ((s = (TSocketHandler *) next())) {
if (sock == s->GetSocket()) {
fActive->Remove(s);
delete s;
return;
}
}
TIter next1(fDeActive);
while ((s = (TSocketHandler *) next1())) {
if (sock == s->GetSocket()) {
fDeActive->Remove(s);
delete s;
return;
}
}
}
void TMonitor::RemoveAll()
{
fActive->Delete();
fDeActive->Delete();
}
void TMonitor::Activate(TSocket *sock)
{
TIter next(fDeActive);
TSocketHandler *s;
while ((s = (TSocketHandler *) next())) {
if (sock == s->GetSocket()) {
fDeActive->Remove(s);
fActive->Add(s);
s->Add();
return;
}
}
}
void TMonitor::ActivateAll()
{
TIter next(fDeActive);
TSocketHandler *s;
while ((s = (TSocketHandler *) next())) {
fActive->Add(s);
s->Add();
}
fDeActive->Clear();
}
void TMonitor::DeActivate(TSocket *sock)
{
TIter next(fActive);
TSocketHandler *s;
while ((s = (TSocketHandler *) next())) {
if (sock == s->GetSocket()) {
fActive->Remove(s);
fDeActive->Add(s);
s->Remove();
return;
}
}
}
void TMonitor::DeActivateAll()
{
TIter next(fActive);
TSocketHandler *s;
while ((s = (TSocketHandler *) next())) {
fDeActive->Add(s);
s->Remove();
}
fActive->Clear();
}
TSocket *TMonitor::Select()
{
fInterrupt = kFALSE;
fReady = 0;
while (!fReady && !fInterrupt)
gSystem->InnerLoop();
if (fInterrupt) {
fReady = 0;
Info("Select","*** interrupt occured ***");
}
return fReady;
}
TSocket *TMonitor::Select(Long_t timeout)
{
if (timeout < 0)
return TMonitor::Select();
fInterrupt = kFALSE;
fReady = 0;
TTimeOutTimer t(this, timeout);
while (!fReady && !fInterrupt)
gSystem->InnerLoop();
if (fInterrupt) {
fReady = 0;
Info("Select","*** interrupt occured ***");
}
return fReady;
}
Int_t TMonitor::Select(TList *rdready, TList *wrready, Long_t timeout)
{
Int_t nr = -2;
TSocketHandler *h = 0;
Int_t ns = fActive->GetSize();
if (ns == 1) {
h = (TSocketHandler *)fActive->First();
nr = gSystem->Select((TFileHandler *)h, timeout);
} else if (ns > 1) {
nr = gSystem->Select(fActive, timeout);
}
if (nr > 0 && (rdready || wrready)) {
if (rdready)
rdready->Clear();
if (wrready)
wrready->Clear();
if (!h) {
TIter next(fActive);
while ((h = (TSocketHandler *)next())) {
if (rdready && h->IsReadReady())
rdready->Add(h->GetSocket());
if (wrready && h->IsWriteReady())
wrready->Add(h->GetSocket());
}
} else {
if (rdready && h->IsReadReady())
rdready->Add(h->GetSocket());
if (wrready && h->IsWriteReady())
wrready->Add(h->GetSocket());
}
}
return nr;
}
void TMonitor::SetReady(TSocket *sock)
{
fReady = sock;
Ready(fReady);
}
Int_t TMonitor::GetActive(Long_t timeout) const
{
if (timeout >= 0) {
TIter next(fActive);
TSocketHandler *s;
if (timeout > 0) {
TTimeStamp now;
while ((s = (TSocketHandler *) next())) {
TSocket *xs = s->GetSocket();
TTimeStamp ts = xs->GetLastUsage();
Long_t dt = (Long_t)(now.GetSec() - ts.GetSec()) * 1000 +
(Long_t)(now.GetNanoSec() - ts.GetNanoSec()) / 1000000 ;
if (dt > timeout) {
Info("GetActive", "socket: %p: %s:%d did not show any activity"
" during the last %ld millisecs: deactivating",
xs, xs->GetInetAddress().GetHostName(),
xs->GetInetAddress().GetPort(), timeout);
fActive->Remove(s);
fDeActive->Add(s);
s->Remove();
}
}
} else if (timeout == 0) {
while ((s = (TSocketHandler *) next())) {
s->GetSocket()->Touch();
}
}
}
return fActive->GetSize();
}
Int_t TMonitor::GetDeActive() const
{
return fDeActive->GetSize();
}
Bool_t TMonitor::IsActive(TSocket *sock) const
{
TIter next(fActive);
while (TSocketHandler *h = (TSocketHandler*) next())
if (sock == h->GetSocket())
return kTRUE;
return kFALSE;
}
TList *TMonitor::GetListOfActives() const
{
TList *list = new TList;
TIter next(fActive);
while (TSocketHandler *h = (TSocketHandler*) next())
list->Add(h->GetSocket());
return list;
}
TList *TMonitor::GetListOfDeActives() const
{
TList *list = new TList;
TIter next(fDeActive);
while (TSocketHandler *h = (TSocketHandler*) next())
list->Add(h->GetSocket());
return list;
}
void TMonitor::Ready(TSocket *sock)
{
Emit("Ready(TSocket*)", (Long_t)sock);
}
Last change: Fri Nov 21 17:20:39 2008
Last generated: 2008-11-21 17:20
This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.