33 #include <sys/resource.h>
56 int XrdPosixObject::highFD = -1;
57 int XrdPosixObject::lastFD = -1;
58 int XrdPosixObject::baseFD = 0;
59 int XrdPosixObject::freeFD = 0;
60 int XrdPosixObject::posxFD = 0;
61 int XrdPosixObject::devNull = -1;
76 {
if (isStream)
return 0;
77 for (fd = freeFD; fd < posxFD && myFiles[fd]; fd++) {}
78 if (fd >= posxFD)
return 0;
81 do{
if ((fd = dup(devNull)) < 0)
return false;
82 if (fd >= lastFD || (isStream && fd > 255))
83 {
close(fd);
return 0;}
84 if (!myFiles[fd])
break;
85 DMSG(
"AssignFD",
"FD " <<fd <<
" closed outside of XrdPosix!");
92 if (fd > highFD) highFD = fd;
113 do{
if (fd >= lastFD || fd < baseFD)
119 if (!(oP = myFiles[fd - baseFD]) || !(oP->
Who(&dP)))
132 if (waitCount > 120)
break;
164 do{
if (fd >= lastFD || fd < baseFD)
170 if (!(oP = myFiles[fd - baseFD]) || !(oP->
Who(&fP)))
183 if (waitCount > 120)
break;
208 static const int maxFD = 1048576;
219 if (getrlimit(RLIMIT_NOFILE, &rlim)) limfd = maxFD;
220 else {
if (rlim.rlim_max == RLIM_INFINITY || (
int)rlim.rlim_max > maxFD)
221 {rlim.rlim_cur = maxFD;
222 setrlimit(RLIMIT_NOFILE, &rlim);
224 if (rlim.rlim_cur != rlim.rlim_max)
225 {rlim.rlim_cur = rlim.rlim_max;
226 setrlimit(RLIMIT_NOFILE, &rlim);
229 limfd =
static_cast<int>(rlim.rlim_cur);
236 if (fdnum < 0) {posxFD = fdnum = -fdnum; baseFD = limfd;}
243 else {memset((
void *)myFiles, 0, isize); lastFD = fdnum+baseFD;}
258 if (needlk) fdMutex.
Lock();
263 {
int myFD = oP->
fdNum - baseFD;
264 if (myFD < freeFD) freeFD = myFD;
267 myFiles[oP->
fdNum] = 0;
326 {
for (i = 0; i <= highFD; i++)
327 if ((oP = myFiles[i]))
333 free(myFiles); myFiles = 0;
int open(const char *path, int oflag,...)
static void Release(XrdPosixObject *oP, bool needlk=true)
bool AssignFD(bool isStream=false)
static XrdPosixDir * Dir(int fildes, bool glk=false)
static XrdPosixDir * ReleaseDir(int fildes)
static int Init(int numfd)
virtual bool Who(XrdPosixDir **dirP)
static XrdPosixFile * ReleaseFile(int fildes)
static XrdPosixFile * File(int fildes, bool glk=false)
static void Wait(int milliseconds)
thread_local XrdOucECMsg ecMsg