rocksdb: use C++ constructor for global channel
This is similar to what's been done on master, but 19.01 doesn't have the fs_thread_ctx changes, so this looks a bit different. Signed-off-by: Jim Harris <james.r.harris@intel.com> Change-Id: I9578bf0f17953b4a7a120de6718cb97258719447 Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/452784 Reviewed-by: Ben Walker <benjamin.walker@intel.com>
This commit is contained in:
parent
fe3a2c4dcd
commit
089585c8d7
@ -58,11 +58,29 @@ uint32_t g_lcore = 0;
|
|||||||
std::string g_bdev_name;
|
std::string g_bdev_name;
|
||||||
volatile bool g_spdk_ready = false;
|
volatile bool g_spdk_ready = false;
|
||||||
volatile bool g_spdk_start_failure = false;
|
volatile bool g_spdk_start_failure = false;
|
||||||
struct sync_args {
|
|
||||||
|
void SpdkInitializeThread(void);
|
||||||
|
|
||||||
|
class SpdkThreadCtx
|
||||||
|
{
|
||||||
|
public:
|
||||||
struct spdk_io_channel *channel;
|
struct spdk_io_channel *channel;
|
||||||
|
|
||||||
|
SpdkThreadCtx(void) : channel(NULL)
|
||||||
|
{
|
||||||
|
SpdkInitializeThread();
|
||||||
|
}
|
||||||
|
|
||||||
|
~SpdkThreadCtx(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
SpdkThreadCtx(const SpdkThreadCtx &);
|
||||||
|
SpdkThreadCtx &operator=(const SpdkThreadCtx &);
|
||||||
};
|
};
|
||||||
|
|
||||||
__thread struct sync_args g_sync_args;
|
thread_local SpdkThreadCtx g_sync_args;
|
||||||
|
|
||||||
static void
|
static void
|
||||||
__call_fn(void *arg1, void *arg2)
|
__call_fn(void *arg1, void *arg2)
|
||||||
@ -510,7 +528,6 @@ public:
|
|||||||
}
|
}
|
||||||
return Status::OK();
|
return Status::OK();
|
||||||
}
|
}
|
||||||
virtual void StartThread(void (*function)(void *arg), void *arg) override;
|
|
||||||
virtual Status LockFile(const std::string &fname, FileLock **lock) override
|
virtual Status LockFile(const std::string &fname, FileLock **lock) override
|
||||||
{
|
{
|
||||||
std::string name = sanitize_path(fname, mDirectory);
|
std::string name = sanitize_path(fname, mDirectory);
|
||||||
@ -583,35 +600,13 @@ void SpdkInitializeThread(void)
|
|||||||
{
|
{
|
||||||
struct spdk_thread *thread;
|
struct spdk_thread *thread;
|
||||||
|
|
||||||
if (g_fs != NULL) {
|
if (g_fs != NULL && g_sync_args.channel == NULL) {
|
||||||
thread = spdk_thread_create("spdk_rocksdb");
|
thread = spdk_thread_create("spdk_rocksdb");
|
||||||
spdk_set_thread(thread);
|
spdk_set_thread(thread);
|
||||||
g_sync_args.channel = spdk_fs_alloc_io_channel_sync(g_fs);
|
g_sync_args.channel = spdk_fs_alloc_io_channel_sync(g_fs);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct SpdkThreadState {
|
|
||||||
void (*user_function)(void *);
|
|
||||||
void *arg;
|
|
||||||
};
|
|
||||||
|
|
||||||
static void SpdkStartThreadWrapper(void *arg)
|
|
||||||
{
|
|
||||||
SpdkThreadState *state = reinterpret_cast<SpdkThreadState *>(arg);
|
|
||||||
|
|
||||||
SpdkInitializeThread();
|
|
||||||
state->user_function(state->arg);
|
|
||||||
delete state;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SpdkEnv::StartThread(void (*function)(void *arg), void *arg)
|
|
||||||
{
|
|
||||||
SpdkThreadState *state = new SpdkThreadState;
|
|
||||||
state->user_function = function;
|
|
||||||
state->arg = arg;
|
|
||||||
EnvWrapper::StartThread(SpdkStartThreadWrapper, state);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
fs_load_cb(__attribute__((unused)) void *ctx,
|
fs_load_cb(__attribute__((unused)) void *ctx,
|
||||||
struct spdk_filesystem *fs, int fserrno)
|
struct spdk_filesystem *fs, int fserrno)
|
||||||
|
Loading…
Reference in New Issue
Block a user