X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~mdw/git/disorder/blobdiff_plain/a745dd436a29ef2ca2a1a83582e3cfd53b24dcc5:/server/trackdb-int.h..f0feb22e80bfe438c16d212a7cc8be6d2282b6ac:/lib/trackdb-int.h diff --git a/server/trackdb-int.h b/lib/trackdb-int.h similarity index 84% rename from server/trackdb-int.h rename to lib/trackdb-int.h index 441a056..1d31cfe 100644 --- a/server/trackdb-int.h +++ b/lib/trackdb-int.h @@ -53,6 +53,24 @@ void trackdb_abort_transaction(DB_TXN *tid); void trackdb_commit_transaction(DB_TXN *tid); /* begin, abort or commit a transaction */ +/** @brief Evaluate @p expr in a transaction, looping on deadlock + * + * @c tid will be the transaction handle. @p e will be the error code. + */ +#define WITH_TRANSACTION(expr) do { \ + DB_TXN *tid; \ + \ + tid = trackdb_begin_transaction(); \ + while((e = (expr)) == DB_LOCK_DEADLOCK) { \ + trackdb_abort_transaction(tid); \ + tid = trackdb_begin_transaction(); \ + } \ + if(e) \ + trackdb_abort_transaction(tid); \ + else \ + trackdb_commit_transaction(tid); \ +} while(0) + int trackdb_getdata(DB *db, const char *track, struct kvp **kp,