Skip to content

Commit

Permalink
Refactor: make files access C tranlation friendly for Composed images
Browse files Browse the repository at this point in the history
  • Loading branch information
PalumboN committed Feb 7, 2022
1 parent d81baf0 commit e6b9e74
Show file tree
Hide file tree
Showing 4 changed files with 94 additions and 62 deletions.
100 changes: 52 additions & 48 deletions smalltalksrc/VMMaker/AbstractComposedImageAccess.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,14 @@ Class {
#category : #'VMMaker-ImageFormat'
}

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

self cCode: [ self mkdir: imageFileName ]
inSmalltalk: [ imageFileName asFileReference ensureCreateDirectory ]

]

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

Expand Down Expand Up @@ -40,14 +48,24 @@ AbstractComposedImageAccess >> fprintf: aStream format: aFormat arguments: argum
{ #category : #'file operations' }
AbstractComposedImageAccess >> headerFile: imageFileName [

<doNotGenerate>
| headerFileName imageFile |
headerFileName := 'header.ston'.
imageFile := self imageFile: imageFileName.
^ imageFile / headerFileName
]

{ #category : #'file operations' }
AbstractComposedImageAccess >> headerFileNameinImage: imageFileName into: buffer bufferSize: bufferSize [

| headerFileName |
headerFileName := 'header.ston'.

^ self
cCode: [ self vmConcatPath: imageFileName File: headerFileName ]
inSmalltalk: [ | imageFile |
imageFile := self imageFile: imageFileName.
imageFile / headerFileName ]
^ self
cCode: [
self snprintf: buffer _: bufferSize _: '%s/%s' _: imageFileName _: headerFileName.
buffer ]
inSmalltalk: [ imageFileName , '/', headerFileName ]
]

{ #category : #'file operations' }
Expand All @@ -66,88 +84,74 @@ AbstractComposedImageAccess >> segmentDataFile: segmentIndex fromFile: imageFile

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

^ imageFile / segmentDataFileName
]

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

^ self
cCode: [ | segmentFileName fullSegmentPath |
segmentFileName := self segmentDataFileName: segmentIndex.
fullSegmentPath := self
vmConcatPath: imageFileName
File: segmentFileName.
self free: segmentFileName.
fullSegmentPath ]
inSmalltalk: [ | imageFile |
imageFile := self imageFile: imageFileName.
self segmentDataFile: segmentIndex fromFile: imageFile ]
<inline: true>
<var: #buffer declareC: 'char buffer[255]'>

| buffer |

self simulationOnly: [ buffer := nil ].

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

]

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

| fileName extension dataFileName |
fileName := self segmentFileNameWithoutExtension: segmentIndex.
extension := '.data'.
dataFileName := self stretch: fileName cat: extension.
self free: fileName.
^ dataFileName

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

^ 'seg', segmentIndex asString , extension
]

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

^ self stretch: 'seg' cat: segmentIndex asString.
^ self
cCode: [
self snprintf: buffer _: bufferSize _: '%s/seg%d%s' _: imageFileName _: segmentIndex _: extension.
buffer ]
inSmalltalk: [ imageFileName , '/seg', segmentIndex asString , extension ]
]

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

<doNotGenerate>
| segmentDataFileName |
segmentDataFileName := (self segmentFileNameWithoutExtension: segmentIndex) , '.ston'.
segmentDataFileName := self segmentFileName: segmentIndex withExtension: '.ston'.

^ imageFile / segmentDataFileName
]

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

^ self
cCode: [ | segmentFileName fullSegmentPath |
segmentFileName := self segmentMetadataFileName: segmentIndex.
fullSegmentPath := self
vmConcatPath: imageFileName
File: segmentFileName.
self free: segmentFileName.
fullSegmentPath ]
inSmalltalk: [ | imageFile |
imageFile := self imageFile: imageFileName.
self segmentMetadataFile: segmentIndex fromFile: imageFile ]
]
<inline: true>
<var: #buffer declareC: 'char buffer[255]'>

