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#include "simplethread.h" 146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/utypes.h" 166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/ustring.h" 176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "umutex.h" 186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cmemory.h" 196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cstring.h" 206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "uparse.h" 216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/localpointer.h" 226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/resbund.h" 236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/udata.h" 246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/uloc.h" 256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/locid.h" 266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "putilimp.h" 276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "intltest.h" 286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "tsmthred.h" 296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/ushape.h" 306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if U_PLATFORM_USES_ONLY_WIN32_API 336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* Prefer native Windows APIs even if POSIX is implemented (i.e., on Cygwin). */ 346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org# undef POSIX 356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#elif U_PLATFORM_IMPLEMENTS_POSIX 366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org# define POSIX 376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#else 386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org# undef POSIX 396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif 406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0])) 436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* Needed by z/OS to get usleep */ 446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if U_PLATFORM == U_PF_OS390 456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define __DOT1 1 466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define __UU 476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifndef _XPG4_2 486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define _XPG4_2 496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif 506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <unistd.h> 516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif 526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if defined(POSIX) 536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define HAVE_IMP 556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if (ICU_USE_THREADS == 1) 576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <pthread.h> 586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif 596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if defined(__hpux) && defined(HPUX_CMA) 616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org# if defined(read) // read being defined as cma_read causes trouble with iostream::read 626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org# undef read 636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org# endif 646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif 656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* Define __EXTENSIONS__ for Solaris and old friends in strict mode. */ 676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifndef __EXTENSIONS__ 686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define __EXTENSIONS__ 696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif 706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if U_PLATFORM == U_PF_OS390 726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <sys/types.h> 736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif 746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if U_PLATFORM != U_PF_OS390 766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <signal.h> 776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif 786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* Define _XPG4_2 for Solaris and friends. */ 806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifndef _XPG4_2 816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define _XPG4_2 826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif 836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* Define __USE_XOPEN_EXTENDED for Linux and glibc. */ 856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifndef __USE_XOPEN_EXTENDED 866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define __USE_XOPEN_EXTENDED 876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif 886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* Define _INCLUDE_XOPEN_SOURCE_EXTENDED for HP/UX (11?). */ 906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifndef _INCLUDE_XOPEN_SOURCE_EXTENDED 916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define _INCLUDE_XOPEN_SOURCE_EXTENDED 926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif 936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <unistd.h> 956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif 976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* HPUX */ 986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifdef sleep 996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#undef sleep 1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif 1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define TSMTHREAD_FAIL(msg) errln("%s at file %s, line %d", msg, __FILE__, __LINE__) 1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define TSMTHREAD_ASSERT(expr) {if (!(expr)) {TSMTHREAD_FAIL("Fail");}} 1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgMultithreadTest::MultithreadTest() 1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgMultithreadTest::~MultithreadTest() 1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if (ICU_USE_THREADS==0) 1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid MultithreadTest::runIndexedTest( int32_t index, UBool exec, 1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char* &name, char* /*par*/ ) { 1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (exec) logln("TestSuite MultithreadTest: "); 1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(index == 0) 1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org name = "NO_THREADED_TESTS"; 1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org else 1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org name = ""; 1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(exec) { logln("MultithreadTest - test DISABLED. ICU_USE_THREADS set to 0, check your configuration if this is a problem.."); 1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#else 1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <stdio.h> 1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <string.h> 1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <ctype.h> // tolower, toupper 1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/putil.h" 1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// for mthreadtest 1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/numfmt.h" 1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/choicfmt.h" 1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/msgfmt.h" 1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/locid.h" 1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/coll.h" 1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/calendar.h" 1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "ucaconf.h" 1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid SimpleThread::errorFunc() { 1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // *(char *)0 = 3; // Force entry into a debugger via a crash; 1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid MultithreadTest::runIndexedTest( int32_t index, UBool exec, 1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char* &name, char* /*par*/ ) { 1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (exec) 1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logln("TestSuite MultithreadTest: "); 1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org switch (index) { 1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 0: 1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org name = "TestThreads"; 1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (exec) 1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TestThreads(); 1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 1: 1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org name = "TestMutex"; 1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (exec) 1636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TestMutex(); 1646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 1656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 2: 1676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org name = "TestThreadedIntl"; 1686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_FORMATTING 1696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (exec) { 1706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TestThreadedIntl(); 1716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif 1736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 1746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 3: 1766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org name = "TestCollators"; 1776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_COLLATION 1786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (exec) { 1796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TestCollators(); 1806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif /* #if !UCONFIG_NO_COLLATION */ 1826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 1836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 4: 1856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org name = "TestString"; 1866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (exec) { 1876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TestString(); 1886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 1906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 5: 1926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org name = "TestArabicShapingThreads"; 1936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (exec) { 1946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TestArabicShapingThreads(); 1956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 1976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org default: 2006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org name = ""; 2016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; //needed to end loop 2026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//----------------------------------------------------------------------------------- 2076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// 2086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// TestThreads -- see if threads really work at all. 2096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// 2106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Set up N threads pointing at N chars. When they are started, they will 2116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// each sleep 1 second and then set their chars. At the end we make sure they 2126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// are all set. 2136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// 2146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//----------------------------------------------------------------------------------- 2156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define THREADTEST_NRTHREADS 8 2166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define ARABICSHAPE_THREADTEST 30 2176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass TestThreadsThread : public SimpleThread 2196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 2206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic: 2216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TestThreadsThread(char* whatToChange) { fWhatToChange = whatToChange; } 2226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual void run() { SimpleThread::sleep(1000); 2236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Mutex m; 2246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *fWhatToChange = '*'; 2256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgprivate: 2276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char *fWhatToChange; 2286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 2296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//----------------------------------------------------------------------------------- 2306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// 2316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// TestArabicShapeThreads -- see if calls to u_shapeArabic in many threads works successfully 2326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// 2336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Set up N threads pointing at N chars. When they are started, they will make calls to doTailTest which tests 2346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// u_shapeArabic, if the calls are successful it will the set * chars. 2356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// At the end we make sure all threads managed to run u_shapeArabic successfully. 2366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// This is a unit test for ticket 9473 2376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// 2386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//----------------------------------------------------------------------------------- 2396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass TestArabicShapeThreads : public SimpleThread 2406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 2416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic: 2426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TestArabicShapeThreads(char* whatToChange) { fWhatToChange = whatToChange;} 2436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual void run() { 2446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(doTailTest()==TRUE) 2456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *fWhatToChange = '*'; 2466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgprivate: 2486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char *fWhatToChange; 2496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool doTailTest(void) { 2516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const UChar src[] = { 0x0020, 0x0633, 0 }; 2526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const UChar dst_old[] = { 0xFEB1, 0x200B,0 }; 2536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const UChar dst_new[] = { 0xFEB1, 0xFE73,0 }; 2546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar dst[3] = { 0x0000, 0x0000,0 }; 2556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t length; 2566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status; 2576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org IntlTest inteltst = IntlTest(); 2586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status = U_ZERO_ERROR; 2606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length = u_shapeArabic(src, -1, dst, LENGTHOF(dst), 2616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_SHAPE_LETTERS_SHAPE|U_SHAPE_SEEN_TWOCELL_NEAR, &status); 2626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(status)) { 2636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org inteltst.errln("Fail: status %s\n", u_errorName(status)); 2646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return FALSE; 2656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else if(length!=2) { 2666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org inteltst.errln("Fail: len %d expected 3\n", length); 2676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return FALSE; 2686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else if(u_strncmp(dst,dst_old,LENGTHOF(dst))) { 2696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org inteltst.errln("Fail: got U+%04X U+%04X expected U+%04X U+%04X\n", 2706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dst[0],dst[1],dst_old[0],dst_old[1]); 2716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return FALSE; 2726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org //"Trying new tail 2766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status = U_ZERO_ERROR; 2776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length = u_shapeArabic(src, -1, dst, LENGTHOF(dst), 2786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_SHAPE_LETTERS_SHAPE|U_SHAPE_SEEN_TWOCELL_NEAR|U_SHAPE_TAIL_NEW_UNICODE, &status); 2796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(status)) { 2806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org inteltst.errln("Fail: status %s\n", u_errorName(status)); 2816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return FALSE; 2826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else if(length!=2) { 2836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org inteltst.errln("Fail: len %d expected 3\n", length); 2846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return FALSE; 2856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else if(u_strncmp(dst,dst_new,LENGTHOF(dst))) { 2866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org inteltst.errln("Fail: got U+%04X U+%04X expected U+%04X U+%04X\n", 2876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dst[0],dst[1],dst_new[0],dst_new[1]); 2886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return FALSE; 2896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return TRUE; 2936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 2986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid MultithreadTest::TestThreads() 3006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 3016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char threadTestChars[THREADTEST_NRTHREADS + 1]; 3026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org SimpleThread *threads[THREADTEST_NRTHREADS]; 3036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t numThreadsStarted = 0; 3046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t i; 3066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(i=0;i<THREADTEST_NRTHREADS;i++) 3076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 3086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org threadTestChars[i] = ' '; 3096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org threads[i] = new TestThreadsThread(&threadTestChars[i]); 3106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org threadTestChars[THREADTEST_NRTHREADS] = '\0'; 3126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logln("->" + UnicodeString(threadTestChars) + "<- Firing off threads.. "); 3146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(i=0;i<THREADTEST_NRTHREADS;i++) 3156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 3166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (threads[i]->start() != 0) { 3176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("Error starting thread %d", i); 3186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org else { 3206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org numThreadsStarted++; 3216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org SimpleThread::sleep(100); 3236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logln(" Subthread started."); 3246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logln("Waiting for threads to be set.."); 3276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (numThreadsStarted == 0) { 3286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("No threads could be started for testing!"); 3296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 3306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t patience = 40; // seconds to wait 3336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while(patience--) 3356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 3366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t count = 0; 3376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org umtx_lock(NULL); 3386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(i=0;i<THREADTEST_NRTHREADS;i++) 3396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 3406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(threadTestChars[i] == '*') 3416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 3426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org count++; 3436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org umtx_unlock(NULL); 3466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(count == THREADTEST_NRTHREADS) 3486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 3496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logln("->" + UnicodeString(threadTestChars) + "<- Got all threads! cya"); 3506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(i=0;i<THREADTEST_NRTHREADS;i++) 3516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 3526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete threads[i]; 3536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 3556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logln("->" + UnicodeString(threadTestChars) + "<- Waiting.."); 3586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org SimpleThread::sleep(500); 3596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("->" + UnicodeString(threadTestChars) + "<- PATIENCE EXCEEDED!! Still missing some."); 3626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(i=0;i<THREADTEST_NRTHREADS;i++) 3636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 3646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete threads[i]; 3656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 3676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid MultithreadTest::TestArabicShapingThreads() 3706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 3716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char threadTestChars[ARABICSHAPE_THREADTEST + 1]; 3726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org SimpleThread *threads[ARABICSHAPE_THREADTEST]; 3736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t numThreadsStarted = 0; 3746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t i; 3766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(i=0;i<ARABICSHAPE_THREADTEST;i++) 3786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 3796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org threadTestChars[i] = ' '; 3806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org threads[i] = new TestArabicShapeThreads(&threadTestChars[i]); 3816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org threadTestChars[ARABICSHAPE_THREADTEST] = '\0'; 3836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logln("-> do TestArabicShapingThreads <- Firing off threads.. "); 3856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(i=0;i<ARABICSHAPE_THREADTEST;i++) 3866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 3876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (threads[i]->start() != 0) { 3886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("Error starting thread %d", i); 3896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org else { 3916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org numThreadsStarted++; 3926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org //SimpleThread::sleep(100); 3946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logln(" Subthread started."); 3956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logln("Waiting for threads to be set.."); 3986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (numThreadsStarted == 0) { 3996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("No threads could be started for testing!"); 4006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 4016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t patience = 100; // seconds to wait 4046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while(patience--) 4066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 4076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t count = 0; 4086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org umtx_lock(NULL); 4096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(i=0;i<ARABICSHAPE_THREADTEST;i++) 4106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 4116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(threadTestChars[i] == '*') 4126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 4136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org count++; 4146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org umtx_unlock(NULL); 4176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(count == ARABICSHAPE_THREADTEST) 4196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 4206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logln("->TestArabicShapingThreads <- Got all threads! cya"); 4216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(i=0;i<ARABICSHAPE_THREADTEST;i++) 4226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 4236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete threads[i]; 4246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 4266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logln("-> TestArabicShapingThreads <- Waiting.."); 4296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org SimpleThread::sleep(500); 4306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("-> TestArabicShapingThreads <- PATIENCE EXCEEDED!! Still missing some."); 4336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(i=0;i<ARABICSHAPE_THREADTEST;i++) 4346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 4356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete threads[i]; 4366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 4396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//----------------------------------------------------------------------- 4426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// 4436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// TestMutex - a simple (non-stress) test to verify that ICU mutexes 4446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// are actually mutexing. Does not test the use of 4456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// mutexes within ICU services, but rather that the 4466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// platform's mutex support is at least superficially there. 4476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// 4486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//---------------------------------------------------------------------- 4496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UMutex gTestMutexA = U_MUTEX_INITIALIZER; 4506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UMutex gTestMutexB = U_MUTEX_INITIALIZER; 4516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic int gThreadsStarted = 0; 4536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic int gThreadsInMiddle = 0; 4546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic int gThreadsDone = 0; 4556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const int TESTMUTEX_THREAD_COUNT = 4; 4576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic int safeIncr(int &var, int amt) { 4596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Thread safe (using global mutex) increment of a variable. 4606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Return the updated value. 4616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Can also be used as a safe load of a variable by incrementing it by 0. 4626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Mutex m; 4636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org var += amt; 4646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return var; 4656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 4666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass TestMutexThread : public SimpleThread 4686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 4696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic: 4706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual void run() 4716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 4726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // This is the code that each of the spawned threads runs. 4736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // All of the spawned threads bunch up together at each of the two mutexes 4746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // because the main holds the mutexes until they do. 4756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // 4766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org safeIncr(gThreadsStarted, 1); 4776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org umtx_lock(&gTestMutexA); 4786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org umtx_unlock(&gTestMutexA); 4796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org safeIncr(gThreadsInMiddle, 1); 4806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org umtx_lock(&gTestMutexB); 4816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org umtx_unlock(&gTestMutexB); 4826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org safeIncr(gThreadsDone, 1); 4836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 4856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid MultithreadTest::TestMutex() 4876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 4886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Start up the test threads. They should all pile up waiting on 4896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // gTestMutexA, which we (the main thread) hold until the test threads 4906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // all get there. 4916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org gThreadsStarted = 0; 4926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org gThreadsInMiddle = 0; 4936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org gThreadsDone = 0; 4946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org umtx_lock(&gTestMutexA); 4956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TestMutexThread *threads[TESTMUTEX_THREAD_COUNT]; 4966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int i; 4976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t numThreadsStarted = 0; 4986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (i=0; i<TESTMUTEX_THREAD_COUNT; i++) { 4996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org threads[i] = new TestMutexThread; 5006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (threads[i]->start() != 0) { 5016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("Error starting thread %d", i); 5026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org else { 5046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org numThreadsStarted++; 5056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (numThreadsStarted == 0) { 5086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("No threads could be started for testing!"); 5096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 5106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int patience = 0; 5136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while (safeIncr(gThreadsStarted, 0) != TESTMUTEX_THREAD_COUNT) { 5146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (patience++ > 24) { 5156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TSMTHREAD_FAIL("Patience Exceeded"); 5166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 5176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org SimpleThread::sleep(500); 5196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // None of the test threads should have advanced past the first mutex. 5216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TSMTHREAD_ASSERT(gThreadsInMiddle==0); 5226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TSMTHREAD_ASSERT(gThreadsDone==0); 5236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // All of the test threads have made it to the first mutex. 5256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // We (the main thread) now let them advance to the second mutex, 5266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // where they should all pile up again. 5276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org umtx_lock(&gTestMutexB); 5286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org umtx_unlock(&gTestMutexA); 5296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org patience = 0; 5316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while (safeIncr(gThreadsInMiddle, 0) != TESTMUTEX_THREAD_COUNT) { 5326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (patience++ > 24) { 5336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TSMTHREAD_FAIL("Patience Exceeded"); 5346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 5356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org SimpleThread::sleep(500); 5376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TSMTHREAD_ASSERT(gThreadsDone==0); 5396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // All test threads made it to the second mutex. 5416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Now let them proceed from there. They will all terminate. 5426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org umtx_unlock(&gTestMutexB); 5436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org patience = 0; 5446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while (safeIncr(gThreadsDone, 0) != TESTMUTEX_THREAD_COUNT) { 5456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (patience++ > 24) { 5466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TSMTHREAD_FAIL("Patience Exceeded"); 5476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 5486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org SimpleThread::sleep(500); 5506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // All threads made it by both mutexes. 5536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (i=0; i<TESTMUTEX_THREAD_COUNT; i++) { 5556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete threads[i]; 5566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 5596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//------------------------------------------------------------------------------------------- 5626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// 5636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// class ThreadWithStatus - a thread that we can check the status and error condition of 5646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// 5656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//------------------------------------------------------------------------------------------- 5666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass ThreadWithStatus : public SimpleThread 5676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 5686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic: 5696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool getError() { return (fErrors > 0); } 5706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool getError(UnicodeString& fillinError) { fillinError = fErrorString; return (fErrors > 0); } 5716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual ~ThreadWithStatus(){} 5726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgprotected: 5736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ThreadWithStatus() : fErrors(0) {} 5746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org void error(const UnicodeString &error) { 5756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fErrors++; fErrorString = error; 5766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org SimpleThread::errorFunc(); 5776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org void error() { error("An error occured."); } 5796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgprivate: 5806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t fErrors; 5816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString fErrorString; 5826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 5836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//------------------------------------------------------------------------------------------- 5876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// 5886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// TestMultithreadedIntl. Test ICU Formatting n a multi-threaded environment 5896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// 5906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//------------------------------------------------------------------------------------------- 5916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// * Show exactly where the string's differences lie. 5946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString showDifference(const UnicodeString& expected, const UnicodeString& result) 5956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 5966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString res; 5976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org res = expected + "<Expected\n"; 5986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(expected.length() != result.length()) 5996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org res += " [ Different lengths ] \n"; 6006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org else 6016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 6026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(int32_t i=0;i<expected.length();i++) 6036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 6046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(expected[i] == result[i]) 6056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 6066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org res += " "; 6076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org else 6096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 6106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org res += "|"; 6116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org res += "<Differences"; 6146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org res += "\n"; 6156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org res += result + "<Result\n"; 6176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return res; 6196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 6206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//------------------------------------------------------------------------------------------- 6256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// 6266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// FormatThreadTest - a thread that tests performing a number of numberformats. 6276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// 6286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//------------------------------------------------------------------------------------------- 6296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgconst int kFormatThreadIterations = 100; // # of iterations per thread 6316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgconst int kFormatThreadThreads = 10; // # of threads to spawn 6326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgconst int kFormatThreadPatience = 60; // time in seconds to wait for all threads 6336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_FORMATTING 6356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstruct FormatThreadTestData 6396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 6406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org double number; 6416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString string; 6426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org FormatThreadTestData(double a, const UnicodeString& b) : number(a),string(b) {} 6436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} ; 6446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// "Someone from {2} is receiving a #{0} error - {1}. Their telephone call is costing {3 number,currency}." 6476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void formatErrorMessage(UErrorCode &realStatus, const UnicodeString& pattern, const Locale& theLocale, 6496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode inStatus0, /* statusString 1 */ const Locale &inCountry2, double currency3, // these numbers are the message arguments. 6506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString &result) 6516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 6526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(realStatus)) 6536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; // you messed up 6546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString errString1(u_errorName(inStatus0)); 6566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString countryName2; 6586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org inCountry2.getDisplayCountry(theLocale,countryName2); 6596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Formattable myArgs[] = { 6616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Formattable((int32_t)inStatus0), // inStatus0 {0} 6626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Formattable(errString1), // statusString1 {1} 6636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Formattable(countryName2), // inCountry2 {2} 6646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Formattable(currency3)// currency3 {3,number,currency} 6656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }; 6666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org MessageFormat *fmt = new MessageFormat("MessageFormat's API is broken!!!!!!!!!!!",realStatus); 6686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fmt->setLocale(theLocale); 6696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fmt->applyPattern(pattern, realStatus); 6706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(realStatus)) { 6726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete fmt; 6736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 6746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org FieldPosition ignore = 0; 6776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fmt->format(myArgs,4,result,ignore,realStatus); 6786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete fmt; 6806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 6816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 6836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Class for thread-safe (theoretically) format. 6846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 6856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 6866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Its constructor, destructor, and init/fini are NOT thread safe. 6876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 6886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass ThreadSafeFormat { 6896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic: 6906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* give a unique offset to each thread */ 6916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ThreadSafeFormat(); 6926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool doStuff(int32_t offset, UnicodeString &appendErr, UErrorCode &status); 6936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgprivate: 6946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org LocalPointer<NumberFormat> fFormat; // formtter - default constructed currency 6956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Formattable fYDDThing; // Formattable currency - YDD 6966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Formattable fBBDThing; // Formattable currency - BBD 6976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // statics 6996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgprivate: 7006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static LocalPointer<NumberFormat> gFormat; 7016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static NumberFormat *createFormat(UErrorCode &status); 7026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static Formattable gYDDThing, gBBDThing; 7036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic: 7046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static void init(UErrorCode &status); // avoid static init. 7056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static void fini(UErrorCode &status); // avoid static fini 7066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 7076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgLocalPointer<NumberFormat> ThreadSafeFormat::gFormat; 7096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgFormattable ThreadSafeFormat::gYDDThing; 7106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgFormattable ThreadSafeFormat::gBBDThing; 7116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString gYDDStr, gBBDStr; 7126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgNumberFormat *ThreadSafeFormat::createFormat(UErrorCode &status) { 7136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org LocalPointer<NumberFormat> fmt(NumberFormat::createCurrencyInstance(Locale::getUS(), status)); 7146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return fmt.orphan(); 7156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 7166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const UChar kYDD[] = { 0x59, 0x44, 0x44, 0x00 }; 7196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const UChar kBBD[] = { 0x42, 0x42, 0x44, 0x00 }; 7206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const UChar kUSD[] = { 0x55, 0x53, 0x44, 0x00 }; 7216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid ThreadSafeFormat::init(UErrorCode &status) { 7236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org gFormat.adoptInstead(createFormat(status)); 7246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org gYDDThing.adoptObject(new CurrencyAmount(123.456, kYDD, status)); 7256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org gBBDThing.adoptObject(new CurrencyAmount(987.654, kBBD, status)); 7266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 7276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 7286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org gFormat->format(gYDDThing, gYDDStr, NULL, status); 7306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org gFormat->format(gBBDThing, gBBDStr, NULL, status); 7316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 7326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid ThreadSafeFormat::fini(UErrorCode &/*status*/) { 7346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org gFormat.adoptInstead(NULL); 7356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 7366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgThreadSafeFormat::ThreadSafeFormat() { 7386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 7396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUBool ThreadSafeFormat::doStuff(int32_t offset, UnicodeString &appendErr, UErrorCode &status) { 7416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool okay = TRUE; 7426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(fFormat.isNull()) { 7436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fFormat.adoptInstead(createFormat(status)); 7446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(u_strcmp(fFormat->getCurrency(), kUSD)) { 7476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org appendErr.append("fFormat currency != ") 7486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org .append(kUSD) 7496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org .append(", =") 7506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org .append(fFormat->getCurrency()) 7516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org .append("! "); 7526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org okay = FALSE; 7536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(u_strcmp(gFormat->getCurrency(), kUSD)) { 7566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org appendErr.append("gFormat currency != ") 7576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org .append(kUSD) 7586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org .append(", =") 7596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org .append(gFormat->getCurrency()) 7606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org .append("! "); 7616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org okay = FALSE; 7626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString str; 7646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UnicodeString *o=NULL; 7656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Formattable f; 7666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const NumberFormat *nf = NULL; // only operate on it as const. 7676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org switch(offset%4) { 7686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 0: f = gYDDThing; o = &gYDDStr; nf = gFormat.getAlias(); break; 7696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 1: f = gBBDThing; o = &gBBDStr; nf = gFormat.getAlias(); break; 7706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 2: f = gYDDThing; o = &gYDDStr; nf = fFormat.getAlias(); break; 7716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 3: f = gBBDThing; o = &gBBDStr; nf = fFormat.getAlias(); break; 7726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org nf->format(f, str, NULL, status); 7746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(*o != str) { 7766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org appendErr.append(showDifference(*o, str)); 7776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org okay = FALSE; 7786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return okay; 7806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 7816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUBool U_CALLCONV isAcceptable(void *, const char *, const char *, const UDataInfo *) { 7836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return TRUE; 7846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 7856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//static UMTX debugMutex = NULL; 7876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//static UMTX gDebugMutex; 7886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass FormatThreadTest : public ThreadWithStatus 7916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 7926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic: 7936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int fNum; 7946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int fTraceInfo; 7956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ThreadSafeFormat fTSF; 7976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org FormatThreadTest() // constructor is NOT multithread safe. 7996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org : ThreadWithStatus(), 8006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fNum(0), 8016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fTraceInfo(0), 8026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fOffset(0) 8036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // the locale to use 8046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 8056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static int32_t fgOffset = 0; 8066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fgOffset += 3; 8076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fOffset = fgOffset; 8086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual void run() 8126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 8136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fTraceInfo = 1; 8146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org LocalPointer<NumberFormat> percentFormatter; 8156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status = U_ZERO_ERROR; 8166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if 0 8186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // debugging code, 8196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (int i=0; i<4000; i++) { 8206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status = U_ZERO_ERROR; 8216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UDataMemory *data1 = udata_openChoice(0, "res", "en_US", isAcceptable, 0, &status); 8226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UDataMemory *data2 = udata_openChoice(0, "res", "fr", isAcceptable, 0, &status); 8236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org udata_close(data1); 8246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org udata_close(data2); 8256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 8266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org error("udata_openChoice failed.\n"); 8276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 8286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 8316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif 8326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if 0 8346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // debugging code, 8356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int m; 8366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (m=0; m<4000; m++) { 8376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status = U_ZERO_ERROR; 8386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UResourceBundle *res = NULL; 8396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *localeName = NULL; 8406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Locale loc = Locale::getEnglish(); 8426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org localeName = loc.getName(); 8446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // localeName = "en"; 8456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // ResourceBundle bund = ResourceBundle(0, loc, status); 8476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org //umtx_lock(&gDebugMutex); 8486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org res = ures_open(NULL, localeName, &status); 8496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org //umtx_unlock(&gDebugMutex); 8506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org //umtx_lock(&gDebugMutex); 8526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ures_close(res); 8536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org //umtx_unlock(&gDebugMutex); 8546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 8566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org error("Resource bundle construction failed.\n"); 8576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 8586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 8616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif 8626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Keep this data here to avoid static initialization. 8646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org FormatThreadTestData kNumberFormatTestData[] = 8656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 8666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org FormatThreadTestData((double)5.0, UnicodeString("5", "")), 8676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org FormatThreadTestData( 6.0, UnicodeString("6", "")), 8686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org FormatThreadTestData( 20.0, UnicodeString("20", "")), 8696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org FormatThreadTestData( 8.0, UnicodeString("8", "")), 8706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org FormatThreadTestData( 8.3, UnicodeString("8.3", "")), 8716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org FormatThreadTestData( 12345, UnicodeString("12,345", "")), 8726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org FormatThreadTestData( 81890.23, UnicodeString("81,890.23", "")), 8736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }; 8746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t kNumberFormatTestDataLength = (int32_t)(sizeof(kNumberFormatTestData) / 8756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sizeof(kNumberFormatTestData[0])); 8766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Keep this data here to avoid static initialization. 8786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org FormatThreadTestData kPercentFormatTestData[] = 8796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 8806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org FormatThreadTestData((double)5.0, CharsToUnicodeString("500\\u00a0%")), 8816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org FormatThreadTestData( 1.0, CharsToUnicodeString("100\\u00a0%")), 8826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org FormatThreadTestData( 0.26, CharsToUnicodeString("26\\u00a0%")), 8836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org FormatThreadTestData( 8846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 16384.99, CharsToUnicodeString("1\\u00a0638\\u00a0499\\u00a0%")), // U+00a0 = NBSP 8856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org FormatThreadTestData( 8866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 81890.23, CharsToUnicodeString("8\\u00a0189\\u00a0023\\u00a0%")), 8876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }; 8886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t kPercentFormatTestDataLength = 8896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (int32_t)(sizeof(kPercentFormatTestData) / sizeof(kPercentFormatTestData[0])); 8906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t iteration; 8916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status = U_ZERO_ERROR; 8936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org LocalPointer<NumberFormat> formatter(NumberFormat::createInstance(Locale::getEnglish(),status)); 8946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(status)) { 8956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org error("Error on NumberFormat::createInstance()."); 8966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org goto cleanupAndReturn; 8976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org percentFormatter.adoptInstead(NumberFormat::createPercentInstance(Locale::getFrench(),status)); 9006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(status)) { 9016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org error("Error on NumberFormat::createPercentInstance()."); 9026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org goto cleanupAndReturn; 9036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 9046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(iteration = 0;!getError() && iteration<kFormatThreadIterations;iteration++) 9066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 9076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t whichLine = (iteration + fOffset)%kNumberFormatTestDataLength; 9096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString output; 9116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org formatter->format(kNumberFormatTestData[whichLine].number, output); 9136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(0 != output.compare(kNumberFormatTestData[whichLine].string)) { 9156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org error("format().. expected " + kNumberFormatTestData[whichLine].string 9166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org + " got " + output); 9176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org goto cleanupAndReturn; 9186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 9196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Now check percent. 9216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org output.remove(); 9226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org whichLine = (iteration + fOffset)%kPercentFormatTestDataLength; 9236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org percentFormatter->format(kPercentFormatTestData[whichLine].number, output); 9256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(0 != output.compare(kPercentFormatTestData[whichLine].string)) 9266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 9276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org error("percent format().. \n" + 9286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org showDifference(kPercentFormatTestData[whichLine].string,output)); 9296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org goto cleanupAndReturn; 9306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 9316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Test message error 9336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const int kNumberOfMessageTests = 3; 9346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode statusToCheck; 9356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString patternToCheck; 9366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Locale messageLocale; 9376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Locale countryToCheck; 9386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org double currencyToCheck; 9396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString expected; 9416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // load the cases. 9436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org switch((iteration+fOffset) % kNumberOfMessageTests) 9446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 9456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org default: 9466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 0: 9476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org statusToCheck= U_FILE_ACCESS_ERROR; 9486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org patternToCheck= "0:Someone from {2} is receiving a #{0}" 9496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org " error - {1}. Their telephone call is costing " 9506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "{3,number,currency}."; // number,currency 9516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org messageLocale= Locale("en","US"); 9526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org countryToCheck= Locale("","HR"); 9536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org currencyToCheck= 8192.77; 9546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org expected= "0:Someone from Croatia is receiving a #4 error - " 9556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "U_FILE_ACCESS_ERROR. Their telephone call is costing $8,192.77."; 9566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 9576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 1: 9586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org statusToCheck= U_INDEX_OUTOFBOUNDS_ERROR; 9596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org patternToCheck= "1:A customer in {2} is receiving a #{0} error - {1}. Their telephone call is costing {3,number,currency}."; // number,currency 9606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org messageLocale= Locale("de","DE@currency=DEM"); 9616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org countryToCheck= Locale("","BF"); 9626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org currencyToCheck= 2.32; 9636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org expected= CharsToUnicodeString( 9646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "1:A customer in Burkina Faso is receiving a #8 error - U_INDEX_OUTOFBOUNDS_ERROR. Their telephone call is costing 2,32\\u00A0DEM."); 9656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 9666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 2: 9676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org statusToCheck= U_MEMORY_ALLOCATION_ERROR; 9686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org patternToCheck= "2:user in {2} is receiving a #{0} error - {1}. " 9696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "They insist they just spent {3,number,currency} " 9706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "on memory."; // number,currency 9716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org messageLocale= Locale("de","AT@currency=ATS"); // Austrian German 9726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org countryToCheck= Locale("","US"); // hmm 9736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org currencyToCheck= 40193.12; 9746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org expected= CharsToUnicodeString( 9756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "2:user in Vereinigte Staaten is receiving a #7 error" 9766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org " - U_MEMORY_ALLOCATION_ERROR. They insist they just spent" 9776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org " \\u00f6S\\u00A040.193,12 on memory."); 9786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 9796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 9806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString result; 9826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status = U_ZERO_ERROR; 9836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org formatErrorMessage(status,patternToCheck,messageLocale,statusToCheck, 9846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org countryToCheck,currencyToCheck,result); 9856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(status)) 9866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 9876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString tmp(u_errorName(status)); 9886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org error("Failure on message format, pattern=" + patternToCheck + 9896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ", error = " + tmp); 9906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org goto cleanupAndReturn; 9916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 9926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(result != expected) 9946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 9956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org error("PatternFormat: \n" + showDifference(expected,result)); 9966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org goto cleanupAndReturn; 9976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 9986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // test the Thread Safe Format 9996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString appendErr; 10006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(!fTSF.doStuff(fNum, appendErr, status)) { 10016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org error(appendErr); 10026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org goto cleanupAndReturn; 10036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } /* end of for loop */ 10056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgcleanupAndReturn: 10096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // while (fNum == 4) {SimpleThread::sleep(10000);} // Force a failure by preventing thread from finishing 10106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fTraceInfo = 2; 10116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgprivate: 10146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t fOffset; // where we are testing from. 10156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 10166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// ** The actual test function. 10186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid MultithreadTest::TestThreadedIntl() 10206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 10216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int i; 10226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString theErr; 10236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool haveDisplayedInfo[kFormatThreadThreads]; 10246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const int32_t PATIENCE_SECONDS = 45; 10256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode threadSafeErr = U_ZERO_ERROR; 10276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ThreadSafeFormat::init(threadSafeErr); 10296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org assertSuccess("initializing ThreadSafeFormat", threadSafeErr, TRUE); 10306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // 10326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Create and start the test threads 10336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // 10346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logln("Spawning: %d threads * %d iterations each.", 10356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org kFormatThreadThreads, kFormatThreadIterations); 10366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org LocalArray<FormatThreadTest> tests(new FormatThreadTest[kFormatThreadThreads]); 10376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(int32_t j = 0; j < kFormatThreadThreads; j++) { 10386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org tests[j].fNum = j; 10396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t threadStatus = tests[j].start(); 10406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (threadStatus != 0) { 10416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("System Error %d starting thread number %d.", threadStatus, j); 10426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org SimpleThread::errorFunc(); 10436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 10446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org haveDisplayedInfo[j] = FALSE; 10466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Spin, waiting for the test threads to finish. 10506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool stillRunning; 10516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UDate startTime, endTime; 10526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org startTime = Calendar::getNow(); 10536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org double lastComplaint = 0; 10546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org do { 10556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* Spin until the test threads complete. */ 10566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org stillRunning = FALSE; 10576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org endTime = Calendar::getNow(); 10586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org double elapsedSeconds = ((int32_t)(endTime - startTime)/U_MILLIS_PER_SECOND); 10596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (elapsedSeconds > PATIENCE_SECONDS) { 10606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("Patience exceeded. Test is taking too long."); 10616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 10626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else if((elapsedSeconds-lastComplaint) > 2.0) { 10636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org infoln("%.1f seconds elapsed (still waiting..)", elapsedSeconds); 10646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org lastComplaint = elapsedSeconds; 10656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* 10676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org The following sleep must be here because the *BSD operating systems 10686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org have a brain dead thread scheduler. They starve the child threads from 10696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org CPU time. 10706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 10716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org SimpleThread::sleep(1); // yield 10726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(i=0;i<kFormatThreadThreads;i++) { 10736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (tests[i].isRunning()) { 10746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org stillRunning = TRUE; 10756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else if (haveDisplayedInfo[i] == FALSE) { 10766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logln("Thread # %d is complete..", i); 10776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(tests[i].getError(theErr)) { 10786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dataerrln(UnicodeString("#") + i + ": " + theErr); 10796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org SimpleThread::errorFunc(); 10806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org haveDisplayedInfo[i] = TRUE; 10826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } while (stillRunning); 10856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // 10876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // All threads have finished. 10886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // 10896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ThreadSafeFormat::fini(threadSafeErr); 10906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org assertSuccess("finalizing ThreadSafeFormat", threadSafeErr, TRUE); 10916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 10926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif /* #if !UCONFIG_NO_FORMATTING */ 10936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//------------------------------------------------------------------------------------------- 10996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// 11006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Collation threading test 11016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// 11026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//------------------------------------------------------------------------------------------- 11036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_COLLATION 11046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define kCollatorThreadThreads 10 // # of threads to spawn 11066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define kCollatorThreadPatience kCollatorThreadThreads*30 11076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstruct Line { 11096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar buff[25]; 11106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t buflen; 11116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} ; 11126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UBool 11146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgskipLineBecauseOfBug(const UChar *s, int32_t length) { 11156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // TODO: Fix ICU ticket #8052 11166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(length >= 3 && 11176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (s[0] == 0xfb2 || s[0] == 0xfb3) && 11186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org s[1] == 0x334 && 11196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (s[2] == 0xf73 || s[2] == 0xf75 || s[2] == 0xf81)) { 11206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return TRUE; 11216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 11226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return FALSE; 11236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 11246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UCollationResult 11266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgnormalizeResult(int32_t result) { 11276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return result<0 ? UCOL_LESS : result==0 ? UCOL_EQUAL : UCOL_GREATER; 11286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 11296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass CollatorThreadTest : public ThreadWithStatus 11316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 11326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgprivate: 11336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const Collator *coll; 11346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const Line *lines; 11356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t noLines; 11366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool isAtLeastUCA62; 11376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic: 11386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org CollatorThreadTest() : ThreadWithStatus(), 11396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org coll(NULL), 11406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org lines(NULL), 11416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org noLines(0), 11426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org isAtLeastUCA62(TRUE) 11436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 11446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }; 11456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org void setCollator(Collator *c, Line *l, int32_t nl, UBool atLeastUCA62) 11466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 11476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org coll = c; 11486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org lines = l; 11496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org noLines = nl; 11506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org isAtLeastUCA62 = atLeastUCA62; 11516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 11526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual void run() { 11536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint8_t sk1[1024], sk2[1024]; 11546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint8_t *oldSk = NULL, *newSk = sk1; 11556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t oldLen = 0; 11566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t prev = 0; 11576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t i = 0; 11586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(i = 0; i < noLines; i++) { 11606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(lines[i].buflen == 0) { continue; } 11616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(skipLineBecauseOfBug(lines[i].buff, lines[i].buflen)) { continue; } 11636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t resLen = coll->getSortKey(lines[i].buff, lines[i].buflen, newSk, 1024); 11656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(oldSk != NULL) { 11676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t skres = strcmp((char *)oldSk, (char *)newSk); 11686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t cmpres = coll->compare(lines[prev].buff, lines[prev].buflen, lines[i].buff, lines[i].buflen); 11696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t cmpres2 = coll->compare(lines[i].buff, lines[i].buflen, lines[prev].buff, lines[prev].buflen); 11706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(cmpres != -cmpres2) { 11726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org error(UnicodeString("Compare result not symmetrical on line ") + (i + 1)); 11736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 11746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 11756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(cmpres != normalizeResult(skres)) { 11776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org error(UnicodeString("Difference between coll->compare and sortkey compare on line ") + (i + 1)); 11786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 11796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 11806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t res = cmpres; 11826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(res == 0 && !isAtLeastUCA62) { 11836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Up to UCA 6.1, the collation test files use a custom tie-breaker, 11846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // comparing the raw input strings. 11856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org res = u_strcmpCodePointOrder(lines[prev].buff, lines[i].buff); 11866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Starting with UCA 6.2, the collation test files use the standard UCA tie-breaker, 11876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // comparing the NFD versions of the input strings, 11886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // which we do via setting strength=identical. 11896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 11906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(res > 0) { 11916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org error(UnicodeString("Line is not greater or equal than previous line, for line ") + (i + 1)); 11926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 11936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 11946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 11956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org oldSk = newSk; 11976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org oldLen = resLen; 11986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (void)oldLen; // Suppress set but not used warning. 11996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org prev = i; 12006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org newSk = (newSk == sk1)?sk2:sk1; 12026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 12056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid MultithreadTest::TestCollators() 12076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 12086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status = U_ZERO_ERROR; 12106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org FILE *testFile = NULL; 12116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char testDataPath[1024]; 12126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org strcpy(testDataPath, IntlTest::getSourceTestData(status)); 12136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 12146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("ERROR: could not open test data %s", u_errorName(status)); 12156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 12166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org strcat(testDataPath, "CollationTest_"); 12186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char* type = "NON_IGNORABLE"; 12206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *ext = ".txt"; 12226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(testFile) { 12236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fclose(testFile); 12246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char buffer[1024]; 12266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org strcpy(buffer, testDataPath); 12276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org strcat(buffer, type); 12286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org size_t bufLen = strlen(buffer); 12296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // we try to open 3 files: 12316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // path/CollationTest_type.txt 12326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // path/CollationTest_type_SHORT.txt 12336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // path/CollationTest_type_STUB.txt 12346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // we are going to test with the first one that we manage to open. 12356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org strcpy(buffer+bufLen, ext); 12376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org testFile = fopen(buffer, "rb"); 12396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(testFile == 0) { 12416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org strcpy(buffer+bufLen, "_SHORT"); 12426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org strcat(buffer, ext); 12436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org testFile = fopen(buffer, "rb"); 12446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(testFile == 0) { 12466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org strcpy(buffer+bufLen, "_STUB"); 12476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org strcat(buffer, ext); 12486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org testFile = fopen(buffer, "rb"); 12496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (testFile == 0) { 12516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *(buffer+bufLen) = 0; 12526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dataerrln("could not open any of the conformance test files, tried opening base %s", buffer); 12536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 12546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 12556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org infoln( 12566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "INFO: Working with the stub file.\n" 12576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "If you need the full conformance test, please\n" 12586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "download the appropriate data files from:\n" 12596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "http://source.icu-project.org/repos/icu/tools/trunk/unicodetools/com/ibm/text/data/"); 12606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org LocalArray<Line> lines(new Line[200000]); 12656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org memset(lines.getAlias(), 0, sizeof(Line)*200000); 12666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t lineNum = 0; 12676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar bufferU[1024]; 12696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint32_t first = 0; 12706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while (fgets(buffer, 1024, testFile) != NULL) { 12726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(*buffer == 0 || buffer[0] == '#') { 12736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Store empty and comment lines so that errors are reported 12746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // for the real test file lines. 12756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org lines[lineNum].buflen = 0; 12766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org lines[lineNum].buff[0] = 0; 12776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 12786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t buflen = u_parseString(buffer, bufferU, 1024, &first, &status); 12796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org lines[lineNum].buflen = buflen; 12806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u_memcpy(lines[lineNum].buff, bufferU, buflen); 12816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org lines[lineNum].buff[buflen] = 0; 12826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org lineNum++; 12846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fclose(testFile); 12866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(status)) { 12876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dataerrln("Couldn't read the test file!"); 12886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 12896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UVersionInfo uniVersion; 12926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const UVersionInfo v62 = { 6, 2, 0, 0 }; 12936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u_getUnicodeVersion(uniVersion); 12946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool isAtLeastUCA62 = uprv_memcmp(uniVersion, v62, 4) >= 0; 12956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org LocalPointer<Collator> coll(Collator::createInstance(Locale::getRoot(), status)); 12976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(status)) { 12986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errcheckln(status, "Couldn't open UCA collator"); 12996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 13006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 13016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org coll->setAttribute(UCOL_NORMALIZATION_MODE, UCOL_ON, status); 13026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org coll->setAttribute(UCOL_CASE_FIRST, UCOL_OFF, status); 13036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org coll->setAttribute(UCOL_CASE_LEVEL, UCOL_OFF, status); 13046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org coll->setAttribute(UCOL_STRENGTH, isAtLeastUCA62 ? UCOL_IDENTICAL : UCOL_TERTIARY, status); 13056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org coll->setAttribute(UCOL_ALTERNATE_HANDLING, UCOL_NON_IGNORABLE, status); 13066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t noSpawned = 0; 13086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t spawnResult = 0; 13096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org LocalArray<CollatorThreadTest> tests(new CollatorThreadTest[kCollatorThreadThreads]); 13106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logln(UnicodeString("Spawning: ") + kCollatorThreadThreads + " threads * " + kFormatThreadIterations + " iterations each."); 13126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t j = 0; 13136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(j = 0; j < kCollatorThreadThreads; j++) { 13146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org //logln("Setting collator %i", j); 13156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org tests[j].setCollator(coll.getAlias(), lines.getAlias(), lineNum, isAtLeastUCA62); 13166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 13176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(j = 0; j < kCollatorThreadThreads; j++) { 13186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log("%i ", j); 13196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org spawnResult = tests[j].start(); 13206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(spawnResult != 0) { 13216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org infoln("THREAD INFO: Couldn't spawn more than %i threads", noSpawned); 13226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 13236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 13246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org noSpawned++; 13256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 13266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logln("Spawned all"); 13276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (noSpawned == 0) { 13286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("No threads could be spawned."); 13296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 13306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 13316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(int32_t patience = kCollatorThreadPatience;patience > 0; patience --) 13336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 13346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logln("Waiting..."); 13356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t i; 13376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t terrs = 0; 13386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t completed =0; 13396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(i=0;i<kCollatorThreadThreads;i++) 13416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 13426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (tests[i].isRunning() == FALSE) 13436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 13446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org completed++; 13456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org //logln(UnicodeString("Test #") + i + " is complete.. "); 13476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString theErr; 13496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(tests[i].getError(theErr)) 13506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 13516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org terrs++; 13526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln(UnicodeString("#") + i + ": " + theErr); 13536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 13546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // print out the error, too, if any. 13556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 13566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 13576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logln("Completed %i tests", completed); 13586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(completed == noSpawned) 13606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 13616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logln("Done! All %i tests are finished", noSpawned); 13626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(terrs) 13646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 13656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("There were errors."); 13666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org SimpleThread::errorFunc(); 13676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 13686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 13696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 13706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org SimpleThread::sleep(900); 13726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 13736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("patience exceeded. "); 13746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org SimpleThread::errorFunc(); 13756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 13766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif /* #if !UCONFIG_NO_COLLATION */ 13786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//------------------------------------------------------------------------------------------- 13836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// 13846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// StringThreadTest2 13856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// 13866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//------------------------------------------------------------------------------------------- 13876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgconst int kStringThreadIterations = 2500;// # of iterations per thread 13896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgconst int kStringThreadThreads = 10; // # of threads to spawn 13906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgconst int kStringThreadPatience = 120; // time in seconds to wait for all threads 13916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass StringThreadTest2 : public ThreadWithStatus 13946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 13956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic: 13966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int fNum; 13976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int fTraceInfo; 13986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UnicodeString *fSharedString; 13996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org StringThreadTest2(const UnicodeString *sharedString, int num) // constructor is NOT multithread safe. 14016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org : ThreadWithStatus(), 14026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fNum(num), 14036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fTraceInfo(0), 14046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fSharedString(sharedString) 14056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 14066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }; 14076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual void run() 14106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 14116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fTraceInfo = 1; 14126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int loopCount = 0; 14136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (loopCount = 0; loopCount < kStringThreadIterations; loopCount++) { 14156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (*fSharedString != "This is the original test string.") { 14166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org error("Original string is corrupt."); 14176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 14186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 14196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString s1 = *fSharedString; 14206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org s1 += "cat this"; 14216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString s2(s1); 14226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString s3 = *fSharedString; 14236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org s2 = s3; 14246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org s3.truncate(12); 14256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org s2.truncate(0); 14266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 14276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // while (fNum == 4) {SimpleThread::sleep(10000);} // Force a failure by preventing thread from finishing 14296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fTraceInfo = 2; 14306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 14316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 14336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// ** The actual test function. 14356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid MultithreadTest::TestString() 14376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 14386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int patience; 14396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int terrs = 0; 14406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int j; 14416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString *testString = new UnicodeString("This is the original test string."); 14436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Not using LocalArray<StringThreadTest2> tests[kStringThreadThreads]; 14456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // because we don't always want to delete them. 14466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // See the comments below the cleanupAndReturn label. 14476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org StringThreadTest2 *tests[kStringThreadThreads]; 14486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(j = 0; j < kStringThreadThreads; j++) { 14496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org tests[j] = new StringThreadTest2(testString, j); 14506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 14516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logln(UnicodeString("Spawning: ") + kStringThreadThreads + " threads * " + kStringThreadIterations + " iterations each."); 14536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(j = 0; j < kStringThreadThreads; j++) { 14546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t threadStatus = tests[j]->start(); 14556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (threadStatus != 0) { 14566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("System Error %d starting thread number %d.", threadStatus, j); 14576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org SimpleThread::errorFunc(); 14586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org goto cleanupAndReturn; 14596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 14606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 14616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(patience = kStringThreadPatience;patience > 0; patience --) 14636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 14646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logln("Waiting..."); 14656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t i; 14676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org terrs = 0; 14686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t completed =0; 14696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(i=0;i<kStringThreadThreads;i++) { 14716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (tests[i]->isRunning() == FALSE) 14726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 14736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org completed++; 14746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logln(UnicodeString("Test #") + i + " is complete.. "); 14766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString theErr; 14786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(tests[i]->getError(theErr)) 14796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 14806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org terrs++; 14816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln(UnicodeString("#") + i + ": " + theErr); 14826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 14836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // print out the error, too, if any. 14846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 14856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 14866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(completed == kStringThreadThreads) 14886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 14896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logln("Done!"); 14906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(terrs) { 14916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("There were errors."); 14926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 14936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 14946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 14956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org SimpleThread::sleep(900); 14976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 14986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (patience <= 0) { 15006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("patience exceeded. "); 15016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // while (TRUE) {SimpleThread::sleep(10000);} // TODO: for debugging. Sleep forever on failure. 15026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org terrs++; 15036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 15046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (terrs > 0) { 15066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org SimpleThread::errorFunc(); 15076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 15086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgcleanupAndReturn: 15106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (terrs == 0) { 15116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* 15126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Don't clean up if there are errors. This prevents crashes if the 15136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org threads are still running and using this data. This will only happen 15146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if there is an error with the test, ICU, or the machine is too slow. 15156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org It's better to leak than crash. 15166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 15176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(j = 0; j < kStringThreadThreads; j++) { 15186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete tests[j]; 15196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 15206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete testString; 15216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 15226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 15236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif // ICU_USE_THREADS 1525