fixed sparc atomics; added sparc newlib
[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 #include <atomic.h>
8 #include <smp.h>
9
10 #include <ros/error.h>
11
12 #include <atomic.h>
13 #include <stdio.h>
14 #include <workqueue.h>
15
16 /*
17  * TODO: actually use a queue, which will change some things all over.
18  */
19 void process_workqueue()
20 {
21         struct work work;
22         struct per_cpu_info *cpuinfo = &per_cpu_info[core_id()];
23
24         // copy the work in, since we may never return to this stack frame
25         spin_lock_irqsave(&cpuinfo->lock);
26         work = cpuinfo->workqueue.statics[0];
27         spin_unlock_irqsave(&cpuinfo->lock);
28         if (work.func) {
29                 // TODO: possible race with this.  sort it out when we have a queue.
30                 spin_lock_irqsave(&cpuinfo->lock);
31                 cpuinfo->workqueue.statics[0].func = 0;
32                 spin_unlock_irqsave(&cpuinfo->lock);
33                 // We may never return from this (if it is env_run)
34                 work.func(work.data);
35         }
36 }
37
38 int enqueue_work(struct workqueue *queue, struct work *job)
39 {
40         error_t retval = 0;
41         struct per_cpu_info *cpuinfo = &per_cpu_info[core_id()];
42
43         spin_lock_irqsave(&cpuinfo->lock);
44         printd("Enqueuing func 0x%08x and data 0x%08x on core %d.\n",
45                job->func, job->data, core_id());
46         if (queue->statics[0].func)
47                 retval = -ENOMEM;
48         else
49                 queue->statics[0] = *job;
50         spin_unlock_irqsave(&cpuinfo->lock);
51         return retval;
52 }