summaryrefslogtreecommitdiff
path: root/libgfortran
diff options
context:
space:
mode:
authorjvdelisle <jvdelisle@138bc75d-0d04-0410-961f-82ee72b054a4>2008-02-10 18:06:34 +0000
committerjvdelisle <jvdelisle@138bc75d-0d04-0410-961f-82ee72b054a4>2008-02-10 18:06:34 +0000
commit533d0ceb28088c9b755731b0a9179dbc857b7e72 (patch)
treecb9b409978e20058c0a784dab93cc4c41074e52c /libgfortran
parent24e3538db13430e484ce33946b6f600c82fcbf62 (diff)
downloadgcc-533d0ceb28088c9b755731b0a9179dbc857b7e72.tar.gz
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: svn+ssh://gcc.gnu.org/svn/gcc/trunk@132217 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libgfortran')
-rw-r--r--libgfortran/ChangeLog10
-rw-r--r--libgfortran/io/unit.c36
2 files changed, 38 insertions, 8 deletions
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);