X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0e2c5534fe8321fe192e77c764307b23a9c361ac..c3016fd626994c6f9f555e03076a497eb1f5797c:/samples/console/console.cpp diff --git a/samples/console/console.cpp b/samples/console/console.cpp index 96f432813c..7a9e0bb1af 100644 --- a/samples/console/console.cpp +++ b/samples/console/console.cpp @@ -91,7 +91,7 @@ #undef TEST_ALL static const bool TEST_ALL = TRUE; #else - #define TEST_VOLUME + #define TEST_FILENAME static const bool TEST_ALL = FALSE; #endif @@ -184,11 +184,11 @@ static void TestCharset() for ( size_t n = 0; n < WXSIZEOF(charsets); n++ ) { - wxFontEncoding enc = wxTheFontMapper->CharsetToEncoding(charsets[n]); + wxFontEncoding enc = wxFontMapper::Get()->CharsetToEncoding(charsets[n]); wxPrintf(_T("Charset: %s\tEncoding: %s (%s)\n"), charsets[n], - wxTheFontMapper->GetEncodingName(enc).c_str(), - wxTheFontMapper->GetEncodingDescription(enc).c_str()); + wxFontMapper::Get()->GetEncodingName(enc).c_str(), + wxFontMapper::Get()->GetEncodingDescription(enc).c_str()); } } @@ -802,6 +802,8 @@ static struct FileNameInfo { _T("c:\\Windows\\command.com"), _T("c"), _T("\\Windows"), _T("command"), _T("com"), TRUE, wxPATH_DOS }, { _T("\\\\server\\foo.bar"), _T("server"), _T("\\"), _T("foo"), _T("bar"), TRUE, wxPATH_DOS }, + // wxFileName support for Mac file names is broken currently +#if 0 // Mac file names { _T("Volume:Dir:File"), _T("Volume"), _T("Dir"), _T("File"), _T(""), TRUE, wxPATH_MAC }, { _T("Volume:Dir:Subdir:File"), _T("Volume"), _T("Dir:Subdir"), _T("File"), _T(""), TRUE, wxPATH_MAC }, @@ -809,6 +811,7 @@ static struct FileNameInfo { _T(":Dir:File"), _T(""), _T("Dir"), _T("File"), _T(""), FALSE, wxPATH_MAC }, { _T(":File.Ext"), _T(""), _T(""), _T("File"), _T(".Ext"), FALSE, wxPATH_MAC }, { _T("File.Ext"), _T(""), _T(""), _T("File"), _T(".Ext"), FALSE, wxPATH_MAC }, +#endif // 0 // VMS file names { _T("device:[dir1.dir2.dir3]file.txt"), _T("device"), _T("dir1.dir2.dir3"), _T("file"), _T("txt"), TRUE, wxPATH_VMS }, @@ -831,7 +834,7 @@ static void TestFileNameConstruction() printf("ERROR: fullname should be '%s'\n", fni.fullname); } - bool isAbsolute = fn.IsAbsolute(); + bool isAbsolute = fn.IsAbsolute(fni.format); printf("'%s' is %s (%s)\n\t", fullname.c_str(), isAbsolute ? "absolute" : "relative", @@ -884,17 +887,25 @@ static void TestFileNameTemp() static const char *tmpprefixes[] = { + "", "foo", - "/tmp/foo", "..", "../bar", +#ifdef __UNIX__ + "/tmp/foo", "/tmp/foo/bar", // this one must be an error +#endif // __UNIX__ }; for ( size_t n = 0; n < WXSIZEOF(tmpprefixes); n++ ) { wxString path = wxFileName::CreateTempFileName(tmpprefixes[n]); - if ( !path.empty() ) + if ( path.empty() ) + { + // "error" is not in upper case because it may be ok + printf("Prefix '%s'\t-> error\n", tmpprefixes[n]); + } + else { printf("Prefix '%s'\t-> temp file '%s'\n", tmpprefixes[n], path.c_str()); @@ -4621,7 +4632,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 { @@ -4709,7 +4720,7 @@ void MyDetachedThread::OnExit() wxCriticalSectionLocker lock(gs_critsect); if ( !--gs_counter && !m_cancelled ) - gs_cond.Signal(); + gs_cond.Post(); } static void TestDetachedThreads() @@ -4848,8 +4859,9 @@ static void TestThreadDelete() class MyWaitingThread : public wxThread { public: - MyWaitingThread(wxCondition *condition) + MyWaitingThread( wxMutex *mutex, wxCondition *condition ) { + m_mutex = mutex; m_condition = condition; Create(); @@ -4860,12 +4872,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); @@ -4874,17 +4888,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]; @@ -4892,7 +4908,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++ ) @@ -4938,6 +4954,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 // ---------------------------------------------------------------------------- @@ -5693,7 +5805,7 @@ int main(int argc, char **argv) #endif // TEST_FILE #ifdef TEST_FILENAME - if ( 1 ) + if ( 0 ) { wxFileName fn; fn.Assign("c:\\foo", "bar.baz"); @@ -5701,7 +5813,7 @@ int main(int argc, char **argv) DumpFileName(fn); } - if ( TEST_ALL ) + if ( 1 ) { TestFileNameConstruction(); TestFileNameMakeRelative(); @@ -5845,9 +5957,11 @@ int main(int argc, char **argv) TestJoinableThreads(); TestThreadSuspend(); TestThreadDelete(); + TestThreadConditions(); + TestThreadExec(); } - TestThreadConditions(); + TestSemaphore(); #endif // TEST_THREADS #ifdef TEST_TIMER