Module: sip-router
Branch: master
Commit: b0d642016cca83c519ea9aa0e04aa9bf353e07e4
URL:
http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=b0d6420…
Author: Peter Dunkley <peter.dunkley(a)crocodile-rcs.com>
Committer: Peter Dunkley <peter.dunkley(a)crocodile-rcs.com>
Date: Tue Sep 11 13:23:23 2012 +0100
modules_k/pua: Adjusted locking for dialog insertion. Candidate fix for "temporary
dialog" error reported by Juha
---
modules_k/pua/hash.c | 18 +++---------------
modules_k/pua/hash.h | 3 ++-
modules_k/pua/pua.c | 7 ++++++-
modules_k/pua/send_publish.c | 4 +++-
modules_k/pua/send_subscribe.c | 6 ++----
5 files changed, 16 insertions(+), 22 deletions(-)
diff --git a/modules_k/pua/hash.c b/modules_k/pua/hash.c
index 1fa6149..9ad169b 100644
--- a/modules_k/pua/hash.c
+++ b/modules_k/pua/hash.c
@@ -235,7 +235,7 @@ void update_htable(ua_pres_t* p, time_t desired_expires, int expires,
}
}
/* insert in front; so when searching the most recent result is returned*/
-void _insert_htable(ua_pres_t* presentity, unsigned int hash_code)
+void insert_htable(ua_pres_t* presentity, unsigned int hash_code)
{
ua_pres_t* p= NULL;
@@ -253,18 +253,6 @@ void _insert_htable(ua_pres_t* presentity, unsigned int hash_code)
p->next= presentity;
}
-void insert_htable(ua_pres_t* presentity)
-{
- unsigned int hash_code;
-
- hash_code= core_hash(presentity->pres_uri,presentity->watcher_uri, HASH_SIZE);
- lock_get(&HashT->p_records[hash_code].lock);
-
- _insert_htable(presentity, hash_code);
-
- lock_release(&HashT->p_records[hash_code].lock);
-}
-
/* This function used to perform a search to find the hash table
entry that matches the presentity it is passed. However,
everywhere it is used it is passed a pointer to the correct
@@ -349,7 +337,7 @@ int convert_temporary_dialog(ua_pres_t *dialog)
else
return -1;
- _insert_htable(dialog, hash_code);
+ insert_htable(dialog, hash_code);
lock_release(&HashT->p_records[hash_code].lock);
@@ -695,4 +683,4 @@ list_entry_t *get_subs_list(str *did)
}
done:
return list;
-}
\ No newline at end of file
+}
diff --git a/modules_k/pua/hash.h b/modules_k/pua/hash.h
index 61ccd54..9912eba 100644
--- a/modules_k/pua/hash.h
+++ b/modules_k/pua/hash.h
@@ -116,7 +116,8 @@ htable_t* new_htable(void);
ua_pres_t* search_htable(ua_pres_t* pres, unsigned int hash_code);
-void insert_htable(ua_pres_t* presentity );
+void insert_htable(ua_pres_t* presentity, unsigned int hash_code);
+
void update_htable(ua_pres_t* presentity,time_t desired_expires,
int expires, str* etag, unsigned int hash_code, str* contact);
diff --git a/modules_k/pua/pua.c b/modules_k/pua/pua.c
index 2297219..8734d35 100644
--- a/modules_k/pua/pua.c
+++ b/modules_k/pua/pua.c
@@ -391,6 +391,7 @@ static int db_restore(void)
int watcher_col,callid_col,totag_col,fromtag_col,cseq_col,remote_contact_col;
int event_col,contact_col,tuple_col,record_route_col, extra_headers_col;
int version_col;
+ unsigned int hash_code;
if (dbmode==PUA_DB_ONLY)
{
@@ -643,7 +644,11 @@ static int db_restore(void)
}
print_ua_pres(p);
- insert_htable(p);
+
+ hash_code= core_hash(p->pres_uri, p->watcher_uri, HASH_SIZE);
+ lock_get(&HashT->p_records[hash_code].lock);
+ insert_htable(p, hash_code);
+ lock_release(&HashT->p_records[hash_code].lock);
}
} while((db_fetch_next(&pua_dbf, pua_fetch_rows, pua_db, &res)==1)
diff --git a/modules_k/pua/send_publish.c b/modules_k/pua/send_publish.c
index 1f4ed37..3a86cf3 100644
--- a/modules_k/pua/send_publish.c
+++ b/modules_k/pua/send_publish.c
@@ -422,7 +422,9 @@ void publ_cback_func(struct cell *t, int type, struct tmcb_params
*ps)
}
else
{
- insert_htable(presentity);
+ lock_get(&HashT->p_records[hash_code].lock);
+ insert_htable(presentity, hash_code);
+ lock_release(&HashT->p_records[hash_code].lock);
}
LM_DBG("***Inserted in hash table\n");
diff --git a/modules_k/pua/send_subscribe.c b/modules_k/pua/send_subscribe.c
index 1c10bf0..006bae4 100644
--- a/modules_k/pua/send_subscribe.c
+++ b/modules_k/pua/send_subscribe.c
@@ -1029,9 +1029,6 @@ int send_subscribe(subs_info_t* subs)
int size;
insert:
- if (dbmode!=PUA_DB_ONLY)
- lock_release(&HashT->p_records[hash_code].lock);
-
if (subs->expires == 0)
/* Don't create a new dialog when expires == 0 */
goto done;
@@ -1141,7 +1138,8 @@ insert:
}
else
{
- insert_htable(presentity);
+ insert_htable(presentity, hash_code);
+ lock_release(&HashT->p_records[hash_code].lock);
}
uac_r.dialog->rem_target.s = 0;