… | |
… | |
714 | |
714 | |
715 | return count; |
715 | return count; |
716 | } |
716 | } |
717 | |
717 | |
718 | /*****************************************************************************/ |
718 | /*****************************************************************************/ |
|
|
719 | |
|
|
720 | static void |
|
|
721 | bdb_request (bdb_req req) |
|
|
722 | { |
|
|
723 | switch (req->type) |
|
|
724 | { |
|
|
725 | case REQ_ENV_OPEN: |
|
|
726 | req->result = req->env->open (req->env, req->buf1, req->uint1, req->int1); |
|
|
727 | break; |
|
|
728 | |
|
|
729 | case REQ_ENV_CLOSE: |
|
|
730 | req->result = req->env->close (req->env, req->uint1); |
|
|
731 | break; |
|
|
732 | |
|
|
733 | case REQ_ENV_TXN_CHECKPOINT: |
|
|
734 | req->result = req->env->txn_checkpoint (req->env, req->uint1, req->int1, req->uint2); |
|
|
735 | break; |
|
|
736 | |
|
|
737 | case REQ_ENV_LOCK_DETECT: |
|
|
738 | req->result = req->env->lock_detect (req->env, req->uint1, req->uint2, &req->int1); |
|
|
739 | break; |
|
|
740 | |
|
|
741 | case REQ_ENV_MEMP_SYNC: |
|
|
742 | req->result = req->env->memp_sync (req->env, 0); |
|
|
743 | break; |
|
|
744 | |
|
|
745 | case REQ_ENV_MEMP_TRICKLE: |
|
|
746 | req->result = req->env->memp_trickle (req->env, req->int1, &req->int2); |
|
|
747 | break; |
|
|
748 | |
|
|
749 | case REQ_ENV_DBREMOVE: |
|
|
750 | req->result = req->env->dbremove (req->env, req->txn, req->buf1, req->buf2, req->uint1); |
|
|
751 | break; |
|
|
752 | |
|
|
753 | case REQ_ENV_DBRENAME: |
|
|
754 | req->result = req->env->dbrename (req->env, req->txn, req->buf1, req->buf2, req->buf3, req->uint1); |
|
|
755 | break; |
|
|
756 | |
|
|
757 | case REQ_DB_OPEN: |
|
|
758 | req->result = req->db->open (req->db, req->txn, req->buf1, req->buf2, req->int1, req->uint1, req->int2); |
|
|
759 | break; |
|
|
760 | |
|
|
761 | case REQ_DB_CLOSE: |
|
|
762 | req->result = req->db->close (req->db, req->uint1); |
|
|
763 | break; |
|
|
764 | |
|
|
765 | #if DB_VERSION_MINOR >= 4 |
|
|
766 | case REQ_DB_COMPACT: |
|
|
767 | req->result = req->db->compact (req->db, req->txn, &req->dbt1, &req->dbt2, 0, req->uint1, 0); |
|
|
768 | break; |
|
|
769 | #endif |
|
|
770 | |
|
|
771 | case REQ_DB_SYNC: |
|
|
772 | req->result = req->db->sync (req->db, req->uint1); |
|
|
773 | break; |
|
|
774 | |
|
|
775 | case REQ_DB_UPGRADE: |
|
|
776 | req->result = req->db->upgrade (req->db, req->buf1, req->uint1); |
|
|
777 | break; |
|
|
778 | |
|
|
779 | case REQ_DB_PUT: |
|
|
780 | req->result = req->db->put (req->db, req->txn, &req->dbt1, &req->dbt2, req->uint1); |
|
|
781 | break; |
|
|
782 | |
|
|
783 | #if DB_VERSION_MINOR >= 6 |
|
|
784 | case REQ_DB_EXISTS: |
|
|
785 | req->result = req->db->exists (req->db, req->txn, &req->dbt1, req->uint1); |
|
|
786 | break; |
|
|
787 | #endif |
|
|
788 | case REQ_DB_GET: |
|
|
789 | req->result = req->db->get (req->db, req->txn, &req->dbt1, &req->dbt3, req->uint1); |
|
|
790 | break; |
|
|
791 | |
|
|
792 | case REQ_DB_PGET: |
|
|
793 | req->result = req->db->pget (req->db, req->txn, &req->dbt1, &req->dbt2, &req->dbt3, req->uint1); |
|
|
794 | break; |
|
|
795 | |
|
|
796 | case REQ_DB_DEL: |
|
|
797 | req->result = req->db->del (req->db, req->txn, &req->dbt1, req->uint1); |
|
|
798 | break; |
|
|
799 | |
|
|
800 | case REQ_DB_KEY_RANGE: |
|
|
801 | req->result = req->db->key_range (req->db, req->txn, &req->dbt1, &req->key_range, req->uint1); |
|
|
802 | break; |
|
|
803 | |
|
|
804 | case REQ_TXN_COMMIT: |
|
|
805 | req->result = req->txn->commit (req->txn, req->uint1); |
|
|
806 | break; |
|
|
807 | |
|
|
808 | case REQ_TXN_ABORT: |
|
|
809 | req->result = req->txn->abort (req->txn); |
|
|
810 | break; |
|
|
811 | |
|
|
812 | case REQ_TXN_FINISH: |
|
|
813 | if (req->txn->flags & TXN_DEADLOCK) |
|
|
814 | { |
|
|
815 | req->result = req->txn->abort (req->txn); |
|
|
816 | if (!req->result) |
|
|
817 | req->result = DB_LOCK_DEADLOCK; |
|
|
818 | } |
|
|
819 | else |
|
|
820 | req->result = req->txn->commit (req->txn, req->uint1); |
|
|
821 | break; |
|
|
822 | |
|
|
823 | case REQ_C_CLOSE: |
|
|
824 | req->result = req->dbc->c_close (req->dbc); |
|
|
825 | break; |
|
|
826 | |
|
|
827 | case REQ_C_COUNT: |
|
|
828 | { |
|
|
829 | db_recno_t recno; |
|
|
830 | req->result = req->dbc->c_count (req->dbc, &recno, req->uint1); |
|
|
831 | req->uv1 = recno; |
|
|
832 | } |
|
|
833 | break; |
|
|
834 | |
|
|
835 | case REQ_C_PUT: |
|
|
836 | req->result = req->dbc->c_put (req->dbc, &req->dbt1, &req->dbt2, req->uint1); |
|
|
837 | break; |
|
|
838 | |
|
|
839 | case REQ_C_GET: |
|
|
840 | req->result = req->dbc->c_get (req->dbc, &req->dbt1, &req->dbt3, req->uint1); |
|
|
841 | break; |
|
|
842 | |
|
|
843 | case REQ_C_PGET: |
|
|
844 | req->result = req->dbc->c_pget (req->dbc, &req->dbt1, &req->dbt2, &req->dbt3, req->uint1); |
|
|
845 | break; |
|
|
846 | |
|
|
847 | case REQ_C_DEL: |
|
|
848 | req->result = req->dbc->c_del (req->dbc, req->uint1); |
|
|
849 | break; |
|
|
850 | |
|
|
851 | #if DB_VERSION_MINOR >= 3 |
|
|
852 | case REQ_SEQ_OPEN: |
|
|
853 | req->result = req->seq->open (req->seq, req->txn, &req->dbt1, req->uint1); |
|
|
854 | break; |
|
|
855 | |
|
|
856 | case REQ_SEQ_CLOSE: |
|
|
857 | req->result = req->seq->close (req->seq, req->uint1); |
|
|
858 | break; |
|
|
859 | |
|
|
860 | case REQ_SEQ_GET: |
|
|
861 | req->result = req->seq->get (req->seq, req->txn, req->int1, &req->seq_t, req->uint1); |
|
|
862 | break; |
|
|
863 | |
|
|
864 | case REQ_SEQ_REMOVE: |
|
|
865 | req->result = req->seq->remove (req->seq, req->txn, req->uint1); |
|
|
866 | break; |
|
|
867 | #endif |
|
|
868 | |
|
|
869 | default: |
|
|
870 | req->result = ENOSYS; |
|
|
871 | break; |
|
|
872 | } |
|
|
873 | |
|
|
874 | if (req->txn && (req->result > 0 || req->result == DB_LOCK_NOTGRANTED)) |
|
|
875 | req->txn->flags |= TXN_DEADLOCK; |
|
|
876 | } |
719 | |
877 | |
720 | X_THREAD_PROC (bdb_proc) |
878 | X_THREAD_PROC (bdb_proc) |
721 | { |
879 | { |
722 | bdb_req req; |
880 | bdb_req req; |
723 | struct timespec ts; |
881 | struct timespec ts; |
… | |
… | |
764 | |
922 | |
765 | --nready; |
923 | --nready; |
766 | |
924 | |
767 | X_UNLOCK (reqlock); |
925 | X_UNLOCK (reqlock); |
768 | |
926 | |
769 | switch (req->type) |
927 | if (req->type == REQ_QUIT) |
770 | { |
|
|
771 | case REQ_QUIT: |
|
|
772 | req->result = ENOSYS; |
|
|
773 | goto quit; |
928 | goto quit; |
774 | |
929 | |
775 | case REQ_ENV_OPEN: |
930 | bdb_request (req); |
776 | req->result = req->env->open (req->env, req->buf1, req->uint1, req->int1); |
|
|
777 | break; |
|
|
778 | |
|
|
779 | case REQ_ENV_CLOSE: |
|
|
780 | req->result = req->env->close (req->env, req->uint1); |
|
|
781 | break; |
|
|
782 | |
|
|
783 | case REQ_ENV_TXN_CHECKPOINT: |
|
|
784 | req->result = req->env->txn_checkpoint (req->env, req->uint1, req->int1, req->uint2); |
|
|
785 | break; |
|
|
786 | |
|
|
787 | case REQ_ENV_LOCK_DETECT: |
|
|
788 | req->result = req->env->lock_detect (req->env, req->uint1, req->uint2, &req->int1); |
|
|
789 | break; |
|
|
790 | |
|
|
791 | case REQ_ENV_MEMP_SYNC: |
|
|
792 | req->result = req->env->memp_sync (req->env, 0); |
|
|
793 | break; |
|
|
794 | |
|
|
795 | case REQ_ENV_MEMP_TRICKLE: |
|
|
796 | req->result = req->env->memp_trickle (req->env, req->int1, &req->int2); |
|
|
797 | break; |
|
|
798 | |
|
|
799 | case REQ_ENV_DBREMOVE: |
|
|
800 | req->result = req->env->dbremove (req->env, req->txn, req->buf1, req->buf2, req->uint1); |
|
|
801 | break; |
|
|
802 | |
|
|
803 | case REQ_ENV_DBRENAME: |
|
|
804 | req->result = req->env->dbrename (req->env, req->txn, req->buf1, req->buf2, req->buf3, req->uint1); |
|
|
805 | break; |
|
|
806 | |
|
|
807 | case REQ_DB_OPEN: |
|
|
808 | req->result = req->db->open (req->db, req->txn, req->buf1, req->buf2, req->int1, req->uint1, req->int2); |
|
|
809 | break; |
|
|
810 | |
|
|
811 | case REQ_DB_CLOSE: |
|
|
812 | req->result = req->db->close (req->db, req->uint1); |
|
|
813 | break; |
|
|
814 | |
|
|
815 | #if DB_VERSION_MINOR >= 4 |
|
|
816 | case REQ_DB_COMPACT: |
|
|
817 | req->result = req->db->compact (req->db, req->txn, &req->dbt1, &req->dbt2, 0, req->uint1, 0); |
|
|
818 | break; |
|
|
819 | #endif |
|
|
820 | |
|
|
821 | case REQ_DB_SYNC: |
|
|
822 | req->result = req->db->sync (req->db, req->uint1); |
|
|
823 | break; |
|
|
824 | |
|
|
825 | case REQ_DB_UPGRADE: |
|
|
826 | req->result = req->db->upgrade (req->db, req->buf1, req->uint1); |
|
|
827 | break; |
|
|
828 | |
|
|
829 | case REQ_DB_PUT: |
|
|
830 | req->result = req->db->put (req->db, req->txn, &req->dbt1, &req->dbt2, req->uint1); |
|
|
831 | break; |
|
|
832 | |
|
|
833 | #if DB_VERSION_MINOR >= 6 |
|
|
834 | case REQ_DB_EXISTS: |
|
|
835 | req->result = req->db->exists (req->db, req->txn, &req->dbt1, req->uint1); |
|
|
836 | break; |
|
|
837 | #endif |
|
|
838 | case REQ_DB_GET: |
|
|
839 | req->result = req->db->get (req->db, req->txn, &req->dbt1, &req->dbt3, req->uint1); |
|
|
840 | break; |
|
|
841 | |
|
|
842 | case REQ_DB_PGET: |
|
|
843 | req->result = req->db->pget (req->db, req->txn, &req->dbt1, &req->dbt2, &req->dbt3, req->uint1); |
|
|
844 | break; |
|
|
845 | |
|
|
846 | case REQ_DB_DEL: |
|
|
847 | req->result = req->db->del (req->db, req->txn, &req->dbt1, req->uint1); |
|
|
848 | break; |
|
|
849 | |
|
|
850 | case REQ_DB_KEY_RANGE: |
|
|
851 | req->result = req->db->key_range (req->db, req->txn, &req->dbt1, &req->key_range, req->uint1); |
|
|
852 | break; |
|
|
853 | |
|
|
854 | case REQ_TXN_COMMIT: |
|
|
855 | req->result = req->txn->commit (req->txn, req->uint1); |
|
|
856 | break; |
|
|
857 | |
|
|
858 | case REQ_TXN_ABORT: |
|
|
859 | req->result = req->txn->abort (req->txn); |
|
|
860 | break; |
|
|
861 | |
|
|
862 | case REQ_TXN_FINISH: |
|
|
863 | if (req->txn->flags & TXN_DEADLOCK) |
|
|
864 | { |
|
|
865 | req->result = req->txn->abort (req->txn); |
|
|
866 | if (!req->result) |
|
|
867 | req->result = DB_LOCK_DEADLOCK; |
|
|
868 | } |
|
|
869 | else |
|
|
870 | req->result = req->txn->commit (req->txn, req->uint1); |
|
|
871 | break; |
|
|
872 | |
|
|
873 | case REQ_C_CLOSE: |
|
|
874 | req->result = req->dbc->c_close (req->dbc); |
|
|
875 | break; |
|
|
876 | |
|
|
877 | case REQ_C_COUNT: |
|
|
878 | { |
|
|
879 | db_recno_t recno; |
|
|
880 | req->result = req->dbc->c_count (req->dbc, &recno, req->uint1); |
|
|
881 | req->uv1 = recno; |
|
|
882 | } |
|
|
883 | break; |
|
|
884 | |
|
|
885 | case REQ_C_PUT: |
|
|
886 | req->result = req->dbc->c_put (req->dbc, &req->dbt1, &req->dbt2, req->uint1); |
|
|
887 | break; |
|
|
888 | |
|
|
889 | case REQ_C_GET: |
|
|
890 | req->result = req->dbc->c_get (req->dbc, &req->dbt1, &req->dbt3, req->uint1); |
|
|
891 | break; |
|
|
892 | |
|
|
893 | case REQ_C_PGET: |
|
|
894 | req->result = req->dbc->c_pget (req->dbc, &req->dbt1, &req->dbt2, &req->dbt3, req->uint1); |
|
|
895 | break; |
|
|
896 | |
|
|
897 | case REQ_C_DEL: |
|
|
898 | req->result = req->dbc->c_del (req->dbc, req->uint1); |
|
|
899 | break; |
|
|
900 | |
|
|
901 | #if DB_VERSION_MINOR >= 3 |
|
|
902 | case REQ_SEQ_OPEN: |
|
|
903 | req->result = req->seq->open (req->seq, req->txn, &req->dbt1, req->uint1); |
|
|
904 | break; |
|
|
905 | |
|
|
906 | case REQ_SEQ_CLOSE: |
|
|
907 | req->result = req->seq->close (req->seq, req->uint1); |
|
|
908 | break; |
|
|
909 | |
|
|
910 | case REQ_SEQ_GET: |
|
|
911 | req->result = req->seq->get (req->seq, req->txn, req->int1, &req->seq_t, req->uint1); |
|
|
912 | break; |
|
|
913 | |
|
|
914 | case REQ_SEQ_REMOVE: |
|
|
915 | req->result = req->seq->remove (req->seq, req->txn, req->uint1); |
|
|
916 | break; |
|
|
917 | #endif |
|
|
918 | |
|
|
919 | default: |
|
|
920 | req->result = ENOSYS; |
|
|
921 | break; |
|
|
922 | } |
|
|
923 | |
|
|
924 | if (req->txn && (req->result > 0 || req->result == DB_LOCK_NOTGRANTED)) |
|
|
925 | req->txn->flags |= TXN_DEADLOCK; |
|
|
926 | |
931 | |
927 | X_LOCK (reslock); |
932 | X_LOCK (reslock); |
928 | |
933 | |
929 | ++npending; |
934 | ++npending; |
930 | |
935 | |