Spec-Zone.ru › Haskell 8

Foreign.ForeignPtr

Copyright (c) The University of Glasgow 2001
License BSD-style (see the file libraries/base/LICENSE)
Maintainer ffi@haskell.org
Stability provisional
Portability portable
Safe Haskell Trustworthy
Language Haskell2010

Содержание

  • Указатели на финализированные данные
    • Основные операции
    • Операции низкого уровня
    • Выделение управляемой памяти

Описание

Тип ForeignPtr и операции. Этот модуль является частью интерфейса внешних функций (FFI) и обычно импортируется через модуль Foreign.

Для непортабельной поддержки финализаторов Haskell см. модуль Foreign.Concurrent.

Указатели на финализированные данные

data ForeignPtr a Source

Тип ForeignPtr представляет ссылки на объекты, которые поддерживаются на иностранном языке, то есть не являются частью структур данных, обычно управляемых менеджером хранения Haskell. Основное различие между ForeignPtr и обычными ссылками на память типа Ptr a заключается в том, что к первым могут быть присоединены финализаторы. Финализатор — это процедура, которая вызывается, когда менеджер хранения Haskell обнаруживает, что в куче и стеке Haskell больше нет ссылок, указывающих на ForeignPtr. Как правило, финализатор затем вызывает процедуры на иностранном языке, которые освобождают ресурсы, связанные с внешним объектом.

ForeignPtr параметризуется так же, как Ptr. Аргумент типа ForeignPtr обычно должен быть экземпляром класса Storable.

Экземпляры
Подробности о экземплярах
Eq (ForeignPtr a)

Since: base-2.1

Подробности о экземпляре

Определено в GHC.ForeignPtr

Методы

(==) :: ForeignPtr a -> ForeignPtr a -> Bool Source

(/=) :: ForeignPtr a -> ForeignPtr a -> Bool Source

Data a => Data (ForeignPtr a)

Since: base-4.8.0.0

Подробности о экземпляре

Определено в Data.Data

Методы

gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> ForeignPtr a -> c (ForeignPtr a) Source

gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c (ForeignPtr a) Source

toConstr :: ForeignPtr a -> Constr Source

dataTypeOf :: ForeignPtr a -> DataType Source

dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c (ForeignPtr a)) Source

dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (ForeignPtr a)) Source

gmapT :: (forall b. Data b => b -> b) -> ForeignPtr a -> ForeignPtr a Source

gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> ForeignPtr a -> r Source

gmapQr :: forall r r'. (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> ForeignPtr a -> r Source

gmapQ :: (forall d. Data d => d -> u) -> ForeignPtr a -> [u] Source

gmapQi :: Int -> (forall d. Data d => d -> u) -> ForeignPtr a -> u Source

gmapM :: Monad m => (forall d. Data d => d -> m d) -> ForeignPtr a -> m (ForeignPtr a) Source

gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> ForeignPtr a -> m (ForeignPtr a) Source

gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> ForeignPtr a -> m (ForeignPtr a) Source

Ord (ForeignPtr a)

Since: base-2.1

Подробности экземпляра

Определено в GHC.ForeignPtr

Методы

compare :: ForeignPtr a -> ForeignPtr a -> Ordering Исходный код

(<) :: ForeignPtr a -> ForeignPtr a -> Bool Исходный код

(<=) :: ForeignPtr a -> ForeignPtr a -> Bool Исходный код

(>) :: ForeignPtr a -> ForeignPtr a -> Bool Исходный код

(>=) :: ForeignPtr a -> ForeignPtr a -> Bool Исходный код

max :: ForeignPtr a -> ForeignPtr a -> ForeignPtr a Исходный код

min :: ForeignPtr a -> ForeignPtr a -> ForeignPtr a Исходный код

Show (ForeignPtr a)

С момента: base-2.1

Подробности экземпляра

Определено в GHC.ForeignPtr

Методы

showsPrec :: Int -> ForeignPtr a -> ShowS Исходный код

show :: ForeignPtr a -> String Исходный код

showList :: [ForeignPtr a] -> ShowS Исходный код

type FinalizerPtr a = FunPtr (Ptr a -> IO ()) Исходный код

Функция-финализатор представлена как указатель на внешнюю функцию, которая во время финализации получает в качестве аргумента обычную указанную переменную варианта внешнего указателя, с которым ассоциирован финализатор.

Обратите внимание, что внешняя функция должна использовать соглашение о вызове ccall.

type FinalizerEnvPtr env a = FunPtr (Ptr env -> Ptr a -> IO ()) Исходный код

Основные операции

newForeignPtr :: FinalizerPtr a -> Ptr a -> IO (ForeignPtr a) Исходный код

Преобразует обычную ссылку на память в внешний указатель и связывает с ней финализатор. Финализатор будет выполнен после того, как последняя ссылка на внешний объект будет удалена. Однако никакой гарантии момента выполнения нет, но финализатор будет выполнен до выхода программы.

newForeignPtr_ :: Ptr a -> IO (ForeignPtr a) Исходный код

Преобразует обычную ссылку на память в внешний указатель, который может быть связан с финализаторами с помощью addForeignPtrFinalizer.

addForeignPtrFinalizer :: FinalizerPtr a -> ForeignPtr a -> IO () Исходный код

Эта функция добавляет финализатор к заданному внешнему объекту. Финализатор выполняется перед всеми другими финализаторами для того же объекта, которые уже были зарегистрированы.

