glibc/linuxthreads/Examples/ex9.c
Ulrich Drepper b664d723de Update.
* malloc/hooks.c (realloc_check): If mremap succeeds actually use
	the result.

	* sysdeps/i386/i486/bits/string.h: Add early clobber for "a"
	output parameter.  Reported by Denis Zaitsev <zzz@cd-club.ru>.

	* Versions.def (libthread_db): Add GLIBC_2.3.

2002-07-09  Jakub Jelinek  <jakub@redhat.com>

	* libio/freopen.c (freopen): Reset jump tables, use mmap stdio for the
	new stream if possible.
	* libio/freopen64.c (freopen64): Likewise.
	* libio/Makefile (tests): Add tst-freopen.
	* libio/tst-freopen.c: New file.

2002-07-03  Jakub Jelinek  <jakub@redhat.com>

	* libio/stdio.h (obstack_printf): Add format attribute.
	(obstack_vprintf): Likewise.

2002-07-04  Jakub Jelinek  <jakub@redhat.com>

	* posix/regex_internal.h (re_token_t): Shrink the structure to 8
	resp. 16 bytes on 32-bit resp. 64-bit platforms.
	(re_charset_t, re_string_t): Reorder structure members for 64-bit
	architectures.

2002-07-04  Jakub Jelinek  <jakub@redhat.com>

	* posix/regcomp.c (re_compile_internal): Move clearing of dfa...
	(init_dfa): ...here.

2002-07-05  Isamu Hasegawa  <isamu@yamato.ibm.com>

	* posix/regcomp.c (parse_sub_exp): Add nodes OP_OPEN_SUBEXP and
	OP_CLOSE_SUBEXP at both ends of sub expressions instead of SUBEXP
	nodes in parse trees.
	(calc_first): Fix the Definition of `firsts' of OP_OPEN_SUBEXP
	and OP_CLOSE_SUBEXP, and remove the definition of SUBEXP.
	(calc_epsdest): Treat OP_OPEN_SUBEXP and OP_CLOSE_SUBEXP as the
	nodes which can epsilon transit.
	* posix/regex_internal.h: Add OP_OPEN_SUBEXP and OP_CLOSE_SUBEXP
	to IS_EPSILON_NODE macro.
	* posix/regexec.c (update_regs): New function to update registers
	by refering OP_OPEN_SUBEXP and OP_CLOSE_SUBEXP nodes.
	(proceed_next_node): Use the entities of the nodes to determine
	whether the node can transit to.
	(set_regs): Use update_regs function to update registers.

2002-07-03  Jakub Jelinek  <jakub@redhat.com>

	* posix/bug-regex4.c (main): Remove duplicate setlocale.
	* posix/bug-regex6.c: New file.
	* posix/Makefile (tests): Add bug-regex6.
	(bug-regex6-ENV): Set LOCPATH.

2002-07-10  Ulrich Drepper  <drepper@redhat.com>
2002-07-11 02:59:49 +00:00

100 lines
2.6 KiB
C

/* Tests for pthread_barrier_* functions.
Copyright (C) 2000, 2001 Free Software Foundation, Inc.
Contributed by Kaz Kylheku <kaz@ashi.footprints.net>, 2000.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C 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
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <errno.h>
#include <error.h>
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define NUM_THREADS 10
#define NUM_ITERS 500
static void *thread (void *) __attribute__ ((__noreturn__));
static pthread_barrier_t barrier;
int
main (void)
{
pthread_t thread_list[NUM_THREADS];
int i;
if (pthread_barrier_init (&barrier, NULL, NUM_THREADS + 1) != 0)
error (EXIT_FAILURE, 0, "cannot initialize barrier");
for (i = 0; i < NUM_THREADS; i++)
{
if (pthread_create (&thread_list[i], NULL, thread, NULL) != 0)
error (EXIT_FAILURE, 0, "cannot create thread");
}
(void) thread (NULL);
for (i = 0; i < NUM_THREADS; i++)
{
pthread_join(thread_list[i], NULL);
}
return 0;
}
static void *
thread (void *arg)
{
int i;
pthread_t self = pthread_self ();
static pthread_t last_serial_thread;
static int linecount; /* protected by flockfile(stdout) */
for (i = 0; i < NUM_ITERS; i++)
{
switch (pthread_barrier_wait (&barrier))
{
case 0:
flockfile (stdout);
printf ("%04d: non-serial thread %lu\n", ++linecount,
(unsigned long) self);
funlockfile (stdout);
break;
case PTHREAD_BARRIER_SERIAL_THREAD:
flockfile (stdout);
printf ("%04d: serial thread %lu\n", ++linecount,
(unsigned long) self);
funlockfile (stdout);
last_serial_thread = self;
break;
default:
/* Huh? */
error (EXIT_FAILURE, 0, "unexpected return value from barrier wait");
}
}
if (pthread_equal (self, last_serial_thread))
{
flockfile (stdout);
printf ("%04d: last serial thread %lu terminating process\n",
++linecount, (unsigned long) self);
funlockfile (stdout);
return;
}
pthread_exit(NULL);
}