From a2c557f3a1fa4c2bc0ba127a1d59f58df637ed66 Mon Sep 17 00:00:00 2001 From: Tilghman Lesher Date: Thu, 18 Dec 2008 16:36:48 +0000 Subject: Fix reference counts of the class and add an assertion to the end. git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@165541 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- res/res_odbc.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) (limited to 'res') diff --git a/res/res_odbc.c b/res/res_odbc.c index 808867f84..8161fd3bf 100644 --- a/res/res_odbc.c +++ b/res/res_odbc.c @@ -699,15 +699,19 @@ struct odbc_obj *ast_odbc_request_obj(const char *name, int check) ast_mutex_init(&obj->lock); /* obj inherits the outstanding reference to class */ obj->parent = class; + class = NULL; if (odbc_obj_connect(obj) == ODBC_FAIL) { ast_log(LOG_WARNING, "Failed to connect to %s\n", name); ao2_ref(obj, -1); obj = NULL; - class->count--; } else { obj->used = 1; ao2_link(class->obj_container, obj); } + } else { + /* Object is not constructed, so delete outstanding reference to class. */ + ao2_ref(class, -1); + class = NULL; } } else { /* Non-pooled connection: multiple modules can use the same connection. */ @@ -717,7 +721,11 @@ struct odbc_obj *ast_odbc_request_obj(const char *name, int check) break; } - if (!obj) { + if (obj) { + /* Object is not constructed, so delete outstanding reference to class. */ + ao2_ref(class, -1); + class = NULL; + } else { /* No entry: build one */ obj = ao2_alloc(sizeof(*obj), odbc_obj_destructor); if (!obj) { @@ -727,6 +735,7 @@ struct odbc_obj *ast_odbc_request_obj(const char *name, int check) ast_mutex_init(&obj->lock); /* obj inherits the outstanding reference to class */ obj->parent = class; + class = NULL; if (odbc_obj_connect(obj) == ODBC_FAIL) { ast_log(LOG_WARNING, "Failed to connect to %s\n", name); ao2_ref(obj, -1); @@ -749,8 +758,8 @@ struct odbc_obj *ast_odbc_request_obj(const char *name, int check) obj->lineno = lineno; } #endif + ast_assert(class == NULL); - ao2_ref(class, -1); return obj; } -- cgit v1.2.3