Шаблон класса gemont_1::temporary_sources_t< Data_source, Key >

Хранилище временных источников данных. Подробнее...

#include <temporary_sources.hpp>

Полный список членов класса

Открытые типы

typedef Data_source data_source_type
 Тип источника данных.
typedef Key key_type
 Тип ключа.
typedef std::set< Key > key_set_type
 Тип множества ключей.

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

 temporary_sources_t ()
 Основной конструктор.
virtual ~temporary_sources_t ()
 Деструктор уничтожает все оставшиеся источники данных без вызова deinit.
void insert (const Key &key, Data_source *source)
 Добавить источник данных.
void erase (const Key &k)
 Изъять источник данных.
void clear ()
 Удалить все источники данных.
Data_source * find (const Key &k) const
 Найти источник данных по ключу.
key_set_type source_keys () const
 Получить множество всех ключей источников данных.
Реализация унаследованных методов.
Вызывает init у всех временных источников данных.

virtual void init (so_4::rt::agent_t &agent)
virtual void deinit (so_4::rt::agent_t &agent)
 Дерегистрирует источник данных.

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

typedef temporary_sources_t
< Data_source, Key > 
self_t
 Удобный псевдоним для собственного типа.
typedef std::map< Key,
Data_source * > 
map_t
 Тип карты временных источников данных.

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

void destroy (const typename map_t::value_type &o)
 Уничтожение источника данных.
void init_source (const typename map_t::value_type &o)
 Вызов метода init() у источника данных.
void deinit_source (const typename map_t::value_type &o)
 Вызов метода deinit() у источника данных.

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

so_4::rt::agent_t * m_agent
 Агент, который владеет хранилищем.
map_t m_sources
 Карта временных источников данных.


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

template<class Data_source, class Key = std::string>
class gemont_1::temporary_sources_t< Data_source, Key >

Хранилище временных источников данных.

Начиная с:
v.1.0.2
Если источник данных добавляется в список свойств агента, то время жизни этого источника должно быть равным или превышать время жизни агента. Т.е. источник данных может быть атрибутом агента или уничтожаемым агентом свойством. Определяется это требование тем, что однажды помещенный в список свойств агента объект уже не может быть извлечен из этого списка.

В некоторых случаях нужны источники данных, время жизни которых заведомо меньше времени жизни агента. Например, если требуется создать по источнику данных на каждого подключившегося к серверу клиента. Время жизни такого источника будет определяется временем подключения клиента, но оно будет меньше, чем время жизни агента-сервера. И соответствующий клиенту источник данных должен быть удален при отключении клиента.

В таких случаях источник данных нельзя добавлять в список свойств агента -- необходимо воспользоваться объектом temporary_sources_t.

Агент, который владеет временными источниками данных, создает у себя объект temporary_sources_t и добавляет его в список своих свойств:

class a_some_t : public so_4::rt::agent_t
{
  ...
  private :
    gemont_1::temporary_sources_t<
        gemont_1::uint_data_source_t >
      m_data_sources;
    ...
};
a_some_t::a_some_t(...)
{
  so_add_traits( m_data_sources );
}

Все временные источники данных добавляются в объект temporary_sources_t:

void
a_some_t::evt_new_client_connected(
  const msg_new_client & o )
{
  ...
  m_data_sources.insert(
    client_name,
    new uint_data_source_t( client_name,
      "a_some_t::client_request_count", 0 ) );
  ...
}

Каждый источник данных во временном хранилище идентифицируется уникальным строковым ключем. Значением ключа не обязательно должно быть имя источника данных. Это может быть, например, строковое представление адреса, с которого подключился клиент.

Получить источник из хранилища можно при помощи метода temporary_sources_t::find():

void
a_some_t::evt_client_request(
  const msg_client_request & o )
{
  ...
  // Увеличиваем количество запросов, полученных от данного клиента.
  gemont_1::uint_data_source_t * client_request_count =
    m_data_sources.find( client_name );
  client_request_count->set( client_request_count.current() + 1 );
  ...
}

