gsdx linux:

* add the code to select the attribute (still the default but can be changed now)
* add a hidden option (condvar) to select between the 2 threads algorithm


git-svn-id: http://pcsx2.googlecode.com/svn/trunk@5021 96395faa-99c1-11dd-bbfe-3dabce05a288
This commit is contained in:
gregory.hainaut 2011-12-27 13:14:30 +00:00
parent ba14c557ed
commit 4f6796916a
1 changed files with 32 additions and 10 deletions

View File

@ -114,6 +114,7 @@ public:
#include <pthread.h> #include <pthread.h>
#include <semaphore.h> #include <semaphore.h>
#include "GSdx.h"
class GSThread class GSThread
{ {
@ -142,7 +143,7 @@ public:
GSCritSec() GSCritSec()
{ {
pthread_mutexattr_init(&m_mutex_attr); pthread_mutexattr_init(&m_mutex_attr);
pthread_mutexattr_settype(&m_mutex_attr, PTHREAD_MUTEX_RECURSIVE_NP); pthread_mutexattr_settype(&m_mutex_attr, PTHREAD_MUTEX_RECURSIVE);
pthread_mutex_init(&m_mutex, &m_mutex_attr); pthread_mutex_init(&m_mutex, &m_mutex_attr);
} }
@ -170,27 +171,47 @@ public:
bool Wait() {return sem_wait(&m_sem) == 0;} bool Wait() {return sem_wait(&m_sem) == 0;}
}; };
// Note except the mutex attribute the code is same as GSCritSec object
class GSCondVarLock class GSCondVarLock
{ {
pthread_mutex_t m_lock; pthread_mutexattr_t m_mutex_attr;
pthread_mutex_t m_mutex;
public: public:
GSCondVarLock() {pthread_mutex_init(&m_lock, NULL);} GSCondVarLock()
virtual ~GSCondVarLock() {pthread_mutex_destroy(&m_lock);} {
pthread_mutexattr_init(&m_mutex_attr);
pthread_mutexattr_settype(&m_mutex_attr, PTHREAD_MUTEX_NORMAL);
pthread_mutex_init(&m_mutex, &m_mutex_attr);
}
virtual ~GSCondVarLock()
{
pthread_mutex_destroy(&m_mutex);
pthread_mutexattr_destroy(&m_mutex_attr);
}
void Lock() {pthread_mutex_lock(&m_lock);} void Lock() {pthread_mutex_lock(&m_mutex);}
void Unlock() {pthread_mutex_unlock(&m_lock);} void Unlock() {pthread_mutex_unlock(&m_mutex);}
operator pthread_mutex_t* () {return &m_lock;} operator pthread_mutex_t* () {return &m_mutex;}
}; };
class GSCondVar class GSCondVar
{ {
pthread_cond_t m_cv; pthread_cond_t m_cv;
pthread_condattr_t m_cv_attr;
public: public:
GSCondVar() {pthread_cond_init(&m_cv, NULL);} GSCondVar()
virtual ~GSCondVar() {pthread_cond_destroy(&m_cv);} {
pthread_condattr_init(&m_cv_attr);
pthread_cond_init(&m_cv, &m_cv_attr);
}
virtual ~GSCondVar()
{
pthread_condattr_destroy(&m_cv_attr);
pthread_cond_destroy(&m_cv);
}
void Set() {pthread_cond_signal(&m_cv);} void Set() {pthread_cond_signal(&m_cv);}
void Wait(GSCondVarLock& lock) {pthread_cond_wait(&m_cv, lock);} void Wait(GSCondVarLock& lock) {pthread_cond_wait(&m_cv, lock);}
@ -324,7 +345,8 @@ public:
#elif defined(_LINUX) #elif defined(_LINUX)
m_cv.available = true; //m_cv.available = true;
m_cv.available = !!theApp.GetConfig("condvar", 1);
#endif #endif