diff options
Diffstat (limited to 'libgfortran')
-rw-r--r-- | libgfortran/ChangeLog | 10 | ||||
-rw-r--r-- | libgfortran/io/unit.c | 36 |
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); |