Bug in FileSystem

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

Bug in FileSystem

Mariano Martinez Peck
FSReadStream >> next: count
    | result |
    result := ByteArray new: count.
    handle at: position read: result startingAt: 1 count: count.
    position := position + 1.
     ^ result


shouldn't be

FSReadStream >> next: count
    | result |
    result := ByteArray new: count.
    handle at: position read: result startingAt: 1 count: count.
    position := position + count.
     ^ result

At least with that (among some extensions) Fuel tests pass with FS :)

Cheers

--
Mariano
http://marianopeck.wordpress.com

Reply | Threaded
Open this post in threaded view
|

Re: Bug in FileSystem

Stéphane Ducasse
sounds like :)

Stef

On Jan 7, 2012, at 1:10 PM, Mariano Martinez Peck wrote:

> FSReadStream >> next: count
>     | result |
>     result := ByteArray new: count.
>     handle at: position read: result startingAt: 1 count: count.
>     position := position + 1.
>      ^ result
>
>
> shouldn't be
>
> FSReadStream >> next: count
>     | result |
>     result := ByteArray new: count.
>     handle at: position read: result startingAt: 1 count: count.
>     position := position + count.
>      ^ result
>
> At least with that (among some extensions) Fuel tests pass with FS :)
>
> Cheers
>
> --
> Mariano
> http://marianopeck.wordpress.com
>


Reply | Threaded
Open this post in threaded view
|

Re: Bug in FileSystem

Henrik Sperre Johansen
On 07.01.2012 13:20, Stéphane Ducasse wrote:

> sounds like :)
>
> Stef
>
> On Jan 7, 2012, at 1:10 PM, Mariano Martinez Peck wrote:
>
>> FSReadStream>>  next: count
>>      | result |
>>      result := ByteArray new: count.
>>      handle at: position read: result startingAt: 1 count: count.
>>      position := position + 1.
>>       ^ result
>>
>>
>> shouldn't be
>>
>> FSReadStream>>  next: count
>>      | result |
>>      result := ByteArray new: count.
>>      handle at: position read: result startingAt: 1 count: count.
>>      position := position + count.
>>       ^ result
>>
>> At least with that (among some extensions) Fuel tests pass with FS :)
>>
>> Cheers
>>
>> --
>> Mariano
>> http://marianopeck.wordpress.com
>>
>
Still wrong though, I think...
It doesn't handle the case where you try to read past end of stream.

next: count
^self nextInto: (ByteArray new: count)

would probably be better.

Cheers,
Henry


Reply | Threaded
Open this post in threaded view
|

Re: Bug in FileSystem

Henrik Sperre Johansen
In reply to this post by Stéphane Ducasse
On 07.01.2012 14:05, Henrik Sperre Johansen wrote:

> On 07.01.2012 13:20, Stéphane Ducasse wrote:
>> sounds like :)
>>
>> Stef
>>
>> On Jan 7, 2012, at 1:10 PM, Mariano Martinez Peck wrote:
>>
>>> FSReadStream>>  next: count
>>>      | result |
>>>      result := ByteArray new: count.
>>>      handle at: position read: result startingAt: 1 count: count.
>>>      position := position + 1.
>>>       ^ result
>>>
>>>
>>> shouldn't be
>>>
>>> FSReadStream>>  next: count
>>>      | result |
>>>      result := ByteArray new: count.
>>>      handle at: position read: result startingAt: 1 count: count.
>>>      position := position + count.
>>>       ^ result
>>>
>>> At least with that (among some extensions) Fuel tests pass with FS :)
>>>
>>> Cheers
>>>
>>> --
>>> Mariano
>>> http://marianopeck.wordpress.com
>>>
>>
> Still wrong though, I think...
> It doesn't handle the case where you try to read past end of stream.
>
> next: count
> ^self nextInto: (ByteArray new: count)
>
> would probably be better.
>
> Cheers,
> Henry
>
>
As for the API:

1) There's no next: into: (which returns the amount read). It's really
the only way to do buffers without garbage allocations.
2) FSHandle >>at: offset read: buffer startingAt: start count: count is
a weirdly named selector for what it does imho...
Doesn't #at: offset read: count into: buffer startingAt: start  make
more sense?

Cheers,
Henry

Reply | Threaded
Open this post in threaded view
|

Re: Bug in FileSystem

Nicolas Cellier
2012/1/7 Henrik Sperre Johansen <[hidden email]>:

