2
0
mirror of https://github.com/boostorg/thread.git synced 2026-01-21 17:32:18 +00:00

Add noexcept(false) in destructor that could throw in C++11.

This commit is contained in:
Vicente J. Botet Escriba
2017-04-29 16:15:57 +02:00
parent 8dfa7c2e42
commit dcafe1e17d
3 changed files with 51 additions and 12 deletions

View File

@@ -45,9 +45,17 @@ namespace boost
m_.unlock();
m=&m_;
}
~lock_on_exit()
void deactivate()
{
if(m)
if (m)
{
m->lock();
}
m = 0;
}
~lock_on_exit() BOOST_NOEXCEPT_IF(false)
{
if (m)
{
m->lock();
}
@@ -70,10 +78,13 @@ namespace boost
detail::interruption_checker check_for_interruption(&internal_mutex,&cond);
pthread_mutex_t* the_mutex = &internal_mutex;
guard.activate(m);
res = pthread_cond_wait(&cond,the_mutex);
//check_for_interruption.check();
//guard.deactivate();
#else
pthread_mutex_t* the_mutex = m.mutex()->native_handle();
#endif
res = pthread_cond_wait(&cond,the_mutex);
#endif
}
#if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
this_thread::interruption_point();
@@ -101,10 +112,13 @@ namespace boost
detail::interruption_checker check_for_interruption(&internal_mutex,&cond);
pthread_mutex_t* the_mutex = &internal_mutex;
guard.activate(m);
cond_res=pthread_cond_timedwait(&cond,the_mutex,&timeout);
//check_for_interruption.check();
//guard.deactivate();
#else
pthread_mutex_t* the_mutex = m.mutex()->native_handle();
#endif
cond_res=pthread_cond_timedwait(&cond,the_mutex,&timeout);
#endif
}
#if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
this_thread::interruption_point();
@@ -176,6 +190,8 @@ namespace boost
#endif
guard.activate(m);
res=pthread_cond_wait(&cond,&internal_mutex);
//check_for_interruption.check();
//guard.deactivate();
}
#if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
this_thread::interruption_point();
@@ -404,6 +420,8 @@ namespace boost
#endif
guard.activate(m);
res=pthread_cond_timedwait(&cond,&internal_mutex,&timeout);
//check_for_interruption.check();
//guard.deactivate();
}
#if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
this_thread::interruption_point();

View File

@@ -177,6 +177,7 @@ namespace boost
thread_data_base* const thread_info;
pthread_mutex_t* m;
bool set;
bool done;
void check_for_interruption()
{
@@ -193,7 +194,7 @@ namespace boost
public:
explicit interruption_checker(pthread_mutex_t* cond_mutex,pthread_cond_t* cond):
thread_info(detail::get_current_thread_data()),m(cond_mutex),
set(thread_info && thread_info->interrupt_enabled)
set(thread_info && thread_info->interrupt_enabled), done(false)
{
if(set)
{
@@ -208,9 +209,10 @@ namespace boost
BOOST_VERIFY(!pthread_mutex_lock(m));
}
}
~interruption_checker()
void check()
{
if(set)
if ( ! done) {
if (set)
{
BOOST_VERIFY(!pthread_mutex_unlock(m));
lock_guard<mutex> guard(thread_info->data_mutex);
@@ -221,6 +223,13 @@ namespace boost
{
BOOST_VERIFY(!pthread_mutex_unlock(m));
}
done = true;
}
}
~interruption_checker() BOOST_NOEXCEPT_IF(false)
{
check();
}
};
#endif

View File

@@ -153,9 +153,14 @@ namespace boost
lock.unlock();
unlocked=true;
}
~relocker()
void lock()
{
if(unlocked)
lock.lock();
unlocked=false;
}
~relocker() BOOST_NOEXCEPT_IF(false)
{
if (unlocked)
{
lock.lock();
}
@@ -215,11 +220,12 @@ namespace boost
template<typename lock_type>
bool do_wait(lock_type& lock,timeout abs_time)
{
relocker<lock_type> locker(lock);
//relocker<lock_type> locker(lock);
try {
entry_manager entry(get_wait_entry(), internal_mutex);
locker.unlock();
lock.unlock();
bool woken=false;
while(!woken)
@@ -231,7 +237,13 @@ namespace boost
woken=entry->woken();
}
return woken;
lock.lock();
}
catch (E& ex )
{
throw;
}
return woken;
}
template<typename lock_type,typename predicate_type>