boost::call_once баг ?
От: Feonyf  
Дата: 01.09.09 04:45
Оценка:
Смотрю на код в бусте внутри call_once

void* const mutex_handle(::boost::detail::create_once_mutex(&flag));
BOOST_ASSERT(mutex_handle);

только ассерт ? А что будет если ::boost::detail::create_once_mutex возвратит ошибку, например в результате нехватки ресурсов ?
Моя строка построения буста:
.\bjam link=static threading=multi runtime-link=static -j %NUMBER_OF_PROCESSORS% --with-filesystem --with-thread --with-date_time address-model=64
Re: boost::call_once баг ?
От: Feonyf  
Дата: 01.09.09 17:03
Оценка:
1. где же "защитники" буста ?
2. где защитники надежного софта ?

кстати, про буст. Я тут решил переехать с Loki::SmartPtr на boost::shared_ptr и наткнулся на проблему:


class MyClass {
 (...)
};

typedef boost::shared_ptr<MyClass> MyClassPtr;

typedef std::vector<MyClassPtr> ContainerType;

ContainerType Container;
MyClass* ptrToFind = 0;

std::find(Container.begin(),Container.end(),ptrToFind); // не компилируется


у boost::shared_ptr нет оператора или я что-то не понял ? С Loki::SmartPtr такого небыло
Моя строка построения буста:
.\bjam link=static threading=multi runtime-link=static -j %NUMBER_OF_PROCESSORS% --with-filesystem --with-thread --with-date_time address-model=64
Re: boost::call_once баг ?
От: ioni Россия  
Дата: 01.09.09 17:58
Оценка:
Здравствуйте, Feonyf, Вы писали:

F>Смотрю на код в бусте внутри call_once


F>void* const mutex_handle(::boost::detail::create_once_mutex(&flag));

F>BOOST_ASSERT(mutex_handle);

F>только ассерт ? А что будет если ::boost::detail::create_once_mutex возвратит ошибку, например в результате нехватки ресурсов ?


ничего,
если вы уж полезли в дебри boost, то могли бы посмотреть, что функция
::boost::detail::create_once_mutex(&flag)

возвращает void* ( что скорее всего HANDLE объекта ), посему ассерт вполне по месту для отладочной версии
в релизе будет неудачное создание объекта и скорее всего INVALID_HANDLE_VALUE
что вполне допустимо для winapi
и потом как реагировать когда ресурсов нет... прикрвать приолжение... кидать исключение...
это уже вопрос дискусии
Re[2]: boost::call_once баг ?
От: ioni Россия  
Дата: 01.09.09 17:59
Оценка:
Здравствуйте, Feonyf, Вы писали:

F>1. где же "защитники" буста ?

F>2. где защитники надежного софта ?

F>кстати, про буст. Я тут решил переехать с Loki::SmartPtr на boost::shared_ptr и наткнулся на проблему:



F>
F>class MyClass {
F> (...)
F>};

F>typedef boost::shared_ptr<MyClass> MyClassPtr;

F>typedef std::vector<MyClassPtr> ContainerType;

F>ContainerType Container;
F>MyClass* ptrToFind = 0;

F>std::find(Container.begin(),Container.end(),ptrToFind); // не компилируется

F>


F>у boost::shared_ptr нет оператора или я что-то не понял ? С Loki::SmartPtr такого небыло


Привели бы код оишбки компилятора что ли
Re[2]: boost::call_once баг ?
От: Feonyf  
Дата: 01.09.09 18:27
Оценка:
Здравствуйте, ioni, Вы писали:

I>что вполне допустимо для winapi

да. Windows тут неслабое место
I>и потом как реагировать когда ресурсов нет... прикрвать приолжение... кидать исключение...

исключение кидать. std::bad_alloc ведь кидается когда памяти нет...
Я одно точно знаю: игнорировать нельзя
Моя строка построения буста:
.\bjam link=static threading=multi runtime-link=static -j %NUMBER_OF_PROCESSORS% --with-filesystem --with-thread --with-date_time address-model=64
Re[3]: boost::call_once баг ?
От: Feonyf  
Дата: 01.09.09 18:31
Оценка:
Здравствуйте, ioni, Вы писали:

I>Привели бы код оишбки компилятора что ли


проект http://files.rsdn.ru/46977/testPtr.7z
компилятор говорит это:

1>------ Build started: Project: testPtr, Configuration: Debug Win32 ------

