View | Details | Raw Unified | Return to bug 18435 | Differences between
and this patch

Collapse All | Expand All

(-)a/ChangeLog (+8 lines)
Lines 1-3 Link Here
1
2015-05-19  Martin Sebor  <msebor@redhat.com>
2
3
	[BZ #18435]
4
	* nptl/Makefile: Add tst-once5.cc.
5
	* nptl/pthreadP.h (pthread_cleanup_push, pthread_cleanup_pop):
6
	Remove macro redefinitions.
7
	* nptl/tst-once5.cc: New test.
8
1
2015-05-18  Siddhesh Poyarekar  <siddhesh@redhat.com>
9
2015-05-18  Siddhesh Poyarekar  <siddhesh@redhat.com>
2
10
3
	* .gitignore: Ignore generated *.pyc.
11
	* .gitignore: Ignore generated *.pyc.
(-)a/nptl/Makefile (-1 / +2 lines)
Lines 203-208 CFLAGS-send.c = -fexceptions -fasynchronous-unwind-tables Link Here
203
203
204
CFLAGS-pt-system.c = -fexceptions
204
CFLAGS-pt-system.c = -fexceptions
205
205
206
LDFLAGS-tst-once5 = -lstdc++
206
207
207
tests = tst-typesizes \
208
tests = tst-typesizes \
208
	tst-attr1 tst-attr2 tst-attr3 tst-default-attr \
209
	tst-attr1 tst-attr2 tst-attr3 tst-default-attr \
Lines 224-230 tests = tst-typesizes \ Link Here
224
	tst-rwlock1 tst-rwlock2 tst-rwlock2a tst-rwlock3 tst-rwlock4 \
225
	tst-rwlock1 tst-rwlock2 tst-rwlock2a tst-rwlock3 tst-rwlock4 \
225
	tst-rwlock5 tst-rwlock6 tst-rwlock7 tst-rwlock8 tst-rwlock9 \
226
	tst-rwlock5 tst-rwlock6 tst-rwlock7 tst-rwlock8 tst-rwlock9 \
226
	tst-rwlock10 tst-rwlock11 tst-rwlock12 tst-rwlock13 tst-rwlock14 \
227
	tst-rwlock10 tst-rwlock11 tst-rwlock12 tst-rwlock13 tst-rwlock14 \
227
	tst-once1 tst-once2 tst-once3 tst-once4 \
228
	tst-once1 tst-once2 tst-once3 tst-once4 tst-once5 \
228
	tst-key1 tst-key2 tst-key3 tst-key4 \
229
	tst-key1 tst-key2 tst-key3 tst-key4 \
229
	tst-sem1 tst-sem2 tst-sem3 tst-sem4 tst-sem5 tst-sem6 tst-sem7 \
230
	tst-sem1 tst-sem2 tst-sem3 tst-sem4 tst-sem5 tst-sem6 tst-sem7 \
230
	tst-sem8 tst-sem9 tst-sem10 tst-sem11 tst-sem12 tst-sem13 tst-sem14 \
231
	tst-sem8 tst-sem9 tst-sem10 tst-sem11 tst-sem12 tst-sem13 tst-sem14 \
(-)a/nptl/pthreadP.h (-7 lines)
Lines 536-551 extern void __librt_disable_asynccancel (int oldtype) Link Here
536
extern void __pthread_cleanup_push (struct _pthread_cleanup_buffer *buffer,
536
extern void __pthread_cleanup_push (struct _pthread_cleanup_buffer *buffer,
537
				    void (*routine) (void *), void *arg)
537
				    void (*routine) (void *), void *arg)
538
     attribute_hidden;
538
     attribute_hidden;
539
# undef pthread_cleanup_push
540
# define pthread_cleanup_push(routine,arg) \
541
  { struct _pthread_cleanup_buffer _buffer;				      \
542
    __pthread_cleanup_push (&_buffer, (routine), (arg));
543
539
544
extern void __pthread_cleanup_pop (struct _pthread_cleanup_buffer *buffer,
540
extern void __pthread_cleanup_pop (struct _pthread_cleanup_buffer *buffer,
545
				   int execute) attribute_hidden;
541
				   int execute) attribute_hidden;
546
# undef pthread_cleanup_pop
547
# define pthread_cleanup_pop(execute) \
548
    __pthread_cleanup_pop (&_buffer, (execute)); }
549
#endif
542
#endif
550
543
551
extern void __pthread_cleanup_push_defer (struct _pthread_cleanup_buffer *buffer,
544
extern void __pthread_cleanup_push_defer (struct _pthread_cleanup_buffer *buffer,
(-)a/nptl/tst-once5.cc (+80 lines)
Line 0 Link Here
1
/* Copyright (C) 2015 Free Software Foundation, Inc.
2
   This file is part of the GNU C Library.
3
   Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
4
5
   The GNU C Library is free software; you can redistribute it and/or
6
   modify it under the terms of the GNU Lesser General Public
7
   License as published by the Free Software Foundation; either
8
   version 2.1 of the License, or (at your option) any later version.
9
10
   The GNU C Library is distributed in the hope that it will be useful,
11
   but WITHOUT ANY WARRANTY; without even the implied warranty of
12
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13
   Lesser General Public License for more details.
14
15
   You should have received a copy of the GNU Lesser General Public
16
   License along with the GNU C Library; if not, see
17
   <http://www.gnu.org/licenses/>.  */
18
19
#include <errno.h>
20
#include <pthread.h>
21
#include <stdio.h>
22
#include <string.h>
23
24
25
static pthread_once_t once = PTHREAD_ONCE_INIT;
26
27
// Exception type thrown from the pthread_once init routine.
28
struct OnceException { };
29
30
// Test iteration counter.
31
static int niter;
32
33
static void
34
init_routine (void)
35
{
36
  if (niter < 2)
37
    throw OnceException ();
38
}
39
40
// Verify that an exception thrown from the pthread_once init routine
41
// is propagated to the pthread_once caller and that the function can
42
// be subsequently invoked to attempt the initialization again.
43
static int
44
do_test (void)
45
{
46
  int result = 1;
47
48
  // Repeat three times, having the init routine throw the first two
49
  // times and succeed on the final attempt.
50
  for (niter = 0; niter != 3; ++niter) {
51
52
    try {
53
      int rc = pthread_once (&once, init_routine);
54
      if (rc)
55
        fprintf (stderr, "pthread_once failed: %i (%s)\n",
56
                 rc, strerror (rc));
57
58
      if (niter < 2)
59
        fputs ("pthread_once unexpectedly returned without"
60
               " throwing an exception", stderr);
61
    }
62
    catch (OnceException) {
63
      if (1 < niter)
64
        fputs ("pthread_once unexpectedly threw", stderr);
65
      result = 0;
66
    }
67
    catch (...) {
68
      fputs ("pthread_once threw an unknown exception", stderr);
69
    }
70
71
    // Abort the test on the first failure.
72
    if (result)
73
      break;
74
  }
75
76
  return result;
77
}
78
79
#define TEST_FUNCTION do_test ()
80
#include "../test-skeleton.c"

Return to bug 18435