--- BDB/BDB.xs 2008/09/25 13:22:32 1.50 +++ BDB/BDB.xs 2008/09/25 13:28:37 1.51 @@ -717,6 +717,164 @@ /*****************************************************************************/ +static void +bdb_request (bdb_req req) +{ + switch (req->type) + { + case REQ_ENV_OPEN: + req->result = req->env->open (req->env, req->buf1, req->uint1, req->int1); + break; + + case REQ_ENV_CLOSE: + req->result = req->env->close (req->env, req->uint1); + break; + + case REQ_ENV_TXN_CHECKPOINT: + req->result = req->env->txn_checkpoint (req->env, req->uint1, req->int1, req->uint2); + break; + + case REQ_ENV_LOCK_DETECT: + req->result = req->env->lock_detect (req->env, req->uint1, req->uint2, &req->int1); + break; + + case REQ_ENV_MEMP_SYNC: + req->result = req->env->memp_sync (req->env, 0); + break; + + case REQ_ENV_MEMP_TRICKLE: + req->result = req->env->memp_trickle (req->env, req->int1, &req->int2); + break; + + case REQ_ENV_DBREMOVE: + req->result = req->env->dbremove (req->env, req->txn, req->buf1, req->buf2, req->uint1); + break; + + case REQ_ENV_DBRENAME: + req->result = req->env->dbrename (req->env, req->txn, req->buf1, req->buf2, req->buf3, req->uint1); + break; + + case REQ_DB_OPEN: + req->result = req->db->open (req->db, req->txn, req->buf1, req->buf2, req->int1, req->uint1, req->int2); + break; + + case REQ_DB_CLOSE: + req->result = req->db->close (req->db, req->uint1); + break; + +#if DB_VERSION_MINOR >= 4 + case REQ_DB_COMPACT: + req->result = req->db->compact (req->db, req->txn, &req->dbt1, &req->dbt2, 0, req->uint1, 0); + break; +#endif + + case REQ_DB_SYNC: + req->result = req->db->sync (req->db, req->uint1); + break; + + case REQ_DB_UPGRADE: + req->result = req->db->upgrade (req->db, req->buf1, req->uint1); + break; + + case REQ_DB_PUT: + req->result = req->db->put (req->db, req->txn, &req->dbt1, &req->dbt2, req->uint1); + break; + +#if DB_VERSION_MINOR >= 6 + case REQ_DB_EXISTS: + req->result = req->db->exists (req->db, req->txn, &req->dbt1, req->uint1); + break; +#endif + case REQ_DB_GET: + req->result = req->db->get (req->db, req->txn, &req->dbt1, &req->dbt3, req->uint1); + break; + + case REQ_DB_PGET: + req->result = req->db->pget (req->db, req->txn, &req->dbt1, &req->dbt2, &req->dbt3, req->uint1); + break; + + case REQ_DB_DEL: + req->result = req->db->del (req->db, req->txn, &req->dbt1, req->uint1); + break; + + case REQ_DB_KEY_RANGE: + req->result = req->db->key_range (req->db, req->txn, &req->dbt1, &req->key_range, req->uint1); + break; + + case REQ_TXN_COMMIT: + req->result = req->txn->commit (req->txn, req->uint1); + break; + + case REQ_TXN_ABORT: + req->result = req->txn->abort (req->txn); + break; + + case REQ_TXN_FINISH: + if (req->txn->flags & TXN_DEADLOCK) + { + req->result = req->txn->abort (req->txn); + if (!req->result) + req->result = DB_LOCK_DEADLOCK; + } + else + req->result = req->txn->commit (req->txn, req->uint1); + break; + + case REQ_C_CLOSE: + req->result = req->dbc->c_close (req->dbc); + break; + + case REQ_C_COUNT: + { + db_recno_t recno; + req->result = req->dbc->c_count (req->dbc, &recno, req->uint1); + req->uv1 = recno; + } + break; + + case REQ_C_PUT: + req->result = req->dbc->c_put (req->dbc, &req->dbt1, &req->dbt2, req->uint1); + break; + + case REQ_C_GET: + req->result = req->dbc->c_get (req->dbc, &req->dbt1, &req->dbt3, req->uint1); + break; + + case REQ_C_PGET: + req->result = req->dbc->c_pget (req->dbc, &req->dbt1, &req->dbt2, &req->dbt3, req->uint1); + break; + + case REQ_C_DEL: + req->result = req->dbc->c_del (req->dbc, req->uint1); + break; + +#if DB_VERSION_MINOR >= 3 + case REQ_SEQ_OPEN: + req->result = req->seq->open (req->seq, req->txn, &req->dbt1, req->uint1); + break; + + case REQ_SEQ_CLOSE: + req->result = req->seq->close (req->seq, req->uint1); + break; + + case REQ_SEQ_GET: + req->result = req->seq->get (req->seq, req->txn, req->int1, &req->seq_t, req->uint1); + break; + + case REQ_SEQ_REMOVE: + req->result = req->seq->remove (req->seq, req->txn, req->uint1); + break; +#endif + + default: + req->result = ENOSYS; + break; + } + + if (req->txn && (req->result > 0 || req->result == DB_LOCK_NOTGRANTED)) + req->txn->flags |= TXN_DEADLOCK; +} + X_THREAD_PROC (bdb_proc) { bdb_req req; @@ -766,163 +924,10 @@ X_UNLOCK (reqlock); - switch (req->type) - { - case REQ_QUIT: - req->result = ENOSYS; - goto quit; - - case REQ_ENV_OPEN: - req->result = req->env->open (req->env, req->buf1, req->uint1, req->int1); - break; - - case REQ_ENV_CLOSE: - req->result = req->env->close (req->env, req->uint1); - break; - - case REQ_ENV_TXN_CHECKPOINT: - req->result = req->env->txn_checkpoint (req->env, req->uint1, req->int1, req->uint2); - break; - - case REQ_ENV_LOCK_DETECT: - req->result = req->env->lock_detect (req->env, req->uint1, req->uint2, &req->int1); - break; - - case REQ_ENV_MEMP_SYNC: - req->result = req->env->memp_sync (req->env, 0); - break; - - case REQ_ENV_MEMP_TRICKLE: - req->result = req->env->memp_trickle (req->env, req->int1, &req->int2); - break; - - case REQ_ENV_DBREMOVE: - req->result = req->env->dbremove (req->env, req->txn, req->buf1, req->buf2, req->uint1); - break; - - case REQ_ENV_DBRENAME: - req->result = req->env->dbrename (req->env, req->txn, req->buf1, req->buf2, req->buf3, req->uint1); - break; - - case REQ_DB_OPEN: - req->result = req->db->open (req->db, req->txn, req->buf1, req->buf2, req->int1, req->uint1, req->int2); - break; - - case REQ_DB_CLOSE: - req->result = req->db->close (req->db, req->uint1); - break; - -#if DB_VERSION_MINOR >= 4 - case REQ_DB_COMPACT: - req->result = req->db->compact (req->db, req->txn, &req->dbt1, &req->dbt2, 0, req->uint1, 0); - break; -#endif - - case REQ_DB_SYNC: - req->result = req->db->sync (req->db, req->uint1); - break; - - case REQ_DB_UPGRADE: - req->result = req->db->upgrade (req->db, req->buf1, req->uint1); - break; - - case REQ_DB_PUT: - req->result = req->db->put (req->db, req->txn, &req->dbt1, &req->dbt2, req->uint1); - break; - -#if DB_VERSION_MINOR >= 6 - case REQ_DB_EXISTS: - req->result = req->db->exists (req->db, req->txn, &req->dbt1, req->uint1); - break; -#endif - case REQ_DB_GET: - req->result = req->db->get (req->db, req->txn, &req->dbt1, &req->dbt3, req->uint1); - break; - - case REQ_DB_PGET: - req->result = req->db->pget (req->db, req->txn, &req->dbt1, &req->dbt2, &req->dbt3, req->uint1); - break; - - case REQ_DB_DEL: - req->result = req->db->del (req->db, req->txn, &req->dbt1, req->uint1); - break; - - case REQ_DB_KEY_RANGE: - req->result = req->db->key_range (req->db, req->txn, &req->dbt1, &req->key_range, req->uint1); - break; - - case REQ_TXN_COMMIT: - req->result = req->txn->commit (req->txn, req->uint1); - break; - - case REQ_TXN_ABORT: - req->result = req->txn->abort (req->txn); - break; - - case REQ_TXN_FINISH: - if (req->txn->flags & TXN_DEADLOCK) - { - req->result = req->txn->abort (req->txn); - if (!req->result) - req->result = DB_LOCK_DEADLOCK; - } - else - req->result = req->txn->commit (req->txn, req->uint1); - break; - - case REQ_C_CLOSE: - req->result = req->dbc->c_close (req->dbc); - break; - - case REQ_C_COUNT: - { - db_recno_t recno; - req->result = req->dbc->c_count (req->dbc, &recno, req->uint1); - req->uv1 = recno; - } - break; - - case REQ_C_PUT: - req->result = req->dbc->c_put (req->dbc, &req->dbt1, &req->dbt2, req->uint1); - break; - - case REQ_C_GET: - req->result = req->dbc->c_get (req->dbc, &req->dbt1, &req->dbt3, req->uint1); - break; - - case REQ_C_PGET: - req->result = req->dbc->c_pget (req->dbc, &req->dbt1, &req->dbt2, &req->dbt3, req->uint1); - break; - - case REQ_C_DEL: - req->result = req->dbc->c_del (req->dbc, req->uint1); - break; - -#if DB_VERSION_MINOR >= 3 - case REQ_SEQ_OPEN: - req->result = req->seq->open (req->seq, req->txn, &req->dbt1, req->uint1); - break; - - case REQ_SEQ_CLOSE: - req->result = req->seq->close (req->seq, req->uint1); - break; - - case REQ_SEQ_GET: - req->result = req->seq->get (req->seq, req->txn, req->int1, &req->seq_t, req->uint1); - break; - - case REQ_SEQ_REMOVE: - req->result = req->seq->remove (req->seq, req->txn, req->uint1); - break; -#endif - - default: - req->result = ENOSYS; - break; - } + if (req->type == REQ_QUIT) + goto quit; - if (req->txn && (req->result > 0 || req->result == DB_LOCK_NOTGRANTED)) - req->txn->flags |= TXN_DEADLOCK; + bdb_request (req); X_LOCK (reslock);