Index: res/res_odbc.c =================================================================== --- res/res_odbc.c (revision 304952) +++ res/res_odbc.c (working copy) @@ -1177,10 +1177,11 @@ ast_assert(ao2_ref(obj, 0) > 1); } - if (!obj && (class->count < class->limit)) { + if (!obj && (ast_atomic_fetchadd_int(&class->count, +1) < class->limit)) { obj = ao2_alloc(sizeof(*obj), odbc_obj_destructor); if (!obj) { ao2_ref(class, -1); + ast_atomic_fetchadd_int(&class->count, -1); return NULL; } ast_assert(ao2_ref(obj, 0) == 1); @@ -1191,14 +1192,18 @@ if (odbc_obj_connect(obj) == ODBC_FAIL) { ast_log(LOG_WARNING, "Failed to connect to %s\n", name); ao2_ref(obj, -1); + obj = NULL; ast_assert(ao2_ref(class, 0) > 0); - obj = NULL; + ast_atomic_fetchadd_int(&class->count, -1); } else { obj->used = 1; ao2_link(obj->parent->obj_container, obj); - ast_atomic_fetchadd_int(&obj->parent->count, +1); } } else { + /* If construction fails due to the limit, remove our increment. */ + if (!obj) { + ast_atomic_fetchadd_int(&class->count, -1); + } /* Object is not constructed, so delete outstanding reference to class. */ ao2_ref(class, -1); class = NULL;