Skip to content

Commit cd89bb6

Browse files
authored
Add lock to pjsip resolver (#3991)
1 parent 77f8ad5 commit cd89bb6

File tree

1 file changed

+25
-0
lines changed

1 file changed

+25
-0
lines changed

pjsip/src/pjsip/sip_resolve.c

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ struct query
5151
pjsip_resolver_callback *cb;
5252
pj_dns_async_query *object;
5353
pj_dns_async_query *object6;
54+
pj_grp_lock_t *grp_lock;
5455
pj_status_t last_error;
5556

5657
/* Original request: */
@@ -71,6 +72,7 @@ struct query
7172
struct pjsip_resolver_t
7273
{
7374
pj_dns_resolver *res;
75+
pj_grp_lock_t *grp_lock;
7476
pjsip_ext_resolver *ext_res;
7577
};
7678

@@ -93,9 +95,18 @@ PJ_DEF(pj_status_t) pjsip_resolver_create( pj_pool_t *pool,
9395
pjsip_resolver_t **p_res)
9496
{
9597
pjsip_resolver_t *resolver;
98+
pj_status_t status;
9699

97100
PJ_ASSERT_RETURN(pool && p_res, PJ_EINVAL);
98101
resolver = PJ_POOL_ZALLOC_T(pool, pjsip_resolver_t);
102+
103+
/* Create group lock */
104+
status = pj_grp_lock_create(pool, NULL, &resolver->grp_lock);
105+
if (status != PJ_SUCCESS)
106+
return status;
107+
108+
pj_grp_lock_add_ref(resolver->grp_lock);
109+
99110
*p_res = resolver;
100111

101112
return PJ_SUCCESS;
@@ -160,6 +171,11 @@ PJ_DEF(void) pjsip_resolver_destroy(pjsip_resolver_t *resolver)
160171
#endif
161172
resolver->res = NULL;
162173
}
174+
175+
if (resolver->grp_lock) {
176+
pj_grp_lock_dec_ref(resolver->grp_lock);
177+
resolver->grp_lock = NULL;
178+
}
163179
}
164180

165181
/*
@@ -393,6 +409,7 @@ PJ_DEF(void) pjsip_resolve( pjsip_resolver_t *resolver,
393409
query->objname = THIS_FILE;
394410
query->token = token;
395411
query->cb = cb;
412+
query->grp_lock = resolver->grp_lock;
396413
query->req.target = *target;
397414
pj_strdup(pool, &query->req.target.addr.host, &target->addr.host);
398415

@@ -532,6 +549,8 @@ static void dns_a_callback(void *user_data,
532549
struct query *query = (struct query*) user_data;
533550
pjsip_server_addresses *srv = &query->server;
534551

552+
pj_grp_lock_acquire(query->grp_lock);
553+
535554
/* Reset outstanding job */
536555
query->object = NULL;
537556

@@ -577,6 +596,8 @@ static void dns_a_callback(void *user_data,
577596
else
578597
(*query->cb)(query->last_error, query->token, NULL);
579598
}
599+
600+
pj_grp_lock_release(query->grp_lock);
580601
}
581602

582603

@@ -590,6 +611,8 @@ static void dns_aaaa_callback(void *user_data,
590611
struct query *query = (struct query*) user_data;
591612
pjsip_server_addresses *srv = &query->server;
592613

614+
pj_grp_lock_acquire(query->grp_lock);
615+
593616
/* Reset outstanding job */
594617
query->object6 = NULL;
595618

@@ -636,6 +659,8 @@ static void dns_aaaa_callback(void *user_data,
636659
else
637660
(*query->cb)(query->last_error, query->token, NULL);
638661
}
662+
663+
pj_grp_lock_release(query->grp_lock);
639664
}
640665

641666

0 commit comments

Comments
 (0)