1. C++ / Говнокод #13905

    +8

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 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 переменной, и только).

    Запостил: Dummy00001, 07 Октября 2013

    Комментарии (15) RSS

    • показать все, что скрытоУ МИНЯ ЕСТЬ IFON 5S НО Я ЖЫ НИ ХВАСТАЮЗЬ!!!!!!!!!!!!!
      Ответить
    • а действительно нужен SAX?
      Ответить
      • нет. по сырцам, они просто демо сакса скопировали. наверное потому что демы дома (который там и строится в конце) к саксу не прилагается.
        Ответить
        • http://pugixml.org/benchmark/
          Ответить
          • и?
            Ответить
            • и нужны пиздец какие веские причины, чтобы выбрать именно херсес в качестве xml парсера
              Ответить
              • причины к слову весьма "прикольные". хмл в проекте начал первым использовать много много лет назад один архитектор для перловой системы инкрементальных апгрейдов базы данных. (на тот момент может и альтернативы не было.) а потом пропошло как обычно в большой конторе: "нужна хмл библиотека? так у нас уже есть ксерсес!!"
                Ответить
      • Если есть DOM или лучше XPath, и при этом файлы небольшого размера, то действительно голый SAX использовать незачем.
        Ответить
    • "но и в добавок народ не впечатал как многопоточность сделать правильно"
      Для обычных машин можно так:

      if (!instance->mRootNode) {
      lock();
      if (!instance->mRootNode) {
      instance->load();
      }
      unlock();
      }
      Ответить
      • да. но это же "догадатся" надо.
        Ответить
      • Это даже не double-checked locking, это пиздец какой-то.

        load() засовывает что-то нибудь в mRootNode, и следующий поток благополучно улетает его юзать недозагруженный конфиг безо всяких локов :) На интелах, емнип, из-за упорядочивания записи можно делать запись в mRootNode последней (и надеяться, что компилятор ничего не переупорядочит), но один хер код очень хрупкий.
        Ответить
        • Формально в модели памяти c++11 этот код - UB, т.к. неатомарный mRootNode может одновременно читаться и модифицироваться из разных потоков. Для таких вещей есть call_once.
          Ответить

    Добавить комментарий