changed wxCondition API to take a reference, not pointer, to wxMutex

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@14909 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2002-04-02 15:37:57 +00:00
parent cd10339a23
commit c112e10026
5 changed files with 152 additions and 76 deletions

View File

@@ -91,7 +91,7 @@
#undef TEST_ALL
static const bool TEST_ALL = TRUE;
#else
#define TEST_FILENAME
#define TEST_THREADS
static const bool TEST_ALL = FALSE;
#endif
@@ -4627,7 +4627,7 @@ static void TestTimeCompatibility()
static size_t gs_counter = (size_t)-1;
static wxCriticalSection gs_critsect;
static wxCondition gs_cond;
static wxSemaphore gs_cond;
class MyJoinableThread : public wxThread
{
@@ -4715,7 +4715,7 @@ void MyDetachedThread::OnExit()
wxCriticalSectionLocker lock(gs_critsect);
if ( !--gs_counter && !m_cancelled )
gs_cond.Signal();
gs_cond.Post();
}
static void TestDetachedThreads()
@@ -4854,8 +4854,9 @@ static void TestThreadDelete()
class MyWaitingThread : public wxThread
{
public:
MyWaitingThread(wxCondition *condition)
MyWaitingThread( wxMutex *mutex, wxCondition *condition )
{
m_mutex = mutex;
m_condition = condition;
Create();
@@ -4866,12 +4867,14 @@ public:
printf("Thread %lu has started running.\n", GetId());
fflush(stdout);
gs_cond.Signal();
gs_cond.Post();
printf("Thread %lu starts to wait...\n", GetId());
fflush(stdout);
m_mutex->Lock();
m_condition->Wait();
m_mutex->Unlock();
printf("Thread %lu finished to wait, exiting.\n", GetId());
fflush(stdout);
@@ -4880,17 +4883,19 @@ public:
}
private:
wxMutex *m_mutex;
wxCondition *m_condition;
};
static void TestThreadConditions()
{
wxCondition condition;
wxMutex mutex;
wxCondition condition(mutex);
// otherwise its difficult to understand which log messages pertain to
// which condition
wxLogTrace("thread", "Local condition var is %08x, gs_cond = %08x",
condition.GetId(), gs_cond.GetId());
//wxLogTrace("thread", "Local condition var is %08x, gs_cond = %08x",
// condition.GetId(), gs_cond.GetId());
// create and launch threads
MyWaitingThread *threads[10];
@@ -4898,7 +4903,7 @@ static void TestThreadConditions()
size_t n;
for ( n = 0; n < WXSIZEOF(threads); n++ )
{
threads[n] = new MyWaitingThread(&condition);
threads[n] = new MyWaitingThread( &mutex, &condition );
}
for ( n = 0; n < WXSIZEOF(threads); n++ )
@@ -4944,6 +4949,102 @@ static void TestThreadConditions()
wxThread::Sleep(500);
}
#include "wx/utils.h"
class MyExecThread : public wxThread
{
public:
MyExecThread(const wxString& command) : wxThread(wxTHREAD_JOINABLE),
m_command(command)
{
Create();
}
virtual ExitCode Entry()
{
return (ExitCode)wxExecute(m_command, wxEXEC_SYNC);
}
private:
wxString m_command;
};
static void TestThreadExec()
{
wxPuts(_T("*** Testing wxExecute interaction with threads ***\n"));
MyExecThread thread(_T("true"));
thread.Run();
wxPrintf(_T("Main program exit code: %ld.\n"),
wxExecute(_T("false"), wxEXEC_SYNC));
wxPrintf(_T("Thread exit code: %ld.\n"), (long)thread.Wait());
}
// semaphore tests
#include "wx/datetime.h"
class MySemaphoreThread : public wxThread
{
public:
MySemaphoreThread(int i, wxSemaphore *sem)
: wxThread(wxTHREAD_JOINABLE),
m_sem(sem),
m_i(i)
{
Create();
}
virtual ExitCode Entry()
{
wxPrintf(_T("%s: Thread %d starting to wait for semaphore...\n"),
wxDateTime::Now().FormatTime().c_str(), m_i);
m_sem->Wait();
wxPrintf(_T("%s: Thread %d acquired the semaphore.\n"),
wxDateTime::Now().FormatTime().c_str(), m_i);
Sleep(1000);
wxPrintf(_T("%s: Thread %d releasing the semaphore.\n"),
wxDateTime::Now().FormatTime().c_str(), m_i);
m_sem->Post();
return 0;
}
private:
wxSemaphore *m_sem;
int m_i;
};
WX_DEFINE_ARRAY(wxThread *, ArrayThreads);
static void TestSemaphore()
{
wxPuts(_T("*** Testing wxSemaphore class. ***"));
static const int SEM_LIMIT = 3;
wxSemaphore sem(SEM_LIMIT, SEM_LIMIT);
ArrayThreads threads;
for ( int i = 0; i < 3*SEM_LIMIT; i++ )
{
threads.Add(new MySemaphoreThread(i, &sem));
threads.Last()->Run();
}
for ( size_t n = 0; n < threads.GetCount(); n++ )
{
threads[n]->Wait();
delete threads[n];
}
}
#endif // TEST_THREADS
// ----------------------------------------------------------------------------
@@ -5851,9 +5952,11 @@ int main(int argc, char **argv)
TestJoinableThreads();
TestThreadSuspend();
TestThreadDelete();
TestThreadConditions();
TestThreadExec();
}
TestThreadConditions();
TestSemaphore();
#endif // TEST_THREADS
#ifdef TEST_TIMER