[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