@@ -51,6 +51,7 @@ struct query
51
51
pjsip_resolver_callback * cb ;
52
52
pj_dns_async_query * object ;
53
53
pj_dns_async_query * object6 ;
54
+ pj_grp_lock_t * grp_lock ;
54
55
pj_status_t last_error ;
55
56
56
57
/* Original request: */
@@ -71,6 +72,7 @@ struct query
71
72
struct pjsip_resolver_t
72
73
{
73
74
pj_dns_resolver * res ;
75
+ pj_grp_lock_t * grp_lock ;
74
76
pjsip_ext_resolver * ext_res ;
75
77
};
76
78
@@ -93,9 +95,18 @@ PJ_DEF(pj_status_t) pjsip_resolver_create( pj_pool_t *pool,
93
95
pjsip_resolver_t * * p_res )
94
96
{
95
97
pjsip_resolver_t * resolver ;
98
+ pj_status_t status ;
96
99
97
100
PJ_ASSERT_RETURN (pool && p_res , PJ_EINVAL );
98
101
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
+
99
110
* p_res = resolver ;
100
111
101
112
return PJ_SUCCESS ;
@@ -160,6 +171,11 @@ PJ_DEF(void) pjsip_resolver_destroy(pjsip_resolver_t *resolver)
160
171
#endif
161
172
resolver -> res = NULL ;
162
173
}
174
+
175
+ if (resolver -> grp_lock ) {
176
+ pj_grp_lock_dec_ref (resolver -> grp_lock );
177
+ resolver -> grp_lock = NULL ;
178
+ }
163
179
}
164
180
165
181
/*
@@ -393,6 +409,7 @@ PJ_DEF(void) pjsip_resolve( pjsip_resolver_t *resolver,
393
409
query -> objname = THIS_FILE ;
394
410
query -> token = token ;
395
411
query -> cb = cb ;
412
+ query -> grp_lock = resolver -> grp_lock ;
396
413
query -> req .target = * target ;
397
414
pj_strdup (pool , & query -> req .target .addr .host , & target -> addr .host );
398
415
@@ -532,6 +549,8 @@ static void dns_a_callback(void *user_data,
532
549
struct query * query = (struct query * ) user_data ;
533
550
pjsip_server_addresses * srv = & query -> server ;
534
551
552
+ pj_grp_lock_acquire (query -> grp_lock );
553
+
535
554
/* Reset outstanding job */
536
555
query -> object = NULL ;
537
556
@@ -577,6 +596,8 @@ static void dns_a_callback(void *user_data,
577
596
else
578
597
(* query -> cb )(query -> last_error , query -> token , NULL );
579
598
}
599
+
600
+ pj_grp_lock_release (query -> grp_lock );
580
601
}
581
602
582
603
@@ -590,6 +611,8 @@ static void dns_aaaa_callback(void *user_data,
590
611
struct query * query = (struct query * ) user_data ;
591
612
pjsip_server_addresses * srv = & query -> server ;
592
613
614
+ pj_grp_lock_acquire (query -> grp_lock );
615
+
593
616
/* Reset outstanding job */
594
617
query -> object6 = NULL ;
595
618
@@ -636,6 +659,8 @@ static void dns_aaaa_callback(void *user_data,
636
659
else
637
660
(* query -> cb )(query -> last_error , query -> token , NULL );
638
661
}
662
+
663
+ pj_grp_lock_release (query -> grp_lock );
639
664
}
640
665
641
666
0 commit comments