1>Compiling...
1>stdafx.cpp
1>Compiling...
1>testPtr.cpp
1>c:\program files\microsoft visual studio 9.0\vc\include\algorithm(40) : error C2679: binary '==' : no operator found which takes a right-hand operand of type 'wmain::MyClass *const ' (or there is no acceptable conversion)
1> could be 'built-in C++ operator==(wmain::MyClass *boost::shared_ptr<T>::* , wmain::MyClass *boost::shared_ptr<T>::* )'
1> with
1> [
1> T=wmain::MyClass
1> ]
1> or 'built-in C++ operator==(wmain::MyClass *, wmain::MyClass *)'
1> while trying to match the argument list '(boost::shared_ptr<T>, wmain::MyClass *const )'
1> with
1> [
1> T=wmain::MyClass
1> ]
1> c:\program files\microsoft visual studio 9.0\vc\include\algorithm(74) : see reference to function template instantiation '_InIt std::_Find<std::_Vector_iterator<_Ty,_Alloc>,wmain::MyClass>(_InIt,_InIt,wmain::MyClass &)' being compiled
1> with
1> [
1> _InIt=std::_Vector_iterator<MyClassPtr,std::allocator<MyClassPtr>>,
1> _Ty=MyClassPtr,
1> _Alloc=std::allocator<MyClassPtr>
1> ]
1> c:\users\user\desktop\testptr\testptr.cpp(22) : see reference to function template instantiation '_InIt std::find<std::_Vector_iterator<_Ty,_Alloc>,wmain::MyClass*>(_InIt,_InIt,wmain::MyClass &)' being compiled
1> with
1> [
1> _InIt=std::_Vector_iterator<MyClassPtr,std::allocator<MyClassPtr>>,
1> _Ty=MyClassPtr,
1> _Alloc=std::allocator<MyClassPtr>
1> ]
1>Build Time 0:03
1>Build log was saved at "file://c:\Users\user\Desktop\testPtr\Debug\BuildLog.htm"
1>testPtr — 1 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Моя строка построения буста:
.\bjam link=static threading=multi runtime-link=static -j %NUMBER_OF_PROCESSORS% --with-filesystem --with-thread --with-date_time address-model=64
Re: boost::call_once баг ?
От: Alexander G Украина  
Дата: 01.09.09 18:49
Оценка:
Здравствуйте, Feonyf, Вы писали:

F>Смотрю на код в бусте внутри call_once


F>void* const mutex_handle(::boost::detail::create_once_mutex(&flag));

F>BOOST_ASSERT(mutex_handle);

F>только ассерт ? А что будет если ::boost::detail::create_once_mutex возвратит ошибку, например в результате нехватки ресурсов ?


И всё-таки не думаю, что оно часто падает.
Нужно тройное совпадение — одновременная инициализация, первая инициализация и нехватка ресурсов.
Русский военный корабль идёт ко дну!
Re[2]: boost::call_once баг ?
От: Feonyf  
Дата: 01.09.09 20:27
Оценка:
Здравствуйте, Alexander G, Вы писали:

AG>И всё-таки не думаю, что оно часто падает.

AG>Нужно тройное совпадение — одновременная инициализация, первая инициализация и нехватка ресурсов.

Согласен.
Однако более надежно когда ошибки не игнорируются. boost это серьёзная библиотека, а серьезная библиотека должна обрабатывать нехватку ресурсов.
Моя строка построения буста:
.\bjam link=static threading=multi runtime-link=static -j %NUMBER_OF_PROCESSORS% --with-filesystem --with-thread --with-date_time address-model=64
Re[2]: boost::call_once баг ?
От: Feonyf  
Дата: 02.09.09 05:57
Оценка:
Здравствуйте, ioni, Вы писали:

I>и потом как реагировать когда ресурсов нет...


кстати есть такая утилитка consume.exe от Microsoft с помощью неё можно проводить стрессовое тестирование: сожрать память или kernel pool. Mutex как раз к kernel pool относится
Моя строка построения буста:
.\bjam link=static threading=multi runtime-link=static -j %NUMBER_OF_PROCESSORS% --with-filesystem --with-thread --with-date_time address-model=64
Re: boost::call_once баг ?
От: Feonyf  
Дата: 02.09.09 16:24
Оценка:
Завел багу https://svn.boost.org/trac/boost/ticket/3391. Мой Английский не очень. Надеюсь поймут
Моя строка построения буста:
.\bjam link=static threading=multi runtime-link=static -j %NUMBER_OF_PROCESSORS% --with-filesystem --with-thread --with-date_time address-model=64
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.