- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
const Registry & Registry::getInstance()
{
Registry *instance = RegistrySingleton::instance();
if (!instance->mRootNode) {
instance->load();
}
return *instance;
}
void Registry::load()
{
try {
// ...
if (!mReader) {
mReader = XMLReaderFactory::createXMLReader();
}
// ...
mReader->parse( ... );
} catch (...) {
// ...
throw; // удачи всем пользователям обрабатывать исключения xerces...
}
}
боян синглтонно-абстрактный для чтения xml конфигурации с помощью xerces.
и не только ошибки не обрабатаешь (потому что getInstance() их бросает, угадай какой именно вызов из сотен загружает конфигурацию), но и в добавок народ не впечатал как многопоточность сделать правильно (RegistrySingleton это специализация шаблона который синхронизирует инициализацию mInstance переменной, и только).
Какая мерзость.
Для обычных машин можно так:
if (!instance->mRootNode) {
lock();
if (!instance->mRootNode) {
instance->load();
}
unlock();
}
load() засовывает что-то нибудь в mRootNode, и следующий поток благополучно улетает его юзать недозагруженный конфиг безо всяких локов :) На интелах, емнип, из-за упорядочивания записи можно делать запись в mRootNode последней (и надеяться, что компилятор ничего не переупорядочит), но один хер код очень хрупкий.