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

0

В этом модуле определены программные  сущности, использующиеся для работы с пулами памяти, то есть областями памяти, в рамках которых происходит работа с данными как с единым целым. Это означает, что при перераспределении памяти в рамках одного пула  происходит перераспределение всех выделенных блоков. Эта идиома полезна в тех случаях, когда использование функции alloca (см. стр. 445) с её неявным  выделением  и высвобождением памяти нежелательно, но использование функций malloc и free (см. стр. 445 и стр. 447 соответственно) выглядит неуклюже.

Предполагается, что этот модуль подключается в проект при помощи реимпорта из модуля Marshal, однако если имеется необходимость использования этого модуля отдельно, его можно подключить следующим образом:

import Foreign.Marshal.Pool

В модуле описан главный тип данных для работы с пулами памяти.

Тип: Pool

Описание: тип для представления пула памяти.

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

newtype Pool  = Pool  (IORef  [Ptr ()])

Функция: newPool

Описание: выделяет новый пул памяти.

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

newPool  ::  IO  Pool

newPool = liftM  Pool  (newIORef [])

Функция: freePool

Описание: высвобождает пул памяти и всё, что было создано внутри него.

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

freePool ::  Pool  ->  IO ()

freePool (Pool   pool) = readIORef  pool  >>= freeAll where freeAll []     =  return ()

freeAll (p:ps) = free p >>  freeAll ps

Функция: withPool

Описание: выполняет монадическое  действие внутри пула памяти, который автоматически высвобождается  после окончания действия.

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

withPool :: (Pool   ->  IO  b)  ->  IO b withPool =  bracket newPool  freePool

Функция: pooledMalloc

Описание: выделяет память внутри заданного пула для хранения значения заданного типа. Количество памяти определяется при помощи метода sizeOf  класса Storable (см. стр. 468).

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

pooledMalloc :: Storable a => Pool  ->  IO (Ptr a) pooledMalloc = pm  undefined

where

pm  :: Storable a’ => a’ ->  Pool  ->  IO (Ptr a’)

pm  dummy  pool  = pooledMallocBytes pool  (sizeOf dummy)

Функция: pooledMallocBytes

Описание: выделяет заданное количество байт внутри пула памяти.

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

pooledMallocBytes :: Pool  ->  Int  ->  IO (Ptr a)

pooledMallocBytes (Pool   pool) size = do ptr < mallocBytes  size ptrs < readIORef  pool writeIORef  pool  (ptr:ptrs)

return (castPtr ptr)

Функция: pooledRealloc

Описание: перераспределяет память внутри заданного пула для хранения значения заданного типа. Количество памяти определяется при помощи метода sizeOf  класса Storable (см. стр. 468).

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

pooledRealloc :: Storable a => Pool  ->  Ptr   a ->  IO  (Ptr a) pooledRealloc = pr  undefined

where

pr  :: Storable a’ => a’ ->  Pool  ->  Ptr   a’ ->  IO (Ptr a’)

pr  dummy  pool  ptr = pooledReallocBytes pool  ptr (sizeOf dummy)

Функция: pooledReallocBytes

Описание: перераспределяет заданное количество байт внутри пула памяти.

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

pooledReallocBytes :: Pool  ->  Ptr   a ->  Int ->  IO  (Ptr a) pooledReallocBytes (Pool   pool) ptr size

= do let cPtr = castPtr ptr

throwIf (not . (cPtr ‘elem‘)) (\_ ->  "pointer not  in pool")  (readIORef  pool) newPtr  < reallocBytes cPtr size

ptrs < readIORef  pool

writeIORef pool  (newPtr  : delete  cPtr ptrs) return (castPtr newPtr)

Функция: pooledMallocArray

Описание: выделяет память для заданного количества элементов массива внутри заданного пула.

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

pooledMallocArray :: Storable a => Pool  ->  Int ->  IO  (Ptr a) pooledMallocArray = pma  undefined

where

pma  :: Storable a’ => a’ ->  Pool  ->  Int ->  IO (Ptr a’)

pma  dummy  pool  size = pooledMallocBytes pool  (size * sizeOf dummy)

Функция: pooledMallocArray0

Описание: вариант функции pooledMallocArray, добавляющий дополнительную память в конце выделяемого участка для хранения замыкающего (терминального) элемента (аналог символа с кодом 0 в строках формата языка C). Определение:

pooledMallocArray0 :: Storable a => Pool  ->  Int ->  IO  (Ptr a) pooledMallocArray0 pool  size =  pooledMallocArray pool  (size + 1)

Функция: pooledReallocArray

Описание: изменяет длину массива, выделяя новую память или высвобождая её излишки. Функция работает внутри заданного пула памяти.

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

pooledReallocArray :: Storable a => Pool  ->  Ptr   a ->  Int  ->  IO (Ptr a) pooledReallocArray = pra  undefined

where

pra  :: Storable a’ => a’ ->  Pool  ->  Ptr   a’ ->  Int ->  IO (Ptr a’)

pra  dummy  pool  ptr size = pooledReallocBytes pool  ptr (size * sizeOf  dummy)

Функция: pooledReallocArray0

Описание: вариант функции pooledReallocArray, добавляющий  дополнительную память в конце выделяемого участка для хранения замыкающего (терминального) элемента (аналог символа с кодом 0 в строках формата языка C). Определение:

pooledReallocArray0 :: Storable a => Pool  ->  Ptr   a ->  Int ->  IO  (Ptr a) pooledReallocArray0 pool  ptr size =  pooledReallocArray pool  ptr (size + 1)

Функция: pooledNew

Описание: выделяет память внутри заданного пула памяти и маршализует заданное значение в эту выделенную память.

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

pooledNew :: Storable a => Pool  ->  a  ->  IO (Ptr a) pooledNew pool  val   = do  ptr < pooledMalloc pool

poke  ptr  val return  ptr

Функция: pooledNewArray

Описание: выделяет последовательный набор ячеек памяти внутри  заданного пула и записывает в него элементы заданного списка.

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

pooledNewArray :: Storable a => Pool  ->  [a] ->  IO  (Ptr a)

pooledNewArray pool  vals = do ptr < pooledMallocArray pool  (length vals) pokeArray  ptr vals

return  ptr

Функция: pooledNewArray0

Описание: вариант функции pooledNewArray, добавляющий дополнительную память в конце выделяемого участка для хранения замыкающего (терминального) элемента (аналог символа с кодом 0 в строках формата языка C).

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

pooledNewArray0 :: Storable a => Pool  ->  a ->  [a] ->  IO  (Ptr a)

pooledNewArray0 pool  marker  vals = do ptr < pooledMallocArray0 pool  (length vals) pokeArray0  marker  ptr  vals

return  ptr

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

По теме:

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