neovim

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

rpc.h (2456B)


      1 #ifndef MPACK_RPC_H
      2 #define MPACK_RPC_H
      3 
      4 #include "mpack_core.h"
      5 #include "object.h"
      6 
      7 #ifndef MPACK_RPC_MAX_REQUESTS
      8 # define MPACK_RPC_MAX_REQUESTS 32
      9 #endif
     10 
     11 enum {
     12  MPACK_RPC_REQUEST = MPACK_NOMEM + 1,
     13  MPACK_RPC_RESPONSE,
     14  MPACK_RPC_NOTIFICATION,
     15  MPACK_RPC_ERROR
     16 };
     17 
     18 enum {
     19  MPACK_RPC_EARRAY = MPACK_RPC_ERROR,
     20  MPACK_RPC_EARRAYL,
     21  MPACK_RPC_ETYPE,
     22  MPACK_RPC_EMSGID,
     23  MPACK_RPC_ERESPID
     24 };
     25 
     26 typedef struct mpack_rpc_header_s {
     27  mpack_token_t toks[3];
     28  int index;
     29 } mpack_rpc_header_t;
     30 
     31 typedef struct mpack_rpc_message_s {
     32  mpack_uint32_t id;
     33  mpack_data_t data;
     34 } mpack_rpc_message_t;
     35 
     36 struct mpack_rpc_slot_s {
     37  int used;
     38  mpack_rpc_message_t msg;
     39 };
     40 
     41 #define MPACK_RPC_SESSION_STRUCT(c)      \
     42  struct {     \
     43    mpack_tokbuf_t reader, writer;       \
     44    mpack_rpc_header_t receive, send;    \
     45    mpack_uint32_t request_id, capacity; \
     46    struct mpack_rpc_slot_s slots[c];    \
     47  }
     48 
     49 /* Some compilers warn against anonymous structs:
     50 * https://github.com/libmpack/libmpack/issues/6 */
     51 typedef MPACK_RPC_SESSION_STRUCT(1) mpack_rpc_one_session_t;
     52 
     53 #define MPACK_RPC_SESSION_STRUCT_SIZE(c)        \
     54  (sizeof(struct mpack_rpc_slot_s) * (c - 1) +  \
     55   sizeof(mpack_rpc_one_session_t))
     56 
     57 typedef MPACK_RPC_SESSION_STRUCT(MPACK_RPC_MAX_REQUESTS) mpack_rpc_session_t;
     58 
     59 MPACK_API void mpack_rpc_session_init(mpack_rpc_session_t *s, mpack_uint32_t c)
     60  FUNUSED FNONULL;
     61 
     62 MPACK_API int mpack_rpc_receive_tok(mpack_rpc_session_t *s, mpack_token_t t,
     63    mpack_rpc_message_t *msg) FUNUSED FNONULL;
     64 MPACK_API int mpack_rpc_request_tok(mpack_rpc_session_t *s, mpack_token_t *t,
     65    mpack_data_t d) FUNUSED FNONULL_ARG((1,2));
     66 MPACK_API int mpack_rpc_reply_tok(mpack_rpc_session_t *s, mpack_token_t *t,
     67    mpack_uint32_t i) FUNUSED FNONULL;
     68 MPACK_API int mpack_rpc_notify_tok(mpack_rpc_session_t *s, mpack_token_t *t)
     69  FUNUSED FNONULL;
     70 
     71 MPACK_API int mpack_rpc_receive(mpack_rpc_session_t *s, const char **b,
     72    size_t *bl, mpack_rpc_message_t *m) FUNUSED FNONULL;
     73 MPACK_API int mpack_rpc_request(mpack_rpc_session_t *s, char **b, size_t *bl,
     74    mpack_data_t d) FUNUSED FNONULL_ARG((1,2,3));
     75 MPACK_API int mpack_rpc_reply(mpack_rpc_session_t *s, char **b, size_t *bl,
     76    mpack_uint32_t i) FNONULL FUNUSED;
     77 MPACK_API int mpack_rpc_notify(mpack_rpc_session_t *s, char **b, size_t *bl)
     78  FNONULL FUNUSED;
     79 
     80 MPACK_API void mpack_rpc_session_copy(mpack_rpc_session_t *d,
     81    mpack_rpc_session_t *s) FUNUSED FNONULL;
     82 
     83 #endif  /* MPACK_RPC_H */