Browse Source

TT#106101 turn bencode buffer into shared refcounted object

Change-Id: I6d8e443d8b0fc7e9afe0a6f6b3cde3d1a85e42de
pull/1164/head
Richard Fuchs 5 years ago
parent
commit
28e0620c80
4 changed files with 38 additions and 15 deletions
  1. +6
    -5
      daemon/call_interfaces.c
  2. +17
    -8
      daemon/control_ng.c
  3. +3
    -2
      include/call_interfaces.h
  4. +12
    -0
      include/control_ng.h

+ 6
- 5
daemon/call_interfaces.c View File

@ -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) {


+ 17
- 8
daemon/control_ng.c View File

@ -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;
}


+ 3
- 2
include/call_interfaces.h View File

@ -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 *);


+ 12
- 0
include/control_ng.h View File

@ -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;


Loading…
Cancel
Save