interpreterProxy signalSemaphoreWithIndex:

Andreas Raab andreas.raab at gmx.de
Fri Jun 9 22:37:55 UTC 2006


In the same mood, check out the example callback plugin that I just 
posted over at vm-dev: It uses signalSemaphoreWithIndex() as well.

http://discuss.squeakfoundation.org/cgi-bin/ezmlm-browse?list=vm-dev&cmd=showmsg&msgnum=749

Cheers,
   - Andreas


Gerardo Richarte wrote:
> lethalman88 said:
>> So, does #signalSemaphoreWithIndex: work on Windows and other platforms?
> 
> 	Yes it does. It's a feature of the VM (the interpreter), and it's 100% platform independent. In fact, if there is no platform it also works (we are using it in SqueakNOS).
> 
> 	David explained why you may want to use it. The counterpart is how to use it:
> 
> In Squeak at some point you'll want to wait for an external event, for this, you create a Semaphore and register it:
> 
> <code>
> sem := Semaphore new.
> plugin registerSemaphore: (Smalltalk registerExternalObject: sem).
> </code>
> 
> With #registerExternalObject: you register the object so it can be accessed from the native world. This is necesary because objects tend to move with Garbage Collection, so if you just used a direct pointer to the object, this pointer would become obsolete when the GC moves the object.  #registerExternalObject: puts the object in an array (updated by the GC I guess) and returns an index.
> 
> your plugin will need to implement something like #registerSemaphore:, for example for SqueakNOS we have:
> 
> <code>
> SqueakNOSPlugin>>primitiveRegisterSemaphoreIndex: aSemaphoreIndex forIRQ: irqNumber
> 	| IRQSemaphores |
> 
> 	self primitive: 'primitiveRegisterSemaphoreIndexForIRQ'
> 		parameters: #(SmallInteger SmallInteger).
> 
> 	self var: #IRQSemaphores type: 'extern t_IRQSemaphores'.
> 
> 	irqNumber < (IRQSemaphores sizeof/(IRQSemaphores at: 0) sizeof)
> 			ifTrue: [IRQSemaphores at: irqNumber put: aSemaphoreIndex]
> 			ifFalse: [interpreterProxy primitiveFail].
> 
> 	^ interpreterProxy trueObject
> </code>
> 
> 	where t_IRQSemaphores is nothing more than an array of integers. So we save the index returned by #registerExternalObject: in this array for when we want to use it.
> 
> 	When the external even hapens (your native part will know), you need to call #signalSemaphoreWithIndex:, for example:
> <code>
> 	void signalIRQ(int number) {
> 		if (0 != IRQSemaphores[number])
> 		  signalSemaphoreWithIndex(IRQSemaphores[number]);
> 	}		
> </code>
> 
> and inside Squeak you will have a Process waiting on the Semaphore, for example, the complite code could be:
> 
> <code>
> sem := Semaphore new.
> self primRegisterSemaphore: (Smalltalk registerExternalObject: sem).
> 
> [[
> 	sem wait.
> 	self doSomething] repeat.
> ] fork.
> </code>
> 
> 	Hope it helps.
> 
> 	gera
> 
> </code>
> 
> 
> 
> 




More information about the Squeak-dev mailing list