Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Update.
2003-11-05  Jakub Jelinek  <jakub@redhat.com>

	* unwind.c (FRAME_LEFT): Define.
	(unwind_stop): Handle old style cleanups here.
	(__pthread_unwind): Handle old style cleanups only if
	!HAVE_FORCED_UNWIND.
	* Makefile (tests): Add tst-cleanup4 and tst-cleanupx4.
	(CFLAGS-tst-cleanupx4.c): Add -fexceptions.
	($(objpfx)tst-cleanup4): Depend on $(objpfx)tst-cleanup4aux.o.
	($(objpfx)tst-cleanupx4): Likewise.
	* tst-cleanup4.c: New test.
	* tst-cleanup4aux.c: New.
	* tst-cleanupx4.c: New test.
  • Loading branch information
Ulrich Drepper committed Nov 6, 2003
1 parent c28422b commit 44e9414
Show file tree
Hide file tree
Showing 6 changed files with 390 additions and 10 deletions.
14 changes: 14 additions & 0 deletions nptl/ChangeLog
@@ -1,3 +1,17 @@
2003-11-05 Jakub Jelinek <jakub@redhat.com>

* unwind.c (FRAME_LEFT): Define.
(unwind_stop): Handle old style cleanups here.
(__pthread_unwind): Handle old style cleanups only if
!HAVE_FORCED_UNWIND.
* Makefile (tests): Add tst-cleanup4 and tst-cleanupx4.
(CFLAGS-tst-cleanupx4.c): Add -fexceptions.
($(objpfx)tst-cleanup4): Depend on $(objpfx)tst-cleanup4aux.o.
($(objpfx)tst-cleanupx4): Likewise.
* tst-cleanup4.c: New test.
* tst-cleanup4aux.c: New.
* tst-cleanupx4.c: New test.

2003-11-04 Ulrich Drepper <drepper@redhat.com>

* sysdeps/pthread/bits/stdio-lock.h: Use lll_*lock instead of
Expand Down
8 changes: 6 additions & 2 deletions nptl/Makefile
Expand Up @@ -216,7 +216,7 @@ tests = tst-attr1 tst-attr2 tst-attr3 \
tst-cancel6 tst-cancel7 tst-cancel8 tst-cancel9 tst-cancel10 \
tst-cancel11 tst-cancel12 tst-cancel13 tst-cancel14 tst-cancel15 \
tst-cancel16 tst-cancel17 tst-cancel18 tst-cancel19 \
tst-cleanup0 tst-cleanup1 tst-cleanup2 tst-cleanup3 \
tst-cleanup0 tst-cleanup1 tst-cleanup2 tst-cleanup3 tst-cleanup4 \
tst-flock1 tst-flock2 \
tst-signal1 tst-signal2 tst-signal3 tst-signal4 tst-signal5 \
tst-signal6 \
Expand Down Expand Up @@ -248,7 +248,7 @@ tests += tst-cancelx2 tst-cancelx3 tst-cancelx4 tst-cancelx5 \
tst-cancelx6 tst-cancelx7 tst-cancelx8 tst-cancelx9 tst-cancelx10 \
tst-cancelx11 tst-cancelx12 tst-cancelx13 tst-cancelx14 tst-cancelx15\
tst-cancelx16 tst-cancelx17 tst-cancelx18 \
tst-cleanupx0 tst-cleanupx1 tst-cleanupx2 tst-cleanupx3 \
tst-cleanupx0 tst-cleanupx1 tst-cleanupx2 tst-cleanupx3 tst-cleanupx4 \
tst-oncex3 tst-oncex4
endif
ifeq ($(build-shared),yes)
Expand Down Expand Up @@ -393,6 +393,7 @@ CFLAGS-tst-cleanupx0.c += -fexceptions -fasynchronous-unwind-tables
CFLAGS-tst-cleanupx1.c += -fexceptions -fasynchronous-unwind-tables
CFLAGS-tst-cleanupx2.c += -fexceptions
CFLAGS-tst-cleanupx3.c += -fexceptions
CFLAGS-tst-cleanupx4.c += -fexceptions
CFLAGS-tst-oncex3.c += -fexceptions
CFLAGS-tst-oncex4.c += -fexceptions
CFLAGS-tst-align.c += $(stack-align-test-flags)
Expand All @@ -405,6 +406,9 @@ LDFLAGS-tst-atfork2 = -rdynamic
tst-atfork2-ENV = MALLOC_TRACE=$(objpfx)tst-atfork2.mtrace
$(objpfx)tst-atfork2mod.so: $(shared-thread-library)

$(objpfx)tst-cleanup4: $(objpfx)tst-cleanup4aux.o $(shared-thread-library)
$(objpfx)tst-cleanupx4: $(objpfx)tst-cleanup4aux.o $(shared-thread-library)

$(objpfx)tst-tls3: $(libdl) $(shared-thread-library)
LDFLAGS-tst-tls3 = -rdynamic
$(objpfx)tst-tls3.out: $(objpfx)tst-tls3mod.so
Expand Down
198 changes: 198 additions & 0 deletions nptl/tst-cleanup4.c
@@ -0,0 +1,198 @@
/* Copyright (C) 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Jakub Jelinek <jakub@redhat.com>, 2003.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

/* LinuxThreads pthread_cleanup_{push,pop} helpers. */
extern void _pthread_cleanup_push (struct _pthread_cleanup_buffer *__buffer,
void (*__routine) (void *),
void *__arg);
extern void _pthread_cleanup_pop (struct _pthread_cleanup_buffer *__buffer,
int __execute);

