{- | Copyright : Will Thompson, Iñaki García Etxebarria and Jonas Platte License : LGPL-2.1 Maintainer : Iñaki García Etxebarria (inaki@blueleaf.cc) A structure containing a weak reference to a 'GI.GObject.Objects.Object.Object'. It can either be empty (i.e. point to 'Nothing'), or point to an object for as long as at least one \"strong\" reference to that object exists. Before the object\'s 'GI.GObject.Structs.ObjectClass.ObjectClass'.@/dispose/@ method is called, every 'GI.GObject.Structs.WeakRef.WeakRef' associated with becomes empty (i.e. points to 'Nothing'). Like 'GI.GObject.Structs.Value.Value', 'GI.GObject.Structs.WeakRef.WeakRef' can be statically allocated, stack- or heap-allocated, or embedded in larger structures. Unlike @/g_object_weak_ref()/@ and @/g_object_add_weak_pointer()/@, this weak reference is thread-safe: converting a weak pointer to a reference is atomic with respect to invalidation of weak pointers to destroyed objects. If the object\'s 'GI.GObject.Structs.ObjectClass.ObjectClass'.@/dispose/@ method results in additional references to the object being held, any @/GWeakRefs/@ taken before it was disposed will continue to point to 'Nothing'. If @/GWeakRefs/@ are taken after the object is disposed and re-referenced, they will continue to point to it until its refcount goes back to zero, at which point they too will be invalidated. -} #define ENABLE_OVERLOADING (MIN_VERSION_haskell_gi_overloading(1,0,0) \ && !defined(__HADDOCK_VERSION__)) module GI.GObject.Structs.WeakRef ( -- * Exported types WeakRef(..) , noWeakRef , ) where import Data.GI.Base.ShortPrelude import qualified Data.GI.Base.ShortPrelude as SP import qualified Data.GI.Base.Overloading as O import qualified Prelude as P import qualified Data.GI.Base.Attributes as GI.Attributes import qualified Data.GI.Base.ManagedPtr as B.ManagedPtr import qualified Data.GI.Base.GClosure as B.GClosure import qualified Data.GI.Base.GError as B.GError import qualified Data.GI.Base.GVariant as B.GVariant import qualified Data.GI.Base.GValue as B.GValue import qualified Data.GI.Base.GParamSpec as B.GParamSpec import qualified Data.GI.Base.CallStack as B.CallStack import qualified Data.GI.Base.Properties as B.Properties import qualified Data.Text as T import qualified Data.ByteString.Char8 as B import qualified Data.Map as Map import qualified Foreign.Ptr as FP import qualified GHC.OverloadedLabels as OL -- | Memory-managed wrapper type. newtype WeakRef = WeakRef (ManagedPtr WeakRef) -- XXX Wrapping a foreign struct/union with no known destructor or size, leak? instance WrappedPtr WeakRef where wrappedPtrCalloc = return nullPtr wrappedPtrCopy = return wrappedPtrFree = Nothing -- | A convenience alias for `Nothing` :: `Maybe` `WeakRef`. noWeakRef :: Maybe WeakRef noWeakRef = Nothing #if ENABLE_OVERLOADING instance O.HasAttributeList WeakRef type instance O.AttributeList WeakRef = WeakRefAttributeList type WeakRefAttributeList = ('[ ] :: [(Symbol, *)]) #endif #if ENABLE_OVERLOADING type family ResolveWeakRefMethod (t :: Symbol) (o :: *) :: * where ResolveWeakRefMethod l o = O.MethodResolutionFailed l o instance (info ~ ResolveWeakRefMethod t WeakRef, O.MethodInfo info WeakRef p) => OL.IsLabel t (WeakRef -> p) where #if MIN_VERSION_base(4,10,0) fromLabel = O.overloadedMethod (O.MethodProxy :: O.MethodProxy info) #else fromLabel _ = O.overloadedMethod (O.MethodProxy :: O.MethodProxy info) #endif #endif