]> git.saurik.com Git - apple/xnu.git/blobdiff - osfmk/kern/waitq.h
xnu-6153.41.3.tar.gz
[apple/xnu.git] / osfmk / kern / waitq.h
index 2d897573373730e0ca0ef4b116dd1e04ea68b890..efbdcc8830710f5f87aac23e47abee29b5ce64b5 100644 (file)
@@ -101,6 +101,7 @@ typedef enum e_waitq_lock_state {
 
 enum waitq_type {
        WQT_INVALID = 0,
+       WQT_TSPROXY = 0x1,
        WQT_QUEUE   = 0x2,
        WQT_SET     = 0x3,
 };
@@ -141,7 +142,7 @@ struct waitq {
            waitq_prepost:1,     /* waitq supports prepost? */
            waitq_irq:1,         /* waitq requires interrupts disabled */
            waitq_isvalid:1,     /* waitq structure is valid */
-           waitq_turnstile_or_port:1,     /* waitq is embedded in a turnstile (if irq safe), or port (if not irq safe) */
+           waitq_turnstile:1,   /* waitq is embedded in a turnstile */
            waitq_eventmask:_EVENT_MASK_BITS;
        /* the wait queue set (set-of-sets) to which this queue belongs */
 #if __arm64__
@@ -153,8 +154,12 @@ struct waitq {
        uint64_t waitq_set_id;
        uint64_t waitq_prepost_id;
        union {
-               queue_head_t            waitq_queue;            /* queue of elements */
-               struct priority_queue   waitq_prio_queue;       /* priority ordered queue of elements */
+               queue_head_t            waitq_queue;        /* queue of elements */
+               struct priority_queue   waitq_prio_queue;   /* priority ordered queue of elements */
+               struct {
+                       struct turnstile   *waitq_ts;           /* turnstile for WQT_TSPROXY */
+                       void               *waitq_tspriv;       /* private field for clients use */
+               };
        };
 };
 
@@ -184,11 +189,11 @@ extern void waitq_bootstrap(void);
 #define waitq_is_queue(wq) \
        ((wq)->waitq_type == WQT_QUEUE)
 
-#define waitq_is_turnstile_queue(wq) \
-       (((wq)->waitq_irq) && (wq)->waitq_turnstile_or_port)
+#define waitq_is_turnstile_proxy(wq) \
+       ((wq)->waitq_type == WQT_TSPROXY)
 
-#define waitq_is_port_queue(wq) \
-       (!((wq)->waitq_irq) && (wq)->waitq_turnstile_or_port)
+#define waitq_is_turnstile_queue(wq) \
+       (((wq)->waitq_irq) && (wq)->waitq_turnstile)
 
 #define waitq_is_set(wq) \
        ((wq)->waitq_type == WQT_SET && ((struct waitq_set *)(wq))->wqset_id != 0)
@@ -209,16 +214,6 @@ extern void waitq_bootstrap(void);
  */
 extern void waitq_invalidate_locked(struct waitq *wq);
 
-static inline boolean_t
-waitq_empty(struct waitq *wq)
-{
-       if (waitq_is_turnstile_queue(wq)) {
-               return priority_queue_empty(&(wq->waitq_prio_queue));
-       } else {
-               return queue_empty(&(wq->waitq_queue));
-       }
-}
-
 extern lck_grp_t waitq_lck_grp;
 
 #if __arm64__
@@ -466,8 +461,6 @@ extern int waitq_is_global(struct waitq *waitq);
 
 extern int waitq_irq_safe(struct waitq *waitq);
 
-extern struct waitq * waitq_get_safeq(struct waitq *waitq);
-
 #if CONFIG_WAITQ_STATS
 /*
  * waitq statistics