84 theTarget = strdup(Target);
87 msgFirst = msgLast = msgFree = 0;
113 while ((tp = msgFirst)) {msgFirst = tp->
next;
delete tp;}
114 if (theTarget) free(theTarget);
115 if (msgFD >= 0)
close(msgFD);
116 if (theProg)
delete theProg;
122 while ((tp = msgFree)) {msgFree = tp->
next;
delete tp;}
132 static int warnings = 0;
137 if (!(tp = getMsg()))
138 {
if ((++warnings & 0xff) == 1)
139 eDest->
Emsg(
"Notify",
"Ran out of logger message objects;",
140 eInfo.
Tident,
"event not logged.");
147 "<stats id=\"bwm\"><tid>%s</tid><lfn>%s</lfn>"
148 "<lcl>%s</lcl><rmt>%s</rmt><flow>%c</flow>"
149 "<at>%lld</at><bt>%lld</bt><ct>%lld</ct>"
150 "<iq>%d</iq><oq>%d</oq><xq>%d</xq>"
151 "<sz>%lld<sz><esec>%d</esec></stats>%c",
154 (
long long) eInfo.
BTime, (
long long) eInfo.
CTime,
162 if (msgLast) {msgLast->
next = tp; msgLast = tp;}
163 else msgFirst = msgLast = tp;
175 const char *theData[2] = {0,0};
176 int theDlen[2] = {0,0};
186 if ((tp = msgFirst) && !(msgFirst = tp->
next)) msgLast = 0;
189 {
if (!theProg) Feed(tp->
Text, tp->
Tlen);
190 else {theData[0] = tp->
Text; theDlen[0] = tp->
Tlen;
191 theProg->
Feed(theData, theDlen);
214 if (!strcmp(
"*", theTarget)) {msgFD = -1; theEOL =
'\0';}
215 else if (*theTarget ==
'>')
219 msgFD = msgSock->
Detach();
224 if (theProg)
return 0;
229 if (theProg->
Setup(theTarget, eobj))
return -1;
230 if ((rc = theProg->
Start()))
231 {eobj->
Emsg(
"Logger", rc,
"start event collector");
return -1;}
237 0,
"Log message sender")))
238 {eobj->
Emsg(
"Logger", rc,
"create log message sender thread");
254 int XrdBwmLogger::Feed(
const char *data,
int dlen)
260 if (msgFD < 0) {eDest->
Say(
"", data);
return 0;}
264 do { retc =
write(msgFD, (
const void *)data, (
size_t)dlen);}
265 while (retc < 0 && errno == EINTR);
267 {eDest->
Emsg(
"Feed", errno,
"write to logger socket", theTarget);
290 if (msgsInQ >= maxmInQ) tp = 0;
291 else {
if ((tp = msgFree)) msgFree = tp->
next;
void * XrdBwmLoggerSend(void *pp)
ssize_t write(int fildes, const void *buf, size_t nbyte)
XrdBwmLogger(const char *Target)
int Start(XrdSysError *eobj)
static XrdNetSocket * Create(XrdSysError *Say, const char *path, const char *fn, mode_t mode, int isudp=0)
int Feed(const char *data[], const int dlen[])
int Setup(const char *prog, XrdSysError *errP=0, int(*Proc)(XrdOucStream *, char **, int)=0)
int Emsg(const char *esfx, int ecode, const char *text1, const char *text2=0)
void Say(const char *text1, const char *text2=0, const char *txt3=0, const char *text4=0, const char *text5=0, const char *txt6=0)
static int Run(pthread_t *, void *(*proc)(void *), void *arg, int opts=0, const char *desc=0)
static int Kill(pthread_t tid)