From 6a560b519b60cc5faae2c784c6e90bd9c0d06572 Mon Sep 17 00:00:00 2001 From: Haomai Wang Date: Wed, 23 Dec 2015 15:29:52 +0800 Subject: [PATCH] async: don't use shared_ptr to manage EventCallback Signed-off-by: Haomai Wang --- src/msg/async/AsyncConnection.cc | 15 ++++++++------- src/msg/async/AsyncConnection.h | 14 +++++++------- src/msg/async/AsyncMessenger.cc | 13 +------------ src/msg/async/AsyncMessenger.h | 16 +++++++++++++++- src/msg/async/Event.cc | 4 ++-- src/msg/async/Event.h | 2 +- 6 files changed, 34 insertions(+), 30 deletions(-) diff --git a/src/msg/async/AsyncConnection.cc b/src/msg/async/AsyncConnection.cc index 83c36de3cf0..944c4ad3b58 100644 --- a/src/msg/async/AsyncConnection.cc +++ b/src/msg/async/AsyncConnection.cc @@ -147,6 +147,7 @@ class C_clean_handler : public EventCallback { C_clean_handler(AsyncConnectionRef c): conn(c) {} void do_request(int id) { conn->cleanup_handler(); + delete this; } }; @@ -183,13 +184,13 @@ AsyncConnection::AsyncConnection(CephContext *cct, AsyncMessenger *m, EventCente recv_start(0), recv_end(0), got_bad_auth(false), authorizer(NULL), replacing(false), is_reset_from_peer(false), once_ready(false), state_buffer(NULL), state_offset(0), net(cct), center(c) { - read_handler.reset(new C_handle_read(this)); - write_handler.reset(new C_handle_write(this)); - reset_handler.reset(new C_handle_reset(async_msgr, this)); - remote_reset_handler.reset(new C_handle_remote_reset(async_msgr, this)); - connect_handler.reset(new C_deliver_connect(async_msgr, this)); - local_deliver_handler.reset(new C_local_deliver(this)); - wakeup_handler.reset(new C_time_wakeup(this)); + read_handler = new C_handle_read(this); + write_handler = new C_handle_write(this); + reset_handler = new C_handle_reset(async_msgr, this); + remote_reset_handler = new C_handle_remote_reset(async_msgr, this); + connect_handler = new C_deliver_connect(async_msgr, this); + local_deliver_handler = new C_local_deliver(this); + wakeup_handler = new C_time_wakeup(this); memset(msgvec, 0, sizeof(msgvec)); // double recv_max_prefetch see "read_until" recv_buf = new char[2*recv_max_prefetch]; diff --git a/src/msg/async/AsyncConnection.h b/src/msg/async/AsyncConnection.h index c578a7a4358..98e6d442c05 100644 --- a/src/msg/async/AsyncConnection.h +++ b/src/msg/async/AsyncConnection.h @@ -316,13 +316,13 @@ class AsyncConnection : public Connection { mark_down(); } void cleanup_handler() { - read_handler.reset(); - write_handler.reset(); - reset_handler.reset(); - remote_reset_handler.reset(); - connect_handler.reset(); - local_deliver_handler.reset(); - wakeup_handler.reset(); + delete read_handler; + delete write_handler; + delete reset_handler; + delete remote_reset_handler; + delete connect_handler; + delete local_deliver_handler; + delete wakeup_handler; } PerfCounters *get_perf_counter() { return logger; diff --git a/src/msg/async/AsyncMessenger.cc b/src/msg/async/AsyncMessenger.cc index e5e393a4fb4..524c6015e24 100644 --- a/src/msg/async/AsyncMessenger.cc +++ b/src/msg/async/AsyncMessenger.cc @@ -50,16 +50,6 @@ static ostream& _prefix(std::ostream *_dout, WorkerPool *p) { } -class C_processor_accept : public EventCallback { - Processor *pro; - - public: - C_processor_accept(Processor *p): pro(p) {} - void do_request(int id) { - pro->accept(); - } -}; - /******************* * Processor @@ -232,8 +222,7 @@ int Processor::start(Worker *w) // start thread if (listen_sd >= 0) { worker = w; - w->center.create_file_event(listen_sd, EVENT_READABLE, - EventCallbackRef(new C_processor_accept(this))); + w->center.create_file_event(listen_sd, EVENT_READABLE, listen_handler); } return 0; diff --git a/src/msg/async/AsyncMessenger.h b/src/msg/async/AsyncMessenger.h index ed8a0ffca59..59f9f3a2cc6 100644 --- a/src/msg/async/AsyncMessenger.h +++ b/src/msg/async/AsyncMessenger.h @@ -103,9 +103,22 @@ class Processor { Worker *worker; int listen_sd; uint64_t nonce; + EventCallbackRef listen_handler; + + class C_processor_accept : public EventCallback { + Processor *pro; + + public: + C_processor_accept(Processor *p): pro(p) {} + void do_request(int id) { + pro->accept(); + } + }; public: - Processor(AsyncMessenger *r, CephContext *c, uint64_t n): msgr(r), net(c), worker(NULL), listen_sd(-1), nonce(n) {} + Processor(AsyncMessenger *r, CephContext *c, uint64_t n) + : msgr(r), net(c), worker(NULL), listen_sd(-1), nonce(n), listen_handler(new C_processor_accept(this)) {} + ~Processor() { delete listen_handler; }; void stop(); int bind(const entity_addr_t &bind_addr, const set& avoid_ports); @@ -135,6 +148,7 @@ class WorkerPool { Mutex::Locker l(pool->barrier_lock); pool->barrier_count.dec(); pool->barrier_cond.Signal(); + delete this; } }; friend class C_barrier; diff --git a/src/msg/async/Event.cc b/src/msg/async/Event.cc index 2027a9f415f..d51f66af1ce 100644 --- a/src/msg/async/Event.cc +++ b/src/msg/async/Event.cc @@ -199,10 +199,10 @@ void EventCenter::delete_file_event(int fd, int mask) } if (mask & EVENT_READABLE && event->read_cb) { - event->read_cb.reset(); + event->read_cb = nullptr; } if (mask & EVENT_WRITABLE && event->write_cb) { - event->write_cb.reset(); + event->write_cb = nullptr; } event->mask = event->mask & (~mask); diff --git a/src/msg/async/Event.h b/src/msg/async/Event.h index dc85238dcb2..7e0a195bbb4 100644 --- a/src/msg/async/Event.h +++ b/src/msg/async/Event.h @@ -58,7 +58,7 @@ class EventCallback { virtual ~EventCallback() {} // we want a virtual destructor!!! }; -typedef ceph::shared_ptr EventCallbackRef; +typedef EventCallback* EventCallbackRef; struct FiredFileEvent { int fd; -- 2.47.3