]> git.saurik.com Git - apple/icu.git/blobdiff - icuSources/test/intltest/simplethread.cpp
ICU-64232.0.1.tar.gz
[apple/icu.git] / icuSources / test / intltest / simplethread.cpp
old mode 100644 (file)
new mode 100755 (executable)
index 10b635d..4f833bb
  * others. All Rights Reserved.
  ********************************************************************/
 
-#if defined(hpux)
-# ifndef _INCLUDE_POSIX_SOURCE
-#  define _INCLUDE_POSIX_SOURCE
-# endif
-#endif
-
-/* Define __EXTENSIONS__ for Solaris and old friends in strict mode. */
-#ifndef __EXTENSIONS__
-#define __EXTENSIONS__
-#endif
-
-// Defines _XOPEN_SOURCE for access to POSIX functions.
-// Must be before any other #includes.
-#include "uposixdefs.h"
 
 #include "simplethread.h"
 
+#include <thread>
 #include "unicode/utypes.h"
-#include "unicode/ustring.h"
-#include "umutex.h"
-#include "cmemory.h"
-#include "cstring.h"
-#include "uparse.h"
-#include "unicode/resbund.h"
-#include "unicode/udata.h"
-#include "unicode/uloc.h"
-#include "unicode/locid.h"
-#include "putilimp.h"
 #include "intltest.h"
 
-#include <stdio.h>
-#include <string.h>
-#include <ctype.h>    // tolower, toupper
-
-#if U_PLATFORM_USES_ONLY_WIN32_API
-    /* Prefer native Windows APIs even if POSIX is implemented (i.e., on Cygwin). */
-#   undef POSIX
-#elif U_PLATFORM_IMPLEMENTS_POSIX
-#   define POSIX
-#else
-#   undef POSIX
-#endif
-
-/* Needed by z/OS to get usleep */
-#if U_PLATFORM == U_PF_OS390
-#define __DOT1 1
-#ifndef __UU
-#   define __UU
-#endif
-#ifndef _XPG4_2
-#   define _XPG4_2
-#endif
-#include <unistd.h>
-#endif
-
-#if defined(POSIX)
-#define HAVE_IMP
-
-#include <pthread.h>
-
-#if U_PLATFORM == U_PF_OS390
-#include <sys/types.h>
-#endif
-
-#if U_PLATFORM != U_PF_OS390
-#include <signal.h>
-#endif
-
-/* Define _XPG4_2 for Solaris and friends. */
-#ifndef _XPG4_2
-#define _XPG4_2
-#endif
-
-/* Define __USE_XOPEN_EXTENDED for Linux and glibc. */
-#ifndef __USE_XOPEN_EXTENDED
-#define __USE_XOPEN_EXTENDED 
-#endif
-
-/* Define _INCLUDE_XOPEN_SOURCE_EXTENDED for HP/UX (11?). */
-#ifndef _INCLUDE_XOPEN_SOURCE_EXTENDED
-#define _INCLUDE_XOPEN_SOURCE_EXTENDED
-#endif
-
-#include <unistd.h>
-
-#endif
-/* HPUX */
-#ifdef sleep
-#undef sleep
-#endif
-
-
-#include "unicode/putil.h"
 
