mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-01-11 00:29:11 +01:00
da088e62ad
For testing purpose only (I can't test with lots of games) because it may break some sync. Besides, I'm not satisfied with the way things are done. So just uncomment "//#define THREAD_VIDEO_WAKEUP_ONIDLE" in thread.h in order to test it. Works fine with movies, 2D and simple 3D in ZWW at least. If it's ok I'll clean up the code. git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@658 8ced0084-cf51-0410-be5f-012b33b47a6e
120 lines
2.2 KiB
C++
120 lines
2.2 KiB
C++
// Copyright (C) 2003-2008 Dolphin Project.
|
|
|
|
// This program is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU General Public License as published by
|
|
// the Free Software Foundation, version 2.0.
|
|
|
|
// This program is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General Public License 2.0 for more details.
|
|
|
|
// A copy of the GPL 2.0 should have been included with the program.
|
|
// If not, see http://www.gnu.org/licenses/
|
|
|
|
// Official SVN repository and contact information can be found at
|
|
// http://code.google.com/p/dolphin-emu/
|
|
|
|
#ifndef _THREAD_H
|
|
#define _THREAD_H
|
|
|
|
#ifdef _WIN32
|
|
#include <windows.h>
|
|
#else
|
|
#include <pthread.h>
|
|
#endif
|
|
|
|
#ifdef _WIN32
|
|
#define THREAD_RETURN DWORD WINAPI
|
|
#else
|
|
#define THREAD_RETURN void*
|
|
#endif
|
|
|
|
#include "Common.h"
|
|
|
|
|
|
// for testing purpose
|
|
//#define THREAD_VIDEO_WAKEUP_ONIDLE
|
|
|
|
#if defined(THREAD_VIDEO_WAKEUP_ONIDLE) && defined(_WIN32)
|
|
extern HANDLE g_hEventOnIdle;
|
|
#endif
|
|
|
|
namespace Common
|
|
{
|
|
class CriticalSection
|
|
{
|
|
#ifdef _WIN32
|
|
CRITICAL_SECTION section;
|
|
#elif __GNUC__
|
|
pthread_mutex_t mutex;
|
|
#endif
|
|
public:
|
|
|
|
CriticalSection(int spincount = 1000);
|
|
~CriticalSection();
|
|
void Enter();
|
|
bool TryEnter();
|
|
void Leave();
|
|
};
|
|
|
|
#ifdef _WIN32
|
|
typedef DWORD (WINAPI * ThreadFunc)(void* arg);
|
|
#elif __GNUC__
|
|
typedef void* (*ThreadFunc)(void* arg);
|
|
#endif
|
|
|
|
class Thread
|
|
{
|
|
public:
|
|
|
|
Thread(ThreadFunc entry, void* arg);
|
|
~Thread();
|
|
|
|
void WaitForDeath();
|
|
void SetAffinity(int mask);
|
|
static void SetCurrentThreadAffinity(int mask);
|
|
|
|
|
|
private:
|
|
|
|
#ifdef _WIN32
|
|
HANDLE m_hThread;
|
|
DWORD m_threadId;
|
|
#elif __GNUC__
|
|
pthread_t thread_id;
|
|
#endif
|
|
};
|
|
|
|
|
|
class Event
|
|
{
|
|
public:
|
|
|
|
Event();
|
|
|
|
void Init();
|
|
void Shutdown();
|
|
|
|
void Set();
|
|
void Wait();
|
|
|
|
|
|
private:
|
|
|
|
#ifdef _WIN32
|
|
HANDLE m_hEvent;
|
|
#elif __GNUC__
|
|
bool is_set_;
|
|
pthread_cond_t event_;
|
|
pthread_mutex_t mutex_;
|
|
#endif
|
|
};
|
|
|
|
void SleepCurrentThread(int ms);
|
|
|
|
void SetCurrentThreadName(const char* name);
|
|
} // end of namespace Common
|
|
|
|
#endif
|