/******************************************************************************/ /* */ /* X r d C m s R T a b l e . c c */ /* */ /* (c) 2007 by the Board of Trustees of the Leland Stanford, Jr., University */ /* All Rights Reserved */ /* Produced by Andrew Hanushevsky for Stanford University under contract */ /* DE-AC02-76-SFO0515 with the Department of Energy */ /* */ /* This file is part of the XRootD software suite. */ /* */ /* XRootD is free software: you can redistribute it and/or modify it under */ /* the terms of the GNU Lesser General Public License as published by the */ /* Free Software Foundation, either version 3 of the License, or (at your */ /* option) any later version. */ /* */ /* XRootD is distributed in the hope that it will be useful, but WITHOUT */ /* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */ /* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public */ /* License for more details. */ /* */ /* You should have received a copy of the GNU Lesser General Public License */ /* along with XRootD in a file called COPYING.LESSER (LGPL license) and file */ /* COPYING (GPL license). If not, see . */ /* */ /* The copyright holder's institutional names and contributor's names may not */ /* be used to endorse or promote products derived from this software without */ /* specific prior written permission of the institution or contributor. */ /******************************************************************************/ #include "XrdCms/XrdCmsRTable.hh" #include "XrdCms/XrdCmsTrace.hh" using namespace XrdCms; /******************************************************************************/ /* G l o b a l s */ /******************************************************************************/ XrdCmsRTable XrdCms::RTable; /******************************************************************************/ /* A d d */ /******************************************************************************/ short XrdCmsRTable::Add(XrdCmsNode *nP) { int i; // Find a free slot for this node. // myMutex.Lock(); for (i = 1; i < maxRD; i++) if (!Rtable[i]) break; // Insert the node if found // if (i >= maxRD) i = 0; else {Rtable[i] = nP; if (i > Hwm) Hwm = i; } // All done // myMutex.UnLock(); return static_cast(i); } /******************************************************************************/ /* D e l */ /******************************************************************************/ void XrdCmsRTable::Del(XrdCmsNode *nP) { int i; // Find the slot for this node. // myMutex.Lock(); for (i = 1; i <= Hwm; i++) if (Rtable[i] == nP) break; // Remove the node if found // if (i <= Hwm) {Rtable[i] = 0; if (i == Hwm) {while(--i) if (Rtable[i]) break; Hwm = i;} } // All done // myMutex.UnLock(); } /******************************************************************************/ /* F i n d */ /******************************************************************************/ // Note that the caller *must* call Lock() prior to calling find. We do this // because this is the only way we can interlock the use of the node object // with deletion of that object as it must be removed prior to deletion. XrdCmsNode *XrdCmsRTable::Find(short Num, int Inst) { // Find the instance of the node in the indicated slot // if (Num <= Hwm && Rtable[Num] && Rtable[Num]->Inst() == Inst) return Rtable[Num]; return (XrdCmsNode *)0; } /******************************************************************************/ /* S e n d */ /******************************************************************************/ void XrdCmsRTable::Send(const char *What, const char *data, int dlen) { EPNAME("Send"); int i; // Send the data to all nodes in this table // myMutex.Lock(); for (i = 1; i <= Hwm; i++) if (Rtable[i]) {DEBUG(What <<" to " <Ident); Rtable[i]->Send(data, dlen); } myMutex.UnLock(); }