mirror of
https://github.com/OpenTTD/OpenTTD
synced 2026-01-15 16:32:41 +01:00
Codechange: Replace custom mutex code with C++11 mutex'es.
A conforming compiler with a valid <mutex>-header is expected. Most parts of the code assume that locking a mutex will never fail unexpectedly, which is generally true on all common platforms that don't just pretend to be C++11. The use of condition variables in driver code is checked.
This commit is contained in:
@@ -108,84 +108,3 @@ private:
|
||||
if (thread != NULL) *thread = to;
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* POSIX pthread version of ThreadMutex.
|
||||
*/
|
||||
class ThreadMutex_pthread : public ThreadMutex {
|
||||
private:
|
||||
pthread_mutex_t mutex; ///< The actual mutex.
|
||||
pthread_cond_t condition; ///< Data for conditional waiting.
|
||||
pthread_mutexattr_t attr; ///< Attributes set for the mutex.
|
||||
pthread_t owner; ///< Owning thread of the mutex.
|
||||
uint recursive_count; ///< Recursive lock count.
|
||||
|
||||
public:
|
||||
ThreadMutex_pthread() : owner(0), recursive_count(0)
|
||||
{
|
||||
pthread_mutexattr_init(&this->attr);
|
||||
pthread_mutexattr_settype(&this->attr, PTHREAD_MUTEX_ERRORCHECK);
|
||||
pthread_mutex_init(&this->mutex, &this->attr);
|
||||
pthread_cond_init(&this->condition, NULL);
|
||||
}
|
||||
|
||||
~ThreadMutex_pthread() override
|
||||
{
|
||||
int err = pthread_cond_destroy(&this->condition);
|
||||
assert(err != EBUSY);
|
||||
err = pthread_mutex_destroy(&this->mutex);
|
||||
assert(err != EBUSY);
|
||||
}
|
||||
|
||||
bool IsOwnedByCurrentThread() const
|
||||
{
|
||||
return this->owner == pthread_self();
|
||||
}
|
||||
|
||||
void BeginCritical(bool allow_recursive = false) override
|
||||
{
|
||||
/* pthread mutex is not recursive by itself */
|
||||
if (this->IsOwnedByCurrentThread()) {
|
||||
if (!allow_recursive) NOT_REACHED();
|
||||
} else {
|
||||
int err = pthread_mutex_lock(&this->mutex);
|
||||
assert(err == 0);
|
||||
assert(this->recursive_count == 0);
|
||||
this->owner = pthread_self();
|
||||
}
|
||||
this->recursive_count++;
|
||||
}
|
||||
|
||||
void EndCritical(bool allow_recursive = false) override
|
||||
{
|
||||
assert(this->IsOwnedByCurrentThread());
|
||||
if (!allow_recursive && this->recursive_count != 1) NOT_REACHED();
|
||||
this->recursive_count--;
|
||||
if (this->recursive_count != 0) return;
|
||||
this->owner = 0;
|
||||
int err = pthread_mutex_unlock(&this->mutex);
|
||||
assert(err == 0);
|
||||
}
|
||||
|
||||
void WaitForSignal() override
|
||||
{
|
||||
uint old_recursive_count = this->recursive_count;
|
||||
this->recursive_count = 0;
|
||||
this->owner = 0;
|
||||
int err = pthread_cond_wait(&this->condition, &this->mutex);
|
||||
assert(err == 0);
|
||||
this->owner = pthread_self();
|
||||
this->recursive_count = old_recursive_count;
|
||||
}
|
||||
|
||||
void SendSignal() override
|
||||
{
|
||||
int err = pthread_cond_signal(&this->condition);
|
||||
assert(err == 0);
|
||||
}
|
||||
};
|
||||
|
||||
/* static */ ThreadMutex *ThreadMutex::New()
|
||||
{
|
||||
return new ThreadMutex_pthread();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user