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