|
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
|
|