Replaced Common::Thread with a partial implementation of std::thread. (rvalue references are used if available, <thread> is used if possible) Eliminates the need to use dynamic memory allocation for threads, so it's impossible to forget to delete a thread or set a pointer to NULL. Enables use of type-safe thread functions, no need to cast to and from void*. I've made sure the code compiles in vs08 and tested the functionality of "StdThread.h" on Linux so I'm hoping everything will work :p. In the future "StdThread.h" can be removed (maybe when OS X ships with gcc 4.4 and vs2015 is released :p).

git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@6933 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
Jordan Woyak 2011-01-27 20:47:58 +00:00
parent 0371f15c23
commit 2c05c49a04
29 changed files with 484 additions and 396 deletions

View file

@ -47,7 +47,7 @@
struct UDPWiimote::_d
{
Common::Thread * thread;
std::thread thread;
std::list<sock_t> sockfds;
Common::CriticalSection termLock,mutex,nameMutex;
volatile bool exit;
@ -56,15 +56,9 @@ struct UDPWiimote::_d
int UDPWiimote::noinst=0;
void _UDPWiiThread(void* arg)
void UDPWiiThread(UDPWiimote* arg)
{
((UDPWiimote*)arg)->mainThread();
}
THREAD_RETURN UDPWiiThread(void* arg)
{
_UDPWiiThread(arg);
return 0;
arg->mainThread();
}
UDPWiimote::UDPWiimote(const char *_port, const char * name, int _index) :
@ -86,7 +80,6 @@ UDPWiimote::UDPWiimote(const char *_port, const char * name, int _index) :
#endif
struct addrinfo hints, *servinfo, *p;
int rv;
d->thread=NULL;
#ifdef _WIN32
if (noinst==0)
@ -142,7 +135,7 @@ UDPWiimote::UDPWiimote(const char *_port, const char * name, int _index) :
initBroadcastIPv4();
initBroadcastIPv6();
d->termLock.Enter();
d->thread = new Common::Thread(UDPWiiThread,this);
d->thread = std::thread(UDPWiiThread, this);
d->termLock.Leave();
return;
}
@ -226,8 +219,8 @@ void UDPWiimote::mainThread()
UDPWiimote::~UDPWiimote()
{
d->exit=true;
d->thread->WaitForDeath();
d->exit = true;
d->thread.join();
d->termLock.Enter();
d->termLock.Leave();
for (std::list<sock_t>::iterator i=d->sockfds.begin(); i!=d->sockfds.end(); i++)