SObjectizer  5.1
Открытые члены | Закрытые типы | Закрытые члены | Закрытые данные | Друзья | Полный список членов класса
Класс so_5_transport::scattered_block_stream_t

Поток блоков-буферов. Подробнее...

Граф наследования:so_5_transport::scattered_block_stream_t:
so_5::rt::atomic_refcounted_t

Открытые члены

 scattered_block_stream_t (size_t block_count, size_t max_block_count, size_t single_block_size)
 
 scattered_block_stream_t (const scattered_block_stream_params_t &scattered_block_stream_params)
 
void flush ()
 Сбросить поток. Подробнее...
 
bool check_stream_has_blocks ()
 Проверить является ли поток пустым? Подробнее...
 
void touch_stream ()
 Имитировать использование потока.
 
size_t default_block_count () const
 Параметры потока блоков.
 
size_t max_block_count () const
 Максимально возможноек количество блоков-буферов в обращении.
 
size_t current_block_count () const
 Количество блоков-буферов, которые в данный момент находятся в обращении.
 
size_t single_block_size () const
 Размер одного блока в байтах.
 
void reset_flush_notifier (block_stream_notifiers::flush_notifier_t *flush_notifier=nullptr)
 Переустановить уведомителей.
 
void reset_free_blocks_availability_notifier (block_stream_notifiers::free_blocks_availability_notifier_t *free_blocks_availability_notifier=nullptr)
 
void reset_stream_operation_notifier (block_stream_notifiers::stream_operation_notifier_t *stream_operation_notifier=nullptr)
 
Интерфейс для получения и возврата блоков из/в пул.
raw_block_toccupy (bool &was_waiting_for_free_blocks, const ACE_Time_Value *timeout=&ACE_Time_Value::zero)
 Получить блок для записи/чтения. Подробнее...
 
raw_block_toccupy (const ACE_Time_Value *timeout=&ACE_Time_Value::zero)
 Получить блок для записи/чтения. Подробнее...
 
void occupy (size_t n, raw_block_chain_t &block_chain, bool &was_waiting_for_free_blocks, const ACE_Time_Value *timeout=&ACE_Time_Value::zero)
 Получить несколько блоков для записи/чтения. Подробнее...
 
void occupy (size_t n, raw_block_chain_t &block_chain, const ACE_Time_Value *timeout=&ACE_Time_Value::zero)
 Получить несколько блоков для записи/чтения. Подробнее...
 
void release (raw_block_t *block)
 Вернуть блок.
 
void release (const raw_block_chain_t &chain)
 Вернуть цепочку блоков. Подробнее...
 
Интерфейс извлечения и вставки блоков в поток.
void stream_push_back (raw_block_t *block)
 Поставить блок в конец потока.
 
void stream_push_back (const raw_block_chain_t &chain)
 Поставить блоки в конец потока.
 
void stream_push_front (raw_block_t *block)
 Поставить блок в начало потока.
 
void stream_push_front (const raw_block_chain_t &chain)
 Поставить блоки в начало потока.
 
void stream_push_front (raw_block_chain_t &chain, size_t size_in_bytes)
 Оптимизированная вставка в начало. Подробнее...
 
size_t stream_query_all_blocks (raw_block_chain_t &chain)
 Извлечь все блоки из потока. Подробнее...
 
size_t stream_query_n_blocks (size_t n, raw_block_chain_t &chain)
 Извлечь не более n блоков из потока. Подробнее...
 

Закрытые типы

typedef ACE_Guard
< ACE_Thread_Mutex > 
scoped_lock_t
 Псевдоним для удобного использования ACE_Guard.
 

Закрытые члены

raw_block_toccupy_impl (const ACE_Time_Value *abs_value, bool &was_waiting_for_free_blocks)
 Служебный метод для получения блока. Подробнее...
 
void release_impl (raw_block_t *block)
 Служебный метод для возвращения блока.
 
void release_impl (const raw_block_chain_t &chain)
 
void allocate_blocks ()
 Попытаться, если можно, выделить блоки.
 
void deallocate_blocks ()
 Уменьшить количество блоков.
 
- Закрытые члены inherited from so_5::rt::atomic_refcounted_t
 atomic_refcounted_t ()
 Конструктор по умолчанию. Устанавливает количество ссылок в 0.
 
void inc_ref_count ()
 Увеличить количество ссылок.
 
unsigned long dec_ref_count ()
 Уменьшить количество ссылок. Подробнее...
 

Закрытые данные

const size_t m_block_count
 Количество блоков по умолчанию. Подробнее...
 
const size_t m_max_block_count
 Максимально возможное количество блоков.
 
