< prev index next >

src/java.base/linux/native/libnet/linux_close.c

Print this page
rev 13764 : 8150460: (linux|bsd|aix)_close.c: file descriptor table may become large or may not work at all
Reviewed-by:

*** 57,70 **** * Signal to unblock thread */ static int sigWakeup = (__SIGRTMAX - 2); /* ! * The fd table and the number of file descriptors */ ! static fdEntry_t *fdTable; ! static int fdCount; /* * Null signal handler */ static void sig_wakeup(int sig) { --- 57,82 ---- * Signal to unblock thread */ static int sigWakeup = (__SIGRTMAX - 2); /* ! * The fd table holds one entry per file descriptor. ! * Note: the number of possible file descriptors can get quite large; ! * RLIMIT_NO_FILE can be large or even infinite. ! * Instead of allocating a plain array of RLIMIT_NO_FILE len, we ! * allocate a two dimensional sparse array: file descriptors are ! * of type int, which on all our platforms is 32bit; so we ! * use the upper 16 bit as index into a base table, and the lower ! * 16bit as index into the actual entry table; the latter is only ! * allocated on demand. ! * Usually (<64K file descriptors and file descriptors handed out ! * sequentually) there will only be the base table and one entry ! * table in slot 0. But this approach handles corner cases like ! * large file descriptor values seamlessly. */ ! static fdEntry_t** fdTable; ! static pthread_mutex_t fdTableLock = PTHREAD_MUTEX_INITIALIZER; /* * Null signal handler */ static void sig_wakeup(int sig) {
*** 73,93 **** /* * Initialization routine (executed when library is loaded) * Allocate fd tables and sets up signal handler. */ static void __attribute((constructor)) init() { - struct rlimit nbr_files; sigset_t sigset; struct sigaction sa; ! /* ! * Allocate table based on the maximum number of ! * file descriptors. ! */ ! getrlimit(RLIMIT_NOFILE, &nbr_files); ! fdCount = nbr_files.rlim_max; ! fdTable = (fdEntry_t *)calloc(fdCount, sizeof(fdEntry_t)); if (fdTable == NULL) { fprintf(stderr, "library initialization failed - " "unable to allocate file descriptor table - out of memory"); abort(); } --- 85,98 ---- /* * Initialization routine (executed when library is loaded) * Allocate fd tables and sets up signal handler. */ static void __attribute((constructor)) init() { sigset_t sigset; struct sigaction sa; ! fdTable = (fdEntry_t**)calloc(0x10000, sizeof(fdEntry_t*)); if (fdTable == NULL) { fprintf(stderr, "library initialization failed - " "unable to allocate file descriptor table - out of memory"); abort(); }
*** 109,122 **** * Return the fd table for this fd or NULL is fd out * of range. */ static inline fdEntry_t *getFdEntry(int fd) { ! if (fd < 0 || fd >= fdCount) { return NULL; } ! return &fdTable[fd]; } /* * Start a blocking operation :- * Insert thread onto thread list for the fd. --- 114,150 ---- * Return the fd table for this fd or NULL is fd out * of range. */ static inline fdEntry_t *getFdEntry(int fd) { ! int base_index; ! int index; ! fdEntry_t* entryTable = NULL; ! ! if (fd < 0) { return NULL; } ! ! base_index = fd >> 16; ! index = fd & 0xFFFF; ! ! /* Look up the entry table; create it if needed */ ! pthread_mutex_lock(&fdTableLock); ! if (fdTable[base_index] == NULL) { ! entryTable = calloc(0x10000, sizeof(fdEntry_t)); ! if (entryTable == NULL) { ! fprintf(stderr, "Unable to allocate file descriptor table - out of memory"); ! pthread_mutex_unlock(&fdTableLock); ! abort(); ! } ! fdTable[base_index] = entryTable; ! } else { ! entryTable = fdTable[base_index]; ! } ! pthread_mutex_unlock(&fdTableLock); ! ! return entryTable + index; } /* * Start a blocking operation :- * Insert thread onto thread list for the fd.
< prev index next >