diff options
author | Namhoon Kim <namhoonk@cs.unc.edu> | 2016-05-03 16:15:07 -0400 |
---|---|---|
committer | Namhoon Kim <namhoonk@cs.unc.edu> | 2016-05-03 16:15:07 -0400 |
commit | fe82d5295af5552936d5bb2497fbf4dc27d77d81 (patch) | |
tree | a5eb54bd54e532b9ce7d28843c5acbd573164cbc | |
parent | a8cda9d6f58a3074875c09c97001207985960a2f (diff) |
add pgm signal api
-rw-r--r-- | src/kernel_iface.c | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/src/kernel_iface.c b/src/kernel_iface.c index a2c2104..5460594 100644 --- a/src/kernel_iface.c +++ b/src/kernel_iface.c | |||
@@ -140,6 +140,61 @@ int requested_to_preempt(void) | |||
140 | return (likely(ctrl_page != NULL) && ctrl_page->sched.np.preempt); | 140 | return (likely(ctrl_page != NULL) && ctrl_page->sched.np.preempt); |
141 | } | 141 | } |
142 | 142 | ||
143 | void enter_pgm_wait(void) | ||
144 | { | ||
145 | if (likely(ctrl_page != NULL) || init_kernel_iface() == 0) { | ||
146 | assert(!ctrl_page->pgm_waiting); | ||
147 | ctrl_page->pgm_waiting = 1; | ||
148 | __sync_synchronize(); | ||
149 | } | ||
150 | else { | ||
151 | fprintf(stderr, "enter_pgm_wait: control page not mapped!\n"); | ||
152 | } | ||
153 | } | ||
154 | |||
155 | void exit_pgm_wait(void) | ||
156 | { | ||
157 | if (likely(ctrl_page != NULL)) { | ||
158 | assert(ctrl_page->pgm_waiting); | ||
159 | ctrl_page->pgm_waiting = 0; | ||
160 | __sync_synchronize(); | ||
161 | } | ||
162 | else { | ||
163 | fprintf(stderr, "exit_pgm_wait: control page not mapped!\n"); | ||
164 | } | ||
165 | } | ||
166 | |||
167 | void enter_pgm_send(void) | ||
168 | { | ||
169 | if (likely(ctrl_page != NULL) || init_kernel_iface() == 0) { | ||
170 | assert(!ctrl_page->pgm_sending); | ||
171 | ctrl_page->pgm_sending = 1; /* we will become boosted if | ||
172 | anyone tries to preempt us. */ | ||
173 | __sync_synchronize(); | ||
174 | } | ||
175 | else { | ||
176 | fprintf(stderr, "enter_pgm_send: control page not mapped!\n"); | ||
177 | } | ||
178 | } | ||
179 | |||
180 | void exit_pgm_send(void) | ||
181 | { | ||
182 | if (likely(ctrl_page != NULL)) { | ||
183 | assert(ctrl_page->pgm_sending); | ||
184 | |||
185 | ctrl_page->pgm_satisfied = 1; | ||
186 | __sync_synchronize(); | ||
187 | |||
188 | /* re-eval priority. Should clear pgm_sending and pgm_satisfied. */ | ||
189 | sched_yield(); | ||
190 | |||
191 | /* double check that Litmus is doing its job */ | ||
192 | assert(!ctrl_page->pgm_sending && !ctrl_page->pgm_satisfied); | ||
193 | } | ||
194 | else { | ||
195 | fprintf(stderr, "exit_pgm_send: control page not mapped!\n"); | ||
196 | } | ||
197 | } | ||
143 | /* init and return a ptr to the control page for | 198 | /* init and return a ptr to the control page for |
144 | * preemption and migration overhead analysis | 199 | * preemption and migration overhead analysis |
145 | * | 200 | * |