This is the mail archive of the libc-hacker@sourceware.org mailing list for the glibc project.

Note that libc-hacker is a closed list. You may look at the archives of this list, but subscription and posting are not open.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: SH: A typo in lowlevellock.S


Ulrich Drepper <drepper@redhat.com> wrote:
> The test suite missed this?  If yes, can you come up with a test which
> exposes the problem?

The current testcases didn't fail for this normally.  Perhaps
I've seen but missed it because it wasn't reproducible.  It seems
to be timing critical on the slow machines like sh.
I've noticed it with a random behavior of a libstdc++-v3 testcase
gcc/libstdc++-v3/testsuite/22_locale/locale/cons/12658_thread-1.c.
The appended is a slightly changed version of it which will end in
~30s on my sh box with the patched libpthread but will take long
time or hang up with high probability on the old libpthread.
I could replace the locale stuff with something and rewrite it in
C using pthread_mutex_{lock,unlock} directly, though I'm unsure
that I can get the appropriate timings.

Regards,
	kaz
--
// Copyright (C) 2004, 2005 Free Software Foundation
//
// This file is part of the GNU ISO C++ Library.  This library is free
// software; you can redistribute it and/or modify it under the
// terms of the GNU General Public License as published by the
// Free Software Foundation; either version 2, or (at your option)
// any later version.

// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License along
// with this library; see the file COPYING.  If not, write to the Free
// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
// USA.

// 22.1.1.2 locale constructors and destructors [lib.locale.cons]

#include <locale>
#include <pthread.h>

const int max_thread_count = 2;
//const int max_loop_count = 1000000; // orig value
const int max_loop_count = 100000;
const int max_locales = 10;
 
void* thread_main(void*)
{
  try
    {
      std::locale loc_c = std::locale::classic();
      std::locale loc[max_locales];
      for (int j = 0; j < max_locales; ++j)
	loc[j] = std::locale(j % 2 ? "en_US" : "fr_FR");
      
      for (int i = 0; i < max_loop_count; ++i)
	{
	  int k = i % max_locales;
	  loc[k] = std::locale::global(loc[k]);
	  
	  if (i % 37 == 0)
	    loc[k] = loc[k].combine<std::ctype<char> >(loc_c);
	}
    }
  catch (...) { }
  return 0;
}
 
int
main()
{
  pthread_t tid[max_thread_count];
  
  for (int i = 0; i < max_thread_count; i++)
    pthread_create (&tid[i], NULL, thread_main, 0);
  
  for (int i = 0; i < max_thread_count; i++)
    pthread_join (tid[i], NULL);

  return 0;
}


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]