yielding the timeslice

This commit is contained in:
David Rose 2009-06-11 19:26:30 +00:00
parent e10d398afd
commit fc28b55b29
2 changed files with 16 additions and 4 deletions

View File

@ -216,6 +216,10 @@ sleep_this(double seconds) {
////////////////////////////////////////////////////////////////////
void ThreadSimpleImpl::
yield_this(bool volunteer) {
if (thread_cat->is_debug() && volunteer) {
thread_cat.debug()
<< "Force-yielding " << _parent_obj->get_name() << "\n";
}
_manager->enqueue_ready(this, true);
_manager->next_context();
}

View File

@ -468,14 +468,22 @@ write_status(ostream &out) const {
////////////////////////////////////////////////////////////////////
void ThreadSimpleManager::
system_yield() {
if (thread_cat->is_debug()) {
thread_cat.debug()
<< "system_yield\n";
}
#ifdef WIN32
Sleep(0);
#else
struct timespec rqtp;
rqtp.tv_sec = 0;
rqtp.tv_nsec = 0;
nanosleep(&rqtp, NULL);
// We use select() as the only way that seems to actually yield the
// timeslice. sleep() and nanosleep() don't appear to do the trick.
struct timeval tv;
tv.tv_sec = 0;
tv.tv_usec = 1;
select(0, NULL, NULL, NULL, &tv);
#endif // WIN32
}