summaryrefslogtreecommitdiff
path: root/statement.c
diff options
context:
space:
mode:
authorHeikki Linnakangas2014-02-24 13:44:50 +0000
committerHeikki Linnakangas2014-02-24 13:44:50 +0000
commitfca9c63978c2a1890e9c2c04274ddb5b86526fd9 (patch)
tree43ef62a26682b7f2f0caca2d3c3395aa26abae59 /statement.c
parent9f17452c0228286e658aa8ffacd5cb7390f74587 (diff)
Fix locking in SC_set_prepared
Commit 2f4f8eabf6ce685c38d69da3e98132b77d38d188 added ENTER/LEAVE_CRIT_CS calls in SC_set_prepared, as a belt-and-suspenders fix for the race condition already fixed by commit 7065a7af196bb09f80beddce82fa728c8a6dfcba. But it didn't take a NULL connection into account.
Diffstat (limited to 'statement.c')
-rw-r--r--statement.c31
1 files changed, 17 insertions, 14 deletions
diff --git a/statement.c b/statement.c
index ee07973..598f402 100644
--- a/statement.c
+++ b/statement.c
@@ -683,24 +683,27 @@ SC_set_prepared(StatementClass *stmt, int prepared)
{
ConnectionClass *conn = SC_get_conn(stmt);
- ENTER_CONN_CS(conn);
- if (conn && CONN_CONNECTED == conn->status)
+ if (conn)
{
- if (CC_is_in_error_trans(conn))
- {
- CC_mark_a_object_to_discard(conn, 's', stmt->plan_name);
- }
- else
+ ENTER_CONN_CS(conn);
+ if (CONN_CONNECTED == conn->status)
{
- QResultClass *res;
- char dealloc_stmt[128];
+ if (CC_is_in_error_trans(conn))
+ {
+ CC_mark_a_object_to_discard(conn, 's', stmt->plan_name);
+ }
+ else
+ {
+ QResultClass *res;
+ char dealloc_stmt[128];
- sprintf(dealloc_stmt, "DEALLOCATE \"%s\"", stmt->plan_name);
- res = CC_send_query(conn, dealloc_stmt, NULL, IGNORE_ABORT_ON_CONN | ROLLBACK_ON_ERROR, NULL);
- QR_Destructor(res);
- }
+ sprintf(dealloc_stmt, "DEALLOCATE \"%s\"", stmt->plan_name);
+ res = CC_send_query(conn, dealloc_stmt, NULL, IGNORE_ABORT_ON_CONN | ROLLBACK_ON_ERROR, NULL);
+ QR_Destructor(res);
+ }
+ }
+ LEAVE_CONN_CS(conn);
}
- LEAVE_CONN_CS(conn);
}
if (NOT_YET_PREPARED == prepared)
SC_set_planname(stmt, NULL);