1 /* Test program, used by the gettext-6 test. 2 Copyright (C) 2005-2006 Free Software Foundation, Inc. 3 4 This program is free software; you can redistribute it and/or modify 5 it under the terms of the GNU General Public License as published by 6 the Free Software Foundation; either version 2, or (at your option) 7 any later version. 8 9 This program is distributed in the hope that it will be useful, 10 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 GNU General Public License for more details. 13 14 You should have received a copy of the GNU General Public License 15 along with this program; if not, write to the Free Software Foundation, 16 Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ 17 18 /* Written by Bruno Haible <haible@clisp.cons.org>, 2005. */ 19 20 #ifdef HAVE_CONFIG_H 21 # include <config.h> 22 #endif 23 24 #include <locale.h> 25 #include <stdlib.h> 26 #include <stdio.h> 27 #include <string.h> 28 29 #if USE_POSIX_THREADS && ((__GLIBC__ > 2) || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 3)) 30 31 #include <pthread.h> 32 #include "setenv.h" 33 34 /* Make sure we use the included libintl, not the system's one. */ 35 #undef _LIBINTL_H 36 #include "libgnuintl.h" 37 38 /* Set to 1 if the program is not behaving correctly. */ 39 int result; 40 41 /* Denotes which thread should run next. */ 42 int flipflop; 43 /* Lock and wait queue used to switch between the threads. */ 44 pthread_mutex_t lock; 45 pthread_cond_t waitqueue; 46 47 /* Waits until the flipflop has a given value. 48 Before the call, the lock is unlocked. After the call, it is locked. */ 49 static void 50 waitfor (int value) 51 { 52 if (pthread_mutex_lock (&lock)) 53 exit (10); 54 while (flipflop != value) 55 if (pthread_cond_wait (&waitqueue, &lock)) 56 exit (11); 57 } 58 59 /* Sets the flipflop to a given value. 60 Before the call, the lock is locked. After the call, it is unlocked. */ 61 static void 62 setto (int value) 63 { 64 flipflop = value; 65 if (pthread_cond_signal (&waitqueue)) 66 exit (20); 67 if (pthread_mutex_unlock (&lock)) 68 exit (21); 69 } 70 71 void * 72 thread1_execution (void *arg) 73 { 74 char *s; 75 76 waitfor (1); 77 uselocale (newlocale (LC_ALL_MASK, "de_DE", NULL)); 78 setto (2); 79 80 waitfor (1); 81 s = gettext ("beauty"); 82 puts (s); 83 if (strcmp (s, "Sch\366nheit")) 84 { 85 fprintf (stderr, "thread 1 call 1 returned: %s\n", s); 86 result = 1; 87 } 88 setto (2); 89 90 waitfor (1); 91 s = gettext ("beauty"); 92 puts (s); 93 if (strcmp (s, "Sch\366nheit")) 94 { 95 fprintf (stderr, "thread 1 call 2 returned: %s\n", s); 96 result = 1; 97 } 98 setto (2); 99 100 return NULL; 101 } 102 103 void * 104 thread2_execution (void *arg) 105 { 106 char *s; 107 108 waitfor (2); 109 uselocale (newlocale (LC_ALL_MASK, "fr_FR", NULL)); 110 setto (1); 111 112 waitfor (2); 113 s = gettext ("beauty"); 114 puts (s); 115 if (strcmp (s, "beaut\351")) 116 { 117 fprintf (stderr, "thread 2 call 1 returned: %s\n", s); 118 result = 1; 119 } 120 setto (1); 121 122 waitfor (2); 123 s = gettext ("beauty"); 124 puts (s); 125 if (strcmp (s, "beaut\351")) 126 { 127 fprintf (stderr, "thread 2 call 2 returned: %s\n", s); 128 result = 1; 129 } 130 setto (1); 131 132 return NULL; 133 } 134 135 int 136 main (void) 137 { 138 pthread_t thread1; 139 pthread_t thread2; 140 141 unsetenv ("LANGUAGE"); 142 unsetenv ("OUTPUT_CHARSET"); 143 textdomain ("tstthread"); 144 bindtextdomain ("tstthread", "."); 145 result = 0; 146 147 flipflop = 1; 148 if (pthread_mutex_init (&lock, NULL)) 149 exit (2); 150 if (pthread_cond_init (&waitqueue, NULL)) 151 exit (2); 152 if (pthread_create (&thread1, NULL, &thread1_execution, NULL)) 153 exit (2); 154 if (pthread_create (&thread2, NULL, &thread2_execution, NULL)) 155 exit (2); 156 if (pthread_join (thread2, NULL)) 157 exit (3); 158 159 return result; 160 } 161 162 #else 163 164 /* This test is not executed. */ 165 166 int 167 main (void) 168 { 169 return 77; 170 } 171 172 #endif 173