Fixes apipe_read_cond()
[akaros.git] / kern / include / kthread.h
index b179548..542ece7 100644 (file)
 
 struct proc;
 struct kthread;
+struct semaphore;
+struct semaphore_entry;
 TAILQ_HEAD(kthread_tailq, kthread);
+LIST_HEAD(semaphore_list, semaphore_entry);
+
 
 /* This captures the essence of a kernel context that we want to suspend.  When
  * a kthread is running, we make sure its stacktop is the default kernel stack,
  * meaning it will receive the interrupts from userspace. */
 struct kthread {
-       struct trapframe                        context;
+       struct kernel_ctx                       context;
        uintptr_t                                       stacktop;
        struct proc                                     *proc;
        struct syscall                          *sysc;
+       void                                            *errbuf;        /* TODO: avoiding include loops */
        TAILQ_ENTRY(kthread)            link;
        /* ID, other shit, etc */
 };
@@ -40,15 +45,25 @@ struct semaphore {
 
 struct cond_var {
        struct semaphore                        sem;
-       spinlock_t                                      lock;
+       spinlock_t                                      *lock;          /* usually points to internal_ */
+       spinlock_t                                      internal_lock;
        unsigned long                           nr_waiters;
        bool                                            irq_okay;
 };
 
+/* TODO: consider building this into struct semaphore */
+struct semaphore_entry {
+       struct semaphore sem;
+       int fd;
+       LIST_ENTRY(semaphore_entry) link;
+};
+
 void kthread_init(void);
 void restart_kthread(struct kthread *kthread);
 void kthread_runnable(struct kthread *kthread);
 void kthread_yield(void);
+/* Debugging */
+void check_poison(char *msg);
 
 void sem_init(struct semaphore *sem, int signals);
 void sem_init_irqsave(struct semaphore *sem, int signals);
@@ -59,6 +74,8 @@ bool sem_up_irqsave(struct semaphore *sem, int8_t *irq_state);
 
 void cv_init(struct cond_var *cv);
 void cv_init_irqsave(struct cond_var *cv);
+void cv_init_with_lock(struct cond_var *cv, spinlock_t *lock);
+void cv_init_irqsave_with_lock(struct cond_var *cv, spinlock_t *lock);
 void cv_lock(struct cond_var *cv);
 void cv_unlock(struct cond_var *cv);
 void cv_lock_irqsave(struct cond_var *cv, int8_t *irq_state);