Fixed up error codes to all have a positive 'defined' value and a -negative return...
[akaros.git] / kern / src / workqueue.c
1 /*
2  * Copyright (c) 2009 The Regents of the University of California
3  * See LICENSE for details.
4  */
5
6 #include <arch/x86.h>
7 #include <arch/apic.h>
8 #include <arch/smp.h>
9
10 #include <atomic.h>
11
12 #include <workqueue.h>
13
14 /*
15  * TODO: actually use a queue, which will change some things all over.
16  */
17 void process_workqueue()
18 {
19         work_t work;
20         per_cpu_info_t *cpuinfo = &per_cpu_info[lapic_get_id()];
21         // copy the work in, since we may never return to this stack frame
22         spin_lock_irqsave(&cpuinfo->lock);
23         work = cpuinfo->delayed_work;
24         spin_unlock_irqsave(&cpuinfo->lock);
25         if (work.func) {
26                 // TODO: possible race with this.  sort it out when we have a queue.
27                 spin_lock_irqsave(&cpuinfo->lock);
28                 cpuinfo->delayed_work.func = 0;
29                 spin_unlock_irqsave(&cpuinfo->lock);
30                 // We may never return from this (if it is env_run)
31                 work.func(work.data);
32         }
33 }