Skip to content

Perm space on image #416

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Apr 7, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions smalltalksrc/Printf/PrintfFormatDescriptor.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -56,9 +56,10 @@ PrintfFormatDescriptor class >> scanFrom: stream [
whileTrue: [desc := desc perform: (Flags at: stream next)].
stream peek isDigit ifTrue: [desc width: (Integer readFrom: stream)].
stream peek == $. ifTrue: [stream next. desc precision: (Integer readFrom: stream)].
stream peek == $l ifTrue: [stream next].
stream peek == $l ifTrue: [stream next].

stream peek == $l ifTrue: [stream next.
stream peek == $l ifTrue: [stream next]
].

desc := desc operator: stream next.
^ desc
]
Expand Down
8 changes: 8 additions & 0 deletions smalltalksrc/Printf/PrintfFormatStringTest.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,14 @@ PrintfFormatStringTest >> testOneIntegerWithLength [
self assert: 'Here is a string "0000042".' equals: ('Here is a string "%07.7d".' printf: 42).
]

{ #category : #'as yet unclassified' }
PrintfFormatStringTest >> testOneLongLongInteger [

self
assert: 'Here is a number "2199023255552".'
equals: ('Here is a number "%lld".' printf: 2199023255552)
]

{ #category : #'as yet unclassified' }
PrintfFormatStringTest >> testOnePrintPointer [

Expand Down
42 changes: 39 additions & 3 deletions smalltalksrc/VMMaker/AbstractComposedImageAccess.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,43 @@ AbstractComposedImageAccess >> headerFileNameinImage: imageFileName into: buffer
inSmalltalk: [ imageFileName , '/', headerFileName ]
]

{ #category : #'file operations' }
{ #category : #'perm - space' }
AbstractComposedImageAccess >> permSpaceDataFileInImage: imageFileName [

<inline: true>
<var: #buffer declareC: 'char buffer[255]'>

| buffer |

self simulationOnly: [ buffer := nil ].

^ self permSpaceFileName: 'permSpace.data' inImage: imageFileName into: buffer bufferSize: 255
]

{ #category : #'perm - space' }
AbstractComposedImageAccess >> permSpaceFileName: fileName inImage: imageFileName into: buffer bufferSize: bufferSize [

^ self
cCode: [
self snprintf: buffer _: bufferSize _: '%s/%s' _: imageFileName _: fileName.
buffer ]
inSmalltalk: [ imageFileName , '/', fileName ].
]

{ #category : #'perm - space' }
AbstractComposedImageAccess >> permSpaceMetadataFileNameInImage: imageFileName [

<inline: true>
<var: #buffer declareC: 'char buffer[255]'>

| buffer |

self simulationOnly: [ buffer := nil ].

^ self permSpaceFileName: 'permSpace.ston' inImage: imageFileName into: buffer bufferSize: 255
]

{ #category : #segments }
AbstractComposedImageAccess >> segmentDataFile: segmentIndex inImage: imageFileName [

<inline: true>
Expand All @@ -115,7 +151,7 @@ AbstractComposedImageAccess >> segmentDataFile: segmentIndex inImage: imageFileN

]

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

^ self
Expand All @@ -125,7 +161,7 @@ AbstractComposedImageAccess >> segmentFileName: segmentIndex withExtension: exte
inSmalltalk: [ imageFileName , '/seg', segmentIndex asString , extension ]
]

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

<inline: true>
Expand Down
14 changes: 9 additions & 5 deletions smalltalksrc/VMMaker/AbstractImageAccess.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -169,9 +169,13 @@ AbstractImageAccess >> loadImageFromFile: imageFile withHeader: header [
"read in the image in bulk, then swap the bytes if necessary"

<var: #header type: #SpurImageHeaderStruct>
| bytesRead |
| bytesRead oldSpaceBytesRead permSpaceBytesRead |

bytesRead := self readSegmentsFromImageFile: imageFile header: header.
oldSpaceBytesRead := self readSegmentsFromImageFile: imageFile header: header.

permSpaceBytesRead := self readPermanentSpaceFromImageFile: imageFile header: header.

bytesRead := oldSpaceBytesRead + permSpaceBytesRead.

self initializeInterpreterFromHeader: header withBytes: bytesRead

Expand Down Expand Up @@ -228,16 +232,16 @@ AbstractImageAccess >> sq: startingAddress Image: byteSize File: bytesToRead Rea
]

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

<doNotGenerate>
| region |
region := objectMemory memoryManager regionForAddress: segStart.
region := objectMemory memoryManager regionForAddress: start.

file
next: segSize
putAll: region memory
startingAt: segStart - region start + 1.
startingAt: start - region start + 1.

^ segSize
]
Expand Down
141 changes: 96 additions & 45 deletions smalltalksrc/VMMaker/ComposedImageReader.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,28 @@ ComposedImageReader >> endOfSTON: file [
^ (self isEndOfLine: charLeft) and: [ charRight = $} ]
]

{ #category : #reading }
ComposedImageReader >> readDataFromFileName: fullFileName startingAt: startingAddress bytes: bytesToRead [

<inline: true>
<var: #file type: #sqImageFile>
| file bytes |

file := self
sqImageFile: fullFileName
Open: 'rb'.

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

self sqImageFileClose: file.

^ bytes
]

{ #category : #reading }
ComposedImageReader >> readFieldsSTONFrom: file into: aStruct [

Expand Down Expand Up @@ -113,73 +135,102 @@ ComposedImageReader >> readImageNamed: imageName [
]

{ #category : #reading }
ComposedImageReader >> readSTONFrom: file into: aStruct [
ComposedImageReader >> readMetadataFromFileName: fullFileName [

<inline: true>
self readHeadSTONFrom: file into: aStruct.
self readFieldsSTONFrom: file into: aStruct
<var: #file type: #sqImageFile>
<var: #metadata type: #ComposedMetadataStruct>

| metadata file |

self simulationOnly: [ metadata := ComposedMetadataStruct new ].

file := self
sqImageFile: fullFileName
Open: 'r'.

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

self sqImageFileClose: file.

^ metadata
]

{ #category : #segments }
ComposedImageReader >> readSegmentData: segmentIndex fromImage: imageFileName startingAt: startingAddress bytes: bytesToRead [
{ #category : #'perm - space' }
ComposedImageReader >> readPermanentSpaceDataFromImage: 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'.
^ self
readDataFromFileName: (self permSpaceDataFileInImage: imageFileName)
startingAt: startingAddress
bytes: bytesToRead
]

bytes := self sq: startingAddress Image: (self sizeof: #char) File: bytesToRead Read: file.
{ #category : #'perm - space' }
ComposedImageReader >> readPermanentSpaceFromImageFile: imageFileName header: aHeader [

self sqImageFileClose: file.
<inline: false>
<var: #imageFile type: #sqImageFile>
<var: 'aHeader' type: #SpurImageHeaderStruct>
<var: #permSpaceMetadata type: #ComposedMetadataStruct>

| newBase permSpaceMetadata oldBase dataSize bytesRead |

^ bytes
newBase := objectMemory getMemoryMap permSpaceStart.
permSpaceMetadata := self readPermanentSpaceMetadataFromImage: imageFileName.
oldBase := permSpaceMetadata startAddress.
dataSize := permSpaceMetadata dataSize.

newBase ~= oldBase ifTrue: [ interpreter unableToReadImageError ].

"check if permsSpace is allocated"

bytesRead := self
readPermanentSpaceDataFromImage: imageFileName
startingAt: (self pointerForOop: newBase)
bytes: dataSize.

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

^ bytesRead
]

{ #category : #segments }
ComposedImageReader >> readSegmentMetadata: segmentIndex fromImage: imageFileName [
{ #category : #'perm - space' }
ComposedImageReader >> readPermanentSpaceMetadataFromImage: imageFileName [

^ self readMetadataFromFileName: (self permSpaceMetadataFileNameInImage: imageFileName)
]

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

<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 ].
self readHeadSTONFrom: file into: aStruct.
self readFieldsSTONFrom: file into: aStruct
]

file := self
sqImageFile: (self
segmentFileName: segmentIndex
withExtension: '.ston'
inImage: imageFileName
into: buffer
bufferSize: 255)
Open: 'r'.
{ #category : #segments }
ComposedImageReader >> readSegmentData: segmentIndex fromImage: imageFileName startingAt: startingAddress bytes: bytesToRead [

self readSTONFrom: file into: (self addressOf: segmentMetadata).
^ self
readDataFromFileName: (self segmentDataFile: segmentIndex inImage: imageFileName)
startingAt: startingAddress
bytes: bytesToRead
]

self sqImageFileClose: file.
{ #category : #segments }
ComposedImageReader >> readSegmentMetadata: segmentIndex fromImage: imageFileName [

^ segmentMetadata
^ self readMetadataFromFileName: (self segmentMetadataFile: segmentIndex inImage: imageFileName)
]

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

<inline: false>
<var: #imageFile type: #sqImageFile>
<var: 'segInfo' type: #'SpurSegmentInfo *'>
<var: 'aHeader' type: #SpurImageHeaderStruct>
<var: #segmentMetadata type: #ComposedSegmentMetadataStruct>
<var: #segmentMetadata type: #ComposedMetadataStruct>
| bytesRead totalBytesRead segmentSize oldBase newBase segmentIndex segmentMetadata |
self prepareSegmentsToRead.

Expand All @@ -191,8 +242,8 @@ ComposedImageReader >> readSegmentsFromImageFile: imageFileName header: aHeader
[

segmentMetadata := self readSegmentMetadata: segmentIndex fromImage: imageFileName.
oldBase := segmentMetadata segStart.
segmentSize := segmentMetadata segSize.
oldBase := segmentMetadata startAddress.
segmentSize := segmentMetadata dataSize.

segmentManager withNewSegmentDo: [ :segInfo |
segInfo
Expand Down
Loading