neovim

Neovim text editor
git clone https://git.dasho.dev/neovim.git
Log | Files | Refs | README

multiqueue.h (1429B)


      1 #pragma once
      2 
      3 #include <stddef.h>  // IWYU pragma: keep
      4 
      5 #include "nvim/event/defs.h"  // IWYU pragma: keep
      6 #include "nvim/os/time.h"  // IWYU pragma: keep
      7 
      8 #include "event/multiqueue.h.generated.h"
      9 
     10 #define multiqueue_put(q, h, ...) \
     11  do { \
     12    multiqueue_put_event(q, event_create(h, __VA_ARGS__)); \
     13  } while (0)
     14 
     15 #define CREATE_EVENT(multiqueue, handler, ...) \
     16  do { \
     17    if (multiqueue) { \
     18      multiqueue_put((multiqueue), (handler), __VA_ARGS__); \
     19    } else { \
     20      void *argv[] = { __VA_ARGS__ }; \
     21      (handler)(argv); \
     22    } \
     23  } while (0)
     24 
     25 // Poll for events until a condition or timeout
     26 #define LOOP_PROCESS_EVENTS_UNTIL(loop, multiqueue, timeout, condition) \
     27  do { \
     28    int64_t remaining = timeout; \
     29    uint64_t before = (remaining > 0) ? os_hrtime() : 0; \
     30    while (!(condition)) { \
     31      LOOP_PROCESS_EVENTS(loop, multiqueue, remaining); \
     32      if (remaining == 0) { \
     33        break; \
     34      } else if (remaining > 0) { \
     35        uint64_t now = os_hrtime(); \
     36        remaining -= (int64_t)((now - before) / 1000000); \
     37        before = now; \
     38        if (remaining <= 0) { \
     39          break; \
     40        } \
     41      } \
     42    } \
     43  } while (0)
     44 
     45 #define LOOP_PROCESS_EVENTS(loop, multiqueue, timeout) \
     46  do { \
     47    if (multiqueue && !multiqueue_empty(multiqueue)) { \
     48      multiqueue_process_events(multiqueue); \
     49    } else { \
     50      loop_poll_events(loop, timeout); \
     51    } \
     52  } while (0)