Skip to content

Commit

Permalink
Translate to C image segments reading code for ComposedImageReader
Browse files Browse the repository at this point in the history
  • Loading branch information
PalumboN committed Feb 10, 2022
1 parent 9c2ac96 commit 3f0101c
Show file tree
Hide file tree
Showing 4 changed files with 108 additions and 113 deletions.
63 changes: 22 additions & 41 deletions smalltalksrc/VMMaker/AbstractComposedImageAccess.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,28 @@ AbstractComposedImageAccess >> createImageDirectory: imageFileName [
inSmalltalk: [ imageFileName asFileReference ensureCreateDirectory ]
]

{ #category : #'file operations' }
AbstractComposedImageAccess >> existSegment: segmentIndex inImage: imageFileName [

<var: #buffer declareC: 'char buffer[255]'>
<var: #sb declareC: 'stat'>
| buffer fileName sb |
self simulationOnly: [
buffer := nil.
sb := nil ].

fileName := self
segmentFileName: segmentIndex
withExtension: '.data'
inImage: imageFileName
into: buffer
bufferSize: 255.

^ self
cCode: [ self stat: fileName _: (self addressOf: sb) ]
inSmalltalk: [ fileName asFileReference exists ]
]

{ #category : #'file primitives' }
AbstractComposedImageAccess >> fprintf: aStream _: format [

Expand Down Expand Up @@ -94,17 +116,6 @@ AbstractComposedImageAccess >> headerFileNameinImage: imageFileName into: buffer
inSmalltalk: [ imageFileName , '/', headerFileName ]
]

{ #category : #'file operations' }
AbstractComposedImageAccess >> imageFile: imageFileName [

<doNotGenerate>
| imageFile |
imageFile := imageFileName asFileReference.
imageFile ensureCreateDirectory.

^ imageFile
]

{ #category : #initialization }
AbstractComposedImageAccess >> initialize [

Expand All @@ -114,16 +125,6 @@ AbstractComposedImageAccess >> initialize [
fieldFormat := '\t#%s : %ld'.
]

{ #category : #'file operations' }
AbstractComposedImageAccess >> segmentDataFile: segmentIndex fromFile: imageFile [

<doNotGenerate>
| segmentDataFileName |
segmentDataFileName := self segmentFileName: segmentIndex withExtension: '.data'.

^ imageFile / segmentDataFileName
]

{ #category : #'file operations' }
AbstractComposedImageAccess >> segmentDataFile: segmentIndex inImage: imageFileName [

Expand All @@ -138,16 +139,6 @@ AbstractComposedImageAccess >> segmentDataFile: segmentIndex inImage: imageFileN

]

{ #category : #'file operations' }
AbstractComposedImageAccess >> segmentFileName: segmentIndex withExtension: extension [


<doNotGenerate>
self flag: #TODO. "REMOVE"

^ 'seg', segmentIndex asString , extension
]

{ #category : #'file operations' }
AbstractComposedImageAccess >> segmentFileName: segmentIndex withExtension: extension inImage: imageFileName into: buffer bufferSize: bufferSize [

Expand All @@ -158,16 +149,6 @@ AbstractComposedImageAccess >> segmentFileName: segmentIndex withExtension: exte
inSmalltalk: [ imageFileName , '/seg', segmentIndex asString , extension ]
]

{ #category : #'file operations' }
AbstractComposedImageAccess >> segmentMetadataFile: segmentIndex fromFile: imageFile [

<doNotGenerate>
| segmentDataFileName |
segmentDataFileName := self segmentFileName: segmentIndex withExtension: '.ston'.

^ imageFile / segmentDataFileName
]

{ #category : #'file operations' }
AbstractComposedImageAccess >> segmentMetadataFile: segmentIndex inImage: imageFileName [

Expand Down
14 changes: 14 additions & 0 deletions smalltalksrc/VMMaker/AbstractImageAccess.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -218,6 +218,20 @@ AbstractImageAccess >> segmentManager: anObject [
segmentManager := anObject
]

{ #category : #'accessing - files' }
AbstractImageAccess >> sq: startingAddress Image: byteSize File: bytesToRead Read: aZnBufferedReadStream [

<doNotGenerate>
| region |

region := objectMemory memoryManager regionForAddress: startingAddress.

^ aZnBufferedReadStream
readInto: region memory
startingAt: startingAddress - region start + 1
count: bytesToRead
]

{ #category : #'accessing - files' }
AbstractImageAccess >> sq: segStart Image: n File: segSize Write: file [

Expand Down
130 changes: 72 additions & 58 deletions smalltalksrc/VMMaker/ComposedImageReader.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -68,30 +68,17 @@ ComposedImageReader >> readHeaderFromImage: imageFileName [
{ #category : #api }
ComposedImageReader >> readImageNamed: imageName [

<var: #f type: #sqImageFile>
<var: #imageName declareC: 'char *imageName'>
<var: #aHeader type: #'SpurImageHeaderStruct'>
<api>

| aHeader f |
| aHeader |

f := self imageFile: imageName.
aHeader := self readHeaderFromImage: imageName.

self loadHeaderToMemory: aHeader.
interpreter allocateMemoryForImage: f withHeader: aHeader.

self flag: #TODO. "Fix this"
^ self sqImageFileClose: f readStream .
]

{ #category : #reading }
ComposedImageReader >> readSTONFrom: file [

<doNotGenerate>
^ STON reader
on: file;
next
interpreter allocateMemoryForImage: imageName withHeader: aHeader

]

{ #category : #reading }
Expand All @@ -103,82 +90,109 @@ ComposedImageReader >> readSTONFrom: file into: aStruct [
]

{ #category : #segments }
ComposedImageReader >> readSegmentMetadata: segmentIndex fromFile: imageFile [
ComposedImageReader >> readSegmentData: segmentIndex fromImage: imageFileName startingAt: startingAddress bytes: bytesToRead [

<inline: true>
<var: #file type: #sqImageFile>
<var: #buffer declareC: 'char buffer[255]'>
| buffer file bytes |
self simulationOnly: [ buffer := nil ].

file := self sqImageFile: (self
segmentFileName: segmentIndex
withExtension: '.data'
inImage: imageFileName
into: buffer
bufferSize: 255)
Open: 'rb'.

bytes := self sq: startingAddress Image: (self sizeof: #char) File: bytesToRead Read: file.

self sqImageFileClose: file.

^ bytes
]

{ #category : #segments }
ComposedImageReader >> readSegmentMetadata: segmentIndex fromImage: imageFileName [

<inline: true>
<var: #file type: #sqImageFile>
<var: #buffer declareC: 'char buffer[255]'>
<var: #segmentMetadata type: #ComposedSegmentMetadataStruct>
| segmentMetadata buffer file |
self simulationOnly: [
buffer := nil.
segmentMetadata := ComposedSegmentMetadataStruct new ].

file := self
sqImageFile: (self
segmentFileName: segmentIndex
withExtension: '.ston'
inImage: imageFileName
into: buffer
bufferSize: 255)
Open: 'r'.

self readSTONFrom: file into: (self addressOf: segmentMetadata).

self sqImageFileClose: file.

^ (self segmentMetadataFile: segmentIndex fromFile: imageFile)
readStreamDo: [ :f | self readSTONFrom: f ]
^ segmentMetadata
]

{ #category : #segments }
ComposedImageReader >> readSegmentsFromImageFile: imageFile header: aHeader [
ComposedImageReader >> readSegmentsFromImageFile: imageFileName header: aHeader [

<inline: false>
<var: #imageFile type: #sqImageFile>
<var: 'segInfo' type: #'SpurSegmentInfo *'>
<var: 'aHeader' type: #SpurImageHeaderStruct>
| bytesRead totalBytesRead segmentSize oldBase newBase segmentIndex existsNextSegment |

self prepareSegmentsToRead.

"segment sizes include the two-header-word bridge at the end of each segment."
segmentIndex := 0.
segmentIndex := 0.
totalBytesRead := 0.
oldBase := aHeader oldBaseAddr.
newBase := objectMemory getMemoryMap oldSpaceStart.
segmentSize := aHeader firstSegSize.

[
segmentManager withNewSegmentDo: [ :segInfo |
segInfo
segStart: oldBase;
segSize: segmentSize;
swizzle: newBase - oldBase ].

bytesRead := self
sq: (self pointerForOop: newBase)
readSegment: segmentIndex
File: segmentSize
Read: imageFile.
bytesRead := self
readSegmentData: segmentIndex
fromImage: imageFileName
startingAt: (self pointerForOop: newBase)
bytes: segmentSize.

bytesRead > 0 ifTrue: [ totalBytesRead := totalBytesRead + bytesRead ].

"Check segment bytes read"
bytesRead ~= segmentSize ifTrue: [ interpreter unableToReadImageError ].
bytesRead ~= segmentSize ifTrue: [
interpreter unableToReadImageError ].

"The next segment will override the bridge of this segment"
newBase := newBase + segmentSize - objectMemory bridgeSize.

"Check if exist next segment"
segmentIndex := segmentIndex + 1.
existsNextSegment := imageFile hasChildrenMatching: (self segmentFileName: segmentIndex withExtension: '*').

existsNextSegment ifTrue: [ | nextSegmentMetadata |
nextSegmentMetadata := self readSegmentMetadata: segmentIndex fromFile: imageFile.
oldBase := nextSegmentMetadata segStart.
segmentSize := nextSegmentMetadata segSize.
].

existsNextSegment
] whileTrue.

self finalizeSegmentsRead: totalBytesRead newBase: newBase.

^ totalBytesRead
]
segmentIndex := segmentIndex + 1.
existsNextSegment := self existSegment: segmentIndex inImage: imageFileName.

{ #category : #segments }
ComposedImageReader >> sq: startingAddress readSegment: segmentIndex File: bytesToRead Read: imageFile [
existsNextSegment ifTrue: [
| nextSegmentMetadata |
nextSegmentMetadata := self readSegmentMetadata: segmentIndex fromImage: imageFileName.
oldBase := nextSegmentMetadata segStart.
segmentSize := nextSegmentMetadata segSize ].

<doNotGenerate>
| region |
existsNextSegment ] whileTrue.

region := objectMemory memoryManager regionForAddress: startingAddress.
self finalizeSegmentsRead: totalBytesRead newBase: newBase.

^ (self segmentDataFile: segmentIndex fromFile: imageFile) binaryReadStreamDo: [ :file |
file
readInto: region memory
startingAt: startingAddress - region start + 1
count: bytesToRead
]

^ totalBytesRead
]
14 changes: 0 additions & 14 deletions smalltalksrc/VMMaker/SpurImageReader.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -235,17 +235,3 @@ SpurImageReader >> readSegmentsFromImageFile: f header: aHeader [

^ totalBytesRead
]

{ #category : #'file operations' }
SpurImageReader >> sq: startingAddress Image: byteSize File: bytesToRead Read: aZnBufferedReadStream [

<doNotGenerate>
| region |

region := objectMemory memoryManager regionForAddress: startingAddress.

^ aZnBufferedReadStream
readInto: region memory
startingAt: startingAddress - region start + 1
count: bytesToRead
]

0 comments on commit 3f0101c

Please sign in to comment.