#define CEPH_LIBRBD_JOURNAL_H
#include "include/int_types.h"
-#include "include/atomic.h"
#include "include/Context.h"
#include "include/interval_set.h"
#include "common/Cond.h"
#include "librbd/Utils.h"
#include "librbd/journal/Types.h"
#include "librbd/journal/TypeTraits.h"
+
#include <algorithm>
#include <list>
#include <string>
+#include <atomic>
#include <unordered_map>
class SafeTimer;
void wait_event(uint64_t tid, Context *on_safe);
uint64_t allocate_op_tid() {
- uint64_t op_tid = m_op_tid.inc();
+ uint64_t op_tid = ++m_op_tid;
assert(op_tid != 0);
return op_tid;
}
uint64_t m_event_tid;
Events m_events;
- atomic_t m_op_tid;
+ std::atomic<uint64_t> m_op_tid = { 0 };
TidToFutures m_op_futures;
bool m_processing_entry = false;
#include "include/rados/librados.hpp"
#include "include/rbd_types.h"
#include "include/Context.h"
+
+#include <atomic>
#include <type_traits>
namespace librbd {
/// a shut down of the invoking class instance
class AsyncOpTracker {
public:
- AsyncOpTracker() : m_refs(0) {
- }
-
void start_op() {
- m_refs.inc();
+ m_refs++;
}
void finish_op() {
- if (m_refs.dec() == 0 && m_on_finish != nullptr) {
+ if (--m_refs == 0 && m_on_finish != nullptr) {
Context *on_finish = nullptr;
std::swap(on_finish, m_on_finish);
on_finish->complete(0);
assert(m_on_finish == nullptr);
on_finish = create_async_context_callback(image_ctx, on_finish);
- if (m_refs.read() == 0) {
+ if (m_refs == 0) {
on_finish->complete(0);
return;
}
}
private:
- atomic_t m_refs;
+ std::atomic<uint64_t> m_refs = { 0 };
Context *m_on_finish = nullptr;
};
#include "common/WorkQueue.h"
#include <boost/bind.hpp>
+// re-include our assert to clobber the system one; fix dout:
+#include "include/assert.h"
+
#define dout_subsys ceph_subsys_rbd
namespace librbd {
std::vector<librados::snap_t> snaps;
if (!copy_on_read) {
- m_pending_copyups.inc();
+ m_pending_copyups++;
}
int r;
// all snapshots are detected from the parent for this object. If
// this is a CoW request, a second request will be created for the
// actual modification.
- m_pending_copyups.inc();
+ m_pending_copyups++;
ldout(m_ictx->cct, 20) << __func__ << " " << this << " copyup with "
<< "empty snapshot context" << dendl;
case STATE_COPYUP:
// invoked via a finisher in librados, so thread safe
- pending_copyups = m_pending_copyups.dec();
+ pending_copyups = --m_pending_copyups;
ldout(cct, 20) << "COPYUP (" << pending_copyups << " pending)"
<< dendl;
if (r == -ENOENT) {
#define CEPH_LIBRBD_IO_COPYUP_REQUEST_H
#include "librbd/AsyncOperation.h"
-#include "include/atomic.h"
#include "include/int_types.h"
#include "include/rados/librados.hpp"
#include "include/buffer.h"
#include "librbd/io/Types.h"
+
#include <string>
#include <vector>
+#include <atomic>
namespace librbd {
State m_state;
ceph::bufferlist m_copyup_data;
std::vector<ObjectRequest<ImageCtx> *> m_pending_requests;
- atomic_t m_pending_copyups;
+ std::atomic<unsigned> m_pending_copyups { 0 };
AsyncOperation m_async_op;
m_shutdown = true;
CephContext *cct = m_image_ctx.cct;
- ldout(cct, 5) << __func__ << ": in_flight=" << m_in_flight_ops.read()
+ ldout(cct, 5) << __func__ << ": in_flight=" << m_in_flight_ops.load()
<< dendl;
- if (m_in_flight_ops.read() > 0) {
+ if (m_in_flight_ops > 0) {
m_on_shutdown = on_shutdown;
return;
}
bool ImageRequestWQ::is_lock_request_needed() const {
RWLock::RLocker locker(m_lock);
- return (m_queued_writes.read() > 0 ||
- (m_require_lock_on_read && m_queued_reads.read() > 0));
+ return (m_queued_writes > 0 ||
+ (m_require_lock_on_read && m_queued_reads > 0));
}
int ImageRequestWQ::block_writes() {
++m_write_blockers;
ldout(cct, 5) << __func__ << ": " << &m_image_ctx << ", "
<< "num=" << m_write_blockers << dendl;
- if (!m_write_blocker_contexts.empty() || m_in_progress_writes.read() > 0) {
+ if (!m_write_blocker_contexts.empty() || m_in_progress_writes > 0) {
m_write_blocker_contexts.push_back(on_blocked);
return;
}
// refresh will requeue the op -- don't count it as in-progress
if (!refresh_required) {
- m_in_progress_writes.inc();
+ m_in_progress_writes++;
}
} else if (m_require_lock_on_read) {
return nullptr;
void ImageRequestWQ::finish_queued_op(ImageRequest<> *req) {
RWLock::RLocker locker(m_lock);
if (req->is_write_op()) {
- assert(m_queued_writes.read() > 0);
- m_queued_writes.dec();
+ assert(m_queued_writes > 0);
+ m_queued_writes--;
} else {
- assert(m_queued_reads.read() > 0);
- m_queued_reads.dec();
+ assert(m_queued_reads > 0);
+ m_queued_reads--;
}
}
bool writes_blocked = false;
{
RWLock::RLocker locker(m_lock);
- assert(m_in_progress_writes.read() > 0);
- if (m_in_progress_writes.dec() == 0 &&
+ assert(m_in_progress_writes > 0);
+ if (--m_in_progress_writes == 0 &&
!m_write_blocker_contexts.empty()) {
writes_blocked = true;
}
return false;
}
- m_in_flight_ops.inc();
+ m_in_flight_ops++;
return true;
}
Context *on_shutdown;
{
RWLock::RLocker locker(m_lock);
- if (m_in_flight_ops.dec() > 0 || !m_shutdown) {
+ if (--m_in_flight_ops > 0 || !m_shutdown) {
return;
}
on_shutdown = m_on_shutdown;
}
if (write_op) {
- m_queued_writes.inc();
+ m_queued_writes++;
} else {
- m_queued_reads.inc();
+ m_queued_reads++;
}
ThreadPool::PointerWQ<ImageRequest<> >::queue(req);
#define CEPH_LIBRBD_IO_IMAGE_REQUEST_WQ_H
#include "include/Context.h"
-#include "include/atomic.h"
#include "common/RWLock.h"
#include "common/WorkQueue.h"
+
#include <list>
+#include <atomic>
namespace librbd {
Contexts m_write_blocker_contexts;
uint32_t m_write_blockers;
bool m_require_lock_on_read = false;
- atomic_t m_in_progress_writes;
- atomic_t m_queued_reads;
- atomic_t m_queued_writes;
- atomic_t m_in_flight_ops;
+ std::atomic<unsigned> m_in_progress_writes { 0 };
+ std::atomic<unsigned> m_queued_reads { 0 };
+ std::atomic<unsigned> m_queued_writes { 0 };
+ std::atomic<unsigned> m_in_flight_ops { 0 };
bool m_refresh_in_progress;
inline bool writes_empty() const {
RWLock::RLocker locker(m_lock);
- return (m_queued_writes.read() == 0);
+ return (m_queued_writes == 0);
}
void finish_queued_op(ImageRequest<ImageCtx> *req);