Rev 1 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1 | Rev 15 | ||
---|---|---|---|
Line 71... | Line 71... | ||
71 | { |
71 | { |
72 | int rc, to; |
72 | int rc, to; |
73 | waitq_sleep(&can_start); |
73 | waitq_sleep(&can_start); |
74 | 74 | ||
75 | to = random(40000); |
75 | to = random(40000); |
76 | printf("cpu%d, tid %d w+ (%d)\n", the->cpu->id, the->thread->tid, to); |
76 | printf("cpu%d, tid %d w+ (%d)\n", CPU->id, THREAD->tid, to); |
77 | rc = rwlock_write_lock_timeout(&rwlock, to); |
77 | rc = rwlock_write_lock_timeout(&rwlock, to); |
78 | if (SYNCH_FAILED(rc)) { |
78 | if (SYNCH_FAILED(rc)) { |
79 | printf("cpu%d, tid %d w!\n", the->cpu->id, the->thread->tid); |
79 | printf("cpu%d, tid %d w!\n", CPU->id, THREAD->tid); |
80 | return; |
80 | return; |
81 | }; |
81 | }; |
82 | printf("cpu%d, tid %d w=\n", the->cpu->id, the->thread->tid); |
82 | printf("cpu%d, tid %d w=\n", CPU->id, THREAD->tid); |
83 | 83 | ||
84 | if (rwlock.readers_in) panic("Oops."); |
84 | if (rwlock.readers_in) panic("Oops."); |
85 | thread_usleep(random(1000000)); |
85 | thread_usleep(random(1000000)); |
86 | if (rwlock.readers_in) panic("Oops."); |
86 | if (rwlock.readers_in) panic("Oops."); |
87 | 87 | ||
88 | rwlock_write_unlock(&rwlock); |
88 | rwlock_write_unlock(&rwlock); |
89 | printf("cpu%d, tid %d w-\n", the->cpu->id, the->thread->tid); |
89 | printf("cpu%d, tid %d w-\n", CPU->id, THREAD->tid); |
90 | } |
90 | } |
91 | 91 | ||
92 | void reader(void *arg) |
92 | void reader(void *arg) |
93 | { |
93 | { |
94 | int rc, to; |
94 | int rc, to; |
95 | waitq_sleep(&can_start); |
95 | waitq_sleep(&can_start); |
96 | 96 | ||
97 | to = random(2000); |
97 | to = random(2000); |
98 | printf("cpu%d, tid %d r+ (%d)\n", the->cpu->id, the->thread->tid, to); |
98 | printf("cpu%d, tid %d r+ (%d)\n", CPU->id, THREAD->tid, to); |
99 | rc = rwlock_read_lock_timeout(&rwlock, to); |
99 | rc = rwlock_read_lock_timeout(&rwlock, to); |
100 | if (SYNCH_FAILED(rc)) { |
100 | if (SYNCH_FAILED(rc)) { |
101 | printf("cpu%d, tid %d r!\n", the->cpu->id, the->thread->tid); |
101 | printf("cpu%d, tid %d r!\n", CPU->id, THREAD->tid); |
102 | return; |
102 | return; |
103 | } |
103 | } |
104 | printf("cpu%d, tid %d r=\n", the->cpu->id, the->thread->tid); |
104 | printf("cpu%d, tid %d r=\n", CPU->id, THREAD->tid); |
105 | thread_usleep(30000); |
105 | thread_usleep(30000); |
106 | rwlock_read_unlock(&rwlock); |
106 | rwlock_read_unlock(&rwlock); |
107 | printf("cpu%d, tid %d r-\n", the->cpu->id, the->thread->tid); |
107 | printf("cpu%d, tid %d r-\n", CPU->id, THREAD->tid); |
108 | } |
108 | } |
109 | 109 | ||
110 | void failed(void) |
110 | void failed(void) |
111 | { |
111 | { |
112 | printf("Test failed prematurely.\n"); |
112 | printf("Test failed prematurely.\n"); |
Line 132... | Line 132... | ||
132 | printf("sp=%X, readers_in=%d\n", ctx.sp, rwlock.readers_in); |
132 | printf("sp=%X, readers_in=%d\n", ctx.sp, rwlock.readers_in); |
133 | 133 | ||
134 | k = random(7) + 1; |
134 | k = random(7) + 1; |
135 | printf("Creating %d readers\n", k); |
135 | printf("Creating %d readers\n", k); |
136 | for (i=0; i<k; i++) { |
136 | for (i=0; i<k; i++) { |
137 | thrd = thread_create(reader, NULL, the->task, 0); |
137 | thrd = thread_create(reader, NULL, TASK, 0); |
138 | if (thrd) |
138 | if (thrd) |
139 | thread_ready(thrd); |
139 | thread_ready(thrd); |
140 | else |
140 | else |
141 | failed(); |
141 | failed(); |
142 | } |
142 | } |
143 | 143 | ||
144 | k = random(5) + 1; |
144 | k = random(5) + 1; |
145 | printf("Creating %d writers\n", k); |
145 | printf("Creating %d writers\n", k); |
146 | for (i=0; i<k; i++) { |
146 | for (i=0; i<k; i++) { |
147 | thrd = thread_create(writer, NULL, the->task, 0); |
147 | thrd = thread_create(writer, NULL, TASK, 0); |
148 | if (thrd) |
148 | if (thrd) |
149 | thread_ready(thrd); |
149 | thread_ready(thrd); |
150 | else |
150 | else |
151 | failed(); |
151 | failed(); |
152 | } |
152 | } |