2
0
mirror of https://github.com/boostorg/fiber.git synced 2026-02-13 00:12:17 +00:00

Merge pull request #22 from absolute8511/fix-deque-erase

fix deque erase, the end() iterator cannot be used as erase position.
This commit is contained in:
olk
2014-09-15 16:57:12 +02:00
3 changed files with 48 additions and 25 deletions

View File

@@ -132,9 +132,12 @@ public:
catch (...)
{
unique_lock< detail::spinlock > lk( splk_);
// remove fiber from waiting-list
waiting_.erase(
std::find( waiting_.begin(), waiting_.end(), n) );
std::deque< detail::fiber_base * >::iterator wit = std::find( waiting_.begin(), waiting_.end(), n);
if (wit != waiting_.end())
{
// remove fiber from waiting-list
waiting_.erase( wit );
}
throw;
}
}
@@ -169,9 +172,12 @@ public:
// this fiber was not notified before timeout
// lock spinlock again
unique_lock< detail::spinlock > lk( splk_);
// remove fiber from waiting-list
waiting_.erase(
std::find( waiting_.begin(), waiting_.end(), n) );
std::deque< detail::fiber_base * >::iterator wit = std::find( waiting_.begin(), waiting_.end(), n);
if (wit != waiting_.end())
{
// remove fiber from waiting-list
waiting_.erase( wit );
}
status = cv_status::timeout;
}
@@ -209,12 +215,14 @@ public:
// timeout happend before notified
// lock spinlock
unique_lock< detail::spinlock > lk( splk_);
// remove fiber from waiting-list
waiting_.erase(
std::find( waiting_.begin(), waiting_.end(), n) );
std::deque< detail::fiber_base * >::iterator wit = std::find( waiting_.begin(), waiting_.end(), n);
if (wit != waiting_.end())
{
// remove fiber from waiting-list
waiting_.erase(wit);
}
status = cv_status::timeout;
break;
}
// run scheduler
@@ -228,9 +236,12 @@ public:
catch (...)
{
unique_lock< detail::spinlock > lk( splk_);
// remove fiber from waiting-list
waiting_.erase(
std::find( waiting_.begin(), waiting_.end(), n) );
std::deque< detail::fiber_base * >::iterator wit = std::find( waiting_.begin(), waiting_.end(), n);
if (wit != waiting_.end())
{
// remove fiber from waiting-list
waiting_.erase( wit );
}
throw;
}

View File

@@ -136,9 +136,12 @@ recursive_timed_mutex::try_lock_until( chrono::high_resolution_clock::time_point
if ( ! fm_wait_until( timeout_time, lk) )
{
lk.lock();
// remove fiber from waiting-list
waiting_.erase(
std::find( waiting_.begin(), waiting_.end(), n) );
std::deque< detail::fiber_base * >::iterator wit = std::find( waiting_.begin(), waiting_.end(), n);
if (wit != waiting_.end())
{
// remove fiber from waiting-list
waiting_.erase( wit );
}
lk.unlock();
return false;
}
@@ -170,9 +173,12 @@ recursive_timed_mutex::try_lock_until( chrono::high_resolution_clock::time_point
if ( chrono::high_resolution_clock::now() > timeout_time)
{
lk.lock();
// remove fiber from waiting-list
waiting_.erase(
std::find( waiting_.begin(), waiting_.end(), n) );
std::deque< detail::fiber_base * >::iterator wit = std::find( waiting_.begin(), waiting_.end(), n);
if (wit != waiting_.end())
{
// remove fiber from waiting-list
waiting_.erase( wit );
}
lk.unlock();
return false;
}

View File

@@ -125,9 +125,12 @@ timed_mutex::try_lock_until( chrono::high_resolution_clock::time_point const& ti
if ( ! fm_wait_until( timeout_time, lk) )
{
lk.lock();
// remove fiber from waiting-list
waiting_.erase(
std::find( waiting_.begin(), waiting_.end(), n) );
std::deque< detail::fiber_base * >::iterator wit = std::find( waiting_.begin(), waiting_.end(), n);
if (wit != waiting_.end())
{
// remove fiber from waiting-list
waiting_.erase( wit );
}
lk.unlock();
return false;
}
@@ -159,9 +162,12 @@ timed_mutex::try_lock_until( chrono::high_resolution_clock::time_point const& ti
if ( chrono::high_resolution_clock::now() > timeout_time)
{
lk.lock();
// remove fiber from waiting-list
waiting_.erase(
std::find( waiting_.begin(), waiting_.end(), n) );
std::deque< detail::fiber_base * >::iterator wit = std::find( waiting_.begin(), waiting_.end(), n);
if (wit != waiting_.end())
{
// remove fiber from waiting-list
waiting_.erase( wit );
}
lk.unlock();
return false;
}