I don't think it's so hard, unless I'm missing something.
foreign export dynamic
mkFooCB :: (Int - Int - IO ()) - IO Addr
freeHaskellFunctionPtr :: Addr - IO ()
Now if you want the callback itself to free itself, you say
do {
a - fixIO (\a - mkFooCB (callBack a));
register a with the window system
}
callBack :: Addr - Int - Int - IO ()
callBack a x y = do { unregister a with window system
... whatever .. }
Isn't that enough?
Simon
-Original Message-
From: Sven Panne [mailto:[EMAIL PROTECTED]]
Sent: Tuesday, April 13, 1999 10:09 AM
To: GHC Users
Subject: Re: Q: Threads in GHC's RTS
"Sigbjorn Finne (Intl Vendor)" wrote:
[...]Good point, I've committed a fix for this.
Adjustor.c gets more and more impressive. :-) BTW: What is the
schedule for porting (i.e. completely rewriting) Adjustor.c to
non-Intel platforms?
If I understand your scenario right, that only leaves getting at
the address of the old-Haskell-callback-to-be-nuked, but it's
reachable without too much bother..?
That heavily depends on the kind of API one is trying to interface
with. In GLUT "global" callbacks (for keyboard/mouse/timer/...) are
the easy part, because for any event there is at most one registered
callback. In these cases, the IORef+unsafePerformIO hack suffices.
Things get more complicated for per-window callbacks, and I think
Manuel will have fun with the per-widget callbacks. Some kind of table
mapping the callback to be unregistered to the Addr from f.e.d. will
be necessary here. But this is all API-specific, so I fear it's hard
to come up with a better general design for creating and destroying
callbacks.
If you are willing to make the memory management visible in the
Haskell binding of an API, there's another possibility: Every callback
is augmented by an additional parameter. To be more concrete, let's
assume the API has "foo" callbacks, expecting two Ints:
foreign export ccall dynamic mkFooCB :: (Int - Int - IO
()) - IO Addr
foreign import ccall registerFoo :: Addr - IO ()
Then you simply extend your Haskell callback by the f.e.d.-generated
Addr and tie a knot:
myCallback :: Addr - Int - Int - IO ()
myCallback self x y = do
...
freeHaskellFunctionPtr self
...
main = do
...
let addr = mkFooCB (myCallback addr)
registerFoo addr
Cheers,
Sven
P.S.: Something completely unrelated: Why is majordomo.haskell.org
expanded to scarlet.cam.uk.eu.microsoft.com in the To:-field?
IMHO this is a bad idea, e.g. when people cut-and-paste this
into their address books and scarlet is renamed to e.g.
rhett. :-)
P.P.S.: Adding a prefix in the Subject:-field (e.g. [ghcu]) would make
mail filters work more reliably. Lots of other mailing lists
do something similar.
--
Sven PanneTel.:
+49/89/2178-2235
LMU, Institut fuer Informatik FAX :
+49/89/2178-2211
LFE Programmier- und Modellierungssprachen
Oettingenstr. 67
mailto:[EMAIL PROTECTED]
D-80538 Muenchen
http://www.pms.informatik.uni-muenchen.de/mitarbeiter/panne