From 28e0620c808d11f7a3f13a4cc33f604be71e85ec Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Tue, 22 Dec 2020 14:39:47 -0500 Subject: [PATCH] TT#106101 turn bencode buffer into shared refcounted object Change-Id: I6d8e443d8b0fc7e9afe0a6f6b3cde3d1a85e42de --- daemon/call_interfaces.c | 11 ++++++----- daemon/control_ng.c | 25 +++++++++++++++++-------- include/call_interfaces.h | 5 +++-- include/control_ng.h | 12 ++++++++++++ 4 files changed, 38 insertions(+), 15 deletions(-) diff --git a/daemon/call_interfaces.c b/daemon/call_interfaces.c index 6300a8591..904a74e54 100644 --- a/daemon/call_interfaces.c +++ b/daemon/call_interfaces.c @@ -1169,7 +1169,7 @@ static enum load_limit_reasons call_offer_session_limit(void) { return ret; } -static const char *call_offer_answer_ng(bencode_item_t *input, +static const char *call_offer_answer_ng(struct ng_buffer *ngbuf, bencode_item_t *input, bencode_item_t *output, enum call_opmode opmode, const char* addr, const endpoint_t *sin) { @@ -1339,14 +1339,15 @@ out: return errstr; } -const char *call_offer_ng(bencode_item_t *input, bencode_item_t *output, const char* addr, +const char *call_offer_ng(struct ng_buffer *ngbuf, bencode_item_t *input, bencode_item_t *output, + const char* addr, const endpoint_t *sin) { - return call_offer_answer_ng(input, output, OP_OFFER, addr, sin); + return call_offer_answer_ng(ngbuf, input, output, OP_OFFER, addr, sin); } -const char *call_answer_ng(bencode_item_t *input, bencode_item_t *output) { - return call_offer_answer_ng(input, output, OP_ANSWER, NULL, NULL); +const char *call_answer_ng(struct ng_buffer *ngbuf, bencode_item_t *input, bencode_item_t *output) { + return call_offer_answer_ng(ngbuf, input, output, OP_ANSWER, NULL, NULL); } const char *call_delete_ng(bencode_item_t *input, bencode_item_t *output) { diff --git a/daemon/control_ng.c b/daemon/control_ng.c index 99e62d4b9..658acc211 100644 --- a/daemon/control_ng.c +++ b/daemon/control_ng.c @@ -134,10 +134,15 @@ struct control_ng_stats* get_control_ng_stats(const sockaddr_t *addr) { return cur; } +static void __ng_buffer_free(void *p) { + struct ng_buffer *ngbuf = p; + bencode_buffer_free(&ngbuf->buffer); +} + int control_ng_process(str *buf, const endpoint_t *sin, char *addr, void (*cb)(str *, str *, const endpoint_t *, void *), void *p1) { - bencode_buffer_t bencbuf; + struct ng_buffer *ngbuf; bencode_item_t *dict, *resp; str cmd = STR_NULL, cookie, data, reply, *to_send, callid; const char *errstr, *resultstr; @@ -154,10 +159,14 @@ int control_ng_process(str *buf, const endpoint_t *sin, char *addr, return funcret; } - int ret = bencode_buffer_init(&bencbuf); + ngbuf = obj_alloc0("ng_buffer", sizeof(*ngbuf), __ng_buffer_free); + mutex_init(&ngbuf->lock); + mutex_lock(&ngbuf->lock); + + int ret = bencode_buffer_init(&ngbuf->buffer); assert(ret == 0); (void) ret; - resp = bencode_dictionary(&bencbuf); + resp = bencode_dictionary(&ngbuf->buffer); assert(resp != NULL); cookie = *buf; @@ -176,7 +185,7 @@ int control_ng_process(str *buf, const endpoint_t *sin, char *addr, goto send_only; } - dict = bencode_decode_expect_str(&bencbuf, &data, BENCODE_DICTIONARY); + dict = bencode_decode_expect_str(&ngbuf->buffer, &data, BENCODE_DICTIONARY); errstr = "Could not decode dictionary"; if (!dict) goto err_send; @@ -213,11 +222,11 @@ int control_ng_process(str *buf, const endpoint_t *sin, char *addr, command = NGC_PING; break; case CSH_LOOKUP("offer"): - errstr = call_offer_ng(dict, resp, addr, sin); + errstr = call_offer_ng(ngbuf, dict, resp, addr, sin); command = NGC_OFFER; break; case CSH_LOOKUP("answer"): - errstr = call_answer_ng(dict, resp); + errstr = call_answer_ng(ngbuf, dict, resp); command = NGC_ANSWER; break; case CSH_LOOKUP("delete"): @@ -345,7 +354,7 @@ send_resp: ilogs(control, LOG_INFO, "Replying to '"STR_FORMAT"' from %s (elapsed time %llu.%06llu sec)", STR_FMT(&cmd), addr, (unsigned long long)cmd_process_time.tv_sec, (unsigned long long)cmd_process_time.tv_usec); if (get_log_level(control) >= LOG_DEBUG) { - dict = bencode_decode_expect_str(&bencbuf, to_send, BENCODE_DICTIONARY); + dict = bencode_decode_expect_str(&ngbuf->buffer, to_send, BENCODE_DICTIONARY); if (dict) { log_str = g_string_sized_new(256); g_string_append_printf(log_str, "Response dump for '"STR_FORMAT"' to %s: %s", @@ -371,7 +380,7 @@ send_only: goto out; out: - bencode_buffer_free(&bencbuf); + ng_buffer_release(ngbuf); log_info_clear(); return funcret; } diff --git a/include/call_interfaces.h b/include/call_interfaces.h index 8afca8c5f..b49363c87 100644 --- a/include/call_interfaces.h +++ b/include/call_interfaces.h @@ -15,6 +15,7 @@ struct call; struct call_stats; struct streambuf_stream; struct sockaddr_in6; +struct ng_buffer; struct sdp_ng_flags { enum call_opmode opmode; @@ -137,9 +138,9 @@ str *call_lookup_udp(char **); str *call_delete_udp(char **); str *call_query_udp(char **); -const char *call_offer_ng(bencode_item_t *, bencode_item_t *, const char*, +const char *call_offer_ng(struct ng_buffer *, bencode_item_t *, bencode_item_t *, const char*, const endpoint_t *); -const char *call_answer_ng(bencode_item_t *, bencode_item_t *); +const char *call_answer_ng(struct ng_buffer *, bencode_item_t *, bencode_item_t *); const char *call_delete_ng(bencode_item_t *, bencode_item_t *); const char *call_query_ng(bencode_item_t *, bencode_item_t *); const char *call_list_ng(bencode_item_t *, bencode_item_t *); diff --git a/include/control_ng.h b/include/control_ng.h index 4e5c837a2..6b917b22f 100644 --- a/include/control_ng.h +++ b/include/control_ng.h @@ -5,6 +5,7 @@ #include "udp_listener.h" #include "socket.h" #include "str.h" +#include "bencode.h" struct poller; @@ -50,6 +51,12 @@ struct control_ng { struct poller *poller; }; +struct ng_buffer { + struct obj obj; + mutex_t lock; + bencode_buffer_t buffer; +}; + extern const char *ng_command_strings[NGC_COUNT]; extern const char *ng_command_strings_short[NGC_COUNT]; @@ -59,6 +66,11 @@ void control_ng_cleanup(void); int control_ng_process(str *buf, const endpoint_t *sin, char *addr, void (*cb)(str *, str *, const endpoint_t *, void *), void *p1); +INLINE void ng_buffer_release(struct ng_buffer *ngbuf) { + mutex_unlock(&ngbuf->lock); + obj_put(ngbuf); +} + extern mutex_t rtpe_cngs_lock; extern GHashTable *rtpe_cngs_hash; extern struct control_ng *rtpe_control_ng;