source: proiecte/swift/trunk/test/test_deque.c @ 176

Last change on this file since 176 was 176, checked in by (none), 14 years ago
  • imported repo from "guagal"
File size: 2.1 KB
Line 
1/*
2 * swift_context.c
3 *
4 * (c) 2009 Ionut Rosoiu <ionut.rosoiu@gmail.com>
5 *
6 */
7
8#include <stdlib.h>
9#include <stdio.h>
10#include <unistd.h>
11#include "swift.h"
12
13#define NUM_THREADS     2
14#define MAX_VAL                 100
15
16swift_deque_t deque;
17int vals[MAX_VAL];
18swift_frame_t frames[MAX_VAL];
19
20void* pusher(void *arg) {
21        swift_status_t status;
22        int i, j = 0;
23
24        printf("pusher started.\n");
25        for (i=0; i<MAX_VAL; i++) {
26                do {
27                        swift_deque_push(&deque, &frames[j++], &status);
28                } while (status == SWIFT_DEQUE_FULL);
29        }
30        printf("pusher finished.\n");
31
32        return arg;
33}
34
35void* popper(void *arg) {
36        swift_status_t status;
37        swift_frame_t *frame;
38        int i;
39
40        printf("popper started.\n");
41        for (i=0; i<MAX_VAL; i++) {
42                frame = swift_deque_pop(&deque, &status);
43                if (frame) {
44                        vals[frame->dependencies_no] = 1;
45                }
46        }
47        printf("popper finished.\n");
48
49        return arg;
50}
51
52void* stealer(void *arg) {
53        swift_status_t status;
54        swift_thread_t *thread = arg;
55        swift_frame_t *frame;
56        int i;
57
58        printf("stealer %d started\n", thread->id);
59        for (i=0; i<MAX_VAL + 1; i++) {
60                do {
61                        frame = swift_deque_steal(&deque, &status);
62                } while (status == SWIFT_DEQUE_ABORT);
63
64                if (frame) {
65                        printf("[S]    pop %d (%p)\n", frame->dependencies_no, (void*)frame);
66                        vals[frame->dependencies_no] = 1;
67                }
68        }
69        printf("stealer %d finished.\n", thread->id);
70
71        return arg;
72}
73
74swift_entrypoint_t funcs[4] = {
75                pusher, // must be first
76                popper,
77                stealer,
78                stealer
79};
80
81int main() {
82        swift_thread_t threads[NUM_THREADS];
83        int i;
84
85        //swift_assert(NUM_THREADS == 4);
86
87        /* initialize the deque */
88        swift_deque_init(&threads[0], &deque, MAX_VAL);
89
90        /* initialize the value vector */
91        for (i=0; i<MAX_VAL; i++) {
92                frames[i].dependencies_no = i;
93                vals[i] = 0;
94        }
95
96        /* start the threads */
97        for (i=0; i<NUM_THREADS; i++) {
98                threads[i].id = i;
99
100                swift_thread_start(&threads[i], funcs[i]);
101        }
102
103        printf("cleaning-up...\n");
104
105        /* clean-up */
106        for (i=0; i<NUM_THREADS; i++) {
107                swift_thread_wait(&threads[i]);
108                printf("thread %d done.\n", i);
109        }
110
111        for (i=0; i<MAX_VAL; i++) {
112                printf("%d ", i);
113                swift_assert(vals[i]);
114        }
115
116        swift_deque_destroy(&threads[0], &deque);
117
118        return 0;
119}
Note: See TracBrowser for help on using the repository browser.