#include "XrdServer.h"
#include "XrdUser.h"
#include "XrdFile.h"
#include "XrdServer.c7"
ClassImp(XrdServer);
void XrdServer::_init()
{
mLastSrvIdTime.SetNever();
mAvgSrvIdDelta = -1;
mPacketCount = mSeqIdFailCount = 0;
ResetSrvSeq();
}
XrdServer::XrdServer(const TString& n, const TString& t) :
ZNameMap(n, t)
{
_init();
}
XrdServer::XrdServer(const TString& n, const TString& t, const TString& h, const TString& d, const GTime& st) :
ZNameMap(n, t),
mHost(h), mDomain(d), mStartTime(st)
{
_init();
}
XrdServer::~XrdServer()
{}
void XrdServer::AdEnlightenment()
{
PARENT_GLASS::AdEnlightenment();
if (mPrevUsers == 0)
{
assign_link<ZList>(mPrevUsers, FID(), "PrevUsers",
GForm("Previous users of %s", GetName()));
mPrevUsers->SetElementFID(XrdUser::FID());
mPrevUsers->SetMIRActive(false);
}
}
TString XrdServer::GetFqhn() const
{
return mHost + "." + mDomain;
}
void XrdServer::UpdateSrvIdTime(const GTime& t)
{
if ( ! mLastSrvIdTime.IsNever())
{
Int_t dt = TMath::Max(10, TMath::Nint((t - mLastSrvIdTime).ToDouble()));
if (mAvgSrvIdDelta <= 0)
{
mAvgSrvIdDelta = dt;
}
else if (dt < mAvgSrvIdDelta)
{
mAvgSrvIdDelta = TMath::Nint(0.9*mAvgSrvIdDelta + 0.1*dt);
}
}
mLastSrvIdTime = t;
Stamp(FID());
}
void XrdServer::IncPacketCount()
{
if (++mPacketCount % 100 == 0)
Stamp(FID());
}
void XrdServer::IncSeqIdFailCount()
{
++mSeqIdFailCount;
Stamp(FID());
}
Bool_t XrdServer::ExistsUserDictId(Int_t dict_id)
{
GMutexHolder _lck(mUserMapMutex);
return mUserMap.find(dict_id) != mUserMap.end();
}
void XrdServer::AddUser(XrdUser* user, Int_t dict_id)
{
static const Exc_t _eh("XrdServer::AddUser ");
GMutexHolder _lck(mUserMapMutex);
if (mUserMap.find(dict_id) != mUserMap.end())
throw _eh + "dict_id exists already.";
Add(user);
mUserMap.insert(make_pair(dict_id, user));
user->m_dict_id = dict_id;
}
void XrdServer::DisconnectUser(XrdUser* user)
{
static const Exc_t _eh("XrdServer::DisconnectUser ");
{
GMutexHolder _lck(mUserMapMutex);
mDict2User_i i = mUserMap.find(user->m_dict_id);
if (i == mUserMap.end())
throw _eh + "dict_id does not exist for user '" + user->GetName() + "'.";
mUserMap.erase(i);
}
mPrevUsers->Add(user);
RemoveAll(user);
}
void XrdServer::RemovePrevUser(XrdUser* user)
{
mPrevUsers->RemoveAll(user);
}
XrdUser* XrdServer::FindUser(const TString& name)
{
return dynamic_cast<XrdUser*>(GetElementByName(name));
}
XrdUser* XrdServer::FindUser(Int_t dict_id)
{
GMutexHolder _lck(mUserMapMutex);
mDict2User_i i = mUserMap.find(dict_id);
return (i != mUserMap.end()) ? i->second : 0;
}
Bool_t XrdServer::ExistsFileDictId(Int_t dict_id)
{
GMutexHolder _lck(mFileMapMutex);
return mFileMap.find(dict_id) != mFileMap.end();
}
void XrdServer::AddFile(XrdFile* file, Int_t dict_id)
{
static const Exc_t _eh("XrdServer::AddFile ");
GMutexHolder _lck(mFileMapMutex);
if (mFileMap.find(dict_id) != mFileMap.end())
throw _eh + "dict_id exists already.";
mFileMap.insert(make_pair(dict_id, file));
file->m_dict_id = dict_id;
}
void XrdServer::RemoveFile(XrdFile* file)
{
static const Exc_t _eh("XrdServer::RemoveFile ");
GMutexHolder _lck(mFileMapMutex);
mDict2File_i i = mFileMap.find(file->m_dict_id);
if (i == mFileMap.end())
throw _eh + "dict_id not registered for file '" + file->GetName() + "'.";
if (i->second != file)
throw _eh + "stored file '" + file->GetName() +
"' and file passed as argument '" + i->second->GetName() +
"' do not match.";
mFileMap.erase(i);
}
XrdFile* XrdServer::FindFile(Int_t dict_id)
{
GMutexHolder _lck(mFileMapMutex);
mDict2File_i i = mFileMap.find(dict_id);
return (i != mFileMap.end()) ? i->second : 0;
}