Upload Tizen:Base source
[toolchains/nspr.git] / mozilla / nsprpub / pr / tests / joinku.c
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* ***** BEGIN LICENSE BLOCK *****
3  * Version: MPL 1.1/GPL 2.0/LGPL 2.1
4  *
5  * The contents of this file are subject to the Mozilla Public License Version
6  * 1.1 (the "License"); you may not use this file except in compliance with
7  * the License. You may obtain a copy of the License at
8  * http://www.mozilla.org/MPL/
9  *
10  * Software distributed under the License is distributed on an "AS IS" basis,
11  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
12  * for the specific language governing rights and limitations under the
13  * License.
14  *
15  * The Original Code is the Netscape Portable Runtime (NSPR).
16  *
17  * The Initial Developer of the Original Code is
18  * Netscape Communications Corporation.
19  * Portions created by the Initial Developer are Copyright (C) 1998-2000
20  * the Initial Developer. All Rights Reserved.
21  *
22  * Contributor(s):
23  *
24  * Alternatively, the contents of this file may be used under the terms of
25  * either the GNU General Public License Version 2 or later (the "GPL"), or
26  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
27  * in which case the provisions of the GPL or the LGPL are applicable instead
28  * of those above. If you wish to allow use of your version of this file only
29  * under the terms of either the GPL or the LGPL, and not to allow others to
30  * use your version of this file under the terms of the MPL, indicate your
31  * decision by deleting the provisions above and replace them with the notice
32  * and other provisions required by the GPL or the LGPL. If you do not delete
33  * the provisions above, a recipient may use your version of this file under
34  * the terms of any one of the MPL, the GPL or the LGPL.
35  *
36  * ***** END LICENSE BLOCK ***** */
37
38 /***********************************************************************
39 **
40 ** Name: dbmalloc1.c
41 **
42 ** Description: Tests PR_SetMallocCountdown PR_ClearMallocCountdown functions.
43 **
44 ** Modification History:
45 ** 
46 ** 19-May-97 AGarcia - separate the four join tests into different unit test modules.
47 **                       AGarcia- Converted the test to accomodate the debug_mode flag.
48 **               The debug mode will print all of the printfs associated with this test.
49 **                       The regress mode will be the default mode. Since the regress tool limits
50 **           the output to a one line status:PASS or FAIL,all of the printf statements
51 **                       have been handled with an if (debug_mode) statement.
52 ** 04-June-97 AGarcia removed the Test_Result function. Regress tool has been updated to
53 **                      recognize the return code from tha main program.
54 ***********************************************************************/
55
56 /***********************************************************************
57 ** Includes
58 ***********************************************************************/
59 /* Used to get the command line option */
60 #include "plgetopt.h"
61
62 #include "nspr.h"
63
64 #include <stdio.h>
65 #include <stdlib.h>
66 #include <string.h>
67
68 PRIntn failed_already=0;
69 PRIntn debug_mode;
70
71
72 /*
73         Program to test joining of threads.  Two threads are created.  One
74         to be waited upon until it has started.  The other to join after it has
75         completed.
76 */
77
78
79 static void lowPriority(void *arg)
80 {
81 }
82
83 static void highPriority(void *arg)
84 {
85 }
86
87 void runTest(PRThreadScope scope1, PRThreadScope scope2)
88 {
89         PRThread *low,*high;
90
91         /* create the low and high priority threads */
92         
93         low = PR_CreateThread(PR_USER_THREAD,
94                                       lowPriority, 0, 
95                                       PR_PRIORITY_LOW,
96                                       scope1,
97                                   PR_JOINABLE_THREAD,
98                                       0);
99         if (!low) {
100                 if (debug_mode) printf("\tcannot create low priority thread\n");
101                 else failed_already=1;
102                 return;
103         }
104
105         high = PR_CreateThread(PR_USER_THREAD,
106                                       highPriority, 0, 
107                                       PR_PRIORITY_HIGH,
108                                       scope2,
109                                   PR_JOINABLE_THREAD,
110                                       0);
111         if (!high) {
112                 if (debug_mode) printf("\tcannot create high priority thread\n");
113                 else failed_already=1;
114                 return;
115         }
116
117         /* Do the joining for both threads */
118         if (PR_JoinThread(low) == PR_FAILURE) {
119                 if (debug_mode) printf("\tcannot join low priority thread\n");
120                 else failed_already=1;
121                 return;
122         } else {
123         if (debug_mode) printf("\tjoined low priority thread\n");
124     }
125         if (PR_JoinThread(high) == PR_FAILURE) {
126                 if (debug_mode) printf("\tcannot join high priority thread\n");
127                 else failed_already=1;
128                 return;
129         } else {
130         if (debug_mode) printf("\tjoined high priority thread\n");
131     }
132 }
133
134 static PRIntn PR_CALLBACK RealMain( PRIntn argc, char **argv )
135 {
136         /* The command line argument: -d is used to determine if the test is being run
137         in debug mode. The regress tool requires only one line output:PASS or FAIL.
138         All of the printfs associated with this test has been handled with a if (debug_mode)
139         test.
140         Usage: test_name -d
141         */
142         
143         PLOptStatus os;
144         PLOptState *opt = PL_CreateOptState(argc, argv, "d:");
145         while (PL_OPT_EOL != (os = PL_GetNextOpt(opt)))
146     {
147                 if (PL_OPT_BAD == os) continue;
148         switch (opt->option)
149         {
150         case 'd':  /* debug mode */
151                         debug_mode = 1;
152             break;
153          default:
154             break;
155         }
156     }
157         PL_DestroyOptState(opt);
158
159     PR_Init(PR_USER_THREAD, PR_PRIORITY_NORMAL, 0);
160     PR_STDIO_INIT();
161
162  /* main test */
163
164     if (debug_mode) printf("Kernel-User test\n");
165     runTest(PR_GLOBAL_THREAD, PR_LOCAL_THREAD);
166
167
168         if(failed_already)      
169     {
170                 printf("FAIL\n");    
171                 return 1;
172         }
173         else
174         {
175                 printf("PASS\n");    
176                 return 0;
177         }
178
179 }
180
181
182 int main(int argc, char **argv)
183 {
184     PRIntn rv;
185     
186     PR_STDIO_INIT();
187     rv = PR_Initialize(RealMain, argc, argv, 0);
188     return rv;
189 }  /* main */