Browse Source

MT#55283 refactor MQTT callbacks

Use dedicated functions and different code paths for the different use
cases, instead of just a single function which does if/else all the
time.

Change-Id: Ic3ab928c3605cfe4a2f48889e95a3a1ddccdbbec
pull/1611/head
Richard Fuchs 3 years ago
parent
commit
c56c3cff4d
3 changed files with 87 additions and 52 deletions
  1. +36
    -17
      daemon/codec.c
  2. +45
    -33
      daemon/mqtt.c
  3. +6
    -2
      include/mqtt.h

+ 36
- 17
daemon/codec.c View File

@ -1380,31 +1380,44 @@ static void __mqtt_timer_free(void *p) {
obj_put(mqt->call);
}
static void __codec_mqtt_timer_schedule(struct mqtt_timer *mqt);
static void __mqtt_timer_run(struct codec_timer *ct) {
struct mqtt_timer *mqt = (struct mqtt_timer *) ct;
INLINE bool __mqtt_timer_common_call(struct mqtt_timer *mqt) {
struct call *call = mqt->call;
if (call) {
rwlock_lock_w(&call->master_lock);
log_info_call(call);
}
rwlock_lock_w(&call->master_lock);
if (!*mqt->self) {
if (call)
rwlock_unlock_w(&call->master_lock);
goto out;
rwlock_unlock_w(&call->master_lock);
return false;
}
__codec_mqtt_timer_schedule(mqt);
log_info_call(call);
if (call)
rwlock_unlock_w(&call->master_lock);
__codec_mqtt_timer_schedule(mqt);
mqtt_timer_run(call, mqt->media);
rwlock_unlock_w(&call->master_lock);
out:
if (call)
log_info_pop();
return true;
}
static void __mqtt_timer_run_media(struct codec_timer *ct) {
struct mqtt_timer *mqt = (struct mqtt_timer *) ct;
if (!__mqtt_timer_common_call(mqt))
return;
mqtt_timer_run_media(mqt->call, mqt->media);
log_info_pop();
}
static void __mqtt_timer_run_call(struct codec_timer *ct) {
struct mqtt_timer *mqt = (struct mqtt_timer *) ct;
if (!__mqtt_timer_common_call(mqt))
return;
mqtt_timer_run_call(mqt->call);
log_info_pop();
}
static void __mqtt_timer_run_global(struct codec_timer *ct) {
struct mqtt_timer *mqt = (struct mqtt_timer *) ct;
if (!*mqt->self)
return;
__codec_mqtt_timer_schedule(mqt);
mqtt_timer_run_global();
}
static void __codec_mqtt_timer_schedule(struct mqtt_timer *mqt) {
timeval_add_usec(&mqt->ct.next, rtpe_config.mqtt_publish_interval * 1000);
@ -1421,7 +1434,13 @@ void mqtt_timer_start(struct mqtt_timer **mqtp, struct call *call, struct call_m
mqt->self = mqtp;
mqt->media = media;
mqt->ct.next = rtpe_now;
mqt->ct.timer_func = __mqtt_timer_run;
if (media)
mqt->ct.timer_func = __mqtt_timer_run_media;
else if (call)
mqt->ct.timer_func = __mqtt_timer_run_call;
else
mqt->ct.timer_func = __mqtt_timer_run_global;
__codec_mqtt_timer_schedule(mqt);
}


+ 45
- 33
daemon/mqtt.c View File

@ -500,7 +500,7 @@ static void mqtt_global_stats(JsonBuilder *json) {
}
void mqtt_timer_run(struct call *call, struct call_media *media) {
INLINE JsonBuilder *__mqtt_timer_intro(void) {
JsonBuilder *json = json_builder_new();
json_builder_begin_object(json);
@ -508,38 +508,9 @@ void mqtt_timer_run(struct call *call, struct call_media *media) {
json_builder_set_member_name(json, "timestamp");
json_builder_add_double_value(json, (double) rtpe_now.tv_sec + (double) rtpe_now.tv_usec / 1000000.0);
if (!call) {
mqtt_global_stats(json);
if (mqtt_publish_scope() == MPS_GLOBAL) {
json_builder_set_member_name(json, "calls");
json_builder_begin_array(json);
ITERATE_CALL_LIST_START(CALL_ITERATOR_MQTT, call);
json_builder_begin_object(json);
mqtt_full_call(call, json);
json_builder_end_object(json);
ITERATE_CALL_LIST_NEXT_END(call);
json_builder_end_array(json);
}
}
else if (!media)
mqtt_full_call(call, json);
else {
rwlock_lock_r(&call->master_lock);
log_info_call(call);
mqtt_call_stats(call, json);
mqtt_monologue_stats(media->monologue, json);
mqtt_media_stats(media, json);
rwlock_unlock_r(&call->master_lock);
log_info_pop();
}
return json;
}
INLINE void __mqtt_timer_outro(JsonBuilder *json) {
json_builder_end_object(json);
JsonGenerator *gen = json_generator_new();
@ -553,6 +524,47 @@ void mqtt_timer_run(struct call *call, struct call_media *media) {
g_object_unref(gen);
g_object_unref(json);
}
void mqtt_timer_run_media(struct call *call, struct call_media *media) {
JsonBuilder *json = __mqtt_timer_intro();
rwlock_lock_r(&call->master_lock);
log_info_call(call);
mqtt_call_stats(call, json);
mqtt_monologue_stats(media->monologue, json);
mqtt_media_stats(media, json);
rwlock_unlock_r(&call->master_lock);
log_info_pop();
__mqtt_timer_outro(json);
}
void mqtt_timer_run_call(struct call *call) {
JsonBuilder *json = __mqtt_timer_intro();
mqtt_full_call(call, json);
__mqtt_timer_outro(json);
}
void mqtt_timer_run_global(void) {
JsonBuilder *json = __mqtt_timer_intro();
mqtt_global_stats(json);
json_builder_set_member_name(json, "calls");
json_builder_begin_array(json);
ITERATE_CALL_LIST_START(CALL_ITERATOR_MQTT, call);
json_builder_begin_object(json);
mqtt_full_call(call, json);
json_builder_end_object(json);
ITERATE_CALL_LIST_NEXT_END(call);
json_builder_end_array(json);
__mqtt_timer_outro(json);
}


+ 6
- 2
include/mqtt.h View File

@ -15,7 +15,9 @@ int mqtt_init(void);
void mqtt_loop(void *);
int mqtt_publish_scope(void);
void mqtt_publish(char *);
void mqtt_timer_run(struct call *, struct call_media *);
void mqtt_timer_run_media(struct call *, struct call_media *);
void mqtt_timer_run_call(struct call *);
void mqtt_timer_run_global(void);
#else
@ -25,7 +27,9 @@ void mqtt_timer_run(struct call *, struct call_media *);
INLINE int mqtt_init(void) { return 0; }
INLINE void mqtt_publish(char *s) { }
INLINE int mqtt_publish_scope(void) { return MPS_NONE; };
INLINE void mqtt_timer_run(struct call *c, struct call_media *m) { }
INLINE void mqtt_timer_run_media(struct call *c, struct call_media *m) { }
INLINE void mqtt_timer_run_call(struct call *c) { }
INLINE void mqtt_timer_run_global(void) { }
#endif
#endif

Loading…
Cancel
Save