X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fio-layer%2Fhandles.c;h=cb0033f5a1ba613a88c4f7a3b3b93f69ab764588;hb=179fbf4b2336b27862850f164aa9e1f7df95fa7f;hp=146c275cb5de7ba3198e16624933bd8b0398d963;hpb=6bc565c1f7e7fd9aaf6ee6a141ea18479a316ac4;p=mono.git diff --git a/mono/io-layer/handles.c b/mono/io-layer/handles.c index 146c275cb5d..cb0033f5a1b 100644 --- a/mono/io-layer/handles.c +++ b/mono/io-layer/handles.c @@ -29,6 +29,9 @@ # include #endif #include +#ifdef HAVE_SYS_RESOURCE_H +# include +#endif #include #include @@ -37,7 +40,6 @@ #include #include #include -#include #include #undef DEBUG_REFS @@ -131,10 +133,10 @@ struct _WapiFileShareLayout *_wapi_fileshare_layout = NULL; * 4MB array. */ static GHashTable *file_share_hash; -static CRITICAL_SECTION file_share_hash_mutex; +static mono_mutex_t file_share_hash_mutex; -#define file_share_hash_lock() EnterCriticalSection (&file_share_hash_mutex) -#define file_share_hash_unlock() LeaveCriticalSection (&file_share_hash_mutex) +#define file_share_hash_lock() mono_mutex_lock (&file_share_hash_mutex) +#define file_share_hash_unlock() mono_mutex_unlock (&file_share_hash_mutex) guint32 _wapi_fd_reserve; @@ -207,7 +209,7 @@ static void handle_cleanup (void) if (file_share_hash) { g_hash_table_destroy (file_share_hash); - DeleteCriticalSection (&file_share_hash_mutex); + mono_mutex_destroy (&file_share_hash_mutex); } for (i = 0; i < _WAPI_PRIVATE_MAX_SLOTS; ++i) @@ -225,7 +227,18 @@ wapi_init (void) g_assert ((sizeof (handle_ops) / sizeof (handle_ops[0])) == WAPI_HANDLE_COUNT); +#ifdef HAVE_GETRLIMIT + { + struct rlimit limit; + int res; + + res = getrlimit (RLIMIT_NOFILE, &limit); + g_assert (res == 0); + _wapi_fd_reserve = limit.rlim_cur; + } +#else _wapi_fd_reserve = getdtablesize(); +#endif /* This is needed by the code in _wapi_handle_new_internal */ _wapi_fd_reserve = (_wapi_fd_reserve + (_WAPI_HANDLE_INITIAL_COUNT - 1)) & ~(_WAPI_HANDLE_INITIAL_COUNT - 1); @@ -267,6 +280,7 @@ wapi_init (void) _wapi_global_signal_cond = &_WAPI_PRIVATE_HANDLES (GPOINTER_TO_UINT (_wapi_global_signal_handle)).signal_cond; _wapi_global_signal_mutex = &_WAPI_PRIVATE_HANDLES (GPOINTER_TO_UINT (_wapi_global_signal_handle)).signal_mutex; + wapi_processes_init (); /* Using g_atexit here instead of an explicit function call in * a cleanup routine lets us cope when a third-party library @@ -1664,7 +1678,7 @@ gboolean _wapi_handle_get_or_set_share (dev_t device, ino_t inode, */ if (!file_share_hash) { file_share_hash = g_hash_table_new_full (wapi_share_info_hash, wapi_share_info_equal, NULL, g_free); - InitializeCriticalSection (&file_share_hash_mutex); + mono_mutex_init_recursive (&file_share_hash_mutex); } tmp.device = device; @@ -1842,65 +1856,6 @@ void _wapi_handle_check_share (struct _WapiFileShare *share_info, int fd) } } - for (i = 0; i < _WAPI_HANDLE_INITIAL_COUNT; i++) { - struct _WapiHandleShared *shared; - struct _WapiHandle_process *process_handle; - - shared = &_wapi_shared_layout->handles[i]; - - if (shared->type == WAPI_HANDLE_PROCESS) { - DIR *fd_dir; - struct dirent *fd_entry; - char subdir[_POSIX_PATH_MAX]; - - process_handle = &shared->u.process; - pid = process_handle->id; - - /* Look in /proc//fd/ but ignore - * /proc//fd/, as we have the - * file open too - */ - g_snprintf (subdir, _POSIX_PATH_MAX, "/proc/%d/fd", - pid); - - fd_dir = opendir (subdir); - if (fd_dir == NULL) { - continue; - } - - DEBUG ("%s: Looking in %s", __func__, subdir); - - proc_fds = TRUE; - - while ((fd_entry = readdir (fd_dir)) != NULL) { - char path[_POSIX_PATH_MAX]; - struct stat link_stat; - - if (!strcmp (fd_entry->d_name, ".") || - !strcmp (fd_entry->d_name, "..") || - (pid == self && - fd == atoi (fd_entry->d_name))) { - continue; - } - - g_snprintf (path, _POSIX_PATH_MAX, - "/proc/%d/fd/%s", pid, - fd_entry->d_name); - - stat (path, &link_stat); - if (link_stat.st_dev == share_info->device && - link_stat.st_ino == share_info->inode) { - DEBUG ("%s: Found it at %s", - __func__, path); - - found = TRUE; - } - } - - closedir (fd_dir); - } - } - if (proc_fds == FALSE) { _wapi_handle_check_share_by_pid (share_info); } else if (found == FALSE) {