mirror of
https://github.com/scylladb/scylladb.git
synced 2026-04-23 01:50:35 +00:00
Alternative way to deal with allocating reactor vs early init
of "local_engine" pointer that does not mix allocation types.
This commit is contained in:
@@ -1318,16 +1318,28 @@ void smp::pin(unsigned cpu_id) {
|
||||
#endif
|
||||
|
||||
void smp::allocate_reactor() {
|
||||
static thread_local std::unique_ptr<reactor> 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<local_reactor> 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<reactor*>(buf);
|
||||
new (buf) reactor;
|
||||
reactor_holder.reset(local_engine);
|
||||
reactor_holder.reset(new local_reactor());
|
||||
}
|
||||
|
||||
void smp::cleanup() {
|
||||
|
||||
Reference in New Issue
Block a user