From 0d8c749bf2435f39e11e1548b83877b592262f6e Mon Sep 17 00:00:00 2001 From: Christos Vontas Date: Mon, 8 Jan 2018 17:14:02 +0000 Subject: [PATCH 1/5] added *Names cowlist to store names for each struct --- compaction_filter.go | 4 +++- comparator.go | 4 +++- filter_policy.go | 4 +++- merge_operator.go | 4 +++- slice_transform.go | 4 +++- 5 files changed, 15 insertions(+), 5 deletions(-) diff --git a/compaction_filter.go b/compaction_filter.go index 43e9617b..8c0f04e1 100644 --- a/compaction_filter.go +++ b/compaction_filter.go @@ -41,8 +41,10 @@ func (c nativeCompactionFilter) Name() string { return "" } // Hold references to compaction filters. var compactionFilters = NewCOWList() +var compactionFilterNames = NewCOWList() func registerCompactionFilter(filter CompactionFilter) int { + compactionFilterNames.Append(C.CString(filter.Name())) return compactionFilters.Append(filter) } @@ -64,5 +66,5 @@ func gorocksdb_compactionfilter_filter(idx int, cLevel C.int, cKey *C.char, cKey //export gorocksdb_compactionfilter_name func gorocksdb_compactionfilter_name(idx int) *C.char { - return stringToChar(compactionFilters.Get(idx).(CompactionFilter).Name()) + return compactionFilterNames.Get(idx).(*C.char) } diff --git a/comparator.go b/comparator.go index 9e30c1fb..6b8d59e1 100644 --- a/comparator.go +++ b/comparator.go @@ -30,8 +30,10 @@ func (c nativeComparator) Name() string { return "" } // Hold references to comperators. var comperators = NewCOWList() +var comperatorNames = NewCOWList() func registerComperator(cmp Comparator) int { + comperatorNames.Append(C.CString(cmp.Name())) return comperators.Append(cmp) } @@ -44,5 +46,5 @@ func gorocksdb_comparator_compare(idx int, cKeyA *C.char, cKeyALen C.size_t, cKe //export gorocksdb_comparator_name func gorocksdb_comparator_name(idx int) *C.char { - return stringToChar(comperators.Get(idx).(Comparator).Name()) + return comperatorNames.Get(idx).(*C.char) } diff --git a/filter_policy.go b/filter_policy.go index 71e74e89..db4c5122 100644 --- a/filter_policy.go +++ b/filter_policy.go @@ -51,8 +51,10 @@ func NewBloomFilter(bitsPerKey int) FilterPolicy { // Hold references to filter policies. var filterPolicies = NewCOWList() +var filterPolicyNames = NewCOWList() func registerFilterPolicy(fp FilterPolicy) int { + filterPolicyNames.Append(C.CString(fp.Name())) return filterPolicies.Append(fp) } @@ -79,5 +81,5 @@ func gorocksdb_filterpolicy_key_may_match(idx int, cKey *C.char, cKeyLen C.size_ //export gorocksdb_filterpolicy_name func gorocksdb_filterpolicy_name(idx int) *C.char { - return stringToChar(filterPolicies.Get(idx).(FilterPolicy).Name()) + return filterPolicyNames.Get(idx).(*C.char) } diff --git a/merge_operator.go b/merge_operator.go index cbf66da5..f0bc33db 100644 --- a/merge_operator.go +++ b/merge_operator.go @@ -66,8 +66,10 @@ func (mo nativeMergeOperator) Name() string { return "" } // Hold references to merge operators. var mergeOperators = NewCOWList() +var mergeOperatorNames = NewCOWList() func registerMergeOperator(merger MergeOperator) int { + mergeOperatorNames.Append(C.CString(merger.Name())) return mergeOperators.Append(merger) } @@ -123,5 +125,5 @@ func gorocksdb_mergeoperator_partial_merge_multi(idx int, cKey *C.char, cKeyLen //export gorocksdb_mergeoperator_name func gorocksdb_mergeoperator_name(idx int) *C.char { - return stringToChar(mergeOperators.Get(idx).(MergeOperator).Name()) + return mergeOperatorNames.Get(idx).(*C.char) } diff --git a/slice_transform.go b/slice_transform.go index 0505df2a..bc228cfc 100644 --- a/slice_transform.go +++ b/slice_transform.go @@ -39,8 +39,10 @@ func (st nativeSliceTransform) Name() string { return "" } // Hold references to slice transforms. var sliceTransforms = NewCOWList() +var sliceTransformNames = NewCOWList() func registerSliceTransform(st SliceTransform) int { + sliceTransformNames.Append(C.CString(st.Name())) return sliceTransforms.Append(st) } @@ -68,5 +70,5 @@ func gorocksdb_slicetransform_in_range(idx int, cKey *C.char, cKeyLen C.size_t) //export gorocksdb_slicetransform_name func gorocksdb_slicetransform_name(idx int) *C.char { - return stringToChar(sliceTransforms.Get(idx).(SliceTransform).Name()) + return sliceTransformNames.Get(idx).(*C.char) } From 24910f46c473aea73adce1bf4ceff90f7f3d1823 Mon Sep 17 00:00:00 2001 From: Christos Vontas Date: Mon, 8 Jan 2018 17:14:57 +0000 Subject: [PATCH 2/5] cleanup --- util.go | 6 ------ 1 file changed, 6 deletions(-) diff --git a/util.go b/util.go index 9c373306..236f3fea 100644 --- a/util.go +++ b/util.go @@ -51,12 +51,6 @@ func cByteSlice(b []byte) *C.char { return c } -// stringToChar returns *C.char from string. -func stringToChar(s string) *C.char { - ptrStr := (*reflect.StringHeader)(unsafe.Pointer(&s)) - return (*C.char)(unsafe.Pointer(ptrStr.Data)) -} - // charSlice converts a C array of *char to a []*C.char. func charSlice(data **C.char, len C.int) []*C.char { var value []*C.char From 98d77d97f007b58a4bfdb27c05d906e2e5dac50d Mon Sep 17 00:00:00 2001 From: Christos Vontas Date: Mon, 8 Jan 2018 17:35:19 +0000 Subject: [PATCH 3/5] added test for two lists with same lifecycle --- cow_test.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/cow_test.go b/cow_test.go index 2af9aa56..dd75e23b 100644 --- a/cow_test.go +++ b/cow_test.go @@ -18,6 +18,16 @@ func TestCOWList(t *testing.T) { ensure.DeepEqual(t, cl.Get(2), "!") } +func TestTwoCOWLists(t *testing.T) { + clo := NewCOWList() + clname := NewCOWList() + + clname.Append("hello") + idx := clo.Append("hello") + + ensure.DeepEqual(t, clo.Get(idx), clname.Get(idx)) +} + func TestCOWListMT(t *testing.T) { cl := NewCOWList() expectedRes := make([]int, 3) From a0e6e0f78fa872e3d2f4067ac32a8666408732ee Mon Sep 17 00:00:00 2001 From: Christos Vontas Date: Tue, 9 Jan 2018 11:24:30 +0000 Subject: [PATCH 4/5] Revert "added test for two lists with same lifecycle" This reverts commit 98d77d97f007b58a4bfdb27c05d906e2e5dac50d. --- cow_test.go | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/cow_test.go b/cow_test.go index dd75e23b..2af9aa56 100644 --- a/cow_test.go +++ b/cow_test.go @@ -18,16 +18,6 @@ func TestCOWList(t *testing.T) { ensure.DeepEqual(t, cl.Get(2), "!") } -func TestTwoCOWLists(t *testing.T) { - clo := NewCOWList() - clname := NewCOWList() - - clname.Append("hello") - idx := clo.Append("hello") - - ensure.DeepEqual(t, clo.Get(idx), clname.Get(idx)) -} - func TestCOWListMT(t *testing.T) { cl := NewCOWList() expectedRes := make([]int, 3) From 813bc14f8bc613c6e7c3dd4502ff1dfe36d002a6 Mon Sep 17 00:00:00 2001 From: Christos Vontas Date: Tue, 9 Jan 2018 11:51:43 +0000 Subject: [PATCH 5/5] two lists became one with a wrapper struct --- compaction_filter.go | 13 ++++++++----- comparator.go | 13 ++++++++----- filter_policy.go | 15 +++++++++------ merge_operator.go | 15 +++++++++------ slice_transform.go | 17 ++++++++++------- 5 files changed, 44 insertions(+), 29 deletions(-) diff --git a/compaction_filter.go b/compaction_filter.go index 8c0f04e1..bda27e20 100644 --- a/compaction_filter.go +++ b/compaction_filter.go @@ -41,11 +41,14 @@ func (c nativeCompactionFilter) Name() string { return "" } // Hold references to compaction filters. var compactionFilters = NewCOWList() -var compactionFilterNames = NewCOWList() + +type compactionFilterWrapper struct { + name *C.char + filter CompactionFilter +} func registerCompactionFilter(filter CompactionFilter) int { - compactionFilterNames.Append(C.CString(filter.Name())) - return compactionFilters.Append(filter) + return compactionFilters.Append(compactionFilterWrapper{C.CString(filter.Name()), filter}) } //export gorocksdb_compactionfilter_filter @@ -53,7 +56,7 @@ func gorocksdb_compactionfilter_filter(idx int, cLevel C.int, cKey *C.char, cKey key := charToByte(cKey, cKeyLen) val := charToByte(cVal, cValLen) - remove, newVal := compactionFilters.Get(idx).(CompactionFilter).Filter(int(cLevel), key, val) + remove, newVal := compactionFilters.Get(idx).(compactionFilterWrapper).filter.Filter(int(cLevel), key, val) if remove { return C.int(1) } else if newVal != nil { @@ -66,5 +69,5 @@ func gorocksdb_compactionfilter_filter(idx int, cLevel C.int, cKey *C.char, cKey //export gorocksdb_compactionfilter_name func gorocksdb_compactionfilter_name(idx int) *C.char { - return compactionFilterNames.Get(idx).(*C.char) + return compactionFilters.Get(idx).(compactionFilterWrapper).name } diff --git a/comparator.go b/comparator.go index 6b8d59e1..242771e3 100644 --- a/comparator.go +++ b/comparator.go @@ -30,21 +30,24 @@ func (c nativeComparator) Name() string { return "" } // Hold references to comperators. var comperators = NewCOWList() -var comperatorNames = NewCOWList() + +type comperatorWrapper struct { + name *C.char + comparator Comparator +} func registerComperator(cmp Comparator) int { - comperatorNames.Append(C.CString(cmp.Name())) - return comperators.Append(cmp) + return comperators.Append(comperatorWrapper{C.CString(cmp.Name()), cmp}) } //export gorocksdb_comparator_compare func gorocksdb_comparator_compare(idx int, cKeyA *C.char, cKeyALen C.size_t, cKeyB *C.char, cKeyBLen C.size_t) C.int { keyA := charToByte(cKeyA, cKeyALen) keyB := charToByte(cKeyB, cKeyBLen) - return C.int(comperators.Get(idx).(Comparator).Compare(keyA, keyB)) + return C.int(comperators.Get(idx).(comperatorWrapper).comparator.Compare(keyA, keyB)) } //export gorocksdb_comparator_name func gorocksdb_comparator_name(idx int) *C.char { - return comperatorNames.Get(idx).(*C.char) + return comperators.Get(idx).(comperatorWrapper).name } diff --git a/filter_policy.go b/filter_policy.go index db4c5122..ac57fd99 100644 --- a/filter_policy.go +++ b/filter_policy.go @@ -51,11 +51,14 @@ func NewBloomFilter(bitsPerKey int) FilterPolicy { // Hold references to filter policies. var filterPolicies = NewCOWList() -var filterPolicyNames = NewCOWList() + +type filterPolicyWrapper struct { + name *C.char + filterPolicy FilterPolicy +} func registerFilterPolicy(fp FilterPolicy) int { - filterPolicyNames.Append(C.CString(fp.Name())) - return filterPolicies.Append(fp) + return filterPolicies.Append(filterPolicyWrapper{C.CString(fp.Name()), fp}) } //export gorocksdb_filterpolicy_create_filter @@ -67,7 +70,7 @@ func gorocksdb_filterpolicy_create_filter(idx int, cKeys **C.char, cKeysLen *C.s keys[i] = charToByte(rawKeys[i], len) } - dst := filterPolicies.Get(idx).(FilterPolicy).CreateFilter(keys) + dst := filterPolicies.Get(idx).(filterPolicyWrapper).filterPolicy.CreateFilter(keys) *cDstLen = C.size_t(len(dst)) return cByteSlice(dst) } @@ -76,10 +79,10 @@ func gorocksdb_filterpolicy_create_filter(idx int, cKeys **C.char, cKeysLen *C.s func gorocksdb_filterpolicy_key_may_match(idx int, cKey *C.char, cKeyLen C.size_t, cFilter *C.char, cFilterLen C.size_t) C.uchar { key := charToByte(cKey, cKeyLen) filter := charToByte(cFilter, cFilterLen) - return boolToChar(filterPolicies.Get(idx).(FilterPolicy).KeyMayMatch(key, filter)) + return boolToChar(filterPolicies.Get(idx).(filterPolicyWrapper).filterPolicy.KeyMayMatch(key, filter)) } //export gorocksdb_filterpolicy_name func gorocksdb_filterpolicy_name(idx int) *C.char { - return filterPolicyNames.Get(idx).(*C.char) + return filterPolicies.Get(idx).(filterPolicyWrapper).name } diff --git a/merge_operator.go b/merge_operator.go index f0bc33db..33f83948 100644 --- a/merge_operator.go +++ b/merge_operator.go @@ -66,11 +66,14 @@ func (mo nativeMergeOperator) Name() string { return "" } // Hold references to merge operators. var mergeOperators = NewCOWList() -var mergeOperatorNames = NewCOWList() + +type mergeOperatorWrapper struct { + name *C.char + mergeOperator MergeOperator +} func registerMergeOperator(merger MergeOperator) int { - mergeOperatorNames.Append(C.CString(merger.Name())) - return mergeOperators.Append(merger) + return mergeOperators.Append(mergeOperatorWrapper{C.CString(merger.Name()), merger}) } //export gorocksdb_mergeoperator_full_merge @@ -84,7 +87,7 @@ func gorocksdb_mergeoperator_full_merge(idx int, cKey *C.char, cKeyLen C.size_t, operands[i] = charToByte(rawOperands[i], len) } - newValue, success := mergeOperators.Get(idx).(MergeOperator).FullMerge(key, existingValue, operands) + newValue, success := mergeOperators.Get(idx).(mergeOperatorWrapper).mergeOperator.FullMerge(key, existingValue, operands) newValueLen := len(newValue) *cNewValueLen = C.size_t(newValueLen) @@ -106,7 +109,7 @@ func gorocksdb_mergeoperator_partial_merge_multi(idx int, cKey *C.char, cKeyLen var newValue []byte success := true - merger := mergeOperators.Get(idx).(MergeOperator) + merger := mergeOperators.Get(idx).(mergeOperatorWrapper).mergeOperator leftOperand := operands[0] for i := 1; i < int(cNumOperands); i++ { newValue, success = merger.PartialMerge(key, leftOperand, operands[i]) @@ -125,5 +128,5 @@ func gorocksdb_mergeoperator_partial_merge_multi(idx int, cKey *C.char, cKeyLen //export gorocksdb_mergeoperator_name func gorocksdb_mergeoperator_name(idx int) *C.char { - return mergeOperatorNames.Get(idx).(*C.char) + return mergeOperators.Get(idx).(mergeOperatorWrapper).name } diff --git a/slice_transform.go b/slice_transform.go index bc228cfc..e66e4d84 100644 --- a/slice_transform.go +++ b/slice_transform.go @@ -39,17 +39,20 @@ func (st nativeSliceTransform) Name() string { return "" } // Hold references to slice transforms. var sliceTransforms = NewCOWList() -var sliceTransformNames = NewCOWList() + +type sliceTransformWrapper struct { + name *C.char + sliceTransform SliceTransform +} func registerSliceTransform(st SliceTransform) int { - sliceTransformNames.Append(C.CString(st.Name())) - return sliceTransforms.Append(st) + return sliceTransforms.Append(sliceTransformWrapper{C.CString(st.Name()), st}) } //export gorocksdb_slicetransform_transform func gorocksdb_slicetransform_transform(idx int, cKey *C.char, cKeyLen C.size_t, cDstLen *C.size_t) *C.char { key := charToByte(cKey, cKeyLen) - dst := sliceTransforms.Get(idx).(SliceTransform).Transform(key) + dst := sliceTransforms.Get(idx).(sliceTransformWrapper).sliceTransform.Transform(key) *cDstLen = C.size_t(len(dst)) return cByteSlice(dst) } @@ -57,18 +60,18 @@ func gorocksdb_slicetransform_transform(idx int, cKey *C.char, cKeyLen C.size_t, //export gorocksdb_slicetransform_in_domain func gorocksdb_slicetransform_in_domain(idx int, cKey *C.char, cKeyLen C.size_t) C.uchar { key := charToByte(cKey, cKeyLen) - inDomain := sliceTransforms.Get(idx).(SliceTransform).InDomain(key) + inDomain := sliceTransforms.Get(idx).(sliceTransformWrapper).sliceTransform.InDomain(key) return boolToChar(inDomain) } //export gorocksdb_slicetransform_in_range func gorocksdb_slicetransform_in_range(idx int, cKey *C.char, cKeyLen C.size_t) C.uchar { key := charToByte(cKey, cKeyLen) - inRange := sliceTransforms.Get(idx).(SliceTransform).InRange(key) + inRange := sliceTransforms.Get(idx).(sliceTransformWrapper).sliceTransform.InRange(key) return boolToChar(inRange) } //export gorocksdb_slicetransform_name func gorocksdb_slicetransform_name(idx int) *C.char { - return sliceTransformNames.Get(idx).(*C.char) + return sliceTransforms.Get(idx).(sliceTransformWrapper).name }