Moves resource requests to procdata (XCC)
[akaros.git] / kern / include / kthread.h
index 5ce5ff4..60108c0 100644 (file)
@@ -25,8 +25,7 @@ struct kthread {
        struct trapframe                        context;
        uintptr_t                                       stacktop;
        struct proc                                     *proc;
        struct trapframe                        context;
        uintptr_t                                       stacktop;
        struct proc                                     *proc;
-       struct trapframe                        *proc_tf;                       /* TODO: change this? */
-       /* TODO: put in the sys_return, if we decide to keep this shit */
+       struct syscall                          *sysc;
        TAILQ_ENTRY(kthread)            link;
        /* ID, other shit, etc */
 };
        TAILQ_ENTRY(kthread)            link;
        /* ID, other shit, etc */
 };
@@ -68,8 +67,8 @@ static inline bool __down_sem(struct semaphore *sem, struct kthread *kthread)
 }
 
 /* Ups the semaphore.  If it was < 0, we need to wake up someone, which is the
 }
 
 /* Ups the semaphore.  If it was < 0, we need to wake up someone, which is the
- * return value. */
-static inline struct kthread *__up_sem(struct semaphore *sem)
+ * return value.  If you think there should be at most one, set exactly_one. */
+static inline struct kthread *__up_sem(struct semaphore *sem, bool exactly_one)
 {
        struct kthread *kthread = 0;
        spin_lock(&sem->lock);
 {
        struct kthread *kthread = 0;
        spin_lock(&sem->lock);
@@ -77,6 +76,8 @@ static inline struct kthread *__up_sem(struct semaphore *sem)
                /* could do something with 'priority' here */
                kthread = TAILQ_FIRST(&sem->waiters);
                TAILQ_REMOVE(&sem->waiters, kthread, link);
                /* could do something with 'priority' here */
                kthread = TAILQ_FIRST(&sem->waiters);
                TAILQ_REMOVE(&sem->waiters, kthread, link);
+               if (exactly_one)
+                       assert(TAILQ_EMPTY(&sem->waiters));
        } else {
                assert(TAILQ_EMPTY(&sem->waiters));
        }
        } else {
                assert(TAILQ_EMPTY(&sem->waiters));
        }
@@ -90,7 +91,7 @@ void restart_kthread(struct kthread *kthread);
 void kthread_runnable(struct kthread *kthread);
 /* Kmsg handler to launch/run a kthread.  This must be a routine message, since
  * it does not return. */
 void kthread_runnable(struct kthread *kthread);
 /* Kmsg handler to launch/run a kthread.  This must be a routine message, since
  * it does not return. */
-void __launch_kthread(struct trapframe *tf, uint32_t srcid, void *a0, void *a1,
-                         void *a2);
+void __launch_kthread(struct trapframe *tf, uint32_t srcid, long a0, long a1,
+                         long a2);
 
 #endif /* ROS_KERN_KTHREAD_H */
 
 #endif /* ROS_KERN_KTHREAD_H */