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:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user