diff options
| author | Heikki Linnakangas | 2014-02-24 13:44:50 +0000 |
|---|---|---|
| committer | Heikki Linnakangas | 2014-02-24 13:44:50 +0000 |
| commit | fca9c63978c2a1890e9c2c04274ddb5b86526fd9 (patch) | |
| tree | 43ef62a26682b7f2f0caca2d3c3395aa26abae59 /statement.c | |
| parent | 9f17452c0228286e658aa8ffacd5cb7390f74587 (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.c | 31 |
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); |