{ #category : #'file operations' }
AbstractComposedImageAccess >> segmentMetadataFileName: segmentIndex [
| buffer |

self simulationOnly: [ buffer := nil ].

| fileName extension metadataFileName |
fileName := self segmentFileNameWithoutExtension: segmentIndex.
extension := '.ston'.
metadataFileName := self stretch: fileName cat: extension.
self free: fileName.
^ metadataFileName
^ self segmentFileName: segmentIndex withExtension: '.ston' inImage: imageFileName into: buffer bufferSize: 255.

]

{ #category : #'string manipulation' }
AbstractComposedImageAccess >> vmConcatPath: dirPath File: fileName [

| prefix fullPath |
self flag: #TODO. "implement sprint"
self flag: #TODO. "REMOVE"
prefix := self stretch: dirPath cat: '/'.
fullPath := self stretch: prefix cat: fileName.
self free: prefix.
Expand Down
6 changes: 4 additions & 2 deletions smalltalksrc/VMMaker/AbstractImageAccess.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -237,9 +237,11 @@ AbstractImageAccess >> sq: segStart Image: n File: segSize Write: file [
AbstractImageAccess >> sqImageFile: imageName Open: fileMode [

<doNotGenerate>
| file |
file := imageName asFileReference.
^ (fileMode includesSubstring: 'b')
ifTrue: [ imageName asFileReference binaryWriteStream ]
ifFalse: [ imageName asFileReference writeStream ]
ifTrue: [ file binaryWriteStream ]
ifFalse: [ file writeStream ]

]

Expand Down
6 changes: 2 additions & 4 deletions smalltalksrc/VMMaker/ComposedImageReader.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -53,10 +53,8 @@ ComposedImageReader >> readSegmentMetadata: segmentIndex fromFile: imageFile [
{ #category : #segments }
ComposedImageReader >> readSegmentsFromImageFile: imageFile header: aHeader [

"Compare with SpurImageReader >> readSegmentsFromImageFile:header:"

<var: #imageFile type: #sqImageFile>
<inline: false>
<var: #imageFile type: #sqImageFile>
<var: 'segInfo' type: #'SpurSegmentInfo *'>
<var: 'aHeader' type: #SpurImageHeaderStruct>
| bytesRead totalBytesRead segmentSize oldBase newBase segmentIndex existsNextSegment |
Expand Down Expand Up @@ -93,7 +91,7 @@ ComposedImageReader >> readSegmentsFromImageFile: imageFile header: aHeader [

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

existsNextSegment ifTrue: [ | nextSegmentMetadata |
nextSegmentMetadata := self readSegmentMetadata: segmentIndex fromFile: imageFile.
Expand Down
44 changes: 36 additions & 8 deletions smalltalksrc/VMMaker/ComposedImageWriter.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,15 @@ Class {
{ #category : #writing }
ComposedImageWriter >> writeHeaderFile: imageFileName fromHeader: header [

<inline: true>
<var: #file type: #sqImageFile>
| file |
<var: #buffer declareC: 'char buffer[255]'>

file := self sqImageFile: (self headerFile: imageFileName) Open: 'w'.
| buffer file |

self simulationOnly: [ buffer := nil ].

file := self sqImageFile: (self headerFileNameinImage: imageFileName into: buffer bufferSize: 255) Open: 'w'.
file ifNil: [ "could not open the file for writing"
^ self primitiveFail ].

Expand All @@ -37,6 +42,8 @@ ComposedImageWriter >> writeImageFile: imageFileName fromHeader: header [

self logDebug: 'Writing snapshot %s' _: imageFileName.

self createImageDirectory: imageFileName.

self writeHeaderFile: imageFileName fromHeader: header.

self flag: #TODO. "success: header imageHeaderSize?"
Expand Down Expand Up @@ -83,16 +90,20 @@ ComposedImageWriter >> writeSTON: struct toFile: f [
{ #category : #writing }
ComposedImageWriter >> writeSegment: segment nextIndex: segmentIndex inImage: imageFileName [

| metadataFile dataFile nWritten |
<inline: false>
<var: 'segment' type: #'SpurSegmentInfo *'>
<var: #imageFileName declareC: 'char *imageFileName'>

metadataFile := self sqImageFile: (self segmentMetadataFile: segmentIndex inImage: imageFileName) Open: 'w'.
metadataFile ifNil: [ "could not open the file for writing"
^ self primitiveFail ].
self writeSegmentMetadata: segment nextIndex: segmentIndex inImage: imageFileName.

self writeSegmentMetadata: segment toFile: metadataFile.
^ self writeSegmentData: segment nextIndex: segmentIndex inImage: imageFileName.
]

self sqImageFileClose: metadataFile.
{ #category : #writing }
ComposedImageWriter >> writeSegmentData: segment nextIndex: segmentIndex inImage: imageFileName [

<var: #dataFile type: #sqImageFile>
| dataFile nWritten |

dataFile := self sqImageFile: (self segmentDataFile: segmentIndex inImage: imageFileName) Open: 'wb'.
dataFile ifNil: [ "could not open the file for writing"
Expand All @@ -110,6 +121,23 @@ ComposedImageWriter >> writeSegment: segment nextIndex: segmentIndex inImage: im
^ nWritten
]

{ #category : #writing }
ComposedImageWriter >> writeSegmentMetadata: segment nextIndex: segmentIndex inImage: imageFileName [

<var: #metadataFile type: #sqImageFile>
| metadataFile |

metadataFile := self sqImageFile: (self segmentMetadataFile: segmentIndex inImage: imageFileName) Open: 'w'.
metadataFile ifNil: [ "could not open the file for writing"
^ self primitiveFail ].

self writeSegmentMetadata: segment toFile: metadataFile.

self sqImageFileClose: metadataFile.


]

{ #category : #writing }
ComposedImageWriter >> writeSegmentMetadata: segment toFile: file [

Expand Down

0 comments on commit e6b9e74

Please sign in to comment.