CMS 3D CMS Logo

DQMImplNet< ObjType > Class Template Reference

#include <DQMServices/Core/interface/DQMNet.h>

Inheritance diagram for DQMImplNet< ObjType >:

DQMNet

List of all members.

Public Types

typedef std::map< std::string,
ObjType
ObjectMap
typedef std::map< lat::Socket *,
ImplPeer
PeerMap

Public Member Functions

 DQMImplNet (const std::string &appname="")
 ~DQMImplNet (void)

Protected Member Functions

virtual PeercreatePeer (lat::Socket *s)
virtual ObjectfindObject (Peer *p, const std::string &name, Peer **owner=0)
virtual PeergetPeer (lat::Socket *s)
virtual ObjectmakeObject (Peer *p, const std::string &name)
virtual void markObjectsDead (Peer *p)
virtual void markObjectsZombies (Peer *p)
virtual void purgeDeadObject (ObjType &o)
virtual void purgeDeadObjects (lat::Time oldobj, lat::Time deadobj)
virtual void removePeer (Peer *p, lat::Socket *s)
virtual void requestFullUpdatesFromPeers (void)
virtual void sendObjectListToPeer (Bucket *msg, bool data, bool all, bool clear)
 Send all objects to a peer and optionally mark sent objects old.
virtual void sendObjectListToPeers (bool all)
virtual void updatePeerMasks (void)

Protected Attributes

PeerMap peers_

Classes

struct  ImplPeer


Detailed Description

template<class ObjType>
class DQMImplNet< ObjType >

Definition at line 218 of file DQMNet.h.


Member Typedef Documentation

template<class ObjType>
typedef std::map<std::string, ObjType> DQMImplNet< ObjType >::ObjectMap

Definition at line 221 of file DQMNet.h.

template<class ObjType>
typedef std::map<lat::Socket *, ImplPeer> DQMImplNet< ObjType >::PeerMap

Definition at line 223 of file DQMNet.h.


Constructor & Destructor Documentation

template<class ObjType>
DQMImplNet< ObjType >::DQMImplNet ( const std::string &  appname = ""  )  [inline]

Definition at line 229 of file DQMNet.h.

00230     : DQMNet(appname)
00231     {}

template<class ObjType>
DQMImplNet< ObjType >::~DQMImplNet ( void   )  [inline]

Definition at line 233 of file DQMNet.h.

00234     {
00235       typename PeerMap::iterator pi, pe;
00236       typename ObjectMap::iterator oi, oe;
00237       for (pi = peers_.begin(), pe = peers_.end(); pi != pe; ++pi)
00238         for (oi = pi->second.objs.begin(), oe = pi->second.objs.end(); oi != oe; ++oi)
00239         {
00240           ObjType &o = oi->second;
00241           delete o.object;
00242           delete o.reference;
00243           o.object = 0;
00244           o.reference = 0;
00245         }
00246     }


Member Function Documentation

template<class ObjType>
virtual Peer* DQMImplNet< ObjType >::createPeer ( lat::Socket s  )  [inline, protected, virtual]

Implements DQMNet.

Definition at line 379 of file DQMNet.h.

00380     {
00381       ImplPeer *ip = &peers_[s];
00382       ip->socket = 0;
00383       ip->sendq = 0;
00384       ip->sendpos = 0;
00385       ip->mask = 0;
00386       ip->source = false;
00387       ip->update = false;
00388       ip->updated = false;
00389       ip->updatefull = false;
00390       ip->updates = 0;
00391       ip->waiting = 0;
00392       ip->automatic = 0;
00393       return ip;
00394     }

template<class ObjType>
virtual Object* DQMImplNet< ObjType >::findObject ( Peer p,
const std::string &  name,
Peer **  owner = 0 
) [inline, protected, virtual]

Implements DQMNet.

Definition at line 250 of file DQMNet.h.

00251     {
00252       typename ObjectMap::iterator pos;
00253       typename PeerMap::iterator i, e;
00254       if (owner)
00255         *owner = 0;
00256       if (p)
00257       {
00258         ImplPeer *ip = static_cast<ImplPeer *>(p);
00259         pos = ip->objs.find(name);
00260         if (pos == ip->objs.end())
00261           return 0;
00262         else
00263         {
00264           if (owner) *owner = ip;
00265           return &pos->second;
00266         }
00267       }
00268       else
00269       {
00270         for (i = peers_.begin(), e = peers_.end(); i != e; ++i)
00271         {
00272           pos = i->second.objs.find(name);
00273           if (pos != i->second.objs.end())
00274           {
00275             if (owner) *owner = &i->second;
00276             return &pos->second;
00277           }
00278         }
00279         return 0;
00280       }
00281     }

template<class ObjType>
virtual Peer* DQMImplNet< ObjType >::getPeer ( lat::Socket s  )  [inline, protected, virtual]

