re PR libfortran/78549 (Very slow formatted internal file output)
authorJerry DeLisle <jvdelisle@gcc.gnu.org>
Tue, 21 Nov 2017 02:17:11 +0000 (02:17 +0000)
committerJerry DeLisle <jvdelisle@gcc.gnu.org>
Tue, 21 Nov 2017 02:17:11 +0000 (02:17 +0000)
2017-11-20  Jerry DeLisle  <jvdelisle@gcc.gnu.org>

PR libgfortran/78549
* io/io.h (newunit_free): Add declaration. Clean some whitespace.
* io/transfer.c (st_read_done, st_write_done): Call newunit_free.
* io/unit.c (newunit_free): Change type from static void to void.

From-SVN: r254982

libgfortran/ChangeLog
libgfortran/io/io.h
libgfortran/io/transfer.c
libgfortran/io/unit.c

index 24084517a62fa8747d69c4bdb1a405b23c56d718..f37850c4505591ee492be37a7430eb08db8fd115 100644 (file)
@@ -1,3 +1,10 @@
+2017-11-20  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
+
+       PR libgfortran/78549
+       * io/io.h (newunit_free): Add declaration. Clean some whitespace.
+       * io/transfer.c (st_read_done, st_write_done): Call newunit_free.
+       * io/unit.c (newunit_free): Change type from static void to void.
+
 2017-11-19  Janne Blomqvist  <jb@gcc.gnu.org>
 
        PR fortran/44292
index d29b112b9c4474788989fd008df35ecb13292604..50db35e1cff45467d9e04f4c6938edc1c1462e33 100644 (file)
@@ -760,18 +760,21 @@ internal_proto(find_or_create_unit);
 extern gfc_unit *get_unit (st_parameter_dt *, int);
 internal_proto(get_unit);
 
-extern void unlock_unit (gfc_unit *);
+extern void unlock_unit(gfc_unit *);
 internal_proto(unlock_unit);
 
 extern void finish_last_advance_record (gfc_unit *u);
-internal_proto (finish_last_advance_record);
+internal_proto(finish_last_advance_record);
 
-extern int unit_truncate (gfc_unit *, gfc_offset, st_parameter_common *);
-internal_proto (unit_truncate);
+extern int unit_truncate(gfc_unit *, gfc_offset, st_parameter_common *);
+internal_proto(unit_truncate);
 
 extern int newunit_alloc (void);
 internal_proto(newunit_alloc);
 
+extern void newunit_free (int);
+internal_proto(newunit_free);
+
 
 /* open.c */
 
index c17344742b177a39e07518111804c7c17364bf7e..1eb23fb89c8fc065aaabd644dfa9958fcfdd1a45 100644 (file)
@@ -4087,16 +4087,19 @@ st_read_done (st_parameter_dt *dtp)
   if (dtp->u.p.current_unit != NULL
       && dtp->u.p.current_unit->child_dtio == 0)
     {
-      if (is_internal_unit (dtp) &&
-         (dtp->common.flags & IOPARM_DT_HAS_UDTIO) == 0)
-        {
-         free (dtp->u.p.current_unit->filename);
-         dtp->u.p.current_unit->filename = NULL;
-         free (dtp->u.p.current_unit->s);
-         dtp->u.p.current_unit->s = NULL;
-         if (dtp->u.p.current_unit->ls)
-           free (dtp->u.p.current_unit->ls);
-         dtp->u.p.current_unit->ls = NULL;
+      if (is_internal_unit (dtp))
+       {
+         if ((dtp->common.flags & IOPARM_DT_HAS_UDTIO) == 0)
+           {
+             free (dtp->u.p.current_unit->filename);
+             dtp->u.p.current_unit->filename = NULL;
+             free (dtp->u.p.current_unit->s);
+             dtp->u.p.current_unit->s = NULL;
+             if (dtp->u.p.current_unit->ls)
+               free (dtp->u.p.current_unit->ls);
+             dtp->u.p.current_unit->ls = NULL;
+           }
+         newunit_free (dtp->common.unit);
        }
       if (is_internal_unit (dtp) || dtp->u.p.format_not_saved)
        {
@@ -4155,16 +4158,19 @@ st_write_done (st_parameter_dt *dtp)
 
       /* If this is a parent WRITE statement we do not need to retain the
         internal unit structure for child use.  */
-      if (is_internal_unit (dtp) &&
-         (dtp->common.flags & IOPARM_DT_HAS_UDTIO) == 0)
+      if (is_internal_unit (dtp))
        {
-         free (dtp->u.p.current_unit->filename);
-         dtp->u.p.current_unit->filename = NULL;
-         free (dtp->u.p.current_unit->s);
-         dtp->u.p.current_unit->s = NULL;
-         if (dtp->u.p.current_unit->ls)
-           free (dtp->u.p.current_unit->ls);
-         dtp->u.p.current_unit->ls = NULL;
+         if ((dtp->common.flags & IOPARM_DT_HAS_UDTIO) == 0)
+           {
+             free (dtp->u.p.current_unit->filename);
+             dtp->u.p.current_unit->filename = NULL;
+             free (dtp->u.p.current_unit->s);
+             dtp->u.p.current_unit->s = NULL;
+             if (dtp->u.p.current_unit->ls)
+               free (dtp->u.p.current_unit->ls);
+             dtp->u.p.current_unit->ls = NULL;
+           }
+         newunit_free (dtp->common.unit);
        }
       if (is_internal_unit (dtp) || dtp->u.p.format_not_saved)
        {
index e06867aa0a11c57cb351cd1bd578a85ecb1f70e4..e62f9b839d4a35eff4e251459082807a8ff8bff5 100644 (file)
@@ -89,7 +89,6 @@ static int newunit_size; /* Total number of elements in the newunits array.  */
    units are allocated, above and equal to the LWI there may be both
    allocated and free units. */
 static int newunit_lwi;
-static void newunit_free (int);
 
 /* Unit numbers assigned with NEWUNIT start from here.  */
 #define NEWUNIT_START -10
@@ -911,7 +910,7 @@ newunit_alloc (void)
 /* Free a previously allocated newunit= unit number.  unit_lock must
    be held when calling.  */
 
-static void
+void
 newunit_free (int unit)
 {
   int ind = -unit + NEWUNIT_START;