const size_t m_deallocate_block_count_threshold
 Порог для удаления лишних блоков. Подробнее...
 
size_t m_current_block_count
 Текуще количество блоков в обращении.
 
const size_t m_single_block_size
 Размер однгого блока в байтах.
 
raw_block_chain_t m_stream_chain
 Поток блоков.
 
raw_block_chain_t m_free_blocks
 Имеющиеся в наличии блоки.
 
size_t m_stream_size_in_bytes
 Количество байт, которое сейчас стоит в очереди потока.
 
ACE_Thread_Mutex m_lock
 Синфронизация работы с потоком.
 
ACE_Condition_Thread_Mutex m_has_free_blocks
 
block_stream_notifiers::flush_notifier_tm_flush_notifier
 Уведомители действий.
 
block_stream_notifiers::free_blocks_availability_notifier_tm_free_blocks_availability_notifier
 
block_stream_notifiers::stream_operation_notifier_tm_stream_operation_notifier
 

Друзья

class scattered_block_stream_ref_t
 

Подробное описание

Поток блоков-буферов.

Входящие и исходящие данные передаются между транспортными агентами SObjectizer и Ace_Reactor frasmework через scattered_block_stream_t. Но агентов SObjectizer на прямую не работают с scattered_block_stream_t, а работают на один уровень абстракции выше с channel_input_stream_t и channel_input_stream_t при помощи механизма транзакций.

Класс содержит пул блоков-буферов. Из этого пула можно брать блоки писать в них и вставлять в поток. Из потока блоков можно брать блоки и зачитывать из них данные, после чего возвращать блоки в пул, а непрочитанные блоки в начало потока.

Конструктор(ы)

so_5_transport::scattered_block_stream_t::scattered_block_stream_t ( size_t  block_count,
size_t  max_block_count,
size_t  single_block_size 
)
Аргументы
block_countОбычное количество блоков.
max_block_countПорог до которого можно увеличивать количество блоков.
single_block_sizeРазмер единичного блока.

Перекрестные ссылки m_block_count, m_free_blocks и m_single_block_size.

so_5_transport::scattered_block_stream_t::scattered_block_stream_t ( const scattered_block_stream_params_t scattered_block_stream_params)
explicit
Аргументы
scattered_block_stream_paramsПараметры.

Перекрестные ссылки m_block_count, m_free_blocks и m_single_block_size.

Методы

bool so_5_transport::scattered_block_stream_t::check_stream_has_blocks ( )

Проверить является ли поток пустым?

Если поток является пустым, то у уведомителя вызывается notify_empty_stream и взводится флаг о необходимости уведомления о сбросе буфера.

Возвращает
Если в потоке есть элементы, то вернет true, иначе false.

Перекрестные ссылки m_flush_notifier, m_lock и m_stream_chain.

Используется в so_5_transport::socket::impl::svc_handler_t::write_channel().

void so_5_transport::scattered_block_stream_t::flush ( )

Сбросить поток.

Если в потоке есть блоки, то получателю через интерфейс увемителя отправляется уведомление.

Перекрестные ссылки m_flush_notifier и m_lock.

Используется в so_5_transport::channel_output_stream_t::flush().

raw_block_t * so_5_transport::scattered_block_stream_t::occupy ( bool &  was_waiting_for_free_blocks,
const ACE_Time_Value *  timeout = &ACE_Time_Value::zero 
)

Получить блок для записи/чтения.

Аргументы
was_waiting_for_free_blocksПриемник флага: было ли ожидание свободных блоков.
timeoutДопустимое время ожидания. * @ timeout = 0, ожидать без ограничения. * @ timeout = &ACE_Time_Value::zero не ждать. * @ timeout = &some_time - ожидать какое-то время.

Перекрестные ссылки m_lock и occupy_impl().

Используется в occupy(), so_5_transport::channel_output_stream_t::occupy_next_block() и so_5_transport::socket::impl::svc_handler_t::read_channel().

raw_block_t * so_5_transport::scattered_block_stream_t::occupy ( const ACE_Time_Value *  timeout = &ACE_Time_Value::zero)

Получить блок для записи/чтения.

Аргументы
timeoutДопустимое время ожидания. * @ timeout = 0, ожидать без ограничения. * @ timeout = &ACE_Time_Value::zero не ждать. * @ timeout = &some_time - ожидать какое-то время.

Перекрестные ссылки occupy().

void so_5_transport::scattered_block_stream_t::occupy ( size_t  n,
raw_block_chain_t block_chain,
bool &  was_waiting_for_free_blocks,
const ACE_Time_Value *  timeout = &ACE_Time_Value::zero 
)

Получить несколько блоков для записи/чтения.