Implements DQMNet.

Definition at line 372 of file DQMNet.h.

00373     {
00374       typename PeerMap::iterator pos = peers_.find(s);
00375       return pos == peers_.end() ? 0 : &pos->second;
00376     }

template<class ObjType>
virtual Object* DQMImplNet< ObjType >::makeObject ( Peer p,
const std::string &  name 
) [inline, protected, virtual]

Implements DQMNet.

Definition at line 284 of file DQMNet.h.

00285     {
00286       ImplPeer *ip = static_cast<ImplPeer *>(p);
00287       ObjType *o = &ip->objs[name];
00288       o->version = 0;
00289       o->name = name;
00290       o->object = 0;
00291       o->reference = 0;
00292       o->flags = 0;
00293       o->lastreq = 0;
00294       return o;
00295     }

template<class ObjType>
virtual void DQMImplNet< ObjType >::markObjectsDead ( Peer p  )  [inline, protected, virtual]

Implements DQMNet.

Definition at line 314 of file DQMNet.h.

00315     {
00316       ImplPeer *ip = static_cast<ImplPeer *>(p);
00317       typename ObjectMap::iterator i, e;
00318       for (i = ip->objs.begin(), e = ip->objs.end(); i != e; ++i)
00319         if (i->second.flags & DQM_FLAG_ZOMBIE)
00320           i->second.flags = (i->second.flags & ~DQM_FLAG_ZOMBIE) | DQM_FLAG_DEAD;
00321     }

template<class ObjType>
virtual void DQMImplNet< ObjType >::markObjectsZombies ( Peer p  )  [inline, protected, virtual]

Implements DQMNet.

Definition at line 304 of file DQMNet.h.

00305     {
00306       ImplPeer *ip = static_cast<ImplPeer *>(p);
00307       typename ObjectMap::iterator i, e;
00308       for (i = ip->objs.begin(), e = ip->objs.end(); i != e; ++i)
00309         i->second.flags |= DQM_FLAG_ZOMBIE;
00310     }

template<class ObjType>
virtual void DQMImplNet< ObjType >::purgeDeadObject ( ObjType o  )  [inline, protected, virtual]

Definition at line 368 of file DQMNet.h.

Referenced by DQMImplNet< DQMNet::Object >::purgeDeadObjects().

00369     {}

template<class ObjType>
virtual void DQMImplNet< ObjType >::purgeDeadObjects ( lat::Time  oldobj,
lat::Time  deadobj 
) [inline, protected, virtual]

Implements DQMNet.

Definition at line 325 of file DQMNet.h.

00326     {
00327       typename PeerMap::iterator pi, pe;
00328       typename ObjectMap::iterator oi, oe;
00329       for (pi = peers_.begin(), pe = peers_.end(); pi != pe; ++pi)
00330         for (oi = pi->second.objs.begin(), oe = pi->second.objs.end(); oi != oe; )
00331         {
00332           ObjType &o = oi->second;
00333 
00334           // Compact non-scalar objects that are unused.  We send scalar
00335           // objects to the web server so we keep them around.
00336           if (o.lastreq < oldobj && o.object && ! (o.flags & DQM_FLAG_SCALAR))
00337           {
00338             if (debug_)
00339               logme()
00340                 << "DEBUG: compacting idle '" << o.name
00341                 << "' from " << pi->second.peeraddr << std::endl;
00342 
00343             delete o.object;
00344             delete o.reference;
00345             o.object = 0;
00346             o.reference = 0;
00347             purgeDeadObject(o);
00348           }
00349 
00350           // Remove if dead, old and unused.
00351           if (o.lastreq < deadobj
00352               && o.version < deadobj
00353               && (o.flags & DQM_FLAG_DEAD))
00354           {
00355             if (debug_)
00356               logme()
00357                 << "DEBUG: removing dead '" << o.name
00358                 << "' from " << pi->second.peeraddr << std::endl;
00359 
00360             pi->second.objs.erase(oi++);
00361           }
00362           else
00363             ++oi;
00364         }
00365     }

template<class ObjType>
virtual void DQMImplNet< ObjType >::removePeer ( Peer p,
lat::Socket s 
) [inline, protected, virtual]

Implements DQMNet.

Definition at line 397 of file DQMNet.h.

00398     {
00399       ImplPeer *ip = static_cast<ImplPeer *>(p);
00400       bool needflush = ! ip->objs.empty();
00401 
00402       typename ObjectMap::iterator i, e;
00403       for (i = ip->objs.begin(), e = ip->objs.end(); i != e; )
00404       {
00405         ObjType &o = i->second;
00406         delete o.object;
00407         delete o.reference;
00408         ip->objs.erase(i++);
00409       }
00410     
00411       peers_.erase(s);
00412 
00413       // If we removed a peer with objects, our list of objects
00414       // has changed and we need to update downstream peers.
00415       if (needflush)
00416         sendLocalChanges();
00417     }

