You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stdcxx.apache.org by se...@apache.org on 2008/04/18 22:04:23 UTC

svn commit: r649673 - /stdcxx/trunk/tests/localization/22.locale.num.get.mt.cpp

Author: sebor
Date: Fri Apr 18 13:04:21 2008
New Revision: 649673

URL: http://svn.apache.org/viewvc?rev=649673&view=rev
Log:
2008-04-18  Martin Sebor  <se...@roguewave.com>

	STDCXX-812
	* tests/localization/22.locale.num.get.mt.cpp [_RWSTD_OS_HP_UX
	|| _ILP32] (rw_opt_nlocales): Decreased from the default to 10
	in order to work around an HP-UX inefficiency, and renamed to
	opt_nlocales to avoid inappropriately using rwtest convention.

	STDCXX-886
	* tests/localization/22.locale.num.get.mt.cpp (thread_func):
	Avoided appending NUL characters to the input sequence to
	prevent failures in locales where the C++ thoudsands_sep is
	the NUL character.
	(test_get_data): Renamed function argument to match its type.

Modified:
    stdcxx/trunk/tests/localization/22.locale.num.get.mt.cpp

Modified: stdcxx/trunk/tests/localization/22.locale.num.get.mt.cpp
URL: http://svn.apache.org/viewvc/stdcxx/trunk/tests/localization/22.locale.num.get.mt.cpp?rev=649673&r1=649672&r2=649673&view=diff
==============================================================================
--- stdcxx/trunk/tests/localization/22.locale.num.get.mt.cpp (original)
+++ stdcxx/trunk/tests/localization/22.locale.num.get.mt.cpp Fri Apr 18 13:04:21 2008
@@ -47,8 +47,18 @@
 // the number of times each thread should iterate
 int rw_opt_nloops = MAX_LOOPS;
 
+#if !defined (_RWSTD_OS_HP_UX) || defined (_ILP32)
+
 // number of locales to use
-int rw_opt_nlocales = MAX_THREADS;
+int opt_nlocales = MAX_THREADS;
+
+#else   // HP-UX in LP64 mode
+
+// work around an inefficiency (small cache size?) on HP-UX
+// in LP64 mode (see STDCXX-812)
+int opt_nlocales = 10;
+
+#endif   // HP-UX 32/64 bit mode
 
 // should all threads share the same set of locale objects instead
 // of creating their own?
@@ -214,7 +224,7 @@
 template <class charT, class Traits>
 void
 test_get_data (const MyNumData                               &data,
-               const std::num_get<charT>                     &np,
+               const std::num_get<charT>                     &ng,
                const std::istreambuf_iterator<charT, Traits> &iter,
                const std::istreambuf_iterator<charT, Traits> &end,
                std::basic_ios<charT, Traits>                 &io)
@@ -225,7 +235,7 @@
     case MyNumData::put_bool: {
             const bool expected = data.value_ < 1.f;
                   bool checked;
-            np.get (iter, end, io, state, checked);
+            ng.get (iter, end, io, state, checked);
             RW_ASSERT (! (state & std::ios_base::failbit));
             RW_ASSERT (checked == expected);
         }
@@ -233,7 +243,7 @@
     case MyNumData::put_long: {
             const long expected = (long)data.value_;
                   long checked;
-            np.get (iter, end, io, state, checked);
+            ng.get (iter, end, io, state, checked);
             RW_ASSERT (! (state & std::ios_base::failbit));
             RW_ASSERT (checked == expected);
         }
@@ -241,7 +251,7 @@
     case MyNumData::put_ulong: {
             const unsigned long expected = (unsigned long)data.value_;
                   unsigned long checked;
-            np.get (iter, end, io, state, checked);
+            ng.get (iter, end, io, state, checked);
             RW_ASSERT (! (state & std::ios_base::failbit));
             RW_ASSERT (checked == expected);
         }
@@ -252,7 +262,7 @@
     case MyNumData::put_llong: {
             const _RWSTD_LONG_LONG expected = (_RWSTD_LONG_LONG)data.value_;
                   _RWSTD_LONG_LONG checked;
-            np.get (iter, end, io, state, checked);
+            ng.get (iter, end, io, state, checked);
             RW_ASSERT (! (state & std::ios_base::failbit));
             RW_ASSERT (checked == expected);
         }
@@ -261,7 +271,7 @@
             const unsigned _RWSTD_LONG_LONG expected
                 = (unsigned _RWSTD_LONG_LONG)data.value_;
                   unsigned _RWSTD_LONG_LONG checked;
-            np.get (iter, end, io, state, checked);
+            ng.get (iter, end, io, state, checked);
             RW_ASSERT (! (state & std::ios_base::failbit));
             RW_ASSERT (checked == expected);
         }
@@ -272,7 +282,7 @@
     case MyNumData::put_dbl: {
             const double expected = (double)data.value_;
                   double checked;
-            np.get (iter, end, io, state, checked);
+            ng.get (iter, end, io, state, checked);
             RW_ASSERT (! (state & std::ios_base::failbit));
             RW_ASSERT (checked == expected);
         }
@@ -283,7 +293,7 @@
     case MyNumData::put_ldbl: {
             const long double expected = (long double)data.value_;
                   long double checked;
-            np.get (iter, end, io, state, checked);
+            ng.get (iter, end, io, state, checked);
             RW_ASSERT (! (state & std::ios_base::failbit));
             RW_ASSERT (checked == expected);
         }
