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;
204 std::unique_lock lock(
ecMutex);
214 static const int maxFD = 1048576;
225 if (getrlimit(RLIMIT_NOFILE, &rlim)) limfd = maxFD;
226 else {
if (rlim.rlim_max == RLIM_INFINITY || (
int)rlim.rlim_max > maxFD)
227 {rlim.rlim_cur = maxFD;
228 setrlimit(RLIMIT_NOFILE, &rlim);
230 if (rlim.rlim_cur != rlim.rlim_max)
231 {rlim.rlim_cur = rlim.rlim_max;
232 setrlimit(RLIMIT_NOFILE, &rlim);
235 limfd =
static_cast<int>(rlim.rlim_cur);
242 if (fdnum < 0) {posxFD = fdnum = -fdnum; baseFD = limfd;}
249 else {memset((
void *)myFiles, 0, isize); lastFD = fdnum+baseFD;}
264 if (needlk) fdMutex.
Lock();
269 {
int myFD = oP->
fdNum - baseFD;
270 if (myFD < freeFD) freeFD = myFD;
273 myFiles[oP->
fdNum] = 0;
332 {
for (i = 0; i <= highFD; i++)
333 if ((oP = myFiles[i]))
339 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)
XrdOucECMsg getECMsg() const
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