rtp_engine.c: Minor tweaks.
authorRichard Mudgett <rmudgett@digium.com>
Thu, 23 Jul 2015 19:04:16 +0000 (14:04 -0500)
committerRichard Mudgett <rmudgett@digium.com>
Thu, 30 Jul 2015 22:11:58 +0000 (17:11 -0500)
* Fix off nominial ref leak of new_type in
ast_rtp_codecs_payloads_set_m_type().

* No need to lock static_RTP_PT_lock in
ast_rtp_codecs_payloads_set_m_type() and
ast_rtp_codecs_payloads_set_rtpmap_type_rate() before the payload type
parameter sanity check.

* No need to create ast_rtp_payload_type ao2 objects with a lock since the
lock is not used.

Change-Id: I64dd1bb4dfabdc7e981e3f61448beac9bb7504d4

main/rtp_engine.c

index 742f2de..069b2fc 100644 (file)
@@ -236,7 +236,10 @@ static ast_rwlock_t static_RTP_PT_lock;
 static struct stasis_topic *rtp_topic;
 
 
 static struct stasis_topic *rtp_topic;
 
 
-/*! \internal \brief Destructor for \c ast_rtp_payload_type */
+/*!
+ * \internal
+ * \brief Destructor for \c ast_rtp_payload_type
+ */
 static void rtp_payload_type_dtor(void *obj)
 {
        struct ast_rtp_payload_type *payload = obj;
 static void rtp_payload_type_dtor(void *obj)
 {
        struct ast_rtp_payload_type *payload = obj;
@@ -248,7 +251,8 @@ struct ast_rtp_payload_type *ast_rtp_engine_alloc_payload_type(void)
 {
        struct ast_rtp_payload_type *payload;
 
 {
        struct ast_rtp_payload_type *payload;
 
-       payload = ao2_alloc(sizeof(*payload), rtp_payload_type_dtor);
+       payload = ao2_alloc_options(sizeof(*payload), rtp_payload_type_dtor,
+               AO2_ALLOC_OPT_LOCK_NOLOCK);
 
        return payload;
 }
 
        return payload;
 }
@@ -644,17 +648,16 @@ void ast_rtp_codecs_payloads_set_m_type(struct ast_rtp_codecs *codecs, struct as
 {
        struct ast_rtp_payload_type *new_type;
 
 {
        struct ast_rtp_payload_type *new_type;
 
-       new_type = ast_rtp_engine_alloc_payload_type();
-       if (!new_type) {
+       if (payload < 0 || payload >= AST_RTP_MAX_PT) {
                return;
        }
 
                return;
        }
 
-       ast_rwlock_rdlock(&static_RTP_PT_lock);
-       if (payload < 0 || payload >= AST_RTP_MAX_PT) {
-               ast_rwlock_unlock(&static_RTP_PT_lock);
+       new_type = ast_rtp_engine_alloc_payload_type();
+       if (!new_type) {
                return;
        }
 
                return;
        }
 
+       ast_rwlock_rdlock(&static_RTP_PT_lock);
        ast_rwlock_wrlock(&codecs->codecs_lock);
        if (payload < AST_VECTOR_SIZE(&codecs->payloads)) {
                ao2_t_cleanup(AST_VECTOR_GET(&codecs->payloads, payload), "cleaning up replaced payload type");
        ast_rwlock_wrlock(&codecs->codecs_lock);
        if (payload < AST_VECTOR_SIZE(&codecs->payloads)) {
                ao2_t_cleanup(AST_VECTOR_GET(&codecs->payloads, payload), "cleaning up replaced payload type");
@@ -684,12 +687,11 @@ int ast_rtp_codecs_payloads_set_rtpmap_type_rate(struct ast_rtp_codecs *codecs,
        unsigned int i;
        int found = 0;
 
        unsigned int i;
        int found = 0;
 
-       ast_rwlock_rdlock(&mime_types_lock);
        if (pt < 0 || pt >= AST_RTP_MAX_PT) {
        if (pt < 0 || pt >= AST_RTP_MAX_PT) {
-               ast_rwlock_unlock(&mime_types_lock);
                return -1; /* bogus payload type */
        }
 
                return -1; /* bogus payload type */
        }
 
+       ast_rwlock_rdlock(&mime_types_lock);
        ast_rwlock_wrlock(&codecs->codecs_lock);
        for (i = 0; i < mime_types_len; ++i) {
                const struct ast_rtp_mime_type *t = &ast_rtp_mime_types[i];
        ast_rwlock_wrlock(&codecs->codecs_lock);
        for (i = 0; i < mime_types_len; ++i) {
                const struct ast_rtp_mime_type *t = &ast_rtp_mime_types[i];
@@ -2094,7 +2096,7 @@ static void rtp_engine_shutdown(void)
        ast_rwlock_unlock(&mime_types_lock);
 }
 
        ast_rwlock_unlock(&mime_types_lock);
 }
 
-int ast_rtp_engine_init()
+int ast_rtp_engine_init(void)
 {
        ast_rwlock_init(&mime_types_lock);
        ast_rwlock_init(&static_RTP_PT_lock);
 {
        ast_rwlock_init(&mime_types_lock);
        ast_rwlock_init(&static_RTP_PT_lock);