From 44c964e111cc620e1950b9ec98b09829ada21fdb Mon Sep 17 00:00:00 2001 From: Jerry DeLisle Date: Sun, 10 Feb 2008 18:06:34 +0000 Subject: 2008-02-10 Danny Smith PR gcc/35063 * gthr-win32.h (__gthread_mutex_destroy_function): New function to CloseHandle after unlocking to prevent accumulation of handle count. 2008-02-10 Jerry DeLisle PR libfortran/35063 * io/unit.c (destroy_unit_mutex): New function that uses __gthread_mutex_destroy_function or pthread_mutex_destroy after unlocking and before free_mem for final closure of I/O unit. (delete_root): Use new function. (free_internal_unit): Likewise. (close_unit_1): Likewise. git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@132217 138bc75d-0d04-0410-961f-82ee72b054a4 --- ChangeLog | 7 +++++++ gcc/gthr-win32.h | 9 +++++++++ libgfortran/ChangeLog | 10 ++++++++++ libgfortran/io/unit.c | 36 ++++++++++++++++++++++++++++-------- 4 files changed, 54 insertions(+), 8 deletions(-) diff --git a/ChangeLog b/ChangeLog index 65dc3d453fd..53b283c2c3e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2008-02-10 Danny Smith + + PR gcc/35063 + * gthr-win32.h (__gthread_mutex_destroy_function): New function + to CloseHandle after unlocking to prevent accumulation of handle + count. + 2008-02-02 Hans-Peter Nilsson * configure.ac: Enable fortran for cris-*-elf and crisv32-*-elf. diff --git a/gcc/gthr-win32.h b/gcc/gthr-win32.h index 80b2b71c9e7..6a32c1a134c 100644 --- a/gcc/gthr-win32.h +++ b/gcc/gthr-win32.h @@ -359,6 +359,9 @@ typedef struct { __gthread_recursive_mutex_init_function #define __GTHREAD_RECURSIVE_MUTEX_INIT_DEFAULT {-1, 0, 0, 0} +#define __GTHREAD_MUTEX_DESTROY_FUNCTION \ + __gthread_mutex_destroy_function + #if __MINGW32_MAJOR_VERSION >= 1 || \ (__MINGW32_MAJOR_VERSION == 0 && __MINGW32_MINOR_VERSION > 2) #define MINGW32_SUPPORTS_MT_EH 1 @@ -615,6 +618,12 @@ __gthread_mutex_init_function (__gthread_mutex_t *mutex) mutex->sema = CreateSemaphore (NULL, 0, 65535, NULL); } +static inline void +__gthread_mutex_destroy_function (__gthread_mutex_t *mutex) +{ + CloseHandle ((HANDLE) mutex->sema); +} + static inline int __gthread_mutex_lock (__gthread_mutex_t *mutex) { diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog index 432aa56ee44..6260ed30b44 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,3 +1,13 @@ +2008-02-10 Jerry DeLisle + + PR libfortran/35063 + * io/unit.c (destroy_unit_mutex): New function that uses + __gthread_mutex_destroy_function or pthread_mutex_destroy after + unlocking and before free_mem for final closure of I/O unit. + (delete_root): Use new function. + (free_internal_unit): Likewise. + (close_unit_1): Likewise. + 2008-02-02 Thomas Koenig PR libfortran/35001 diff --git a/libgfortran/io/unit.c b/libgfortran/io/unit.c index 48efb9bb2d7..2ec776f0d68 100644 --- a/libgfortran/io/unit.c +++ b/libgfortran/io/unit.c @@ -204,6 +204,22 @@ insert_unit (int n) } +/* destroy_unit_mutex()-- Destroy the mutex and free memory of unit. */ + +static void +destroy_unit_mutex (gfc_unit * u) +{ +#ifdef __GTHREAD_MUTEX_DESTROY_FUNCTION + __GTHREAD_MUTEX_DESTROY_FUNCTION (&u->lock); +#else +#ifdef __CYGWIN__ + pthread_mutex_destroy (&u->lock); +#endif +#endif + free_mem (u); +} + + static gfc_unit * delete_root (gfc_unit * t) { @@ -341,7 +357,7 @@ found: __gthread_mutex_lock (&unit_lock); __gthread_mutex_unlock (&p->lock); if (predec_waiting_locked (p) == 0) - free_mem (p); + destroy_unit_mutex (p); goto retry; } @@ -455,14 +471,18 @@ free_internal_unit (st_parameter_dt *dtp) if (!is_internal_unit (dtp)) return; - if (dtp->u.p.current_unit->ls != NULL) - free_mem (dtp->u.p.current_unit->ls); - - sclose (dtp->u.p.current_unit->s); - if (dtp->u.p.current_unit != NULL) - free_mem (dtp->u.p.current_unit); + { + if (dtp->u.p.current_unit->ls != NULL) + free_mem (dtp->u.p.current_unit->ls); + + if (dtp->u.p.current_unit->s) + free_mem (dtp->u.p.current_unit->s); + + destroy_unit_mutex (dtp->u.p.current_unit); + } } + /* get_unit()-- Returns the unit structure associated with the integer @@ -612,7 +632,7 @@ close_unit_1 (gfc_unit *u, int locked) avoid freeing the memory, the last such thread will free it instead. */ if (u->waiting == 0) - free_mem (u); + destroy_unit_mutex (u); if (!locked) __gthread_mutex_unlock (&unit_lock); -- cgit v1.2.3