Главная » Haskell » Модуль Marshal

0

Модуль, который включает в себя при помощи реимпорта функциональность пяти нижеследующих модулей, описывающих специфические функции для работы в рамках подхода FFI с объектами, над которыми можно производить маршализацию. Использование:

import Foreign.Marshal

10.3.1.    Модуль Alloc

В модуле Alloc описаны функции для выделения памяти в процессе маршализации. Обычно этот модуль подключается автоматически при помощи реимпорта в модуле Marshal. Если имеется необходимость в использовании этого модуля самостоятельно, его подключение выглядит следующим образом:

import Foreign.Marshal.Alloc

Функция: alloca

Описание: выполняет заданное действие, передавая в него выделенный (временно) блок памяти, достаточный для содержания значений типа a. Память высвобождается тогда, когда действие, заданное первым  аргументом, заканчивается (нормальным  способом или при помощи исключения), так что указатель на выделенную память после выполненного действия использоваться не должен. Определение:

alloca :: Storable a => (Ptr a ->  IO b)  ->  IO b alloca = doAlloca undefined

where

doAlloca :: Storable a’ => a’ ->  (Ptr a’ ->  IO b’)  ->  IO b’ doAlloca dummy  = allocaBytes (sizeOf  dummy)

Функция: allocaBytes

Описание: вариант функции alloca, который принимает на вход первым аргументом количество байт, которое необходимо выделить.

Определение:

allocaBytes :: Int ->  (Ptr a ->  IO b)  ->  IO  b allocaBytes size = bracket  (mallocBytes size) free

Функция: malloc

Описание: выделяет память, достаточную для хранения значений типа  a. Память выделяется на основании метода sizeOf  класса Storable (см. стр. 468). Память может быть высвобождена при помощи функций free или finalizerFree (см. ниже).

Определение:

malloc  :: Storable a  =>  IO (Ptr a) malloc  =  doMalloc  undefined

where

doMalloc  :: Storable b => b ->  IO (Ptr b) doMalloc  dummy  =  mallocBytes (sizeOf  dummy)

Функция: mallocBytes

Описание: вариант функции malloc,  который принимает на вход первым аргументом количество байт, которое необходимо выделить.

Определение:

mallocBytes :: Int  ->  IO (Ptr a)

mallocBytes size  = failWhenNULL "malloc"  (_malloc  (fromIntegral size))

Функция: realloc

Описание: изменяет размер памяти, которая была выделена при помощи функций malloc или mallocBytes  до количества, достаточного для хранения значений типа b. Возвращаемый указатель может указывать на совершенно иной участок памяти, однако будет достаточен для хранения требуемых значений. Содержимое памяти по новому указателю будет идентично содержимому, хранимому по старому указателю. Если аргументом этой функции является значение nullPtr, то функция ведёт себя так же, как и функция malloc.

Определение:

realloc :: Storable b => Ptr   a  ->  IO (Ptr b) realloc = doRealloc  undefined

where

doRealloc   :: Storable b’ => b’ ->  Ptr   a’ ->  IO  (Ptr b’) doRealloc   dummy  ptr = let size =  fromIntegral (sizeOf dummy)

in  failWhenNULL "realloc" (_realloc ptr size)

Функция: reallocBytes

Описание: вариант функции realloc,  который  принимает на вход  первым аргументом количество байт, которое необходимо выделить. Дополнительно: если заданное количество байт равно 0, то эта функция ведёт себя так же, как и функция free.

Определение:

reallocBytes :: Ptr   a ->  Int ->  IO (Ptr a) reallocBytes ptr  0       = do free ptr;  return  nullPtr

reallocBytes ptr  size = failWhenNULL "realloc" (_realloc ptr  (fromIntegral  size))

Функция: free

Описание: освобождает блок памяти, который был выделен функциями malloc, mallocBytes,  realloc,  reallocBytes, new (см. стр. 460) и  любыми функциями семейства new из модулей Array  (см. подраздел  10.3.2.) и String (см. подраздел 10.1.2.).

Определение:

free :: Ptr   a  ->  IO () free  =  _free

Функция: finalizerFree

Описание: возвращает указатель на функцию, которая может быть использована в качестве финализатора для памяти, выделенной при помощи функций malloc, mallocBytes,  realloc или reallocBytes.

Определение:

finalizerFree ::  FinalizerPtr a

Функция определена в виде примитива.

Источник: Душкин Р. В., Справочник по языку Haskell. М.: ДМК Пресс, 2008. 544 с., ил.

По теме:

  • Комментарии