Skip to content

Commit

Permalink
Merge pull request #4752 from tesonep/moving-read-write-buffer-to-be-…
Browse files Browse the repository at this point in the history
…used-only-by-sourceFIles

Making the ReadWrite buffered stream to be used only by SourceFile
  • Loading branch information
Ducasse committed Sep 29, 2019
2 parents 84cb058 + cefa03e commit 0f9b7d3
Show file tree
Hide file tree
Showing 10 changed files with 117 additions and 123 deletions.
14 changes: 7 additions & 7 deletions src/FileSystem-Core/FileReference.class.st
Expand Up @@ -115,13 +115,6 @@ FileReference >> binaryReadStream [
^ ZnBufferedReadStream on: (filesystem binaryReadStreamOn: self path)
]

{ #category : #streams }
FileReference >> binaryReadWriteStream [
"Answer a binary read/write stream on the receiver"

^ ZnBufferedReadWriteStream on: (filesystem binaryWriteStreamOn: self path)
]

{ #category : #streams }
FileReference >> binaryWriteStream [
"Answer a buffered binary write stream on the receiver"
Expand Down Expand Up @@ -601,6 +594,13 @@ FileReference >> uid: uid gid: gid [
^filesystem file: self path uid: uid gid: gid
]

{ #category : #streams }
FileReference >> unbufferedBinaryWriteStream [
"Answer a binary read/write stream on the receiver"

^ filesystem binaryWriteStreamOn: self path
]

{ #category : #versions }
FileReference >> versionNumberFor: basename extension: extension [
"Answer the latest (largest) version number for the specified file.
Expand Down
7 changes: 3 additions & 4 deletions src/Ombu-Tests/OmFileStoreTest.class.st
Expand Up @@ -141,11 +141,10 @@ OmFileStoreTest >> testLoadFromCorruptFile4 [
store flush.

"Override first characters"
stream := store fileReference binaryReadWriteStream.
stream := store fileReference binaryWriteStream.
[
(ZnCharacterReadWriteStream on: stream encoding: 'utf8')
upToAll: '41';
skip: -1;
(ZnCharacterWriteStream on: stream encoding: 'utf8')
position: 50;
nextPutAll: '**'.

"Apparently, in Linux it can randomly fail if not explicitly flush"
Expand Down
10 changes: 5 additions & 5 deletions src/Ombu/OmFileStore.class.st
Expand Up @@ -227,8 +227,9 @@ OmFileStore >> flushEntryBuffer [
self critical: [
| initialPosition initialLocalName fileStream |
self entryBuffer isEmpty ifTrue: [ ^self ].

[ fileStream := ZnCharacterReadWriteStream on: fileReference binaryReadWriteStream encoding: #utf8. ] on: ReadOnlyFileException do: [ :anException |

[ fileStream := ZnCharacterWriteStream on: fileReference binaryWriteStream encoding: #utf8. ] on: ReadOnlyFileException do: [ :anException |
fileStream close.
^ self
].

Expand All @@ -253,11 +254,10 @@ OmFileStore >> flushEntryBuffer [
"In Linux it was necessary to explicitly flush the file stream"
fileStream flush.

lastStreamPosition := fileStream size.
lastStreamPosition := fileStream position.
] ensure: [ fileStream close ].

self refreshEntryPositionsByLocalNameStartingAt: initialPosition since: initialLocalName.
].
self refreshEntryPositionsByLocalNameStartingAt: initialPosition since: initialLocalName ].

]

Expand Down
4 changes: 2 additions & 2 deletions src/System-Sources/SourceFile.class.st
Expand Up @@ -244,8 +244,8 @@ SourceFile >> tryOpenReadOnly: readOnly [
readOnly ifFalse: [
potentialLocations
do: [ :each |
[ stream := ZnCharacterReadWriteStream
on: (each asFileReference / basename) binaryReadWriteStream
[ stream := SourceFileCharacterReadWriteStream
on: (SourceFileBufferedReadWriteStream on:(each asFileReference / basename) unbufferedBinaryWriteStream)
encoding: 'utf8'.
^ self ] on: Error do: [ ] ] ].

Expand Down
@@ -1,18 +1,9 @@
"
I am ZnBufferedReadWriteStream.
I wrap a buffered read stream and a buffered write stream on the same file.
I discard my read buffer on writes, and flush my write buffer on reads.
Make sure to always send me #flush or #close when you're done,
otherwise the last buffer might not yet have been written.
My class side's #on:do: helps to ensure this.
I can wrap both binary or character streams and act accordingly.
Part of Zinc HTTP Components.
I am Buffered Read Write Stream.
I should only be used in the SourceFile implementation
"
Class {
#name : #ZnBufferedReadWriteStream,
#name : #SourceFileBufferedReadWriteStream,
#superclass : #Object,
#instVars : [
'innerStream',
Expand All @@ -23,18 +14,18 @@ Class {
'nextPosition',
'isDirty'
],
#category : #'Zinc-Character-Encoding-Core'
#category : #'System-Sources-Streams'
}

{ #category : #'instance creation' }
ZnBufferedReadWriteStream class >> on: writeStream [
SourceFileBufferedReadWriteStream class >> on: writeStream [
^ self basicNew
on: writeStream;
yourself
]

{ #category : #convenience }
ZnBufferedReadWriteStream class >> on: readStream do: block [
SourceFileBufferedReadWriteStream class >> on: readStream do: block [
"Execute block with as argument a ZnBufferedReadStream on readStream.
Return the value of block."

Expand All @@ -46,13 +37,13 @@ ZnBufferedReadWriteStream class >> on: readStream do: block [
]

{ #category : #testing }
ZnBufferedReadWriteStream >> atEnd [
SourceFileBufferedReadWriteStream >> atEnd [

^ self atEnd: nextPosition
]

{ #category : #private }
ZnBufferedReadWriteStream >> atEnd: anInteger [
SourceFileBufferedReadWriteStream >> atEnd: anInteger [

anInteger < streamSize ifTrue: [ ^ false ].
anInteger <= (bufferOffset + bufferLength) ifTrue: [ ^ false ].
Expand All @@ -61,15 +52,15 @@ ZnBufferedReadWriteStream >> atEnd: anInteger [
]

{ #category : #private }
ZnBufferedReadWriteStream >> bufferAt: aPosition [
SourceFileBufferedReadWriteStream >> bufferAt: aPosition [

^ buffer at: (aPosition - bufferOffset)


]

{ #category : #private }
ZnBufferedReadWriteStream >> bufferAt: aPosition put: anElement [
SourceFileBufferedReadWriteStream >> bufferAt: aPosition put: anElement [

self checkBufferFor: nextPosition.

Expand All @@ -79,40 +70,40 @@ ZnBufferedReadWriteStream >> bufferAt: aPosition put: anElement [
]

{ #category : #private }
ZnBufferedReadWriteStream >> checkBufferFor: aPosition [
SourceFileBufferedReadWriteStream >> checkBufferFor: aPosition [

(self isPositionInBuffer: aPosition)
ifFalse: [ self refreshBufferFrom: aPosition ]
]

{ #category : #closing }
ZnBufferedReadWriteStream >> close [
SourceFileBufferedReadWriteStream >> close [

self flush.
innerStream close
]

{ #category : #testing }
ZnBufferedReadWriteStream >> closed [
SourceFileBufferedReadWriteStream >> closed [

^ innerStream closed
]

{ #category : #'initialize-release' }
ZnBufferedReadWriteStream >> collectionSpecies [
SourceFileBufferedReadWriteStream >> collectionSpecies [
^ innerStream isBinary
ifTrue: [ ByteArray ]
ifFalse: [ String ]
]

{ #category : #initialization }
ZnBufferedReadWriteStream >> defaultBufferSize [
SourceFileBufferedReadWriteStream >> defaultBufferSize [

^ 2 raisedToInteger: 16
]

{ #category : #writing }
ZnBufferedReadWriteStream >> flush [
SourceFileBufferedReadWriteStream >> flush [

isDirty ifFalse: [ ^ self ].

Expand All @@ -127,31 +118,31 @@ ZnBufferedReadWriteStream >> flush [
]

{ #category : #testing }
ZnBufferedReadWriteStream >> isBinary [
SourceFileBufferedReadWriteStream >> isBinary [

^ innerStream isBinary
]

{ #category : #private }
ZnBufferedReadWriteStream >> isPositionInBuffer: aPosition [
SourceFileBufferedReadWriteStream >> isPositionInBuffer: aPosition [

^ aPosition between: bufferOffset and: bufferOffset + bufferLength
]

{ #category : #testing }
ZnBufferedReadWriteStream >> isReadOnly [
SourceFileBufferedReadWriteStream >> isReadOnly [

^ false
]

{ #category : #testing }
ZnBufferedReadWriteStream >> isStream [
SourceFileBufferedReadWriteStream >> isStream [

^ true
]

{ #category : #reading }
ZnBufferedReadWriteStream >> next [
SourceFileBufferedReadWriteStream >> next [
| value |

self atEnd
Expand All @@ -167,7 +158,7 @@ ZnBufferedReadWriteStream >> next [
]

{ #category : #reading }
ZnBufferedReadWriteStream >> next: aQuantity [
SourceFileBufferedReadWriteStream >> next: aQuantity [

| read collection |

Expand All @@ -184,15 +175,15 @@ ZnBufferedReadWriteStream >> next: aQuantity [
]

{ #category : #writing }
ZnBufferedReadWriteStream >> next: aQuantity putAll: aCollection startingAt: startingAt [
SourceFileBufferedReadWriteStream >> next: aQuantity putAll: aCollection startingAt: startingAt [

aCollection readStreamDo: [ :s |
s skip: startingAt - 1.
self nextPutAll: (s next: aQuantity)].
]

{ #category : #writing }
ZnBufferedReadWriteStream >> nextPut: anElement [
SourceFileBufferedReadWriteStream >> nextPut: anElement [

self checkBufferFor: nextPosition.

Expand All @@ -203,13 +194,13 @@ ZnBufferedReadWriteStream >> nextPut: anElement [
]

{ #category : #writing }
ZnBufferedReadWriteStream >> nextPutAll: aCollection [
SourceFileBufferedReadWriteStream >> nextPutAll: aCollection [

aCollection do: [ :each | self nextPut: each ]
]

{ #category : #'instance creation' }
ZnBufferedReadWriteStream >> on: aStream [
SourceFileBufferedReadWriteStream >> on: aStream [

innerStream := aStream.
nextPosition := aStream position + 1.
Expand All @@ -225,7 +216,7 @@ ZnBufferedReadWriteStream >> on: aStream [
]

{ #category : #reading }
ZnBufferedReadWriteStream >> peek [
SourceFileBufferedReadWriteStream >> peek [

| value |
value := self next.
Expand All @@ -237,21 +228,21 @@ ZnBufferedReadWriteStream >> peek [
]

{ #category : #querying }
ZnBufferedReadWriteStream >> position [
SourceFileBufferedReadWriteStream >> position [

^ nextPosition - 1

]

{ #category : #querying }
ZnBufferedReadWriteStream >> position: aNewPosition [
SourceFileBufferedReadWriteStream >> position: aNewPosition [

^ nextPosition := aNewPosition + 1

]

{ #category : #reading }
ZnBufferedReadWriteStream >> readInto: aBuffer startingAt: startingAt count: count [
SourceFileBufferedReadWriteStream >> readInto: aBuffer startingAt: startingAt count: count [

| remainingCount maxPositionInBuffer read countToRead |

Expand Down Expand Up @@ -279,7 +270,7 @@ ZnBufferedReadWriteStream >> readInto: aBuffer startingAt: startingAt count: cou
]

{ #category : #private }
ZnBufferedReadWriteStream >> refreshBufferFrom: aPosition [
SourceFileBufferedReadWriteStream >> refreshBufferFrom: aPosition [

| nextBufferPosition |

Expand All @@ -303,19 +294,19 @@ ZnBufferedReadWriteStream >> refreshBufferFrom: aPosition [
]

{ #category : #reading }
ZnBufferedReadWriteStream >> setToEnd [
SourceFileBufferedReadWriteStream >> setToEnd [

nextPosition := (streamSize max: (bufferOffset + bufferLength)) + 1
]

{ #category : #querying }
ZnBufferedReadWriteStream >> size [
SourceFileBufferedReadWriteStream >> size [

^ streamSize max: (bufferOffset + bufferLength)
]

{ #category : #'initialize-release' }
ZnBufferedReadWriteStream >> sizeBuffer: size [
SourceFileBufferedReadWriteStream >> sizeBuffer: size [

bufferLength > 0 ifTrue: [ self flush ].
bufferLength := 0.
Expand All @@ -324,13 +315,13 @@ ZnBufferedReadWriteStream >> sizeBuffer: size [
]

{ #category : #reading }
ZnBufferedReadWriteStream >> skip: aQuantity [
SourceFileBufferedReadWriteStream >> skip: aQuantity [

nextPosition := nextPosition + aQuantity
]

{ #category : #reading }
ZnBufferedReadWriteStream >> upTo: value [
SourceFileBufferedReadWriteStream >> upTo: value [
"Read upto but not including value and return them as a collection.
If value is not found, return the entire contents of the stream.
This could be further optimzed."
Expand All @@ -342,7 +333,7 @@ ZnBufferedReadWriteStream >> upTo: value [
]

{ #category : #reading }
ZnBufferedReadWriteStream >> upToEnd [
SourceFileBufferedReadWriteStream >> upToEnd [
"Read elements until the stream is atEnd and return them as a collection."

| toRead |
Expand Down

0 comments on commit 0f9b7d3

Please sign in to comment.