Rev 1128 | Rev 1152 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 1128 | Rev 1129 | ||
|---|---|---|---|
| Line 37... | Line 37... | ||
| 37 | #include <futex.h> |
37 | #include <futex.h> |
| 38 | 38 | ||
| 39 | int a; |
39 | int a; |
| 40 | atomic_t ftx; |
40 | atomic_t ftx; |
| 41 | 41 | ||
| - | 42 | int __thread tls_prom; |
|
| - | 43 | ||
| 42 | extern void utest(void *arg); |
44 | extern void utest(void *arg); |
| 43 | void utest(void *arg) |
45 | void utest(void *arg) |
| 44 | { |
46 | { |
| 45 | printf("Uspace thread started.\n"); |
47 | printf("Uspace thread started.\n"); |
| 46 | if (futex_down(&ftx) < 0) |
48 | if (futex_down(&ftx) < 0) |
| Line 253... | Line 255... | ||
| 253 | ipc_wait_for_call(&data, 0); |
255 | ipc_wait_for_call(&data, 0); |
| 254 | } |
256 | } |
| 255 | 257 | ||
| 256 | static int ptest(void *arg) |
258 | static int ptest(void *arg) |
| 257 | { |
259 | { |
| - | 260 | tls_prom = -1; |
|
| 258 | printf("Pseudo thread stage1.\n"); |
261 | printf("Pseudo thread stage%d.\n", -tls_prom); |
| - | 262 | tls_prom = -2; |
|
| 259 | psthread_schedule_next(); |
263 | psthread_schedule_next(); |
| 260 | printf("Pseudo thread stage2.\n"); |
264 | printf("Pseudo thread stage%d.\n", -tls_prom); |
| - | 265 | tls_prom = -3; |
|
| 261 | psthread_schedule_next(); |
266 | psthread_schedule_next(); |
| 262 | printf("Pseudo thread stage3.\n"); |
267 | printf("Pseudo thread stage%d\n", -tls_prom); |
| 263 | psthread_schedule_next(); |
268 | psthread_schedule_next(); |
| 264 | printf("Pseudo thread stage4.\n"); |
269 | printf("Pseudo thread stage4.\n"); |
| 265 | psthread_schedule_next(); |
270 | psthread_schedule_next(); |
| 266 | printf("Pseudo thread exiting.\n"); |
271 | printf("Pseudo thread exiting.\n"); |
| 267 | return 0; |
272 | return 0; |
| Line 288... | Line 293... | ||
| 288 | if (futex_up(&ftx) < 0) |
293 | if (futex_up(&ftx) < 0) |
| 289 | printf("Futex failed.\n"); |
294 | printf("Futex failed.\n"); |
| 290 | 295 | ||
| 291 | if (futex_down(&ftx) < 0) |
296 | if (futex_down(&ftx) < 0) |
| 292 | printf("Futex failed.\n"); |
297 | printf("Futex failed.\n"); |
| 293 | 298 | /* |
|
| 294 | if ((tid = thread_create(utest, NULL, "utest")) != -1) { |
299 | if ((tid = thread_create(utest, NULL, "utest")) != -1) { |
| 295 | printf("Created thread tid=%d\n", tid); |
300 | printf("Created thread tid=%d\n", tid); |
| 296 | } |
301 | } |
| 297 | 302 | ||
| 298 | if ((tid = thread_create(utest, NULL, "utest")) != -1) { |
303 | if ((tid = thread_create(utest, NULL, "utest")) != -1) { |
| 299 | printf("Created thread tid=%d\n", tid); |
304 | printf("Created thread tid=%d\n", tid); |
| 300 | } |
305 | } |
| 301 | 306 | */ |
|
| 302 | int i; |
307 | int i; |
| 303 | 308 | ||
| 304 | for (i = 0; i < 50000000; i++) |
309 | for (i = 0; i < 50000000; i++) |
| 305 | ; |
310 | ; |
| 306 | 311 | ||
| 307 | if (futex_up(&ftx) < 0) |
312 | if (futex_up(&ftx) < 0) |
| 308 | printf("Futex failed.\n"); |
313 | printf("Futex failed.\n"); |
| 309 | 314 | ||
| - | 315 | ||
| - | 316 | printf("Creating pathread\n"); |
|
| - | 317 | tls_prom = 1; |
|
| 310 | ptid = psthread_create(ptest, NULL); |
318 | ptid = psthread_create(ptest, NULL); |
| 311 | printf("Main thread stage1.\n"); |
319 | printf("Main thread stage%d\n",tls_prom); |
| - | 320 | tls_prom = 2; |
|
| 312 | psthread_schedule_next();; |
321 | psthread_schedule_next();; |
| 313 | printf("Main thread stage2.\n"); |
322 | printf("Main thread stage%d\n", tls_prom); |
| - | 323 | tls_prom = 3; |
|
| 314 | psthread_schedule_next();; |
324 | psthread_schedule_next();; |
| 315 | printf("Main thread stage3.\n"); |
325 | printf("Main thread stage%d\n", tls_prom); |
| 316 | 326 | ||
| 317 | psthread_join(ptid); |
327 | psthread_join(ptid); |
| 318 | 328 | ||
| 319 | printf("Main thread exiting.\n"); |
329 | printf("Main thread exiting.\n"); |
| 320 | return 0; |
330 | return 0; |