Fix GitHub issue #3716: gcc-8 warnings
Summary: Fix the following gcc-8 warnings: - conflicting C language linkage declaration [-Werror] - writing to an object with no trivial copy-assignment [-Werror=class-memaccess] - array subscript -1 is below array bounds [-Werror=array-bounds] Solves https://github.com/facebook/rocksdb/issues/3716 Closes https://github.com/facebook/rocksdb/pull/3736 Differential Revision: D7684161 Pulled By: yiwu-arbug fbshipit-source-id: 47c0423d26b74add251f1d3595211eee1e41e54a
This commit is contained in:
parent
8a9c7f71c9
commit
dee95a1afc
77
db/c.cc
77
db/c.cc
@ -1407,23 +1407,24 @@ void rocksdb_writebatch_put_log_data(
|
|||||||
b->rep.PutLogData(Slice(blob, len));
|
b->rep.PutLogData(Slice(blob, len));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class H : public WriteBatch::Handler {
|
||||||
|
public:
|
||||||
|
void* state_;
|
||||||
|
void (*put_)(void*, const char* k, size_t klen, const char* v, size_t vlen);
|
||||||
|
void (*deleted_)(void*, const char* k, size_t klen);
|
||||||
|
virtual void Put(const Slice& key, const Slice& value) override {
|
||||||
|
(*put_)(state_, key.data(), key.size(), value.data(), value.size());
|
||||||
|
}
|
||||||
|
virtual void Delete(const Slice& key) override {
|
||||||
|
(*deleted_)(state_, key.data(), key.size());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
void rocksdb_writebatch_iterate(
|
void rocksdb_writebatch_iterate(
|
||||||
rocksdb_writebatch_t* b,
|
rocksdb_writebatch_t* b,
|
||||||
void* state,
|
void* state,
|
||||||
void (*put)(void*, const char* k, size_t klen, const char* v, size_t vlen),
|
void (*put)(void*, const char* k, size_t klen, const char* v, size_t vlen),
|
||||||
void (*deleted)(void*, const char* k, size_t klen)) {
|
void (*deleted)(void*, const char* k, size_t klen)) {
|
||||||
class H : public WriteBatch::Handler {
|
|
||||||
public:
|
|
||||||
void* state_;
|
|
||||||
void (*put_)(void*, const char* k, size_t klen, const char* v, size_t vlen);
|
|
||||||
void (*deleted_)(void*, const char* k, size_t klen);
|
|
||||||
virtual void Put(const Slice& key, const Slice& value) override {
|
|
||||||
(*put_)(state_, key.data(), key.size(), value.data(), value.size());
|
|
||||||
}
|
|
||||||
virtual void Delete(const Slice& key) override {
|
|
||||||
(*deleted_)(state_, key.data(), key.size());
|
|
||||||
}
|
|
||||||
};
|
|
||||||
H handler;
|
H handler;
|
||||||
handler.state_ = state;
|
handler.state_ = state;
|
||||||
handler.put_ = put;
|
handler.put_ = put;
|
||||||
@ -1668,18 +1669,6 @@ void rocksdb_writebatch_wi_iterate(
|
|||||||
void* state,
|
void* state,
|
||||||
void (*put)(void*, const char* k, size_t klen, const char* v, size_t vlen),
|
void (*put)(void*, const char* k, size_t klen, const char* v, size_t vlen),
|
||||||
void (*deleted)(void*, const char* k, size_t klen)) {
|
void (*deleted)(void*, const char* k, size_t klen)) {
|
||||||
class H : public WriteBatch::Handler {
|
|
||||||
public:
|
|
||||||
void* state_;
|
|
||||||
void (*put_)(void*, const char* k, size_t klen, const char* v, size_t vlen);
|
|
||||||
void (*deleted_)(void*, const char* k, size_t klen);
|
|
||||||
virtual void Put(const Slice& key, const Slice& value) override {
|
|
||||||
(*put_)(state_, key.data(), key.size(), value.data(), value.size());
|
|
||||||
}
|
|
||||||
virtual void Delete(const Slice& key) override {
|
|
||||||
(*deleted_)(state_, key.data(), key.size());
|
|
||||||
}
|
|
||||||
};
|
|
||||||
H handler;
|
H handler;
|
||||||
handler.state_ = state;
|
handler.state_ = state;
|
||||||
handler.put_ = put;
|
handler.put_ = put;
|
||||||
@ -3298,20 +3287,21 @@ void rocksdb_slicetransform_destroy(rocksdb_slicetransform_t* st) {
|
|||||||
delete st;
|
delete st;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct Wrapper : public rocksdb_slicetransform_t {
|
||||||
|
const SliceTransform* rep_;
|
||||||
|
~Wrapper() { delete rep_; }
|
||||||
|
const char* Name() const override { return rep_->Name(); }
|
||||||
|
Slice Transform(const Slice& src) const override {
|
||||||
|
return rep_->Transform(src);
|
||||||
|
}
|
||||||
|
bool InDomain(const Slice& src) const override {
|
||||||
|
return rep_->InDomain(src);
|
||||||
|
}
|
||||||
|
bool InRange(const Slice& src) const override { return rep_->InRange(src); }
|
||||||
|
static void DoNothing(void*) { }
|
||||||
|
};
|
||||||
|
|
||||||
rocksdb_slicetransform_t* rocksdb_slicetransform_create_fixed_prefix(size_t prefixLen) {
|
rocksdb_slicetransform_t* rocksdb_slicetransform_create_fixed_prefix(size_t prefixLen) {
|
||||||
struct Wrapper : public rocksdb_slicetransform_t {
|
|
||||||
const SliceTransform* rep_;
|
|
||||||
~Wrapper() { delete rep_; }
|
|
||||||
const char* Name() const override { return rep_->Name(); }
|
|
||||||
Slice Transform(const Slice& src) const override {
|
|
||||||
return rep_->Transform(src);
|
|
||||||
}
|
|
||||||
bool InDomain(const Slice& src) const override {
|
|
||||||
return rep_->InDomain(src);
|
|
||||||
}
|
|
||||||
bool InRange(const Slice& src) const override { return rep_->InRange(src); }
|
|
||||||
static void DoNothing(void*) { }
|
|
||||||
};
|
|
||||||
Wrapper* wrapper = new Wrapper;
|
Wrapper* wrapper = new Wrapper;
|
||||||
wrapper->rep_ = rocksdb::NewFixedPrefixTransform(prefixLen);
|
wrapper->rep_ = rocksdb::NewFixedPrefixTransform(prefixLen);
|
||||||
wrapper->state_ = nullptr;
|
wrapper->state_ = nullptr;
|
||||||
@ -3320,19 +3310,6 @@ rocksdb_slicetransform_t* rocksdb_slicetransform_create_fixed_prefix(size_t pref
|
|||||||
}
|
}
|
||||||
|
|
||||||
rocksdb_slicetransform_t* rocksdb_slicetransform_create_noop() {
|
rocksdb_slicetransform_t* rocksdb_slicetransform_create_noop() {
|
||||||
struct Wrapper : public rocksdb_slicetransform_t {
|
|
||||||
const SliceTransform* rep_;
|
|
||||||
~Wrapper() { delete rep_; }
|
|
||||||
const char* Name() const override { return rep_->Name(); }
|
|
||||||
Slice Transform(const Slice& src) const override {
|
|
||||||
return rep_->Transform(src);
|
|
||||||
}
|
|
||||||
bool InDomain(const Slice& src) const override {
|
|
||||||
return rep_->InDomain(src);
|
|
||||||
}
|
|
||||||
bool InRange(const Slice& src) const override { return rep_->InRange(src); }
|
|
||||||
static void DoNothing(void*) { }
|
|
||||||
};
|
|
||||||
Wrapper* wrapper = new Wrapper;
|
Wrapper* wrapper = new Wrapper;
|
||||||
wrapper->rep_ = rocksdb::NewNoopTransform();
|
wrapper->rep_ = rocksdb::NewNoopTransform();
|
||||||
wrapper->state_ = nullptr;
|
wrapper->state_ = nullptr;
|
||||||
|
@ -287,7 +287,7 @@ struct InlineSkipList<Comparator>::Node {
|
|||||||
// next_[0]. This is used for passing data from AllocateKey to Insert.
|
// next_[0]. This is used for passing data from AllocateKey to Insert.
|
||||||
void StashHeight(const int height) {
|
void StashHeight(const int height) {
|
||||||
assert(sizeof(int) <= sizeof(next_[0]));
|
assert(sizeof(int) <= sizeof(next_[0]));
|
||||||
memcpy(&next_[0], &height, sizeof(int));
|
memcpy(static_cast<void*>(&next_[0]), &height, sizeof(int));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Retrieves the value passed to StashHeight. Undefined after a call
|
// Retrieves the value passed to StashHeight. Undefined after a call
|
||||||
@ -307,30 +307,30 @@ struct InlineSkipList<Comparator>::Node {
|
|||||||
assert(n >= 0);
|
assert(n >= 0);
|
||||||
// Use an 'acquire load' so that we observe a fully initialized
|
// Use an 'acquire load' so that we observe a fully initialized
|
||||||
// version of the returned Node.
|
// version of the returned Node.
|
||||||
return (next_[-n].load(std::memory_order_acquire));
|
return ((&next_[0] - n)->load(std::memory_order_acquire));
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetNext(int n, Node* x) {
|
void SetNext(int n, Node* x) {
|
||||||
assert(n >= 0);
|
assert(n >= 0);
|
||||||
// Use a 'release store' so that anybody who reads through this
|
// Use a 'release store' so that anybody who reads through this
|
||||||
// pointer observes a fully initialized version of the inserted node.
|
// pointer observes a fully initialized version of the inserted node.
|
||||||
next_[-n].store(x, std::memory_order_release);
|
(&next_[0] - n)->store(x, std::memory_order_release);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CASNext(int n, Node* expected, Node* x) {
|
bool CASNext(int n, Node* expected, Node* x) {
|
||||||
assert(n >= 0);
|
assert(n >= 0);
|
||||||
return next_[-n].compare_exchange_strong(expected, x);
|
return (&next_[0] - n)->compare_exchange_strong(expected, x);
|
||||||
}
|
}
|
||||||
|
|
||||||
// No-barrier variants that can be safely used in a few locations.
|
// No-barrier variants that can be safely used in a few locations.
|
||||||
Node* NoBarrier_Next(int n) {
|
Node* NoBarrier_Next(int n) {
|
||||||
assert(n >= 0);
|
assert(n >= 0);
|
||||||
return next_[-n].load(std::memory_order_relaxed);
|
return (&next_[0] - n)->load(std::memory_order_relaxed);
|
||||||
}
|
}
|
||||||
|
|
||||||
void NoBarrier_SetNext(int n, Node* x) {
|
void NoBarrier_SetNext(int n, Node* x) {
|
||||||
assert(n >= 0);
|
assert(n >= 0);
|
||||||
next_[-n].store(x, std::memory_order_relaxed);
|
(&next_[0] - n)->store(x, std::memory_order_relaxed);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Insert node after prev on specific level.
|
// Insert node after prev on specific level.
|
||||||
|
Loading…
Reference in New Issue
Block a user