Added __builtin_expect macros and wrapped IORING_ENTER_SQ_WAKEUP branch

If heavy IO load then kernel thread will only very rarely need to be woken up. Only case where this condition is common is if timeout expected between IO calls in which case should be using GETEVENTS. This will avoid the compiler from optimizing the wakeup branch

Signed-off-by: Noah <goldstein.w.n@gmail.com>
diff --git a/src/include/liburing.h b/src/include/liburing.h
index ebfc424..520cd55 100644
--- a/src/include/liburing.h
+++ b/src/include/liburing.h
@@ -15,6 +15,14 @@
 #include "liburing/io_uring.h"
 #include "liburing/barrier.h"
 
+#ifndef uring_unlikely
+#  define uring_unlikely(cond)      __builtin_expect(!!(cond), 0)
+#endif
+
+#ifndef uring_likely
+#  define uring_likely(cond)        __builtin_expect(!!(cond), 1)
+#endif
+
 #ifdef __cplusplus
 extern "C" {
 #endif
diff --git a/src/queue.c b/src/queue.c
index df388f6..8c4f373 100644
--- a/src/queue.c
+++ b/src/queue.c
@@ -25,10 +25,11 @@
 {
 	if (!(ring->flags & IORING_SETUP_SQPOLL))
 		return true;
-	if (IO_URING_READ_ONCE(*ring->sq.kflags) & IORING_SQ_NEED_WAKEUP) {
-		*flags |= IORING_ENTER_SQ_WAKEUP;
-		return true;
-	}
+    if (uring_unlikely(IO_URING_READ_ONCE(*ring->sq.kflags) &
+                       IORING_SQ_NEED_WAKEUP)) {
+        *flags |= IORING_ENTER_SQ_WAKEUP;
+        return true;
+    }
 
 	return false;
 }