From: Timo Sirainen Date: Sun, 15 Sep 2019 20:15:33 +0000 (+0300) Subject: lib-sql: Add refcounting to sql_db X-Git-Tag: 2.3.9~153 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=87a95f18bcb1559e44c645d1b284d60c04186b0f;p=thirdparty%2Fdovecot%2Fcore.git lib-sql: Add refcounting to sql_db --- diff --git a/src/auth/db-sql.c b/src/auth/db-sql.c index 79936aed75..b5769043a9 100644 --- a/src/auth/db-sql.c +++ b/src/auth/db-sql.c @@ -131,7 +131,7 @@ void db_sql_unref(struct db_sql_connection **_conn) if (--conn->refcount > 0) return; - sql_deinit(&conn->db); + sql_unref(&conn->db); pool_unref(&conn->pool); } diff --git a/src/lib-dict-backend/dict-sql.c b/src/lib-dict-backend/dict-sql.c index 52497ff704..4a7baed6af 100644 --- a/src/lib-dict-backend/dict-sql.c +++ b/src/lib-dict-backend/dict-sql.c @@ -143,7 +143,7 @@ static void sql_dict_deinit(struct dict *_dict) struct sql_dict *dict = (struct sql_dict *)_dict; sql_dict_prep_stmt_hash_free(dict); - sql_deinit(&dict->db); + sql_unref(&dict->db); pool_unref(&dict->pool); } diff --git a/src/lib-sql/driver-sqlpool.c b/src/lib-sql/driver-sqlpool.c index 5254687117..b1d3bffe30 100644 --- a/src/lib-sql/driver-sqlpool.c +++ b/src/lib-sql/driver-sqlpool.c @@ -548,7 +548,7 @@ static void driver_sqlpool_deinit(struct sql_db *_db) struct sqlpool_connection *conn; array_foreach_modifiable(&db->all_connections, conn) - sql_deinit(&conn->db); + sql_unref(&conn->db); array_clear(&db->all_connections); driver_sqlpool_abort_requests(db); diff --git a/src/lib-sql/sql-api-private.h b/src/lib-sql/sql-api-private.h index 1c3a542656..a4115a1ec0 100644 --- a/src/lib-sql/sql-api-private.h +++ b/src/lib-sql/sql-api-private.h @@ -123,6 +123,7 @@ struct sql_db_vfuncs { struct sql_db { const char *name; enum sql_db_flags flags; + int refcount; struct sql_db_vfuncs v; ARRAY(union sql_db_module_context *) module_contexts; diff --git a/src/lib-sql/sql-api.c b/src/lib-sql/sql-api.c index 0aaadb6b3b..d2da70c9ff 100644 --- a/src/lib-sql/sql-api.c +++ b/src/lib-sql/sql-api.c @@ -103,16 +103,25 @@ int sql_init_full(const struct sql_settings *set, struct sql_db **db_r, return -1; i_array_init(&db->module_contexts, 5); + db->refcount = 1; *db_r = db; return 0; } -void sql_deinit(struct sql_db **_db) +void sql_ref(struct sql_db *db) +{ + db->refcount++; +} + +void sql_unref(struct sql_db **_db) { struct sql_db *db = *_db; *_db = NULL; + if (--db->refcount > 0) + return; + timeout_remove(&db->to_reconnect); db->v.deinit(db); } diff --git a/src/lib-sql/sql-api.h b/src/lib-sql/sql-api.h index a6600ff183..dd28841c9a 100644 --- a/src/lib-sql/sql-api.h +++ b/src/lib-sql/sql-api.h @@ -94,7 +94,8 @@ struct sql_db *sql_init(const char *db_driver, const char *connect_string); int sql_init_full(const struct sql_settings *set, struct sql_db **db_r, const char **error_r); -void sql_deinit(struct sql_db **db); +void sql_ref(struct sql_db *db); +void sql_unref(struct sql_db **db); /* Returns SQL database state flags. */ enum sql_db_flags sql_get_flags(struct sql_db *db);