#define FAKE_TRY_DB_OP(op) do { \ fakevfs_fprintf(stderr, "FAKE_TRY_DB_OP(%s)\n", #op); \ db_status = (op); \ switch (db_status) { \ case DB_RUNRECOVERY: return FAKEVFS_ABORT; \ case DB_LOCK_NOTGRANTED: case DB_LOCK_DEADLOCK: return FAKEVFS_RETRY; \ default: break; \ } \ } while (0) #define FAKE_TRY_OPEN_OP(pointer, operation) do { \ fakevfs_fprintf(stderr, "FAKE_TRY_OPEN_OP(%s, %s)\n", #pointer, #operation); \ if (!(pointer)) { \ FAKE_TRY_DB_OP(operation); \ } \ } while (0) #define FAKE_TRY_CLOSE_OP1(type, pointer, operation) do { \ fakevfs_fprintf(stderr, "FAKE_TRY_CLOSE_OP1(%s, %s, %s)\n", #type, #pointer, #operation); \ if (pointer) { \ type *temp_pointer = (pointer); \ (pointer) = 0; \ FAKE_TRY_DB_OP(operation(temp_pointer)); \ } \ } while (0) #define FAKE_TRY_CLOSE_OP2(type, pointer, operation, arg2) do { \ fakevfs_fprintf(stderr, "FAKE_TRY_CLOSE_OP2(%s, %s, %s, %s)\n", #type, #pointer, #operation, #arg2); \ if (pointer) { \ type *temp_pointer = (pointer); \ (pointer) = 0; \ FAKE_TRY_DB_OP(operation(temp_pointer, arg2)); \ } \ } while (0) #define FAKE_TRY_CURSOR_CLOSE(cursor) FAKE_TRY_CLOSE_OP1(DBC, cursor, temp_pointer->c_close) #define FAKE_TRY_DB_CLOSE(db) FAKE_TRY_CLOSE_OP2(DB, db, temp_pointer->close, 0) #define FAKE_TRY_ENV_CLOSE(env) FAKE_TRY_CLOSE_OP2(DB_ENV, env, temp_pointer->close, 0) #define FAKE_TRY_TXN_BEGIN(env, txn_pointer, txn_flags) FAKE_TRY_OPEN_OP(txn_pointer, txn_begin(env, 0, &txn_pointer, txn_flags)) #define FAKE_TRY_TXN_ABORT(txn_pointer) FAKE_TRY_CLOSE_OP1(DB_TXN, txn_pointer, txn_abort) #define FAKE_TRY_TXN_COMMIT(txn_pointer, txn_flags) FAKE_TRY_CLOSE_OP2(DB_TXN, txn_pointer, txn_commit, txn_flags) #define FAKE_TRY_CURSOR_OPEN(db_pointer, txn_pointer, cursor_pointer, flags) \ FAKE_TRY_OPEN_OP(cursor_pointer, db_pointer->cursor(db_pointer, txn_pointer, &cursor_pointer, flags)) #define FAKE_TRY_DB_OPEN(db_pointer, env_pointer, db_name, db_type, db_flags) do { \ FAKE_TRY_OPEN_OP(db_pointer, db_create(&db_pointer, env_pointer, 0)); \ assert(db_pointer); \ FAKE_TRY_DB_OP(db_pointer->set_flags(db_pointer, db_flags)); \ FAKE_TRY_DB_OP(db_pointer->open(db_pointer, db_name, 0, db_type, DB_CREATE | DB_THREAD, 0)); \ } while (0)