int MemStore::BufferlistObject::read(uint64_t offset, uint64_t len,
bufferlist &bl)
{
+ std::lock_guard<Spinlock> lock(mutex);
bl.substr_of(data, offset, len);
return bl.length();
}
{
unsigned len = src.length();
+ std::lock_guard<Spinlock> lock(mutex);
+
// before
bufferlist newdata;
if (get_size() >= offset) {
int MemStore::BufferlistObject::clone(Object *src, uint64_t srcoff,
uint64_t len, uint64_t dstoff)
{
- auto srcbl = dynamic_cast<const BufferlistObject*>(src);
+ auto srcbl = dynamic_cast<BufferlistObject*>(src);
if (srcbl == nullptr)
return -ENOTSUP;
- if (srcoff == dstoff && len == src->get_size()) {
- data = srcbl->data;
- return 0;
- }
bufferlist bl;
- bl.substr_of(srcbl->data, srcoff, len);
+ {
+ std::lock_guard<Spinlock> lock(srcbl->mutex);
+ if (srcoff == dstoff && len == src->get_size()) {
+ data = srcbl->data;
+ return 0;
+ }
+ bl.substr_of(srcbl->data, srcoff, len);
+ }
return write(dstoff, bl);
}
int MemStore::BufferlistObject::truncate(uint64_t size)
{
+ std::lock_guard<Spinlock> lock(mutex);
if (get_size() > size) {
bufferlist bl;
bl.substr_of(data, 0, size);
#include "include/assert.h"
#include "include/unordered_map.h"
#include "include/memory.h"
+#include "include/Spinlock.h"
#include "common/Finisher.h"
#include "common/RefCountedObj.h"
#include "common/RWLock.h"
typedef Object::Ref ObjectRef;
struct BufferlistObject : public Object {
+ Spinlock mutex;
bufferlist data;
size_t get_size() const override { return data.length(); }