default:
{
- OpRequest *op = new OpRequest(m, &op_tracker);
+ OpRequestRef *op = new OpRequest(m, &op_tracker);
op->mark_event("waiting_for_osdmap");
// no map? starting up?
if (!osdmap) {
Mutex::Locker locker(ops_in_flight_lock);
utime_t now = ceph_clock_now(g_ceph_context);
dout(1) << "seq: " << op->seq << ", time: " << now << ", event: " << dest
- << " " << *op << dendl;
+ << " " << *op->request << dendl;
+}
+
+void OpTracker::RemoveOnDelete::operator()(OpRequest *op) {
+ tracker->unregister_inflight_op(&(op->xitem));
+ delete op;
+}
+
+OpRequestRef OpTracker::create_request(Message *ref)
+{
+ return OpRequestRef(new OpRequest(ref, this),
+ RemoveOnDelete(this));
}
void OpRequest::mark_event(const string &event)
#include "common/Mutex.h"
#include "include/xlist.h"
#include "msg/Message.h"
+#include <tr1/memory>
class OpRequest;
+typedef std::tr1::shared_ptr<OpRequest> OpRequestRef;
class OpTracker {
+ class RemoveOnDelete {
+ OpTracker *tracker;
+ public:
+ RemoveOnDelete(OpTracker *tracker) : tracker(tracker) {}
+ void operator()(OpRequest *op);
+ };
+ friend class RemoveOnDelete;
uint64_t seq;
Mutex ops_in_flight_lock;
xlist<OpRequest *> ops_in_flight;
void unregister_inflight_op(xlist<OpRequest*>::item *i);
bool check_ops_in_flight(std::ostream &out);
void mark_event(OpRequest *op, const string &evt);
+ OpRequestRef create_request(Message *req);
};
/**
tracker->register_inflight_op(&xitem);
}
~OpRequest() {
- tracker->unregister_inflight_op(&xitem);
assert(request);
request->put();
}