/******************************************************************************/
/* */
/* X r d C n s L o g R e c . c c */
/* */
/* (c) 2009 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
#include
#include
#include
#include
#include "XrdCns/XrdCnsLogRec.hh"
#include "XrdSys/XrdSysTimer.hh"
/******************************************************************************/
/* G l o b a l s */
/******************************************************************************/
extern XrdSysError XrdLog;
XrdSysMutex XrdCnsLogRec::fMutex;
XrdCnsLogRec *XrdCnsLogRec::freeRec = 0;
XrdSysSemaphore XrdCnsLogRec::qSem(0);
XrdSysMutex XrdCnsLogRec::qMutex;
XrdCnsLogRec *XrdCnsLogRec::frstRec = 0;
XrdCnsLogRec *XrdCnsLogRec::lastRec = 0;
int XrdCnsLogRec::Running = 0;
const char *XrdCnsLogRec::IArg = "I755 -1 ";
const char *XrdCnsLogRec::iArg = "i644 0 ";
/******************************************************************************/
/* A l l o c */
/******************************************************************************/
XrdCnsLogRec *XrdCnsLogRec::Alloc()
{
XrdCnsLogRec *rP;
// Allocate a request object. Develop a serial sequence if init wanted
//
fMutex.Lock();
if ((rP = freeRec)) freeRec = rP->Next;
else rP = new XrdCnsLogRec();
fMutex.UnLock();
// Pre-initialize the record
//
rP->Next = 0;
memset(&rP->Rec.Hdr, 0, sizeof(struct Ctl));
memset(&rP->Rec.Data, ' ', FixDLen);
rP->Rec.Data.Mode[2] = '0';
rP->Rec.Data.SorT[11] = '0';
rP->Rec.Data.Type = '?';
return rP;
}
/******************************************************************************/
/* G e t */
/******************************************************************************/
XrdCnsLogRec *XrdCnsLogRec::Get(char &lrType)
{
XrdCnsLogRec *lrP;
// Find the request in the slot table
//
qMutex.Lock();
while(!(lrP = frstRec))
{Running = 0;
qMutex.UnLock();
qSem.Wait();
qMutex.Lock();
}
if (!(frstRec = lrP->Next)) lastRec = 0;
qMutex.UnLock();
// Get the type and if its an eol marker recycle now
//
if (!(lrType = lrP->Rec.Data.Type)) {lrP->Recycle(); lrP = 0;}
return lrP;
}
/******************************************************************************/
/* Q u e u e */
/******************************************************************************/
void XrdCnsLogRec::Queue()
{
// Put request on the queue
//
qMutex.Lock();
if (frstRec) lastRec->Next = this;
else frstRec = this;
lastRec = this;
// Tell dequeue thread we have something if it's not already running
//
if (!Running) {qSem.Post(); Running = 1;}
qMutex.UnLock();
}
/******************************************************************************/
/* R e c y c l e */
/******************************************************************************/
void XrdCnsLogRec::Recycle()
{
// Put this object on the free queue
//
fMutex.Lock();
Next = freeRec;
freeRec = this;
fMutex.UnLock();
}
/******************************************************************************/
/* s e t D a t a */
/******************************************************************************/
int XrdCnsLogRec::setData(const char *dP1, const char *dP2)
{
int n1 = strlen(dP1), n2 = strlen(dP2);
char *dP;
// Make sure we have room "'lfn' + 'data1' + ' ' + data2"
//
if (n1+n2+2 > MAXPATHLEN) return 0;
// Add the data in the fields
//
setSize(static_cast(Rec.Hdr.lfn1Len));
dP = Rec.Data.lfn + Rec.Hdr.lfn1Len+1;
strcpy(dP, dP1);
dP += n1; *dP++ = ' ';
strcpy(dP, dP2);
Rec.Hdr.lfn2Len = n1+n2+1;
return Rec.Hdr.lfn2Len;
}
/******************************************************************************/
/* s e t T y p e */
/******************************************************************************/
int XrdCnsLogRec::setType(const char *lrName)
{
if (!strcmp(lrName, "closew")) setType(lrClosew);
else if (!strcmp(lrName, "create")) setType(lrCreate);
else if (!strcmp(lrName, "mkdir")) setType(lrMkdir);
else if (!strcmp(lrName, "mv")) setType(lrMv);
else if (!strcmp(lrName, "rm")) setType(lrRm);
else if (!strcmp(lrName, "rmdir")) setType(lrRmdir);
else return 0;
return 1;
}