> On 07.01.2012 14:05, Henrik Sperre Johansen wrote:
>>
>> On 07.01.2012 13:20, Stéphane Ducasse wrote:
>>>
>>> sounds like :)
>>>
>>> Stef
>>>
>>> On Jan 7, 2012, at 1:10 PM, Mariano Martinez Peck wrote:
>>>
>>>> FSReadStream>>  next: count
>>>>     | result |
>>>>     result := ByteArray new: count.
>>>>     handle at: position read: result startingAt: 1 count: count.
>>>>     position := position + 1.
>>>>      ^ result
>>>>
>>>>
>>>> shouldn't be
>>>>
>>>> FSReadStream>>  next: count
>>>>     | result |
>>>>     result := ByteArray new: count.
>>>>     handle at: position read: result startingAt: 1 count: count.
>>>>     position := position + count.
>>>>      ^ result
>>>>
>>>> At least with that (among some extensions) Fuel tests pass with FS :)
>>>>
>>>> Cheers
>>>>
>>>> --
>>>> Mariano
>>>> http://marianopeck.wordpress.com
>>>>
>>>
>> Still wrong though, I think...
>> It doesn't handle the case where you try to read past end of stream.
>>
>> next: count
>> ^self nextInto: (ByteArray new: count)
>>
>> would probably be better.
>>
>> Cheers,
>> Henry
>>
>>
> As for the API:
>
> 1) There's no next: into: (which returns the amount read). It's really the
> only way to do buffers without garbage allocations.
> 2) FSHandle >>at: offset read: buffer startingAt: start count: count is a
> weirdly named selector for what it does imho...
> Doesn't #at: offset read: count into: buffer startingAt: start  make more
> sense?
>

Sure.
But without reading source code I also wonder why mixing two
operations into a single ?
I mean seek() and read()
Since the underlying OS handle is most probably a stream, it should
preserve its own position.
Is it because the handle might be shared and FS thus has to provide
some kind of atomic operation ?

Nicolas

> Cheers,
> Henry
>

Reply | Threaded
Open this post in threaded view
|

Re: Bug in FileSystem

Sven Van Caekenberghe
In reply to this post by Henrik Sperre Johansen

On 07 Jan 2012, at 14:19, Henrik Sperre Johansen wrote:

> 1) There's no next: into: (which returns the amount read). It's really the only way to do buffers without garbage allocations.

The 2 key methods for efficient IO are:

readInto: collection startingAt: offset count: requestedCount
        "Read requestedCount elements into collection starting at offset,
        returning the number of elements read, there could be less elements available."

next: count putAll: collection startingAt: offset
        "Write count bytes from collection starting at offset."

All other bulk operations can be written in terms of these (see for example Zodiac streams).

Sven
Reply | Threaded
Open this post in threaded view
|

Re: Bug in FileSystem

Nicolas Cellier
2012/1/7 Sven Van Caekenberghe <[hidden email]>:

>
> On 07 Jan 2012, at 14:19, Henrik Sperre Johansen wrote:
>
>> 1) There's no next: into: (which returns the amount read). It's really the only way to do buffers without garbage allocations.
>
> The 2 key methods for efficient IO are:
>
> readInto: collection startingAt: offset count: requestedCount
>        "Read requestedCount elements into collection starting at offset,
>        returning the number of elements read, there could be less elements available."
>
> next: count putAll: collection startingAt: offset
>        "Write count bytes from collection starting at offset."
>
> All other bulk operations can be written in terms of these (see for example Zodiac streams).
>
> Sven

+1.
All streams should provide these API, and if possible, provide an
optimized implementation.
It was not the case in Squeak, i started to refactor a bit, but
incrementally modifying this dinosaurus without creating circularities
is a sport!
I still have 3 years old refactorings unpublished because I'm not sure
how to reproduce the changes in a safe order ;)

Nicolas

Reply | Threaded
Open this post in threaded view
|

Re: Bug in FileSystem

Stéphane Ducasse

How can we build and improve FS?

I'm too busy with other topics but I would love to get some momentum on that topic.

Stef


> On 07 Jan 2012, at 14:19, Henrik Sperre Johansen wrote:
>>
>>> 1) There's no next: into: (which returns the amount read). It's really the only way to do buffers without garbage allocations.
>>
>> The 2 key methods for efficient IO are:
>>
>> readInto: collection startingAt: offset count: requestedCount
>>        "Read requestedCount elements into collection starting at offset,
>>        returning the number of elements read, there could be less elements available."
>>
>> next: count putAll: collection startingAt: offset
>>        "Write count bytes from collection starting at offset."
>>
>> All other bulk operations can be written in terms of these (see for example Zodiac streams).
>>
>> Sven
>
> +1.
> All streams should provide these API, and if possible, provide an
> optimized implementation.
> It was not the case in Squeak, i started to refactor a bit, but
> incrementally modifying this dinosaurus without creating circularities
> is a sport!
> I still have 3 years old refactorings unpublished because I'm not sure
> how to reproduce the changes in a safe order ;)
>
> Nicolas
>


