X-Git-Url: https://jfr.im/git/solanum.git/blobdiff_plain/e9f0d740e3a88ace378da84896829ab815055929..9d65d599c41fcf70bf060debeb4b0e5545efc8fe:/include/msgbuf.h diff --git a/include/msgbuf.h b/include/msgbuf.h index ed7a04ad..9bc34bf7 100644 --- a/include/msgbuf.h +++ b/include/msgbuf.h @@ -43,6 +43,33 @@ struct MsgBuf { const char *para[MAXPARA]; /* parameters vector (starting with cmd as para[0]) */ }; +struct MsgBuf_str_data { + const struct MsgBuf *msgbuf; + unsigned int caps; +}; + +#define MSGBUF_CACHE_SIZE 32 + +struct MsgBuf_cache_entry { + unsigned int caps; + buf_head_t linebuf; + struct MsgBuf_cache_entry *next; +}; + +struct MsgBuf_cache { + const struct MsgBuf *msgbuf; + char message[DATALEN + 1]; + unsigned int overall_capmask; + + /* Fixed maximum size linked list, new entries are allocated at the end + * of the array but are accessed through the "next" pointers. + * + * This does not use rb dlink to avoid unnecessary individual allocations. + */ + struct MsgBuf_cache_entry entry[MSGBUF_CACHE_SIZE]; + struct MsgBuf_cache_entry *head; /* LRU cache head */ +}; + /* * parse a message into a MsgBuf. * returns 0 on success, 1 on error. @@ -55,7 +82,7 @@ int msgbuf_parse(struct MsgBuf *msgbuf, char *line); * cmd may not be NULL. * returns 0 on success, 1 on error. */ -int msgbuf_unparse(char *buf, size_t buflen, struct MsgBuf *msgbuf, unsigned int capmask); +int msgbuf_unparse(char *buf, size_t buflen, const struct MsgBuf *msgbuf, unsigned int capmask); /* * unparse a MsgBuf header plus payload into a buffer. @@ -63,10 +90,16 @@ int msgbuf_unparse(char *buf, size_t buflen, struct MsgBuf *msgbuf, unsigned int * cmd may not be NULL. * returns 0 on success, 1 on error. */ -int msgbuf_unparse_fmt(char *buf, size_t buflen, struct MsgBuf *head, unsigned int capmask, const char *fmt, ...) AFP(5, 6); -int msgbuf_vunparse_fmt(char *buf, size_t buflen, struct MsgBuf *head, unsigned int capmask, const char *fmt, va_list va); +int msgbuf_unparse_fmt(char *buf, size_t buflen, const struct MsgBuf *head, unsigned int capmask, const char *fmt, ...) AFP(5, 6); +int msgbuf_vunparse_fmt(char *buf, size_t buflen, const struct MsgBuf *head, unsigned int capmask, const char *fmt, va_list va); + +int msgbuf_unparse_linebuf_tags(char *buf, size_t buflen, void *data); +int msgbuf_unparse_prefix(char *buf, size_t *buflen, const struct MsgBuf *msgbuf, unsigned int capmask); -void msgbuf_unparse_prefix(char *buf, size_t buflen, struct MsgBuf *msgbuf, unsigned int capmask); +void msgbuf_cache_init(struct MsgBuf_cache *cache, const struct MsgBuf *msgbuf, const rb_strf_t *message); +void msgbuf_cache_initf(struct MsgBuf_cache *cache, const struct MsgBuf *msgbuf, const rb_strf_t *message, const char *format, ...) AFP(4, 5); +buf_head_t *msgbuf_cache_get(struct MsgBuf_cache *cache, unsigned int caps); +void msgbuf_cache_free(struct MsgBuf_cache *cache); static inline void msgbuf_init(struct MsgBuf *msgbuf) @@ -85,13 +118,4 @@ msgbuf_append_tag(struct MsgBuf *msgbuf, const char *key, const char *value, uns } } -static inline void -msgbuf_append_para(struct MsgBuf *msgbuf, const char *para) -{ - if (msgbuf->n_para < MAXPARA) { - msgbuf->para[msgbuf->n_para] = para; - msgbuf->n_para++; - } -} - #endif