oess_1.2.0. Реентерабильность вспомогательного кода

До версии 1.2.0 вспомогательный код по сериализации объектов не был реентерабильным. Объяснялось это тем, что в случае использования виртуального множественного наследования нужно было защищатся от того, что одна базовая составляющая может быть использована для сериализации более одного раза. Например, в следующем случае:
{type	A
	{attr	m_a {of std::string}}
}

{type	B
	{super {virtual} A}

	{attr	m_b {of std::string}}
}

{type	C
	{super {virtual} A}

	{attr	m_c {of std::string}}
}

{type	D
	{attr	m_d {of std::string}}
}

{type	E
	{super D}
	{super {virtual} B}
	{super {virtual} C}

	{attr	m_e {of std::string}}
}

При сериализации типа E, сериализация его базовой составляющей из типа A инициировалась через E::B::A и E::C::A.

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

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

Для преодоления этой проблемы в v.1.2.0 изменена структура вспомогательного кода. Теперь никаких флагов в сериализуемых объектах не хранится. Контроль повторной сериализации осуществляется на уровне классов oess_1::stdsn::oent_t.

Реентерабильность вспомогательного кода дает возможность параллельной сериализации одного и того же объекта на разных нитях.

Заметки:
ObjESSty гарантирует реентерабильность только вспомогательного кода, который осуществляет сериализацию. Но ObjESSty не может гарантировать реентерабильности всей операции сериализации, если программист перекрыл операции oess_1::stdsn::serializable_t::oess_pre_pack() и oess_1::stdsn::serializable_t::oess_post_pack() и реализовал в них нереентерабильный код.

Документация по ObjESSty. Последние изменения: Fri Oct 13 18:35:37 2006. Создано системой  doxygen 1.4.7
Hosted by uCoz