@@ -294,7 +304,7 @@
     case MyNumData::put_ptr: {
             const void* expected = (const void*)&data.value_;
                   void* checked;
-            np.get (iter, end, io, state, checked);
+            ng.get (iter, end, io, state, checked);
             RW_ASSERT (! (state & std::ios_base::failbit));
             RW_ASSERT (checked == expected);
         }
@@ -316,13 +326,15 @@
 static void*
 thread_func (void*)
 {
-    MyIos<char, std::char_traits<char> >       nio;
-    MyStreambuf<char, std::char_traits<char> > nsb;
+    typedef std::char_traits<char> Traits;
+    MyIos<char, Traits>            nio;
+    MyStreambuf<char, Traits>      nsb;
     nio.rdbuf (&nsb);
 
 #ifndef _RWSTD_NO_WCHAR_T
-    MyIos<wchar_t, std::char_traits<wchar_t> >       wio;
-    MyStreambuf<wchar_t, std::char_traits<wchar_t> > wsb;
+    typedef std::char_traits<wchar_t> WTraits;
+    MyIos<wchar_t, WTraits>           wio;
+    MyStreambuf<wchar_t, WTraits>     wsb;
     wio.rdbuf (&wsb);
 #endif // _RWSTD_NO_WCHAR_T
 
@@ -340,13 +352,13 @@
         if (test_char) {
             // exercise the narrow char specialization of the facet
 
-            const std::num_get<char> &np =
+            const std::num_get<char> &ng =
                 std::use_facet<std::num_get<char> >(loc);
 
             nio.imbue (loc);
-            nsb.pubsetg (data.ncs_, RW_COUNT_OF (data.ncs_));
+            nsb.pubsetg (data.ncs_, Traits::length (data.ncs_));
 
-            test_get_data (data, np,
+            test_get_data (data, ng,
                            std::istreambuf_iterator<char>(&nsb),
                            std::istreambuf_iterator<char>(),
                            nio);
@@ -365,7 +377,7 @@
                 std::use_facet<std::num_get<wchar_t> >(loc);
 
             wio.imbue (loc);
-            wsb.pubsetg (data.wcs_, RW_COUNT_OF (data.wcs_));
+            wsb.pubsetg (data.wcs_, WTraits::length (data.wcs_));
 
             test_get_data (data, wp,
                            std::istreambuf_iterator<wchar_t>(&wsb),
@@ -464,7 +476,7 @@
                      "failed to create locale(%#s)", name);
         }
 
-        if (nlocales == maxinx || nlocales == std::size_t (rw_opt_nlocales))
+        if (nlocales == maxinx || nlocales == std::size_t (opt_nlocales))
             break;
     }
 
@@ -554,7 +566,7 @@
                     &rw_opt_nloops,
                     int (MAX_THREADS),
                     &rw_opt_nthreads,
-                    &rw_opt_nlocales,
+                    &opt_nlocales,
                     &rw_opt_setlocales,
                     &rw_opt_shared_locale);
 }



Re: svn commit: r649673 - /stdcxx/trunk/tests/localization/22.locale.num.get.mt.cpp

Posted by Martin Sebor <se...@roguewave.com>.
This is done:
http://svn.apache.org/viewvc?view=rev&revision=653942

Btw., while there, I noticed that the test generates sequences
at most two digits long, with no thousands separator or decimal
points. It would be good to enhance it to test those formats as
well.

Martin

Martin Sebor wrote:
> Travis Vitek wrote:
>>  
>>
>>> Author: sebor
>>> Date: Fri Apr 18 13:04:21 2008
>>> New Revision: 649673
>>>
>>>
>>>             nio.imbue (loc);
>>> -            nsb.pubsetg (data.ncs_, RW_COUNT_OF (data.ncs_));
>>> +            nsb.pubsetg (data.ncs_, Traits::length (data.ncs_));
>>>
>>
>> Should we calculate the length once in the main thread and cache it?
>> Seems like this would save some cycles in each thread and increase
>> contention for any locks in the locale code.
> 
> Good suggestion! Let me fix it.
> 
> Martin


Re: svn commit: r649673 - /stdcxx/trunk/tests/localization/22.locale.num.get.mt.cpp

Posted by Martin Sebor <se...@roguewave.com>.
Travis Vitek wrote:
>  
> 
>> Author: sebor
>> Date: Fri Apr 18 13:04:21 2008
>> New Revision: 649673
>>
>>
>>             nio.imbue (loc);
>> -            nsb.pubsetg (data.ncs_, RW_COUNT_OF (data.ncs_));
>> +            nsb.pubsetg (data.ncs_, Traits::length (data.ncs_));
>>
> 
> Should we calculate the length once in the main thread and cache it?
> Seems like this would save some cycles in each thread and increase
> contention for any locks in the locale code.

Good suggestion! Let me fix it.

Martin

RE: svn commit: r649673 - /stdcxx/trunk/tests/localization/22.locale.num.get.mt.cpp

Posted by Travis Vitek <Tr...@roguewave.com>.
 

>
>Author: sebor
>Date: Fri Apr 18 13:04:21 2008
>New Revision: 649673
>
> 
>             nio.imbue (loc);
>-            nsb.pubsetg (data.ncs_, RW_COUNT_OF (data.ncs_));
>+            nsb.pubsetg (data.ncs_, Traits::length (data.ncs_));
>

Should we calculate the length once in the main thread and cache it?
Seems like this would save some cycles in each thread and increase
contention for any locks in the locale code.

Travis