Reply | Threaded
Open this post in threaded view
|

Re: Bug in FileSystem

Mariano Martinez Peck
In reply to this post by Henrik Sperre Johansen


On Sat, Jan 7, 2012 at 2:05 PM, Henrik Sperre Johansen <[hidden email]> wrote:
On 07.01.2012 13:20, Stéphane Ducasse wrote:
sounds like :)

Stef

On Jan 7, 2012, at 1:10 PM, Mariano Martinez Peck wrote:

FSReadStream>>  next: count
    | result |
    result := ByteArray new: count.
    handle at: position read: result startingAt: 1 count: count.
    position := position + 1.
     ^ result


shouldn't be

FSReadStream>>  next: count
    | result |
    result := ByteArray new: count.
    handle at: position read: result startingAt: 1 count: count.
    position := position + count.
     ^ result

At least with that (among some extensions) Fuel tests pass with FS :)

Cheers

--
Mariano
http://marianopeck.wordpress.com


Still wrong though, I think...
It doesn't handle the case where you try to read past end of stream.

next: count
^self nextInto: (ByteArray new: count)

would probably be better.


Indeed.

 
Cheers,
Henry





--
Mariano
http://marianopeck.wordpress.com

Reply | Threaded
Open this post in threaded view
|

Re: Bug in FileSystem

Mariano Martinez Peck
In reply to this post by Henrik Sperre Johansen


As for the API:

1) There's no next: into: (which returns the amount read). It's really the only way to do buffers without garbage allocations.

Hi Henry. One of the extensions I needed to add to FSReadStream in order to make it work with Fuel was exatly #next:into:
The method is:

next: number into: aCollection
    | count |
    count := handle at: position read: aCollection startingAt: 1 count: number.
    position := position + count.
     ^ count < aCollection size
        ifTrue: [aCollection first: count]
        ifFalse: [aCollection]


I didn't understand what you meant by "It's really the only way to do buffers without garbage allocations"
So...should I integrate this method #next:into: as it is together to the fix to #read:

 
2) FSHandle >>at: offset read: buffer startingAt: start count: count is a weirdly named selector for what it does imho...
Doesn't #at: offset read: count into: buffer startingAt: start  make more sense?

Cheers,
Henry




--
Mariano
http://marianopeck.wordpress.com

Reply | Threaded
Open this post in threaded view
|

Re: Bug in FileSystem

Mariano Martinez Peck
So, here it is: http://code.google.com/p/pharo/issues/detail?id=5161

On Sun, Jan 8, 2012 at 2:39 PM, Mariano Martinez Peck <[hidden email]> wrote:


As for the API:

1) There's no next: into: (which returns the amount read). It's really the only way to do buffers without garbage allocations.

Hi Henry. One of the extensions I needed to add to FSReadStream in order to make it work with Fuel was exatly #next:into:
The method is:

next: number into: aCollection
    | count |
    count := handle at: position read: aCollection startingAt: 1 count: number.

    position := position + count.
     ^ count < aCollection size
        ifTrue: [aCollection first: count]
        ifFalse: [aCollection]


I didn't understand what you meant by "It's really the only way to do buffers without garbage allocations"
So...should I integrate this method #next:into: as it is together to the fix to #read:

 
2) FSHandle >>at: offset read: buffer startingAt: start count: count is a weirdly named selector for what it does imho...
Doesn't #at: offset read: count into: buffer startingAt: start  make more sense?

Cheers,
Henry




--
Mariano
http://marianopeck.wordpress.com




--
Mariano
http://marianopeck.wordpress.com

Reply | Threaded
Open this post in threaded view
|

Re: Bug in FileSystem

csrabak
In reply to this post by Mariano Martinez Peck
But what if count makes handle pass over the end of the file?
 
--
Cesar Rabak

Em 07/01/2012 10:10, Mariano Martinez Peck < [hidden email] > escreveu:
FSReadStream >> next: count
 | result |
 result := ByteArray new: count.
 handle at: position read: result startingAt: 1 count: count.
  position := position + 1.
 ^ result


shouldn't be

FSReadStream >> next: count
 | result |
 result := ByteArray new: count.
 handle at: position read: result startingAt: 1 count: count.
 position := position + count.
 ^ result
 
At least with that (among some extensions) Fuel tests pass with FS :)

Cheers

--
Mariano
http://marianopeck.wordpress.com