16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/********************************************************************
26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * COPYRIGHT:
36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Copyright (c) 1999-2013, International Business Machines Corporation and
46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * others. All Rights Reserved.
56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ********************************************************************/
66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if defined(hpux)
86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org# ifndef _INCLUDE_POSIX_SOURCE
96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#  define _INCLUDE_POSIX_SOURCE
106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org# endif
116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* Define __EXTENSIONS__ for Solaris and old friends in strict mode. */
146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifndef __EXTENSIONS__
156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define __EXTENSIONS__
166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Defines _XOPEN_SOURCE for access to POSIX functions.
196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Must be before any other #includes.
206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "uposixdefs.h"
216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "simplethread.h"
236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/utypes.h"
256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/ustring.h"
266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "umutex.h"
276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cmemory.h"
286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cstring.h"
296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "uparse.h"
306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/resbund.h"
316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/udata.h"
326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/uloc.h"
336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/locid.h"
346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "putilimp.h"
356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "intltest.h"
366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <stdio.h>
386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <string.h>
396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <ctype.h>    // tolower, toupper
406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if U_PLATFORM_USES_ONLY_WIN32_API
426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Prefer native Windows APIs even if POSIX is implemented (i.e., on Cygwin). */
436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#   undef POSIX
446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#elif U_PLATFORM_IMPLEMENTS_POSIX
456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#   define POSIX
466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#else
476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#   undef POSIX
486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* Needed by z/OS to get usleep */
516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if U_PLATFORM == U_PF_OS390
526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define __DOT1 1
536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifndef __UU
546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#   define __UU
556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifndef _XPG4_2
576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#   define _XPG4_2
586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <unistd.h>
606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if defined(POSIX)
636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define HAVE_IMP
646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if (ICU_USE_THREADS == 1)
666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <pthread.h>
676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if defined(__hpux) && defined(HPUX_CMA)
706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org# if defined(read)  // read being defined as cma_read causes trouble with iostream::read
716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#  undef read
726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org# endif
736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if U_PLATFORM == U_PF_OS390
766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <sys/types.h>
776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if U_PLATFORM != U_PF_OS390
806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <signal.h>
816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* Define _XPG4_2 for Solaris and friends. */
846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifndef _XPG4_2
856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define _XPG4_2
866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* Define __USE_XOPEN_EXTENDED for Linux and glibc. */
896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifndef __USE_XOPEN_EXTENDED
906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define __USE_XOPEN_EXTENDED
916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* Define _INCLUDE_XOPEN_SOURCE_EXTENDED for HP/UX (11?). */
946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifndef _INCLUDE_XOPEN_SOURCE_EXTENDED
956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define _INCLUDE_XOPEN_SOURCE_EXTENDED
966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <unistd.h>
996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* HPUX */
1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifdef sleep
1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#undef sleep
1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if (ICU_USE_THREADS==0)
1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    SimpleThread::SimpleThread()
1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {}
1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    SimpleThread::~SimpleThread()
1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {}
1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t
1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    SimpleThread::start()
1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { return -1; }
1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    void
1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    SimpleThread::run()
1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {}
1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    void
1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    SimpleThread::sleep(int32_t millis)
1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {}
1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool
1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    SimpleThread::isRunning() {
1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return FALSE;
1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#else
1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/putil.h"
1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* for mthreadtest*/
1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/numfmt.h"
1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/choicfmt.h"
1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/msgfmt.h"
1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/locid.h"
1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/ucol.h"
1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/calendar.h"
1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "ucaconf.h"
1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if U_PLATFORM_USES_ONLY_WIN32_API
1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define HAVE_IMP
1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#   define VC_EXTRALEAN
1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#   define WIN32_LEAN_AND_MEAN
1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#   define NOUSER
1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#   define NOSERVICE
1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#   define NOIME
1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#   define NOMCX
1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <windows.h>
1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <process.h>
1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//-----------------------------------------------------------------------------------
1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//
1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//   class SimpleThread   Windows Implementation
1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//
1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//-----------------------------------------------------------------------------------
1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstruct Win32ThreadImplementation
1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    HANDLE         fHandle;
1636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    unsigned int   fThreadID;
1646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
1656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgextern "C" unsigned int __stdcall SimpleThreadProc(void *arg)
1686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
1696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ((SimpleThread*)arg)->run();
1706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return 0;
1716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgSimpleThread::SimpleThread()
1746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org:fImplementation(0)
1756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
1766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    Win32ThreadImplementation *imp = new Win32ThreadImplementation;
1776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    imp->fHandle = 0;
1786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fImplementation = imp;
1796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgSimpleThread::~SimpleThread()
1826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
1836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // Destructor.  Because we start the thread running with _beginthreadex(),
1846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //              we own the Windows HANDLE for the thread and must
1856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //              close it here.
1866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    Win32ThreadImplementation *imp = (Win32ThreadImplementation*)fImplementation;
1876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (imp != 0) {
1886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (imp->fHandle != 0) {
1896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            CloseHandle(imp->fHandle);
1906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            imp->fHandle = 0;
1916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
1926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete (Win32ThreadImplementation*)fImplementation;
1946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgint32_t SimpleThread::start()
1976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
1986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    Win32ThreadImplementation *imp = (Win32ThreadImplementation*)fImplementation;
1996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(imp->fHandle != NULL) {
2006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // The thread appears to have already been started.
2016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        //   This is probably an error on the part of our caller.
2026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return -1;
2036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    imp->fHandle = (HANDLE) _beginthreadex(
2066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        NULL,                                 // Security
2076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x20000,                              // Stack Size
2086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        SimpleThreadProc,                     // Function to Run
2096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        (void *)this,                         // Arg List
2106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0,                                    // initflag.  Start running, not suspended
2116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        &imp->fThreadID                       // thraddr
2126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        );
2136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (imp->fHandle == 0) {
2156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // An error occured
2166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int err = errno;
2176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (err == 0) {
2186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            err = -1;
2196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
2206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return err;
2216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return 0;
2236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUBool  SimpleThread::isRunning() {
2276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //
2286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //  Test whether the thread associated with the SimpleThread object is
2296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //    still actually running.
2306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //
2316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //  NOTE:  on Win64 on Itanium processors, a crashes
2326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //    occur if the main thread of a process exits concurrently with some
2336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //    other thread(s) exiting.  To avoid the possibility, we wait until the
2346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //    OS indicates that all threads have  terminated, rather than waiting
2356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //    only until the end of the user's Run function has been reached.
2366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //
2376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //   I don't know whether the crashes represent a Windows bug, or whether
2386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //    main() programs are supposed to have to wait for their threads.
2396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //
2406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    Win32ThreadImplementation *imp = (Win32ThreadImplementation*)fImplementation;
2416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    bool      success;
2436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    DWORD     threadExitCode;
2446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (imp->fHandle == 0) {
2466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // No handle, thread must not be running.
2476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return FALSE;
2486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    success = GetExitCodeThread(imp->fHandle,   &threadExitCode) != 0;
2506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (! success) {
2516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // Can't get status, thread must not be running.
2526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return FALSE;
2536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return (threadExitCode == STILL_ACTIVE);
2556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid SimpleThread::sleep(int32_t millis)
2596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
2606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ::Sleep(millis);
2616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//-----------------------------------------------------------------------------------
2646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//
2656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//   class SimpleThread   NULL  Implementation
2666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//
2676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//-----------------------------------------------------------------------------------
2686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#elif U_PLATFORM == U_PF_CLASSIC_MACOS
2696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// since the Mac has no preemptive threading (at least on MacOS 8), only
2716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// cooperative threading, threads are a no-op.  We have no yield() calls
2726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// anywhere in the ICU, so we are guaranteed to be thread-safe.
2736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define HAVE_IMP
2756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgSimpleThread::SimpleThread()
2776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{}
2786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgSimpleThread::~SimpleThread()
2806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{}
2816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgint32_t
2836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgSimpleThread::start()
2846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ return 0; }
2856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid
2876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgSimpleThread::run()
2886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{}
2896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid
2916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgSimpleThread::sleep(int32_t millis)
2926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{}
2936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUBool
2956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgSimpleThread::isRunning() {
2966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return FALSE;
2976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
3006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//-----------------------------------------------------------------------------------
3036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//
3046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//   class SimpleThread   POSIX implementation
3056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//
3066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//        A note on the POSIX vs the Windows implementations of this class..
3076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//        On Windows, the main thread must verify that other threads have finished
3086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//        before exiting, or crashes occasionally occur.  (Seen on Itanium Win64 only)
3096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//        The function SimpleThread::isRunning() is used for this purpose.
3106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//
3116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//        On POSIX, there is NO reliable non-blocking mechanism to determine
3126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//        whether a thread has exited.  pthread_kill(thread, 0) almost works,
3136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//        but the system can recycle thread ids immediately, so seeing that a
3146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//        thread exists with this call could mean that the original thread has
3156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//        finished and a new one started with the same ID.  Useless.
3166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//
3176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//        So we need to do the check with user code, by setting a flag just before
3186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//        the thread function returns.  A technique that is guaranteed to fail
3196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//        on Windows, because it indicates that the thread is done before all
3206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//        system level cleanup has happened.
3216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//
3226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//-----------------------------------------------------------------------------------
3236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if defined(POSIX)
3246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define HAVE_IMP
3256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstruct PosixThreadImplementation
3276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
3286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pthread_t        fThread;
3296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool            fRunning;
3306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool            fRan;          // True if the thread was successfully started
3316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
3326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgextern "C" void* SimpleThreadProc(void *arg)
3346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
3356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // This is the code that is run in the new separate thread.
3366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    SimpleThread *This = (SimpleThread *)arg;
3376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    This->run();      // Run the user code.
3386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // The user function has returned.  Set the flag indicating that this thread
3406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // is done.  Need a mutex for memory barrier purposes only, so that other thread
3416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //   will reliably see that the flag has changed.
3426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    PosixThreadImplementation *imp = (PosixThreadImplementation*)This->fImplementation;
3436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    umtx_lock(NULL);
3446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    imp->fRunning = FALSE;
3456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    umtx_unlock(NULL);
3466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return 0;
3476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgSimpleThread::SimpleThread()
3506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
3516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    PosixThreadImplementation *imp = new PosixThreadImplementation;
3526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    imp->fRunning   = FALSE;
3536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    imp->fRan       = FALSE;
3546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fImplementation = imp;
3556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgSimpleThread::~SimpleThread()
3586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
3596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    PosixThreadImplementation *imp = (PosixThreadImplementation*)fImplementation;
3606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (imp->fRan) {
3616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        pthread_join(imp->fThread, NULL);
3626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete imp;
3646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fImplementation = (void *)0xdeadbeef;
3656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgint32_t SimpleThread::start()
3686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
3696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t        rc;
3706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static pthread_attr_t attr;
3716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static UBool attrIsInitialized = FALSE;
3726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    PosixThreadImplementation *imp = (PosixThreadImplementation*)fImplementation;
3746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    imp->fRunning = TRUE;
3756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    imp->fRan     = TRUE;
3766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifdef HPUX_CMA
3786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (attrIsInitialized == FALSE) {
3796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        rc = pthread_attr_create(&attr);
3806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        attrIsInitialized = TRUE;
3816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    rc = pthread_create(&(imp->fThread),attr,&SimpleThreadProc,(void*)this);
3836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#else
3846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (attrIsInitialized == FALSE) {
3856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        rc = pthread_attr_init(&attr);
3866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if U_PLATFORM == U_PF_OS390
3876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {
3886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int detachstate = 0;  // jdc30: detach state of zero causes
3896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                  //threads created with this attr to be in
3906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                  //an undetached state.  An undetached
3916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                  //thread will keep its resources after
3926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                  //termination.
3936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            pthread_attr_setdetachstate(&attr, &detachstate);
3946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
3956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#else
3966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
3976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
3986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
3996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        attrIsInitialized = TRUE;
4006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    rc = pthread_create(&(imp->fThread),&attr,&SimpleThreadProc,(void*)this);
4026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
4036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (rc != 0) {
4056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // some kind of error occured, the thread did not start.
4066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        imp->fRan     = FALSE;
4076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        imp->fRunning = FALSE;
4086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return rc;
4116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
4126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUBool
4156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgSimpleThread::isRunning() {
4166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // Note:  Mutex functions are used here not for synchronization,
4176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //        but to force memory barriors to exist, to ensure that one thread
4186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //        can see changes made by another when running on processors
4196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //        with memory models having weak coherency.
4206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    PosixThreadImplementation *imp = (PosixThreadImplementation*)fImplementation;
4216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    umtx_lock(NULL);
4226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool retVal = imp->fRunning;
4236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    umtx_unlock(NULL);
4246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return retVal;
4256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
4266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid SimpleThread::sleep(int32_t millis)
4296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
4306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if U_PLATFORM == U_PF_SOLARIS
4316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    sigignore(SIGALRM);
4326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
4336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifdef HPUX_CMA
4356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cma_sleep(millis/100);
4366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#elif U_PLATFORM == U_PF_HPUX || U_PLATFORM == U_PF_OS390
4376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    millis *= 1000;
4386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    while(millis >= 1000000) {
4396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        usleep(999999);
4406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        millis -= 1000000;
4416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(millis > 0) {
4436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        usleep(millis);
4446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#else
4466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usleep(millis * 1000);
4476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
4486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
4496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
4516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// end POSIX
4526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifndef HAVE_IMP
4556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#error  No implementation for threads! Cannot test.
4566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org0 = 216; //die
4576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
4586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//-------------------------------------------------------------------------------------------
4606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//
4616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// class ThreadWithStatus - a thread that we can check the status and error condition of
4626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//
4636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//-------------------------------------------------------------------------------------------
4646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass ThreadWithStatus : public SimpleThread
4656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
4666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic:
4676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool  getError() { return (fErrors > 0); }
4686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool  getError(UnicodeString& fillinError) { fillinError = fErrorString; return (fErrors > 0); }
4696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual ~ThreadWithStatus(){}
4706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgprotected:
4716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ThreadWithStatus() :  fErrors(0) {}
4726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    void error(const UnicodeString &error) {
4736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fErrors++; fErrorString = error;
4746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        SimpleThread::errorFunc();
4756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    void error() { error("An error occured."); }
4776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgprivate:
4786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t fErrors;
4796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString fErrorString;
4806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
4816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif // ICU_USE_THREADS
483