Заметки
Если за отведенное время получить все блоки не удастся, то их выдиление будет отменено, и приемник не будет содержать результатов.
Аргументы
nЖелаемое количество блоков.
block_chainПриемник блоков.
was_waiting_for_free_blocksПриемник флага: было ли ожидание свободных блоков.
timeoutДопустимое время ожидания. * @ timeout = 0, ожидать без ограничения. * @ timeout = &ACE_Time_Value::zero не ждать. * @ timeout = &some_time - ожидать какое-то время.

Перекрестные ссылки m_lock, m_max_block_count, so_log_2::n(), occupy_impl() и release_impl().

void so_5_transport::scattered_block_stream_t::occupy ( size_t  n,
raw_block_chain_t block_chain,
const ACE_Time_Value *  timeout = &ACE_Time_Value::zero 
)

Получить несколько блоков для записи/чтения.

Заметки
Если за отведенное время получить все блоки не удастся, то их выдиление будет отменено, и приемник не будет содержать результатов.
Аргументы
nЖелаемое количество блоков.
block_chainПриемник блоков.
timeoutДопустимое время ожидания. * @ timeout = 0, ожидать без ограничения. * @ timeout = &ACE_Time_Value::zero не ждать. * @ timeout = &some_time - ожидать какое-то время.

Перекрестные ссылки occupy().

raw_block_t * so_5_transport::scattered_block_stream_t::occupy_impl ( const ACE_Time_Value *  abs_value,
bool &  was_waiting_for_free_blocks 
)
private

Служебный метод для получения блока.

Аргументы
abs_valueАбсолютное время до которого можно ждать появления блоков, если их в данный момент не оказалось. * @ timeout = 0, ожидать без ограничения. * @ timeout != 0, ожидать вплоть до абсолютного времени.
was_waiting_for_free_blocksПриемник флага: было ли ожидание свободных блоков.

Перекрестные ссылки allocate_blocks(), m_current_block_count, m_free_blocks, m_max_block_count и so_5_transport::raw_block_t::reset_write_pos().

Используется в occupy().

void so_5_transport::scattered_block_stream_t::release ( const raw_block_chain_t chain)

Вернуть цепочку блоков.

Аргументы
chainЦепочка блоков.

Перекрестные ссылки m_block_count, m_free_blocks, m_lock и release_impl().

void so_5_transport::scattered_block_stream_t::stream_push_front ( raw_block_chain_t chain,
size_t  size_in_bytes 
)

Оптимизированная вставка в начало.

В channel_input_stream_t при отмене транзакции и при ее подтверждении, когда не все блоки были до конца прочитаны, происходит вставка взятых из потока блоков в начало потока. Чтобы делать это быстрее эта функция предполагает, что пользователя после вызова не интересует содержимое @ chain и он передает корректное значение @ size_in_bytes, которое содержит размер данных в цепочке.

Аргументы
chainЦепочка для вставки.
size_in_bytesРазмер данных в цепочке.

Перекрестные ссылки m_lock, m_stream_chain и m_stream_size_in_bytes.

size_t so_5_transport::scattered_block_stream_t::stream_query_all_blocks ( raw_block_chain_t chain)

Извлечь все блоки из потока.

Возвращает
Количество байт в полученных блоках.
Заметки
Аргументы
chainПриемник результата.

Перекрестные ссылки m_lock, m_stream_chain и m_stream_size_in_bytes.

size_t so_5_transport::scattered_block_stream_t::stream_query_n_blocks ( size_t  n,
raw_block_chain_t chain 
)

Извлечь не более n блоков из потока.

Возвращает
Количество байт в полученных блоках.
Аргументы
nЖелаемое количество блоков.
chainПриемник результата.

Перекрестные ссылки m_lock, m_stream_chain, m_stream_size_in_bytes, so_log_2::n() и so_5_transport::raw_block_t::read_size_available().

Используется в so_5_transport::socket::impl::svc_handler_t::write_channel().

Данные класса

const size_t so_5_transport::scattered_block_stream_t::m_block_count
private

Количество блоков по умолчанию.

Стратегия выделения дополнительных блоков и их освобождения нацелена на то чтобы держать количество свободных блоков именно таким.

Используется в allocate_blocks(), deallocate_blocks(), release() и scattered_block_stream_t().

const size_t so_5_transport::scattered_block_stream_t::m_deallocate_block_count_threshold
private

Порог для удаления лишних блоков.

Как только образуется количество свободных блоков большее либо равное порогу, лишние блоки освобождаются.

Используется в release_impl().


Документация по SObjectizer v.5.1 'Джимара'. Последние изменения: Ср 15 Май 2013 12:56:24. Создано системой  doxygen1.8.3.1 Intervale SourceForge.net Logo