File: | pr/Linux4.19_x86_64_gcc_glibc_PTH_64_DBG.OBJ/pr/tests/../../../pr/tests/tmoacc.c |
Warning: | line 97, column 17 Value stored to 'toread' is never read |
Press '?' to see keyboard shortcuts
Keyboard shortcuts:
1 | /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ |
2 | /* This Source Code Form is subject to the terms of the Mozilla Public |
3 | * License, v. 2.0. If a copy of the MPL was not distributed with this |
4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
5 | |
6 | #include "nspr.h" |
7 | |
8 | #include <stdlib.h> |
9 | #include <string.h> |
10 | |
11 | #include "plerror.h" |
12 | #include "plgetopt.h" |
13 | |
14 | #ifdef DEBUG1 |
15 | #define PORT_INC_DO+100 +100 |
16 | #else |
17 | #define PORT_INC_DO+100 |
18 | #endif |
19 | #ifdef IS_64 |
20 | #define PORT_INC_3264+200 +200 |
21 | #else |
22 | #define PORT_INC_3264+200 |
23 | #endif |
24 | |
25 | #define BASE_PORT9867 +100 +200 9867 PORT_INC_DO+100 PORT_INC_3264+200 |
26 | #define DEFAULT_THREADS1 1 |
27 | #define DEFAULT_BACKLOG10 10 |
28 | #define DEFAULT_TIMEOUT10 10 |
29 | #define RANDOM_RANGE100 100 /* should be significantly smaller than RAND_MAX */ |
30 | |
31 | typedef enum {running, stopped} Status; |
32 | |
33 | typedef struct Shared |
34 | { |
35 | PRLock *ml; |
36 | PRCondVar *cv; |
37 | PRBool passed; |
38 | PRBool random; |
39 | PRFileDesc *debug; |
40 | PRIntervalTime timeout; |
41 | PRFileDesc *listenSock; |
42 | Status status; |
43 | } Shared; |
44 | |
45 | static PRIntervalTime Timeout(const Shared *shared) |
46 | { |
47 | PRIntervalTime timeout = shared->timeout; |
48 | if (shared->random) |
49 | { |
50 | PRIntervalTime half = timeout >> 1; /* one half of the interval */ |
51 | PRIntervalTime quarter = half >> 1; /* one quarter of the interval */ |
52 | /* something in [0..timeout / 2) */ |
53 | PRUint32 random = (rand() % RANDOM_RANGE100) * half / RANDOM_RANGE100; |
54 | timeout = (3 * quarter) + random; /* [75..125)% */ |
55 | } |
56 | return timeout; |
57 | } /* Timeout */ |
58 | |
59 | static void Accept(void *arg) |
60 | { |
61 | PRStatus rv; |
62 | char *buffer = NULL((void*)0); |
63 | PRNetAddr clientAddr; |
64 | Shared *shared = (Shared*)arg; |
65 | PRInt32 recv_length = 0, flags = 0; |
66 | PRFileDesc *clientSock; |
67 | PRIntn toread, byte, bytes, loop = 0; |
68 | struct Descriptor { |
69 | PRInt32 length; |
70 | PRUint32 checksum; |
71 | } descriptor; |
72 | |
73 | do |
74 | { |
75 | PRUint32 checksum = 0; |
76 | if (NULL((void*)0) != shared->debug) { |
77 | PR_fprintf(shared->debug, "[%d]accepting ... ", loop++); |
78 | } |
79 | clientSock = PR_Accept( |
80 | shared->listenSock, &clientAddr, Timeout(shared)); |
81 | if (clientSock != NULL((void*)0)) |
82 | { |
83 | if (NULL((void*)0) != shared->debug) { |
84 | PR_fprintf(shared->debug, "reading length ... "); |
85 | } |
86 | bytes = PR_Recv( |
87 | clientSock, &descriptor, sizeof(descriptor), |
88 | flags, Timeout(shared)); |
89 | if (sizeof(descriptor) == bytes) |
90 | { |
91 | /* and, before doing something stupid ... */ |
92 | descriptor.length = PR_ntohl(descriptor.length); |
93 | descriptor.checksum = PR_ntohl(descriptor.checksum); |
94 | if (NULL((void*)0) != shared->debug) { |
95 | PR_fprintf(shared->debug, "%d bytes ... ", descriptor.length); |
96 | } |
97 | toread = descriptor.length; |
Value stored to 'toread' is never read | |
98 | if (recv_length < descriptor.length) |
99 | { |
100 | if (NULL((void*)0) != buffer) { |
101 | PR_DELETE(buffer){ PR_Free(buffer); (buffer) = ((void*)0); }; |
102 | } |
103 | buffer = (char*)PR_MALLOC(descriptor.length)(PR_Malloc((descriptor.length))); |
104 | recv_length = descriptor.length; |
105 | } |
106 | for (toread = descriptor.length; toread > 0; toread -= bytes) |
107 | { |
108 | bytes = PR_Recv( |
109 | clientSock, &buffer[descriptor.length - toread], |
110 | toread, flags, Timeout(shared)); |
111 | if (-1 == bytes) |
112 | { |
113 | if (NULL((void*)0) != shared->debug) { |
114 | PR_fprintf(shared->debug, "read data failed..."); |
115 | } |
116 | bytes = 0; |
117 | } |
118 | } |
119 | } |
120 | else if (NULL((void*)0) != shared->debug) |
121 | { |
122 | PR_fprintf(shared->debug, "read desciptor failed..."); |
123 | descriptor.length = -1; |
124 | } |
125 | if (NULL((void*)0) != shared->debug) { |
126 | PR_fprintf(shared->debug, "closing"); |
127 | } |
128 | rv = PR_Shutdown(clientSock, PR_SHUTDOWN_BOTH); |
129 | if ((PR_FAILURE == rv) && (NULL((void*)0) != shared->debug)) |
130 | { |
131 | PR_fprintf(shared->debug, " failed"); |
132 | shared->passed = PR_FALSE0; |
133 | } |
134 | rv = PR_Close(clientSock); |
135 | if (PR_FAILURE == rv) if (NULL((void*)0) != shared->debug) |
136 | { |
137 | PR_fprintf(shared->debug, " failed"); |
138 | shared->passed = PR_FALSE0; |
139 | } |
140 | if (descriptor.length > 0) |
141 | { |
142 | for (byte = 0; byte < descriptor.length; ++byte) |
143 | { |
144 | PRUint32 overflow = checksum & 0x80000000; |
145 | checksum = (checksum << 1); |
146 | if (0x00000000 != overflow) { |
147 | checksum += 1; |
148 | } |
149 | checksum += buffer[byte]; |
150 | } |
151 | if ((descriptor.checksum != checksum) && (NULL((void*)0) != shared->debug)) |
152 | { |
153 | PR_fprintf(shared->debug, " ... data mismatch"); |
154 | shared->passed = PR_FALSE0; |
155 | } |
156 | } |
157 | else if (0 == descriptor.length) |
158 | { |
159 | PR_Lock(shared->ml); |
160 | shared->status = stopped; |
161 | PR_NotifyCondVar(shared->cv); |
162 | PR_Unlock(shared->ml); |
163 | } |
164 | if (NULL((void*)0) != shared->debug) { |
165 | PR_fprintf(shared->debug, "\n"); |
166 | } |
167 | } |
168 | else |
169 | { |
170 | if (PR_PENDING_INTERRUPT_ERROR(-5993L) != PR_GetError()) |
171 | { |
172 | if (NULL((void*)0) != shared->debug) { |
173 | PL_PrintError("Accept"); |
174 | } |
175 | shared->passed = PR_FALSE0; |
176 | } |
177 | } |
178 | } while (running == shared->status); |
179 | if (NULL((void*)0) != buffer) { |
180 | PR_DELETE(buffer){ PR_Free(buffer); (buffer) = ((void*)0); }; |
181 | } |
182 | } /* Accept */ |
183 | |
184 | PRIntn Tmoacc(PRIntn argc, char **argv) |
185 | { |
186 | PRStatus rv; |
187 | PRIntn exitStatus; |
188 | PRIntn index; |
189 | Shared *shared; |
190 | PLOptStatus os; |
191 | PRThread **thread; |
192 | PRNetAddr listenAddr; |
193 | PRSocketOptionData sockOpt; |
194 | PRIntn timeout = DEFAULT_TIMEOUT10; |
195 | PRIntn threads = DEFAULT_THREADS1; |
196 | PRIntn backlog = DEFAULT_BACKLOG10; |
197 | PRThreadScope thread_scope = PR_LOCAL_THREAD; |
198 | |
199 | PLOptState *opt = PL_CreateOptState(argc, argv, "dGb:t:T:R"); |
200 | |
201 | shared = PR_NEWZAP(Shared)((Shared*)PR_Calloc(1, sizeof(Shared))); |
202 | |
203 | shared->debug = NULL((void*)0); |
204 | shared->passed = PR_TRUE1; |
205 | shared->random = PR_TRUE1; |
206 | shared->status = running; |
207 | shared->ml = PR_NewLock(); |
208 | shared->cv = PR_NewCondVar(shared->ml); |
209 | |
210 | while (PL_OPT_EOL != (os = PL_GetNextOpt(opt))) |
211 | { |
212 | if (PL_OPT_BAD == os) { |
213 | continue; |
214 | } |
215 | switch (opt->option) |
216 | { |
217 | case 'd': /* debug mode */ |
218 | shared->debug = PR_GetSpecialFD(PR_StandardError); |
219 | break; |
220 | case 'G': /* use global threads */ |
221 | thread_scope = PR_GLOBAL_THREAD; |
222 | break; |
223 | case 'b': /* size of listen backlog */ |
224 | backlog = atoi(opt->value); |
225 | break; |
226 | case 't': /* number of threads doing accept */ |
227 | threads = atoi(opt->value); |
228 | break; |
229 | case 'T': /* timeout used for network operations */ |
230 | timeout = atoi(opt->value); |
231 | break; |
232 | case 'R': /* randomize the timeout values */ |
233 | shared->random = PR_TRUE1; |
234 | break; |
235 | default: |
236 | break; |
237 | } |
238 | } |
239 | PL_DestroyOptState(opt); |
240 | if (0 == threads) { |
241 | threads = DEFAULT_THREADS1; |
242 | } |
243 | if (0 == backlog) { |
244 | backlog = DEFAULT_BACKLOG10; |
245 | } |
246 | if (0 == timeout) { |
247 | timeout = DEFAULT_TIMEOUT10; |
248 | } |
249 | |
250 | PR_STDIO_INIT(); |
251 | memset(&listenAddr, 0, sizeof(listenAddr)); |
252 | rv = PR_InitializeNetAddr(PR_IpAddrAny, BASE_PORT9867 +100 +200, &listenAddr); |
253 | PR_ASSERT(PR_SUCCESS == rv)((PR_SUCCESS == rv)?((void)0):PR_Assert("PR_SUCCESS == rv","../../../pr/tests/tmoacc.c" ,253)); |
254 | |
255 | shared->timeout = PR_SecondsToInterval(timeout); |
256 | |
257 | /* First bind to the socket */ |
258 | shared->listenSock = PR_NewTCPSocket(); |
259 | if (shared->listenSock) |
260 | { |
261 | sockOpt.option = PR_SockOpt_Reuseaddr; |
262 | sockOpt.value.reuse_addr = PR_TRUE1; |
263 | rv = PR_SetSocketOption(shared->listenSock, &sockOpt); |
264 | PR_ASSERT(PR_SUCCESS == rv)((PR_SUCCESS == rv)?((void)0):PR_Assert("PR_SUCCESS == rv","../../../pr/tests/tmoacc.c" ,264)); |
265 | rv = PR_Bind(shared->listenSock, &listenAddr); |
266 | if (rv != PR_FAILURE) |
267 | { |
268 | rv = PR_Listen(shared->listenSock, threads + backlog); |
269 | if (PR_SUCCESS == rv) |
270 | { |
271 | thread = (PRThread**)PR_CALLOC(threads * sizeof(PRThread*))(PR_Calloc(1, (threads * sizeof(PRThread*)))); |
272 | for (index = 0; index < threads; ++index) |
273 | { |
274 | thread[index] = PR_CreateThread( |
275 | PR_USER_THREAD, Accept, shared, |
276 | PR_PRIORITY_NORMAL, thread_scope, |
277 | PR_JOINABLE_THREAD, 0); |
278 | PR_ASSERT(NULL != thread[index])((((void*)0) != thread[index])?((void)0):PR_Assert("NULL != thread[index]" ,"../../../pr/tests/tmoacc.c",278)); |
279 | } |
280 | |
281 | PR_Lock(shared->ml); |
282 | while (shared->status == running) { |
283 | PR_WaitCondVar(shared->cv, PR_INTERVAL_NO_TIMEOUT0xffffffffUL); |
284 | } |
285 | PR_Unlock(shared->ml); |
286 | for (index = 0; index < threads; ++index) |
287 | { |
288 | rv = PR_Interrupt(thread[index]); |
289 | PR_ASSERT(PR_SUCCESS== rv)((PR_SUCCESS== rv)?((void)0):PR_Assert("PR_SUCCESS== rv","../../../pr/tests/tmoacc.c" ,289)); |
290 | rv = PR_JoinThread(thread[index]); |
291 | PR_ASSERT(PR_SUCCESS== rv)((PR_SUCCESS== rv)?((void)0):PR_Assert("PR_SUCCESS== rv","../../../pr/tests/tmoacc.c" ,291)); |
292 | } |
293 | PR_DELETE(thread){ PR_Free(thread); (thread) = ((void*)0); }; |
294 | } |
295 | else |
296 | { |
297 | if (shared->debug) { |
298 | PL_PrintError("Listen"); |
299 | } |
300 | shared->passed = PR_FALSE0; |
301 | } |
302 | } |
303 | else |
304 | { |
305 | if (shared->debug) { |
306 | PL_PrintError("Bind"); |
307 | } |
308 | shared->passed = PR_FALSE0; |
309 | } |
310 | |
311 | PR_Close(shared->listenSock); |
312 | } |
313 | else |
314 | { |
315 | if (shared->debug) { |
316 | PL_PrintError("Create"); |
317 | } |
318 | shared->passed = PR_FALSE0; |
319 | } |
320 | |
321 | PR_DestroyCondVar(shared->cv); |
322 | PR_DestroyLock(shared->ml); |
323 | |
324 | PR_fprintf( |
325 | PR_GetSpecialFD(PR_StandardError), "%s\n", |
326 | ((shared->passed) ? "PASSED" : "FAILED")); |
327 | |
328 | exitStatus = (shared->passed) ? 0 : 1; |
329 | PR_DELETE(shared){ PR_Free(shared); (shared) = ((void*)0); }; |
330 | return exitStatus; |
331 | } |
332 | |
333 | int main(int argc, char **argv) |
334 | { |
335 | return (PR_VersionCheck(PR_VERSION"4.36 Beta")) ? |
336 | PR_Initialize(Tmoacc, argc, argv, 4) : -1; |
337 | } /* main */ |
338 | |
339 | /* tmoacc */ |