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
+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.
__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
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)
{
+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
}
+/* 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)
{
__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;
}
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
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);