[OpenSmalltalk/opensmalltalk-vm] c0ef42: FilePlugin>>primitiveFileAtEnd for non-regular fil...

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

[OpenSmalltalk/opensmalltalk-vm] c0ef42: FilePlugin>>primitiveFileAtEnd for non-regular fil...

Eliot Miranda-3
 
  Branch: refs/heads/Cog
  Home:   https://github.com/OpenSmalltalk/opensmalltalk-vm
  Commit: c0ef4209d7db5dc017dab0efd7dbf61079a5ede4
      https://github.com/OpenSmalltalk/opensmalltalk-vm/commit/c0ef4209d7db5dc017dab0efd7dbf61079a5ede4
  Author: AlistairGrant <[hidden email]>
  Date:   2018-03-26 (Mon, 26 Mar 2018)

  Changed paths:
    M platforms/Cross/plugins/FilePlugin/FilePlugin.h
    M platforms/Cross/plugins/FilePlugin/sqFilePluginBasicPrims.c

  Log Message:
  -----------
  FilePlugin>>primitiveFileAtEnd for non-regular files

FilePlugin currently splits files in to two groups: 1) Stdio streams and
2) everything else.

To test for the end of file, FilePlugin>>primitiveFileAtEnd:

1) Uses feof() for stdio streams.
2) Compares the current position to the file size for everything else.

This returns the expected results for regular files, but fails for
non-regular files, e.g.:

(FileSystem / 'dev' / 'urandom') binaryReadStream next: 8.

returns an empty array.

On Unix, the proper way to check is to read past the end of the file and
then call feof() to confirm that it is in fact at the end.

Pharo has plenty of code that assumes that a file position >= the file
size means that the file is at the end, and as stated above this
generally works for regular files.

This patch modifies FilePlugin>>primitiveFileAtEnd to:

a) Keep the current behaviour of using the file position test for
regular files.
b) Keep the current behaviour of using feof() for stdio streams.
c) Use feof() for non-regular files, e.g. /dev/urandom.

This allows existing code to continue to function, and allows
non-regular files to be tested correctly.

After applying the patch, the example code above answers the expected
result, e.g.:

(FileSystem / 'dev' / 'urandom') binaryReadStream next: 8.
" #[179 136 227 226 28 147 197 125]"

On Windows, as far as I can tell, all files are regular, and the
position test is used regularly, so no change is requried.

Fogbugz: https://pharo.fogbugz.com/f/cases/21643/


  Commit: 40ab0f5982e791b05515769cb9ec379192aa15ed
      https://github.com/OpenSmalltalk/opensmalltalk-vm/commit/40ab0f5982e791b05515769cb9ec379192aa15ed
  Author: AlistairGrant <[hidden email]>
  Date:   2018-04-04 (Wed, 04 Apr 2018)

  Changed paths:
    M platforms/Cross/plugins/FilePlugin/sqFilePluginBasicPrims.c

  Log Message:
  -----------
  21643-FilePlugin-primitiveFileAtEnd

Modify sqFileAtEnd() (FilePlugin>>primitiveFileAtEnd) so that #atEnd
returns true when the last character has been read.

Both Squeak and Pharo expect that #atEnd can be used to control
iteration over a stream, answering true as soon as the last character
has been read, and importantly not requiring #next values to be tested
for an end-of-stream.

Previously, stdio streams just used feof(), which requires reading past
the end of the stream, and so required the value returned by #next to be
tested for nil.  This causes problems with streams over other
collections where nil is a valid value.

sqFileAtEnd() would also fail to return the correct value for other
files such as kernel virtual files, e.g. /proc/cpuinfo, and devices like
/dev/urandom, because they have a reported file size of 0.

This change also takes a step towards removing the special handling of
stdio files on Unix, significantly simplifying the code base.

This change doesn't break any existing code that uses #next == nil to
test for end-of-stream.


  Commit: bcc644b91f2aef5b6331d71298d6f746f8832433
      https://github.com/OpenSmalltalk/opensmalltalk-vm/commit/bcc644b91f2aef5b6331d71298d6f746f8832433
  Author: AlistairGrant <[hidden email]>
  Date:   2018-04-04 (Wed, 04 Apr 2018)

  Changed paths:
    M platforms/Cross/plugins/FilePlugin/FilePlugin.h
    M platforms/Cross/plugins/FilePlugin/sqFilePluginBasicPrims.c

  Log Message:
  -----------
  21643-FilePlugin-primitiveFileAtEnd

Remove references to stat.h and st_mode that were accidentally left
behind.


  Commit: 3421494b43af5611420ebe229b7db3af2064e539
      https://github.com/OpenSmalltalk/opensmalltalk-vm/commit/3421494b43af5611420ebe229b7db3af2064e539
  Author: akgrant43 <[hidden email]>
  Date:   2018-04-05 (Thu, 05 Apr 2018)

  Changed paths:
    M platforms/Cross/plugins/FilePlugin/sqFilePluginBasicPrims.c

  Log Message:
  -----------
  Merge pull request #232 from akgrant43/21643-FilePlugin-primitiveFileAtEnd

FilePlugin currently splits files in to two groups:

1) Stdio streams and
2) everything else.

To test for the end of file, FilePlugin>>primitiveFileAtEnd:

1) Uses feof() for stdio streams.
2) Compares the current position to the file size for everything else.

This returns the expected results for regular files, but fails for
non-regular files, e.g.:

```
(FileSystem / 'dev' / 'urandom') binaryReadStream next: 8.
'/proc/cpuinfo' asFileReference contents
```

both return empty collections.

Modify sqFileAtEnd() (FilePlugin>>primitiveFileAtEnd) so that #atEnd
returns true when the last character has been read.

Both Squeak and Pharo expect that #atEnd can be used to control
iteration over a stream, answering true as soon as the last character
has been read, and importantly not requiring #next values to be tested
for an end-of-stream.

Previously, stdio streams just used feof(), which requires reading past
the end of the stream, and so required the value returned by #next to be
tested for nil.  This causes problems with streams over other
collections where nil is a valid value.

sqFileAtEnd() would also fail to return the correct value for other
files such as kernel virtual files, e.g. /proc/cpuinfo, and devices like
/dev/urandom, because they have a reported file size of 0.

This change also takes a step towards removing the special handling of
stdio files on Unix, significantly simplifying the code base.

This change doesn't break any existing code that uses #next == nil to
test for end-of-stream.


Compare: https://github.com/OpenSmalltalk/opensmalltalk-vm/compare/0ce1378d23d0...3421494b43af