SObjectizer
5.1
|
Поток блоков-буферов. Подробнее...
Открытые члены | |
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_t * | occupy (bool &was_waiting_for_free_blocks, const ACE_Time_Value *timeout=&ACE_Time_Value::zero) |
Получить блок для записи/чтения. Подробнее... | |
raw_block_t * | occupy (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_t * | occupy_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_t * | m_flush_notifier |
Уведомители действий. | |
block_stream_notifiers::free_blocks_availability_notifier_t * | m_free_blocks_availability_notifier |
block_stream_notifiers::stream_operation_notifier_t * | m_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.
|
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 и взводится флаг о необходимости уведомления о сбросе буфера.
Перекрестные ссылки 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().
|
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().
|
private |
Количество блоков по умолчанию.
Стратегия выделения дополнительных блоков и их освобождения нацелена на то чтобы держать количество свободных блоков именно таким.
Используется в allocate_blocks(), deallocate_blocks(), release() и scattered_block_stream_t().
|
private |
Порог для удаления лишних блоков.
Как только образуется количество свободных блоков большее либо равное порогу, лишние блоки освобождаются.
Используется в release_impl().
Документация по SObjectizer v.5.1 'Джимара'. Последние изменения: Ср 15 Май 2013 12:56:24. Создано системой 1.8.3.1 |