diff --git a/daemon/codec.c b/daemon/codec.c index c5d53df1a..039290541 100644 --- a/daemon/codec.c +++ b/daemon/codec.c @@ -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); } diff --git a/daemon/mqtt.c b/daemon/mqtt.c index 877467a15..f2d86abee 100644 --- a/daemon/mqtt.c +++ b/daemon/mqtt.c @@ -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); +} diff --git a/include/mqtt.h b/include/mqtt.h index 67a659b60..9f37588f7 100644 --- a/include/mqtt.h +++ b/include/mqtt.h @@ -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