Finished sparc port merge, fixed symlink cleaning
[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 <atomic.h>
7 #include <smp.h>
8
9 #include <atomic.h>
10
11 #include <workqueue.h>
12
13 /*
14  * TODO: actually use a queue, which will change some things all over.
15  */
16 void process_workqueue()
17 {
18         work_t work;
19         per_cpu_info_t *cpuinfo = &per_cpu_info[core_id()];
20         // copy the work in, since we may never return to this stack frame
21         spin_lock_irqsave(&cpuinfo->lock);
22         work = cpuinfo->delayed_work;
23         spin_unlock_irqsave(&cpuinfo->lock);
24         if (work.func) {
25                 // TODO: possible race with this.  sort it out when we have a queue.
26                 spin_lock_irqsave(&cpuinfo->lock);
27                 cpuinfo->delayed_work.func = 0;
28                 spin_unlock_irqsave(&cpuinfo->lock);
29                 // We may never return from this (if it is env_run)
30                 work.func(work.data);
31         }
32 }