mirror of
https://gitlab.linphone.org/BC/public/linphone-iphone.git
synced 2026-02-07 14:18:25 +00:00
fix memory leaks
This commit is contained in:
parent
1c1165ff65
commit
649a5a5fe8
7 changed files with 31 additions and 18 deletions
|
|
@ -375,8 +375,8 @@ static void process_response_event(void *user_ctx, const belle_sip_response_even
|
|||
ms_error("Unhandled event response [%p]",event);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static void process_timeout(void *user_ctx, const belle_sip_timeout_event_t *event) {
|
||||
belle_sip_client_transaction_t* client_transaction = belle_sip_timeout_event_get_client_transaction(event);
|
||||
SalOp* op = (SalOp*)belle_sip_transaction_get_application_data(BELLE_SIP_TRANSACTION(client_transaction));
|
||||
|
|
@ -386,6 +386,7 @@ static void process_timeout(void *user_ctx, const belle_sip_timeout_event_t *eve
|
|||
ms_error("Unhandled event timeout [%p]",event);
|
||||
}
|
||||
}
|
||||
|
||||
static void process_transaction_terminated(void *user_ctx, const belle_sip_transaction_terminated_event_t *event) {
|
||||
belle_sip_client_transaction_t* client_transaction = belle_sip_transaction_terminated_event_get_client_transaction(event);
|
||||
belle_sip_server_transaction_t* server_transaction = belle_sip_transaction_terminated_event_get_server_transaction(event);
|
||||
|
|
@ -404,7 +405,6 @@ static void process_transaction_terminated(void *user_ctx, const belle_sip_trans
|
|||
ms_message("Unhandled transaction terminated [%p]",trans);
|
||||
}
|
||||
if (op) sal_op_unref(op); /*because every transaction ref op*/
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -27,16 +27,11 @@ static void call_set_released(SalOp* op){
|
|||
op->state=SalOpStateTerminated;
|
||||
op->base.root->callbacks.call_released(op);
|
||||
op->call_released=TRUE;
|
||||
/*be aware that the following line may destroy the op*/
|
||||
set_or_update_dialog(op,NULL);
|
||||
}
|
||||
}
|
||||
|
||||
/*used when the SalOp was ref'd by the dialog, in which case we rely only on the dialog terminated notification*/
|
||||
static void call_set_released_and_unref(SalOp* op) {
|
||||
call_set_released(op);
|
||||
sal_op_unref(op);
|
||||
}
|
||||
|
||||
|
||||
static void call_set_error(SalOp* op,belle_sip_response_t* response){
|
||||
sal_op_set_error_info_from_response(op,response);
|
||||
op->base.root->callbacks.call_failure(op);
|
||||
|
|
@ -142,7 +137,7 @@ static void process_dialog_terminated(void *ctx, const belle_sip_dialog_terminat
|
|||
break;
|
||||
}
|
||||
belle_sip_main_loop_do_later(belle_sip_stack_get_main_loop(op->base.root->stack)
|
||||
,(belle_sip_callback_t) call_set_released_and_unref
|
||||
,(belle_sip_callback_t) call_set_released
|
||||
, op);
|
||||
} else {
|
||||
ms_error("dialog unknown for op ");
|
||||
|
|
|
|||
|
|
@ -573,16 +573,17 @@ static belle_sip_dialog_t *link_op_with_dialog(SalOp *op, belle_sip_dialog_t* di
|
|||
}
|
||||
|
||||
void set_or_update_dialog(SalOp* op, belle_sip_dialog_t* dialog) {
|
||||
if (dialog==NULL) return;
|
||||
ms_message("op [%p] : set_or_update_dialog() current=[%p] new=[%p]",op,op->dialog,dialog);
|
||||
if (dialog && op->dialog!=dialog){
|
||||
sal_op_ref(op);
|
||||
if (op->dialog!=dialog){
|
||||
if (op->dialog){
|
||||
/*FIXME: shouldn't we delete unconfirmed dialogs ?*/
|
||||
unlink_op_with_dialog(op,op->dialog);
|
||||
op->dialog=NULL;
|
||||
}
|
||||
op->dialog=link_op_with_dialog(op,dialog);
|
||||
if (dialog) op->dialog=link_op_with_dialog(op,dialog);
|
||||
}
|
||||
sal_op_unref(op);
|
||||
}
|
||||
/*return reffed op*/
|
||||
SalOp* sal_op_ref(SalOp* op) {
|
||||
|
|
@ -607,6 +608,13 @@ int sal_op_send_and_create_refresher(SalOp* op,belle_sip_request_t* req, int exp
|
|||
belle_sip_object_unref(op->refresher);
|
||||
}
|
||||
if ((op->refresher = belle_sip_client_transaction_create_refresher(op->pending_client_trans))) {
|
||||
/*since refresher acquires the transaction, we should remove our context from the transaction, because we won't be notified
|
||||
* that it is terminated anymore.*/
|
||||
sal_op_unref(op);/*loose the reference that was given to the transaction when creating it*/
|
||||
/* Note that the refresher will replace our data with belle_sip_transaction_set_application_data().
|
||||
Something in the design is not very good here, it makes things complicated to the belle-sip user.
|
||||
Possible ideas to improve things: refresher shall not use belle_sip_transaction_set_application_data() internally, refresher should let the first transaction
|
||||
notify the user as a normal transaction*/
|
||||
belle_sip_refresher_set_listener(op->refresher,listener,op);
|
||||
belle_sip_refresher_set_retry_after(op->refresher,op->base.root->refresher_retry_after);
|
||||
belle_sip_refresher_enable_manual_mode(op->refresher,op->manual_refresher);
|
||||
|
|
|
|||
|
|
@ -62,7 +62,7 @@ static void file_transfer_progress_indication(LinphoneCore *lc, LinphoneChatMess
|
|||
}
|
||||
/**
|
||||
* function invoked when a file transfer is received.
|
||||
* */
|
||||
**/
|
||||
static void file_transfer_received(LinphoneCore *lc, LinphoneChatMessage *message, const LinphoneContent* content, const char* buff, size_t size){
|
||||
int file=-1;
|
||||
if (!linphone_chat_message_get_user_data(message)) {
|
||||
|
|
@ -81,7 +81,9 @@ static void file_transfer_received(LinphoneCore *lc, LinphoneChatMessage *messag
|
|||
close(file);
|
||||
running=FALSE;
|
||||
} else { /* store content on a file*/
|
||||
write(file,buff,size);
|
||||
if (write(file,buff,size)==-1){
|
||||
ms_warning("file_transfer_received() write failed: %s",strerror(errno));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
Subproject commit c41b1f95201c74809fdf35bca0d5a81a3de4c21f
|
||||
Subproject commit 8b80c5023cabeb400826104b5641a9a6917ab4cf
|
||||
|
|
@ -239,13 +239,19 @@ bool_t call(LinphoneCoreManager* caller_mgr,LinphoneCoreManager* callee_mgr){
|
|||
return call_with_params(caller_mgr,callee_mgr,NULL,NULL);
|
||||
}
|
||||
|
||||
static void end_call(LinphoneCoreManager *m1, LinphoneCoreManager *m2){
|
||||
linphone_core_terminate_all_calls(m1->lc);
|
||||
CU_ASSERT_TRUE(wait_for(m1->lc,m2->lc,&m1->stat.number_of_LinphoneCallEnd,1));
|
||||
CU_ASSERT_TRUE(wait_for(m1->lc,m2->lc,&m2->stat.number_of_LinphoneCallEnd,1));
|
||||
}
|
||||
|
||||
static void simple_call(void) {
|
||||
LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc");
|
||||
LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc");
|
||||
|
||||
CU_ASSERT_TRUE(call(pauline,marie));
|
||||
liblinphone_tester_check_rtcp(marie,pauline);
|
||||
|
||||
end_call(marie,pauline);
|
||||
linphone_core_manager_destroy(marie);
|
||||
linphone_core_manager_destroy(pauline);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -76,7 +76,9 @@ void file_transfer_received(LinphoneCore *lc, LinphoneChatMessage *message, cons
|
|||
counters->number_of_LinphoneMessageExtBodyReceived++;
|
||||
close(file);
|
||||
} else { /* store content on a file*/
|
||||
write(file,buff,size);
|
||||
if (write(file,buff,size)==-1){
|
||||
ms_error("file_transfer_received(): write() failed: %s",strerror(errno));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue