http://gcc.gnu.org/bugzilla/show_bug.cgi?id=30162



--- Comment #43 from Dominique d'Humieres <dominiq at lps dot ens.fr> 
2013-02-17 20:10:52 UTC ---

I finally had a look at this PR.

First the test on comment #41 works on x86_64-apple-darwin10 r196109:



macbook] f90/bug% mkfifo pipe

[macbook] f90/bug% read_f &

[1] 6998

[macbook] f90/bug% write_f

 Hello, world!

[macbook] f90/bug% 

[1]    Done                          read_f



I have done the following changes to the original test:



[macbook] f90/bug% cat pr30162_1_db.f

      integer status

      integer i

      open(unit=20,file='np',action='write',

     &     form='unformatted',iostat=status);

      print*,'status for write from open is ',status

      do i = 1,5

         print *, "write ", i

         write(20)i

      end do

      end

[macbook] f90/bug% cat pr30162_2_db.f

      integer status

      integer i

      integer val

      open(unit=21,file='np',action='read',

     &     form='unformatted',iostat=status);

      print*,'status for read from open is ',status

      do i = 1,5

         read(21)val

         print*,val

      end do

      end



and I got



[macbook] f90/bug% write_f

 status for write from open is            0

 write            1

At line 8 of file pr30162_1_db.f (unit = 20, file = 'np')

Fortran runtime error: Illegal seek

 status for read from open is            0

At line 8 of file pr30162_2_db.f (unit = 21, file = 'np')

Fortran runtime error: I/O past end of record on unformatted file

[macbook] f90/bug% 

[1]    Exit 2                        read_f



Then I have applied the following patch (based on r194679):



--- ../_clean/libgfortran/io/unix.c    2013-01-14 19:25:10.000000000 +0100

+++ libgfortran/io/unix.c    2013-02-17 20:23:43.000000000 +0100

@@ -336,7 +336,14 @@ raw_write (unix_stream * s, const void *

 static gfc_offset

 raw_seek (unix_stream * s, gfc_offset offset, int whence)

 {

-  return lseek (s->fd, offset, whence);

+  gfc_offset x;

+  x = lseek (s->fd, offset, whence);

+  /* Non-seekable files should always be assumed to be at

+     current position.  */

+  if (x == -1 && errno == ESPIPE)

+    x = 0;

+  return x;

+  /* return lseek (s->fd, offset, whence); */

 }



 static gfc_offset



and now I get



[macbook] f90/bug% write_f

 status for write from open is            0

 write            1

 write            2

 write            3

 write            4

 write            5

 status for read from open is            0

At line 8 of file pr30162_2_db.f (unit = 21, file = 'np')

Fortran runtime error: I/O past end of record on unformatted file

[macbook] f90/bug% 

[1]    Exit 2                        read_f



So the write seems now OK. For the read, dtrace gives



fstat64(0x3, 0x7FFF5FBFD580, 0x50)         = 0 0

fstat64(0x3, 0x7FFF5FBFD5C0, 0x0)         = 0 0

lseek(0x3, 0x0, 0x1)         = -1 Err#29

write(0x1, " status for read from open is            0\n\0", 0x2B)         = 43

0

read(0x3, "\0", 0x4)         = 4 0

read(0x3, "\0", 0x0)         = 0 0

lseek(0x3, 0x4, 0x1)         = -1 Err#29

write(0x2, "At line 8 of file pr30162_2_db.f (unit = 21, file = 'np')\n\0",

0x3A)         = 58 0

write(0x2, "Fortran runtime error: \0", 0x17)         = 23 0

write(0x2, "I/O past end of record on unformatted file\0", 0x2A)         = 42 0

write(0x2, "\n\0", 0x1)         = 1 0

close(0x3)         = 0 0



i.e., 2 errors #29 on lseek. I did not find out how this is connected to the

error "I/O past end of record on unformatted file".

Reply via email to