From: Axel S. <si...@co...> - 2009-11-22 19:30:31
|
Sun Nov 22 14:28:28 EST 2009 Axel Simon <Axe...@en...> * Use the C function to finalize dynamic functions. This patch changes mkDestoryNotifyPtr to only return the address of the ghc C function freeHaskellPtr. Thus, any closures passed to Gtk+ functions are now directly freed by a C function rather than calling back into the Haskell system. The downside is that this C function does not know which object to finalize. It is, however, called with the data that is supposed to be passed to the callback function. This used to be nullPtr since this argument was not used. To make things work, this argument now always has to be the address of the callback function so that freeHaskellPtr will get this address as a an argument. If I forgot to change any uses of mkDestroyNotifyPtr, then using this function will lead to a SEGFAULT since freeHaskellPtr is called with NULL. Gtk2Hs programs producing a SEGFAULT when closing are an indication of this. hunk ./glib/System/Glib/MainLoop.chs.pp 117 - nullPtr + (castFunPtrToPtr funPtr) hunk ./glib/System/Glib/MainLoop.chs.pp 136 - nullPtr dPtr + (castFunPtrToPtr funPtr) dPtr hunk ./glib/System/Glib/MainLoop.chs.pp 189 - nullPtr + (castFunPtrToPtr funPtr) hunk ./gstreamer/Media/Streaming/GStreamer/Core/Bus.chs.pp 368 - nullPtr + (castFunPtrToPtr busFuncPtr) hunk ./gstreamer/Media/Streaming/GStreamer/Core/Index.chs 143 - {# call index_set_filter_full #} (toIndex index) cFilter nullPtr destroyNotify + {# call index_set_filter_full #} (toIndex index) cFilter + (castFunPtrToPtr cFilter) destroyNotify hunk ./gtk/Graphics/UI/Gtk.hs.pp 407 -import Graphics.UI.Gtk.Abstract.Object +import Graphics.UI.Gtk.Abstract.Object ( + Object, + ObjectClass, + castToObject, + toObject, + GWeakNotify, + objectWeakref, + objectWeakunref, + objectDestroy ) hunk ./gtk/Graphics/UI/Gtk/Abstract/Object.chs.pp 63 +-- * Weak references + GWeakNotify, + objectWeakref, + objectWeakunref, + hunk ./gtk/Graphics/UI/Gtk/Abstract/Object.chs.pp 83 +import Data.IORef hunk ./gtk/Graphics/UI/Gtk/Abstract/Object.chs.pp 124 +{#pointer GWeakNotify#} + +foreign import ccall "wrapper" mkDestructor :: IO () -> IO GWeakNotify + +-- | Attach a callback that will be called after the +-- destroy hooks have been called +-- +objectWeakref :: ObjectClass o => o -> IO () -> IO GWeakNotify +objectWeakref obj uFun = do + funPtrContainer <- newIORef nullFunPtr + uFunPtr <- mkDestructor $ do + uFun + funPtr <- readIORef funPtrContainer + freeHaskellFunPtr funPtr + writeIORef funPtrContainer uFunPtr + {#call unsafe g_object_weak_ref#} (toGObject obj) uFunPtr nullPtr + return uFunPtr + +-- | Detach a weak destroy callback function +-- +objectWeakunref :: ObjectClass o => o -> GWeakNotify -> IO () +objectWeakunref obj fun = [_$_] + {#call unsafe g_object_weak_unref#} (toGObject obj) fun nullPtr + hunk ./gtk/Graphics/UI/Gtk/ActionMenuToolbar/ActionGroup.chs.pp 369 - nullPtr + (castFunPtrToPtr funcPtr) hunk ./gtk/Graphics/UI/Gtk/Entry/Editable.chs.pp 312 --- 'System.Glib.Signals.signalBlock'. After the default signal +-- 'signalBlock'. After the default signal hunk ./gtk/Graphics/UI/Gtk/Entry/EntryCompletion.chs.pp 240 - (castFunPtr hPtr) nullPtr dPtr + (castFunPtr hPtr) (castFunPtrToPtr hPtr) dPtr hunk ./gtk/Graphics/UI/Gtk/General/Clipboard.chs.pp 265 --- when data is not needed anymore, thus we provide an IO action. Anyway, --- this function is copy and paste of the mkFunPtrDestroyNotify function --- in GObject. +-- when data is not needed anymore, thus we provide an IO action. hunk ./gtk/Graphics/UI/Gtk/MenuComboToolbar/ComboBox.chs.pp 502 - (toComboBox self) funPtr nullPtr desPtr + (toComboBox self) funPtr (castFunPtrToPtr funPtr) desPtr hunk ./gtk/Graphics/UI/Gtk/ModelView/CellLayout.chs.pp 238 - (toCellRenderer cell) fPtr nullPtr destroy + (toCellRenderer cell) fPtr (castFunPtrToPtr fPtr) destroy hunk ./gtk/Graphics/UI/Gtk/ModelView/CellRendererToggle.chs.pp 208 --- | The 'cellToggled' signal is emitted when the cell is toggled. +-- | The 'cellToggled' signal is emitted when the cell is toggled. The string +-- represents a 'TreePath' into the model and can be converted using +-- 'stringToTreePath'. hunk ./gtk/Graphics/UI/Gtk/ModelView/ListStore.hs.pp 127 +-- | Convert a 'TreeIter' to an an index into the 'ListStore'. Note that this +-- function merely extracts the second element of the 'TreeIter'. +listStoreIterToIndex :: TreeIter -> Int +listStoreIterToIndex (TreeIter _ n _ _) = fromIntegral n + hunk ./gtk/Graphics/UI/Gtk/ModelView/TreeModelFilter.chs.pp 162 - (toTreeModelFilter self) funcPtr nullPtr destroyPtr + (toTreeModelFilter self) funcPtr (castFunPtrToPtr funcPtr) destroyPtr hunk ./gtk/Graphics/UI/Gtk/ModelView/TreeSelection.chs.pp 156 - nullPtr + (castFunPtrToPtr fPtr) hunk ./gtk/Graphics/UI/Gtk/ModelView/TreeSortable.chs.pp 167 - fPtr nullPtr dPtr + fPtr (castFunPtrToPtr fPtr) dPtr hunk ./gtk/Graphics/UI/Gtk/ModelView/TreeSortable.chs.pp 198 - fPtr nullPtr dPtr + fPtr (castFunPtrToPtr fPtr) dPtr hunk ./gtk/Graphics/UI/Gtk/ModelView/TreeView.chs.pp 561 - nullPtr dPtr + (castFunPtrToPtr fPtr) dPtr hunk ./gtk/Graphics/UI/Gtk/ModelView/TreeView.chs.pp 1074 - nullPtr dPtr + (castFunPtrToPtr fPtr) dPtr hunk ./gtk/Graphics/UI/Gtk/ModelView/TreeView.chs.pp 1326 - (toTreeView self) funcPtr nullPtr destroyPtr + (toTreeView self) funcPtr (castFunPtrToPtr funcPtr) destroyPtr hunk ./gtk/Graphics/UI/Gtk/Selectors/FileFilter.chs.pp 191 - nullPtr + (castFunPtrToPtr hPtr) hunk ./gtk/Graphics/UI/Gtk/Windows/AboutDialog.chs.pp 448 - nullPtr + (castFunPtrToPtr funcPtr) hunk ./gtk/Graphics/UI/Gtk/Windows/AboutDialog.chs.pp 467 - nullPtr + (castFunPtrToPtr funcPtr) |