static int fds[2];
static pthread_barrier_t b2;
static int global;

/* Defined in tst-cleanup4aux.c, never compiled with -fexceptions. */
extern void fn5 (void);
extern void fn7 (void);
extern void fn9 (void);

void
clh (void *arg)
{
int val = (long int) arg;

printf ("clh (%d)\n", val);

global *= val;
global += val;
}


static __attribute__((noinline)) void
fn_read (void)
{
int r = pthread_barrier_wait (&b2);
if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD)
{
printf ("%s: barrier_wait failed\n", __FUNCTION__);
exit (1);
}

char c;
read (fds[0], &c, 1);
}


__attribute__((noinline)) void
fn0 (void)
{
pthread_cleanup_push (clh, (void *) 1l);

fn_read ();

pthread_cleanup_pop (1);
}


__attribute__((noinline)) void
fn1 (void)
{
/* This is the old LinuxThreads pthread_cleanup_{push,pop}. */
struct _pthread_cleanup_buffer b;
_pthread_cleanup_push (&b, clh, (void *) 2l);

fn0 ();

_pthread_cleanup_pop (&b, 1);
}


static __attribute__((noinline)) void
fn2 (void)
{
pthread_cleanup_push (clh, (void *) 3l);

fn1 ();

pthread_cleanup_pop (1);
}


static void *
tf (void *a)
{
switch ((long) a)
{
case 0:
fn2 ();
break;
case 1:
fn5 ();
break;
case 2:
fn7 ();
break;
case 3:
fn9 ();
break;
}

return NULL;
}


int
do_test (void)
{
int result = 0;

if (pipe (fds) != 0)
{
puts ("pipe failed");
exit (1);
}

if (pthread_barrier_init (&b2, NULL, 2) != 0)
{
puts ("b2 init failed");
exit (1);
}

const int expect[] =
{
15, /* 1 2 3 */
276, /* 1 4 5 6 */
120, /* 1 7 8 */
460 /* 1 2 9 10 */
};

long i;
for (i = 0; i < 4; ++i)
{
global = 0;

printf ("test %ld\n", i);

pthread_t th;
if (pthread_create (&th, NULL, tf, (void *) i) != 0)
{
puts ("create failed");
exit (1);
}

int e = pthread_barrier_wait (&b2);
if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD)
{
printf ("%s: barrier_wait failed\n", __FUNCTION__);
exit (1);
}

pthread_cancel (th);

void *r;
if ((e = pthread_join (th, &r)) != 0)
{
printf ("join failed: %d\n", e);
_exit (1);
}

if (r != PTHREAD_CANCELED)
{
puts ("thread not canceled");
exit (1);
}

if (global != expect[i])
{
printf ("global = %d, expected %d\n", global, expect[i]);
result = 1;
}
}

return result;
}

#define TEST_FUNCTION do_test ()
#include "../test-skeleton.c"
121 changes: 121 additions & 0 deletions nptl/tst-cleanup4aux.c
@@ -0,0 +1,121 @@
/* Copyright (C) 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Jakub Jelinek <jakub@redhat.com>, 2003.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

extern void _pthread_cleanup_push (struct _pthread_cleanup_buffer *__buffer,
void (*__routine) (void *),
void *__arg);
extern void _pthread_cleanup_pop (struct _pthread_cleanup_buffer *__buffer,
int __execute);

extern void clh (void *arg);
extern void fn0 (void);
extern void fn1 (void);
extern void fn5 (void);
extern void fn7 (void);
extern void fn9 (void);


static __attribute__((noinline)) void
fn3 (void)
{
/* This is the old LinuxThreads pthread_cleanup_{push,pop}. */
struct _pthread_cleanup_buffer b;
_pthread_cleanup_push (&b, clh, (void *) 4l);

fn0 ();

_pthread_cleanup_pop (&b, 1);
}


static __attribute__((noinline)) void
fn4 (void)
{
pthread_cleanup_push (clh, (void *) 5l);

fn3 ();

pthread_cleanup_pop (1);
}


void
fn5 (void)
{
/* This is the old LinuxThreads pthread_cleanup_{push,pop}. */
struct _pthread_cleanup_buffer b;
_pthread_cleanup_push (&b, clh, (void *) 6l);

fn4 ();

_pthread_cleanup_pop (&b, 1);
}


static __attribute__((noinline)) void
fn6 (void)
{
pthread_cleanup_push (clh, (void *) 7l);

fn0 ();

pthread_cleanup_pop (1);
}


void
fn7 (void)
{
/* This is the old LinuxThreads pthread_cleanup_{push,pop}. */
struct _pthread_cleanup_buffer b;
_pthread_cleanup_push (&b, clh, (void *) 8l);

fn6 ();

_pthread_cleanup_pop (&b, 1);
}


static __attribute__((noinline)) void
fn8 (void)
{
pthread_cleanup_push (clh, (void *) 9l);

fn1 ();

pthread_cleanup_pop (1);
}


void
fn9 (void)
{
/* This is the old LinuxThreads pthread_cleanup_{push,pop}. */
struct _pthread_cleanup_buffer b;
_pthread_cleanup_push (&b, clh, (void *) 10l);

fn8 ();

_pthread_cleanup_pop (&b, 1);
}
1 change: 1 addition & 0 deletions nptl/tst-cleanupx4.c
@@ -0,0 +1 @@
#include "tst-cleanup4.c"

0 comments on commit 44e9414

Please sign in to comment.