-/* for mthreadtest*/
-#include "unicode/numfmt.h"
-#include "unicode/choicfmt.h"
-#include "unicode/msgfmt.h"
-#include "unicode/locid.h"
-#include "unicode/ucol.h"
-#include "unicode/calendar.h"
-#include "ucaconf.h"
-
-#if U_PLATFORM_USES_ONLY_WIN32_API
-#define HAVE_IMP
-
-#   define VC_EXTRALEAN
-#   define WIN32_LEAN_AND_MEAN
-#   define NOUSER
-#   define NOSERVICE
-#   define NOIME
-#   define NOMCX
-#include <windows.h>
-#include <process.h>
-
-//-----------------------------------------------------------------------------------
-//
-//   class SimpleThread   Windows Implementation
-//
-//-----------------------------------------------------------------------------------
-struct Win32ThreadImplementation
-{
-    HANDLE         fHandle;
-    unsigned int   fThreadID;
-};
-
-
-extern "C" unsigned int __stdcall SimpleThreadProc(void *arg)
-{
-    ((SimpleThread*)arg)->run();
-    return 0;
+SimpleThread::SimpleThread() {
 }
 
-SimpleThread::SimpleThread()
-:fImplementation(0)
-{
-    Win32ThreadImplementation *imp = new Win32ThreadImplementation;
-    imp->fHandle = 0;
-    fImplementation = imp;
+SimpleThread::~SimpleThread() {
+    this->join();     // Avoid crashes if user neglected to join().
 }
 
-SimpleThread::~SimpleThread()
-{
-    // Destructor.  Because we start the thread running with _beginthreadex(),
-    //              we own the Windows HANDLE for the thread and must 
-    //              close it here.
-    Win32ThreadImplementation *imp = (Win32ThreadImplementation*)fImplementation;
-    if (imp != 0) {
-        if (imp->fHandle != 0) {
-            CloseHandle(imp->fHandle);
-            imp->fHandle = 0;
-        }
-    }
-    delete (Win32ThreadImplementation*)fImplementation;
-}
-
-int32_t SimpleThread::start()
-{
-    Win32ThreadImplementation *imp = (Win32ThreadImplementation*)fImplementation;
-    if(imp->fHandle != NULL) {
-        // The thread appears to have already been started.
-        //   This is probably an error on the part of our caller.
-        return -1;
-    }
-
-    imp->fHandle = (HANDLE) _beginthreadex(
-        NULL,                                 // Security    
-        0x20000,                              // Stack Size 
-        SimpleThreadProc,                     // Function to Run
-        (void *)this,                         // Arg List
-        0,                                    // initflag.  Start running, not suspended
-        &imp->fThreadID                       // thraddr
-        );
-
-    if (imp->fHandle == 0) {
-        // An error occured
-        int err = errno;
-        if (err == 0) {
-            err = -1;
-        }
-        return err;
-    }
-    return 0;
+int SimpleThread::start() {
+    fThread = std::thread(&SimpleThread::run, this);
+    return fThread.joinable() ? 0 : 1;
 }
 
-
 void SimpleThread::join() {
-    Win32ThreadImplementation *imp = (Win32ThreadImplementation*)fImplementation;
-    if (imp->fHandle == 0) {
-        // No handle, thread must not be running.
-        return;
+    if (fThread.joinable()) {
+        fThread.join();
     }
-    WaitForSingleObject(imp->fHandle, INFINITE);
 }
 
-#endif
-
-
-//-----------------------------------------------------------------------------------
-//
-//   class SimpleThread   POSIX implementation
-//
-//-----------------------------------------------------------------------------------
-#if defined(POSIX)
-#define HAVE_IMP
-
-struct PosixThreadImplementation
-{
-    pthread_t        fThread;
-};
-
-extern "C" void* SimpleThreadProc(void *arg)
-{
-    // This is the code that is run in the new separate thread.
-    SimpleThread *This = (SimpleThread *)arg;
-    This->run();
-    return 0;
-}
-
-SimpleThread::SimpleThread() 
-{
-    PosixThreadImplementation *imp = new PosixThreadImplementation;
-    fImplementation = imp;
-}
-
-SimpleThread::~SimpleThread()
-{
-    PosixThreadImplementation *imp = (PosixThreadImplementation*)fImplementation;
-    delete imp;
-    fImplementation = (void *)0xdeadbeef;
-}
-
-int32_t SimpleThread::start()
-{
-    int32_t        rc;
-    static pthread_attr_t attr;
-    static UBool attrIsInitialized = FALSE;
-
-    PosixThreadImplementation *imp = (PosixThreadImplementation*)fImplementation;
-
-    if (attrIsInitialized == FALSE) {
-        rc = pthread_attr_init(&attr);
-#if U_PLATFORM == U_PF_OS390
-        {
-            int detachstate = 0;  // jdc30: detach state of zero causes
-                                  //threads created with this attr to be in
-                                  //an undetached state.  An undetached
-                                  //thread will keep its resources after
-                                  //termination.
-            pthread_attr_setdetachstate(&attr, &detachstate);
-        }
-#else
-        // pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
-        pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
-#endif
-        attrIsInitialized = TRUE;
-    }
-    rc = pthread_create(&(imp->fThread), &attr, &SimpleThreadProc, (void*)this);
-    
-    if (rc != 0) {
-        // some kind of error occured, the thread did not start.
-    }
-
-    return rc;
-}
-
-void SimpleThread::join() {
-    PosixThreadImplementation *imp = (PosixThreadImplementation*)fImplementation;
-    pthread_join(imp->fThread, NULL);
-}
-
-#endif
-// end POSIX
-
-
-#ifndef HAVE_IMP
-#error  No implementation for threads! Cannot test.
-#endif
 
 
 class ThreadPoolThread: public SimpleThread {
@@ -337,6 +85,3 @@ ThreadPoolBase::~ThreadPoolBase() {
         fThreads = NULL;
     }
 }
-
-
-