newForeignPtrEnv :: FinalizerEnvPtr env a -> Ptr env -> Ptr a -> IO (ForeignPtr a) Исходный код

Этот вариант newForeignPtr добавляет финализатор, который ожидает среду помимо завершаемого указателя. Среда, которая будет передана финализатору, фиксируется вторым аргументом к newForeignPtrEnv.

addForeignPtrFinalizerEnv :: FinalizerEnvPtr env a -> Ptr env -> ForeignPtr a -> IO () Исходный код

Подобно addForeignPtrFinalizer, но финализатор получает дополнительный параметр среды.

withForeignPtr :: ForeignPtr a -> (Ptr a -> IO b) -> IO b Исходный код

Это способ взглянуть на указатель, хранящийся внутри внешнего объекта. Эта функция принимает функцию, которая применяется к этому указателю. Результирующее действие IO затем выполняется. Внешний объект поддерживается как минимум в течение всего действия, даже если он не используется непосредственно внутри. Обратите внимание, что небезопасно возвращать указатель из действия и использовать его после завершения действия. Все использования указателя должны находиться внутри скобок withForeignPtr. Причина этой небезопасности такая же, как и для unsafeForeignPtrToPtr ниже: финализатор может быть запущен раньше, чем ожидалось, потому что компилятор может отслеживать только использование объекта ForeignPtr, а не объекта Ptr созданного из него.

Эта функция обычно используется для загрузки или выгрузки данных в/из объекта, на который указывает ForeignPtr, используя операции из класса Storable.

finalizeForeignPtr :: ForeignPtr a -> IO () Исходный код

Вызывает немедленное выполнение финализаторов, связанных с внешним указателем.

Операции низкого уровня

touchForeignPtr :: ForeignPtr a -> IO () Source

Эта функция гарантирует, что внешний объект в вопросе жив в данном месте в последовательности действий IO. В частности, withForeignPtr выполняет touchForeignPtr после выполнения пользовательского действия.

Обратите внимание, что этой функцией не следует пользоваться для выражения зависимостей между финализаторами на ForeignPtr. Например, если финализатор для ForeignPtr F1 вызывает touchForeignPtr для второго ForeignPtr F2, то единственной гарантией является то, что финализатор для F2 никогда не будет запущен до финализатора для F1. Они могут быть запущены одновременно, если, например, оба F1 и F2 в противном случае недоступны, и в этом случае планировщик может запустить финализатор для F2 первым.

В общем случае не рекомендуется использовать финализаторы на отдельных объектах с ограничениями упорядочения между ними. Для выражения упорядочения надёжно требуется явная синхронизация с помощью MVar между финализаторами, но даже тогда во время выполнения иногда несколько финализаторов выполняются последовательно в одном потоке (по причинам производительности), поэтому синхронизация между финализаторами может привести к искусственному тупику. Ещё одним вариантом является использование явного подсчёта ссылок.

castForeignPtr :: ForeignPtr a -> ForeignPtr b Source

Эта функция преобразует ForeignPtr параметризованный одним типом в другой тип.

plusForeignPtr :: ForeignPtr a -> Int -> ForeignPtr b Source

Перемещает указанный адрес на указанный смещение в байтах.

Новый ForeignPtr разделяет финализатор оригинала, что с точки зрения финализации эквивалентно просто созданию ещё одной ссылки на оригинал. То есть, финализатор не будет вызван до того, как новый ForeignPtr станет недоступным, и он не будет вызван дополнительно из-за этого вызова, а финализатор будет вызван с тем же адресом, который бы у него был, если бы этот вызов не произошёл, *а не* с новым адресом.

Since: base-4.10.0.0

Выделение управляемой памяти

mallocForeignPtr :: Storable a => IO (ForeignPtr a) Source

Выделяет некоторую память и возвращает ForeignPtr на неё. Память будет освобождена автоматически при удалении ForeignPtr.

mallocForeignPtr эквивалентно

   do { p <- malloc; newForeignPtr finalizerFree p }

хотя оно может быть реализовано по-другому внутри: вы не можете предполагать, что память, возвращённая mallocForeignPtr, была выделена с помощью malloc.

Примечания GHC: mallocForeignPtr имеет сильно оптимизированную реализацию в GHC. Он использует прикреплённую память в куче с сборкой мусора, поэтому ForeignPtr не требует финализатора для освобождения памяти. Использование mallocForeignPtr и связанных функций настоятельно рекомендуется по сравнению с newForeignPtr с финализатором.

mallocForeignPtrBytes :: Int -> IO (ForeignPtr a) Source

Эта функция похожа на mallocForeignPtr, за исключением того, что размер требуемой памяти задаётся явно в байтах.

mallocForeignPtrArray :: Storable a => Int -> IO (ForeignPtr a) Source

Эта функция похожа на mallocArray, но она возвращает область памяти, к которой прикреплён финализатор для освобождения этой области. Как и в случае с mallocForeignPtr, нет гарантии, что блок памяти был выделен с помощью malloc.

mallocForeignPtrArray0 :: Storable a => Int -> IO (ForeignPtr a) Source

Эта функция похожа на mallocArray0, но она возвращает область памяти, к которой прикреплён финализатор для освобождения этой области. Как и в случае с mallocForeignPtr, нет гарантии, что блок памяти был выделен с помощью malloc.

© The University of Glasgow and others
Licensed under a BSD-style license (see top of the page).
https://downloads.haskell.org/~ghc/8.10.2/docs/html/libraries/base-4.14.1.0/Foreign-ForeignPtr.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API