Moved x86 specific files into the arch/i386 directory. Modified files as needed.
[akaros.git] / kern / include / workqueue.h
index c06d39c..27ce98e 100644 (file)
@@ -1,21 +1,35 @@
 /*
  * Copyright (c) 2009 The Regents of the University of California
+ * Barret Rhoden <brho@cs.berkeley.edu>
  * See LICENSE for details.
+ *
+ * Workqueue: This is a todo list of func, void* that get executed whenever
+ * process_workqueue is called.  Typically, this is called from smp_idle().
+ * Note that every core will run this, so be careful with dynamic memory mgmt.
  */
 
 #ifndef ROS_KERN_WORKQUEUE_H
 #define ROS_KERN_WORKQUEUE_H
-#ifndef ROS_KERNEL
-# error "This is an ROS kernel header; user programs should not #include it"
-#endif
 
-// Once we have a real kmalloc, we can make this dynamic.  Want a list.
-typedef void (*func_t)(void* data);
-typedef struct work {
+#include <sys/queue.h>
+#include <arch/types.h>
+#include <env.h>
+
+typedef void (*func_t)(TV(t) data);
+struct work {
+       LIST_ENTRY(work) work_link;
        func_t func;
-       void* data;
-} work_t;
+       TV(t) data;
+};
+
+// TODO make these dynamic and hold more than 1.  might want better list macros.
+#define WORKQUEUE_ELEMENTS 1
+struct workqueue {
+       struct work TP(env_t *) statics[WORKQUEUE_ELEMENTS];
+};
 
 void process_workqueue(void);
+// For now, the caller should free their struct work after this call
+int enqueue_work(struct workqueue *queue, struct work TP(env_t *) *job);
 
 #endif /* ROS_KERN_WORKQUEUE_H */