[Vm-dev] [Fwd: Image file loading]
John M McIntosh
johnmci at smalltalkconsulting.com
Tue Jan 19 22:54:39 UTC 2010
On 2010-01-19, at 2:30 PM, Andreas Raab wrote:
> b) It trivially allows mmap()ing the entire image into memory (I think
> John does that on the iPhone).
So how is this different that what happens now?
In interp.h we have:
#ifndef allocateMemoryMinimumImageFileHeaderSize
/* Called by Interpreter>>allocateMemory:minimum:imageFile:headerSize: */
#define allocateMemoryMinimumImageFileHeaderSize(heapSize, minimumMemory, fileStream, headerSize) sqAllocateMemory(minimumMemory, heapSize)
#endif
#ifndef sqImageFileReadEntireImage
/* Called by Interpreter>>sqImage:read:size:length: */
#define sqImageFileReadEntireImage(memoryAddress, elementSize, length, fileStream) sqImageFileRead(memoryAddress, elementSize, length, fileStream)
#endif
In platform specfic I change that
usqInt sqAllocateMemoryMac(sqInt minHeapSize, sqInt *desiredHeapSize, FILE * f,usqInt headersize);
#define allocateMemoryMinimumImageFileHeaderSize(heapSize, minimumMemory, fileStream, headerSize) sqAllocateMemoryMac(heapSize, minimumMemory, fileStream, headerSize)
#ifdef BUILD_FOR_OSX
size_t sqImageFileReadEntireImage(void *ptr, size_t elementSize, size_t count, FILE * f);
#define sqImageFileReadEntireImage(memoryAddress, elementSize, length, fileStream) sqImageFileReadEntireImage(memoryAddress, elementSize, length, fileStream)
#else
#define sqImageFileReadEntireImage(memoryAddress, elementSize, length, fileStream) length
#endif
The interp.c slang generated below on os-x the sqImageFileReadEntireImage(memoryAddress, elementSize, length, fileStream)
does read the data from fileStream for the given length into memoryAddress. But on the iPhone we just return the length as per the #define above
since the allocateMemoryMinimumImageFileHeaderSize has mmapped the file.
slang...
memory = allocateMemoryMinimumImageFileHeaderSize(heapSize, minimumMemory, f, headerSize);
if (memory == null) {
insufficientMemoryAvailableError();
}
...
sqImageFileSeek(f, headerStart + headerSize);
/* begin sqImage:read:size:length: */
memoryAddress = pointerForOop(memory);
bytesRead = sqImageFileReadEntireImage(memoryAddress, sizeof(unsigned char), dataSize, f);
if (bytesRead != dataSize) {
unableToReadImageError();
}
--
===========================================================================
John M. McIntosh <johnmci at smalltalkconsulting.com> Twitter: squeaker68882
Corporate Smalltalk Consulting Ltd. http://www.smalltalkconsulting.com
===========================================================================
More information about the Vm-dev
mailing list