template<class ObjType>
virtual void DQMImplNet< ObjType >::requestFullUpdatesFromPeers ( void   )  [inline, protected, virtual]

Implements DQMNet.

Reimplemented in DQMBasicNet.

Definition at line 488 of file DQMNet.h.

00489     {
00490       logme()
00491         << "ERROR: invalid request for full updates from peers.\n";
00492     }

template<class ObjType>
virtual void DQMImplNet< ObjType >::sendObjectListToPeer ( Bucket msg,
bool  data,
bool  all,
bool  clear 
) [inline, protected, virtual]

Send all objects to a peer and optionally mark sent objects old.

Implements DQMNet.

Definition at line 421 of file DQMNet.h.

Referenced by DQMImplNet< DQMNet::Object >::sendObjectListToPeers().

00422     {
00423       typename PeerMap::iterator pi, pe;
00424       typename ObjectMap::iterator oi, oe;
00425       uint32_t numobjs = 0;
00426       for (pi = peers_.begin(), pe = peers_.end(); pi != pe; ++pi)
00427         numobjs += pi->second.objs.size();
00428 
00429       msg->data.reserve(msg->data.size() + 300*numobjs);
00430 
00431       uint32_t nupdates = 0;
00432       uint32_t words [4];
00433       words[0] = sizeof(words);
00434       words[1] = DQM_REPLY_LIST_BEGIN;
00435       words[2] = numobjs;
00436       words[3] = all;
00437       copydata(msg, &words[0], sizeof(words));
00438 
00439       for (pi = peers_.begin(), pe = peers_.end(); pi != pe; ++pi)
00440         for (oi = pi->second.objs.begin(), oe = pi->second.objs.end(); oi != oe; ++oi)
00441           if (all || (oi->second.flags & DQM_FLAG_NEW))
00442           {
00443             sendObjectToPeer(msg, oi->second, data, sendScalarAsText_);
00444             if (clear)
00445               oi->second.flags &= ~DQM_FLAG_NEW;
00446             ++nupdates;
00447           }
00448 
00449       words[1] = DQM_REPLY_LIST_END;
00450       words[2] = nupdates;
00451       copydata(msg, &words[0], sizeof(words));
00452     }

template<class ObjType>
virtual void DQMImplNet< ObjType >::sendObjectListToPeers ( bool  all  )  [inline, protected, virtual]

Implements DQMNet.

Definition at line 455 of file DQMNet.h.

00456     {
00457       typename PeerMap::iterator i, e;
00458       for (i = peers_.begin(), e = peers_.end(); i != e; ++i)
00459       {
00460         ImplPeer &p = i->second;
00461         if (! p.update)
00462           continue;
00463 
00464         if (debug_)
00465           logme()
00466             << "DEBUG: notifying " << p.peeraddr
00467             << ", full = " << p.updatefull << std::endl;
00468 
00469         Bucket msg;
00470         msg.next = 0;
00471         sendObjectListToPeer(&msg, p.updatefull, !p.updated || all, true);
00472 
00473         if (! msg.data.empty())
00474         {
00475           Bucket **prev = &p.sendq;
00476           while (*prev)
00477              prev = &(*prev)->next;
00478 
00479           *prev = new Bucket;
00480           (*prev)->next = 0;
00481           (*prev)->data.swap(msg.data);
00482         }
00483         p.updated = true;
00484       }
00485     }

template<class ObjType>
virtual void DQMImplNet< ObjType >::updatePeerMasks ( void   )  [inline, protected, virtual]

Implements DQMNet.

Definition at line 495 of file DQMNet.h.

00496     {
00497       typename PeerMap::iterator i, e;
00498       for (i = peers_.begin(), e = peers_.end(); i != e; )
00499         updateMask(&(i++)->second);
00500     }


Member Data Documentation

template<class ObjType>
PeerMap DQMImplNet< ObjType >::peers_ [protected]

Definition at line 503 of file DQMNet.h.

Referenced by DQMImplNet< DQMNet::Object >::createPeer(), DQMImplNet< DQMNet::Object >::findObject(), DQMImplNet< DQMNet::Object >::getPeer(), DQMImplNet< DQMNet::Object >::purgeDeadObjects(), DQMImplNet< DQMNet::Object >::removePeer(), DQMImplNet< DQMNet::Object >::sendObjectListToPeer(), DQMImplNet< DQMNet::Object >::sendObjectListToPeers(), DQMImplNet< DQMNet::Object >::updatePeerMasks(), and DQMImplNet< DQMNet::Object >::~DQMImplNet().


The documentation for this class was generated from the following file:
Generated on Tue Jun 9 18:18:35 2009 for CMSSW by  doxygen 1.5.4