ROOT
6.18/05
Reference Guide
proof
proofd
src
XpdObject.cxx
Go to the documentation of this file.
1
// @(#)root/proofd:$Id$
2
// Author: Gerardo Ganis Feb 2013
3
4
/*************************************************************************
5
* Copyright (C) 1995-2005, Rene Brun and Fons Rademakers. *
6
* All rights reserved. *
7
* *
8
* For the licensing terms see $ROOTSYS/LICENSE. *
9
* For the list of contributors see $ROOTSYS/README/CREDITS. *
10
*************************************************************************/
11
12
//////////////////////////////////////////////////////////////////////////
13
// //
14
// XpdObject //
15
// //
16
// Authors: G. Ganis, CERN, 2013 //
17
// //
18
// Auxilliary class to stack protocols. //
19
// //
20
//////////////////////////////////////////////////////////////////////////
21
22
#include "
XpdObject.h
"
23
#include "
XrdProofdAux.h
"
24
#include "
XrdProofdProtocol.h
"
25
#include "Xrd/XrdScheduler.hh"
26
#include "XrdOuc/XrdOucTrace.hh"
27
28
////////////////////////////////////////////////////////////////////////////////
29
/// Pop up a protocol object
30
31
XrdProofdProtocol
*
XpdObjectQ::Pop
()
32
{
33
XpdObject
*node;
34
fQMutex
.Lock();
35
if
((node =
fFirst
)) {
36
fFirst
=
fFirst
->
fNext
;
37
fCount
--;
38
}
39
fQMutex
.UnLock();
40
if
(node)
return
node->
fItem
;
41
return
(
XrdProofdProtocol
*)0;
42
}
43
44
////////////////////////////////////////////////////////////////////////////////
45
/// Push back a protocol
46
47
void
XpdObjectQ::Push
(
XpdObject
*node)
48
{
49
node->
fQTime
=
fCurage
;
50
fQMutex
.Lock();
51
if
(
fCount
>=
fMaxinQ
) {
52
delete
node->
fItem
;
53
}
else
{
54
node->
fNext
=
fFirst
;
55
fFirst
= node;
56
fCount
++;
57
}
58
fQMutex
.UnLock();
59
}
60
61
////////////////////////////////////////////////////////////////////////////////
62
/// Lock the data area and set the values
63
64
void
XpdObjectQ::Set
(
int
inQMax, time_t agemax)
65
{
66
fQMutex
.Lock();
67
fMaxinQ
= inQMax;
fMaxage
= agemax;
68
if
(!(
fMininQ
= inQMax/2))
fMininQ
= 1;
69
fQMutex
.UnLock();
70
71
// Schedule ourselves using the new values
72
if
(agemax > 0)
73
fSched
->Schedule((XrdJob *)
this
, agemax + time(0));
74
}
75
76
////////////////////////////////////////////////////////////////////////////////
77
/// Process method
78
79
void
XpdObjectQ::DoIt
()
80
{
81
XpdObject
*pp, *p;
82
int
oldcnt, agemax;
83
84
// Lock the anchor and see if we met the threshold for deletion
85
//
86
fQMutex
.Lock();
87
agemax =
fMaxage
;
88
if
((oldcnt =
fCount
) >
fMininQ
) {
89
90
// Prepare to scan down the queue.
91
if
((pp =
fFirst
)) {
92
p = pp->
fNext
;
93
}
else
{ p = 0; }
94
95
// Find the first object that's been idle for too long
96
while
(p && (p->
fQTime
>=
fCurage
)) { pp = p; p = p->
fNext
;}
97
98
// Now delete half of the idle objects. The object queue element must be
99
// part of the actual object being deleted for this to properly work.
100
if
(pp) {
101
while
(p) {
102
pp->
fNext
= p->
fNext
;
103
delete
p->
fItem
;
104
fCount
--;
105
p = ((pp = pp->
fNext
) ? pp->
fNext
: 0);
106
}
107
}
108
}
109
110
// Increase the age and unlock the queue
111
fCurage
++;
112
fQMutex
.UnLock();
113
114
// Trace as needed
115
if
(
fTraceON
&&
fTrace
->Tracing(
fTraceON
))
116
{
fTrace
->Beg(
fTraceID
);
117
cerr <<Comment <<
" trim done; "
<<
fCount
<<
" of "
<<oldcnt <<
" kept"
;
118
fTrace
->End();
119
}
120
121
// Reschedule ourselves if we must do so
122
if
(agemax > 0)
123
fSched
->Schedule((XrdJob *)
this
, agemax+time(0));
124
}
125
XpdObject.h
XrdProofdAux.h
XrdProofdProtocol.h
XpdObjectQ::fMininQ
int fMininQ
Definition:
XpdObject.h:91
XpdObjectQ::fTraceON
int fTraceON
Definition:
XpdObject.h:96
XpdObjectQ::fTrace
XrdOucTrace * fTrace
Definition:
XpdObject.h:94
XpdObjectQ::fQMutex
XrdSysMutex fQMutex
Definition:
XpdObject.h:87
XpdObjectQ::fTraceID
const char * fTraceID
Definition:
XpdObject.h:97
XpdObjectQ::Set
void Set(int inQMax, time_t agemax=1800)
Lock the data area and set the values.
Definition:
XpdObject.cxx:64
XpdObjectQ::fCount
int fCount
Definition:
XpdObject.h:89
XpdObjectQ::fSched
XrdScheduler * fSched
Definition:
XpdObject.h:95
XpdObjectQ::fMaxage
time_t fMaxage
Definition:
XpdObject.h:93
XpdObjectQ::Push
void Push(XpdObject *Node)
Push back a protocol.
Definition:
XpdObject.cxx:47
XpdObjectQ::fMaxinQ
int fMaxinQ
Definition:
XpdObject.h:92
XpdObjectQ::fFirst
XpdObject * fFirst
Definition:
XpdObject.h:88
XpdObjectQ::fCurage
int fCurage
Definition:
XpdObject.h:90
XpdObjectQ::Pop
XrdProofdProtocol * Pop()
Pop up a protocol object.
Definition:
XpdObject.cxx:31
XpdObjectQ::DoIt
void DoIt()
Process method.
Definition:
XpdObject.cxx:79
XpdObject
Definition:
XpdObject.h:38
XpdObject::fItem
XrdProofdProtocol * fItem
Definition:
XpdObject.h:56
XpdObject::fNext
XpdObject * fNext
Definition:
XpdObject.h:55
XpdObject::fQTime
time_t fQTime
Definition:
XpdObject.h:57
XrdProofdProtocol
Definition:
XrdProofdProtocol.h:54