Import Linux's percpu_counter
[akaros.git] / kern / include / apipe.h
index bb63ca5..3c62f37 100644 (file)
@@ -18,7 +18,7 @@
  *             ret = apipe_read(&ap, &to_local_struct, 1);
  *             apipe_close_writer(&ap);
  *             apipe_close_reader(&ap);
- *     
+ *
  * Read and write return the number of elements copied.  If they copied any
  * amount, they will return.  They will block if the pipe is empty/full,
  * and there exist corresponding writers/readers.
@@ -49,8 +49,7 @@
  * many elements at once (like sys_pipe).  But we can hold off til we see how
  * people use this.  For now, this is built for one copy at a time. */
 
-#ifndef ROS_KERN_APIPE_H
-#define ROS_KERN_APIPE_H
+#pragma once
 
 #include <ros/common.h>
 #include <kthread.h>
@@ -63,12 +62,18 @@ struct atomic_pipe {
        size_t                                          ap_wr_off;
        unsigned int                            ap_nr_readers;
        unsigned int                            ap_nr_writers;
-       struct cond_var                         ap_cv;
+       spinlock_t                                      ap_lock;
+       struct cond_var                         ap_priority_reader;
+       struct cond_var                         ap_general_readers;
+       struct cond_var                         ap_writers;
+       bool                                            ap_has_priority_reader;
 };
 
 void apipe_init(struct atomic_pipe *ap, void *buf, size_t buf_sz,
                 size_t elem_sz);
 int apipe_read(struct atomic_pipe *ap, void *buf, size_t nr_elem);
+int apipe_read_cond(struct atomic_pipe *ap,
+                   int(*f)(struct atomic_pipe *pipe, void *arg), void *arg);
 int apipe_write(struct atomic_pipe *ap, void *buf, size_t nr_elem);
 void *apipe_head(struct atomic_pipe *ap);
 
@@ -76,5 +81,3 @@ void apipe_open_reader(struct atomic_pipe *ap);
 void apipe_open_writer(struct atomic_pipe *ap);
 void apipe_close_reader(struct atomic_pipe *ap);
 void apipe_close_writer(struct atomic_pipe *ap);
-
-#endif /* ROS_KERN_APIPE_H */