aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJerry DeLisle <jvdelisle@gcc.gnu.org>2008-02-10 18:06:34 +0000
committerJerry DeLisle <jvdelisle@gcc.gnu.org>2008-02-10 18:06:34 +0000
commit44c964e111cc620e1950b9ec98b09829ada21fdb (patch)
treecb9b409978e20058c0a784dab93cc4c41074e52c
parent297c96b74bd603e58e2a88e8c78f9c1a82a5b527 (diff)
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. git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@132217 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--ChangeLog7
-rw-r--r--gcc/gthr-win32.h9
-rw-r--r--libgfortran/ChangeLog10
-rw-r--r--libgfortran/io/unit.c36
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 <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 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 <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 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);