diff options
author | Jerry DeLisle <jvdelisle@gcc.gnu.org> | 2008-02-10 18:06:34 +0000 |
---|---|---|
committer | Jerry DeLisle <jvdelisle@gcc.gnu.org> | 2008-02-10 18:06:34 +0000 |
commit | ef4195d63d08c669014ec5330f1b4eacd9778736 (patch) | |
tree | cb9b409978e20058c0a784dab93cc4c41074e52c | |
parent | 39caa164347d4dedef97ccf05cdb66da6514bee6 (diff) | |
download | gcc-ef4195d63d08c669014ec5330f1b4eacd9778736.zip gcc-ef4195d63d08c669014ec5330f1b4eacd9778736.tar.gz gcc-ef4195d63d08c669014ec5330f1b4eacd9778736.tar.bz2 |
[multiple changes]
2008-02-10 Danny Smith <dannysmith@users.sourceforge.net>
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 <jvdelisle@gcc.gnu.org>
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.
From-SVN: r132217
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | gcc/gthr-win32.h | 9 | ||||
-rw-r--r-- | libgfortran/ChangeLog | 10 | ||||
-rw-r--r-- | libgfortran/io/unit.c | 36 |
4 files changed, 54 insertions, 8 deletions
@@ -1,3 +1,10 @@ +2008-02-10 Danny Smith <dannysmith@users.sourceforge.net> + + 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 <hp@axis.com> * configure.ac: Enable fortran for cris-*-elf and crisv32-*-elf. diff --git a/gcc/gthr-win32.h b/gcc/gthr-win32.h index 80b2b71..6a32c1a 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 432aa56..6260ed3 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,3 +1,13 @@ +2008-02-10 Jerry DeLisle <jvdelisle@gcc.gnu.org> + + 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 <tkoenig@gcc.gnu.org> PR libfortran/35001 diff --git a/libgfortran/io/unit.c b/libgfortran/io/unit.c index 48efb9b..2ec776f 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); |