Удаляется источник данных из временного хранилища при помощи метода temporary_sources_t::erase():

void
a_some_t::evt_client_disconnected(
  const msg_channel_closed & o )
{
  ...
  m_data_sources.erase( client_name );
  ...
}

Внимание:
Не является thread-safe.
Примеры:

sysconf/main.cpp.


Методы

template<class Data_source , class Key = std::string>
void gemont_1::temporary_sources_t< Data_source, Key >::clear (  )  [inline]

Удалить все источники данных.

Если 0 != m_agent, то у каждого уничтожаемого источника данных автоматически вызывается метод data_source_t::deinit().

Перекрестные ссылки gemont_1::temporary_sources_t< Data_source, Key >::deinit_source(), gemont_1::temporary_sources_t< Data_source, Key >::destroy(), gemont_1::temporary_sources_t< Data_source, Key >::m_agent и gemont_1::temporary_sources_t< Data_source, Key >::m_sources.

template<class Data_source , class Key = std::string>
void gemont_1::temporary_sources_t< Data_source, Key >::erase ( const Key &  k  )  [inline]

Изъять источник данных.

Если 0 != m_agent, то у уничтожаемого источник данных автоматически вызывается метод data_source_t::deinit().

Перекрестные ссылки gemont_1::temporary_sources_t< Data_source, Key >::m_agent и gemont_1::temporary_sources_t< Data_source, Key >::m_sources.

Используется в gemont_1::temporary_sources_t< Data_source, Key >::insert().

template<class Data_source , class Key = std::string>
Data_source* gemont_1::temporary_sources_t< Data_source, Key >::find ( const Key &  k  )  const [inline]

Найти источник данных по ключу.

Возвращает:
0, если источник данных по этому ключу не найден.

Перекрестные ссылки gemont_1::temporary_sources_t< Data_source, Key >::m_sources.

template<class Data_source , class Key = std::string>
void gemont_1::temporary_sources_t< Data_source, Key >::insert ( const Key &  key,
Data_source *  source 
) [inline]

Добавить источник данных.

Предыдущий источник данных с таким же ключем уничтожается.

Если 0 != m_agent, то у нового источника автоматически вызывается метод data_source_t::init().

Аргументы:
key  Уникальный ключ источника данных.
source  Динамически созданный объект, который будет уничтожен автоматически.

Перекрестные ссылки gemont_1::temporary_sources_t< Data_source, Key >::erase(), gemont_1::temporary_sources_t< Data_source, Key >::m_agent и gemont_1::temporary_sources_t< Data_source, Key >::m_sources.


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

template<class Data_source , class Key = std::string>
so_4::rt::agent_t* gemont_1::temporary_sources_t< Data_source, Key >::m_agent [private]

Агент, который владеет хранилищем.

Инициализируется в методе init() и сбрасывается в методе deinit(). Значение 0 указывает, что хранилище не помещено в список свойств какого-то агента.

Если 0 != m_agent, то у все добавляемых источников данных автоматически вызывается метод init(), а у всех изымаемых источников данных вызывается метод deinit().

Используется в gemont_1::temporary_sources_t< Data_source, Key >::clear(), gemont_1::temporary_sources_t< Data_source, Key >::deinit(), gemont_1::temporary_sources_t< Data_source, Key >::deinit_source(), gemont_1::temporary_sources_t< Data_source, Key >::erase(), gemont_1::temporary_sources_t< Data_source, Key >::init_source() и gemont_1::temporary_sources_t< Data_source, Key >::insert().


Объявления и описания членов класса находятся в файле:

Документация по Generic MONitoring Tools v.1.4.0. Последние изменения: Mon Oct 20 16:21:28 2008. Создано системой  doxygen1.5.7.1 Intervale SourceForge.net Logo