More verbose multicore debugging
[akaros.git] / kern / src / workqueue.c
1 /*
2  * Copyright (c) 2009 The Regents of the University of California
3  * Barret Rhoden <brho@cs.berkeley.edu>
4  * See LICENSE for details.
5  */
6
7 #ifdef __SHARC__
8 #pragma nosharc
9 #endif
10
11 #include <atomic.h>
12 #include <smp.h>
13
14 #include <ros/error.h>
15
16 #include <atomic.h>
17 #include <stdio.h>
18 #include <workqueue.h>
19
20 /*
21  * TODO: actually use a queue, which will change some things all over.
22  */
23 void process_workqueue()
24 {
25         struct work TP(TV(t)) work;
26         per_cpu_info_t *cpuinfo = &per_cpu_info[core_id()];
27
28         // copy the work in, since we may never return to this stack frame
29         spin_lock_irqsave(&cpuinfo->lock);
30         work = cpuinfo->workqueue.statics[0];
31         spin_unlock_irqsave(&cpuinfo->lock);
32         if (work.func) {
33                 // TODO: possible race with this.  sort it out when we have a queue.
34                 spin_lock_irqsave(&cpuinfo->lock);
35                 cpuinfo->workqueue.statics[0].func = 0;
36                 spin_unlock_irqsave(&cpuinfo->lock);
37                 // We may never return from this (if it is proc_run)
38                 work.func(work.data);
39         }
40 }
41
42 int enqueue_work(struct workqueue TP(TV(t)) *queue, struct work TP(TV(t)) *job)
43 {
44         error_t retval = 0;
45         per_cpu_info_t *cpuinfo = &per_cpu_info[core_id()];
46
47         spin_lock_irqsave(&cpuinfo->lock);
48         printd("Enqueuing func 0x%08x and data 0x%08x on core %d.\n",
49                job->func, job->data, core_id());
50         if (queue->statics[0].func)
51                 retval = -ENOMEM;
52         else
53                 queue->statics[0] = *job;
54         spin_unlock_irqsave(&cpuinfo->lock);
55         return retval;
56 }