From 9d93dd1ac337e225a8ca4712ef581d248b4e13f2 Mon Sep 17 00:00:00 2001 From: Calle Wilund Date: Mon, 9 Mar 2015 19:31:23 +0100 Subject: [PATCH] Alternative way to deal with allocating reactor vs early init of "local_engine" pointer that does not mix allocation types. --- core/reactor.cc | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/core/reactor.cc b/core/reactor.cc index 1533223c68..2996fc5f55 100644 --- a/core/reactor.cc +++ b/core/reactor.cc @@ -1318,16 +1318,28 @@ void smp::pin(unsigned cpu_id) { #endif void smp::allocate_reactor() { - static thread_local std::unique_ptr reactor_holder; + // we cannot just write "local_engin = new reactor" since reactor's constructor + // uses local_engine + struct set_local_engine { + set_local_engine(reactor * r) { + local_engine = r; + } + ~set_local_engine() { + local_engine = nullptr; + } + }; + class local_reactor : private set_local_engine, public reactor { + public: + local_reactor() + : set_local_engine(this) + {} + }; + + static thread_local std::unique_ptr reactor_holder; assert(!reactor_holder); - // we cannot just write "local_engin = new reactor" since reactor's constructor - // uses local_engine - auto buf = new (with_alignment(64)) char[sizeof(reactor)]; - local_engine = reinterpret_cast(buf); - new (buf) reactor; - reactor_holder.reset(local_engine); + reactor_holder.reset(new local_reactor()); } void smp::cleanup() {