int binary_reader::read(blob& blob) { int len; if (0 == read(len)) return 0; if (len <= get_remaining_size()) { blob = _blob.range(static_cast<int>(_ptr - _blob.data()), len); // optimization: zero-copy if (!blob.buffer_ptr()) { std::shared_ptr<char> buffer(new char[len]); memcpy(buffer.get(), blob.data(), blob.length()); blob = ::dsn::blob(buffer, 0, blob.length()); } _ptr += len; _remaining_size -= len; return len + sizeof(len); } else { dassert(false, "read beyond the end of buffer"); return 0; } }
binary_reader::binary_reader(blob& blob) { _blob = blob; _size = blob.length(); _ptr = blob.data(); _remaining_size = _size; }
void binary_reader::init(blob& bb) { _blob = bb; _size = bb.length(); _ptr = bb.data(); _remaining_size = _size; }
void meta_service::on_log_completed(error_code err, size_t size, blob buffer, std::shared_ptr<configuration_update_request> req, dsn_message_t resp) { dassert(err == ERR_OK, "log operation failed, cannot proceed, err = %s", err.to_string()); dassert(buffer.length() == size, "log size must equal to the specified buffer size"); configuration_update_response response; update_configuration(*req, response); if (resp != nullptr) { meta_response_header rhdr; rhdr.err = err; rhdr.primary_address = primary_address(); marshall(resp, rhdr); marshall(resp, response); dsn_rpc_reply(resp); } else { err.end_tracking(); } }
binary_writer::binary_writer(blob& buffer) { _total_size = 0; _buffers.reserve(1); _reserved_size_per_buffer = _reserved_size_per_buffer_static; _buffers.push_back(buffer); _current_buffer = (char*)buffer.data(); _current_offset = 0; _current_buffer_length = buffer.length(); }