Skip to content

Commit 43ad67a

Browse files
committed
Fixes performance regression when everything was pooled in the same thread
1 parent 040c8f0 commit 43ad67a

File tree

8 files changed

+62
-50
lines changed

8 files changed

+62
-50
lines changed

cpp/DBHostObject.cpp

Lines changed: 38 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,9 @@ namespace react = facebook::react;
1919
#ifdef OP_SQLITE_USE_LIBSQL
2020
void DBHostObject::flush_pending_reactive_queries(
2121
const std::shared_ptr<jsi::Value> &resolve) {
22-
invoker->invokeAsync(
23-
[resolve](jsi::Runtime &rt) { resolve->asObject(rt).asFunction(rt).call(rt, {}); });
22+
invoker->invokeAsync([resolve](jsi::Runtime &rt) {
23+
resolve->asObject(rt).asFunction(rt).call(rt, {});
24+
});
2425
}
2526
#else
2627
void DBHostObject::flush_pending_reactive_queries(
@@ -37,41 +38,45 @@ void DBHostObject::flush_pending_reactive_queries(
3738

3839
invoker->invokeAsync(
3940
[results = std::make_shared<std::vector<DumbHostObject>>(results),
40-
callback = query->callback, metadata, status = std::move(status)](jsi::Runtime &rt) {
41+
callback = query->callback, metadata,
42+
status = std::move(status)](jsi::Runtime &rt) {
4143
auto jsiResult = create_result(rt, status, results.get(), metadata);
4244
callback->asObject(rt).asFunction(rt).call(rt, jsiResult);
4345
});
4446
}
4547

4648
pending_reactive_queries.clear();
4749

48-
invoker->invokeAsync(
49-
[resolve](jsi::Runtime &rt) { resolve->asObject(rt).asFunction(rt).call(rt, {}); });
50+
invoker->invokeAsync([resolve](jsi::Runtime &rt) {
51+
resolve->asObject(rt).asFunction(rt).call(rt, {});
52+
});
5053
}
5154

5255
void DBHostObject::on_commit() {
53-
invoker->invokeAsync(
54-
[this](jsi::Runtime &rt) { commit_hook_callback->asObject(rt).asFunction(rt).call(rt); });
56+
invoker->invokeAsync([this](jsi::Runtime &rt) {
57+
commit_hook_callback->asObject(rt).asFunction(rt).call(rt);
58+
});
5559
}
5660

5761
void DBHostObject::on_rollback() {
58-
invoker->invokeAsync(
59-
[this](jsi::Runtime &rt) { rollback_hook_callback->asObject(rt).asFunction(rt).call(rt); });
62+
invoker->invokeAsync([this](jsi::Runtime &rt) {
63+
rollback_hook_callback->asObject(rt).asFunction(rt).call(rt);
64+
});
6065
}
6166

6267
void DBHostObject::on_update(const std::string &table,
6368
const std::string &operation, long long row_id) {
6469
if (update_hook_callback != nullptr) {
65-
invoker->invokeAsync(
66-
[callback = update_hook_callback, table, operation, row_id](jsi::Runtime &rt) {
67-
auto res = jsi::Object(rt);
68-
res.setProperty(rt, "table", jsi::String::createFromUtf8(rt, table));
69-
res.setProperty(rt, "operation",
70-
jsi::String::createFromUtf8(rt, operation));
71-
res.setProperty(rt, "rowId", jsi::Value(static_cast<double>(row_id)));
72-
73-
callback->asObject(rt).asFunction(rt).call(rt, res);
74-
});
70+
invoker->invokeAsync([callback = update_hook_callback, table, operation,
71+
row_id](jsi::Runtime &rt) {
72+
auto res = jsi::Object(rt);
73+
res.setProperty(rt, "table", jsi::String::createFromUtf8(rt, table));
74+
res.setProperty(rt, "operation",
75+
jsi::String::createFromUtf8(rt, operation));
76+
res.setProperty(rt, "rowId", jsi::Value(static_cast<double>(row_id)));
77+
78+
callback->asObject(rt).asFunction(rt).call(rt, res);
79+
});
7580
}
7681

7782
for (const auto &query_ptr : reactive_queries) {
@@ -144,7 +149,7 @@ void DBHostObject::auto_register_update_hook() {
144149
DBHostObject::DBHostObject(jsi::Runtime &rt, std::string &url,
145150
std::string &auth_token)
146151
: db_name(url) {
147-
_thread_pool = std::make_shared<ThreadPool>();
152+
thread_pool = std::make_shared<ThreadPool>();
148153
db = opsqlite_libsql_open_remote(url, auth_token);
149154

150155
create_jsi_functions(rt);
@@ -158,7 +163,7 @@ DBHostObject::DBHostObject(jsi::Runtime &rt, std::string &db_name,
158163
std::string &remote_encryption_key)
159164
: db_name(db_name) {
160165

161-
_thread_pool = std::make_shared<ThreadPool>();
166+
thread_pool = std::make_shared<ThreadPool>();
162167

163168
db =
164169
opsqlite_libsql_open_sync(db_name, path, url, auth_token, sync_interval,
@@ -175,7 +180,7 @@ DBHostObject::DBHostObject(jsi::Runtime &rt, std::string &base_path,
175180
std::string &sqlite_vec_path,
176181
std::string &encryption_key)
177182
: base_path(base_path), db_name(db_name) {
178-
_thread_pool = std::make_shared<ThreadPool>();
183+
thread_pool = std::make_shared<ThreadPool>();
179184

180185
#ifdef OP_SQLITE_USE_SQLCIPHER
181186
db = opsqlite_open(db_name, path, crsqlite_path, sqlite_vec_path,
@@ -281,7 +286,7 @@ void DBHostObject::create_jsi_functions(jsi::Runtime &rt) {
281286
: std::vector<JSVariant>();
282287

283288
return promisify(
284-
rt,
289+
rt, thread_pool,
285290
[this, query, params]() {
286291
std::vector<std::vector<JSVariant>> results;
287292
#ifdef OP_SQLITE_USE_LIBSQL
@@ -341,7 +346,7 @@ void DBHostObject::create_jsi_functions(jsi::Runtime &rt) {
341346
: std::vector<JSVariant>();
342347

343348
return promisify(
344-
rt,
349+
rt, thread_pool,
345350
[this, query, params]() {
346351
#ifdef OP_SQLITE_USE_LIBSQL
347352
auto status = opsqlite_libsql_execute(db, query, &params);
@@ -363,7 +368,7 @@ void DBHostObject::create_jsi_functions(jsi::Runtime &rt) {
363368
: std::vector<JSVariant>();
364369

365370
return promisify(
366-
rt,
371+
rt, thread_pool,
367372
[this, query, params]() {
368373
std::vector<DumbHostObject> results;
369374
std::shared_ptr<std::vector<SmartHostObject>> metadata =
@@ -408,7 +413,7 @@ void DBHostObject::create_jsi_functions(jsi::Runtime &rt) {
408413
to_batch_arguments(rt, batchParams, &commands);
409414

410415
return promisify(
411-
rt,
416+
rt, thread_pool,
412417
[this, commands]() {
413418
#ifdef OP_SQLITE_USE_LIBSQL
414419
auto batchResult = opsqlite_libsql_execute_batch(db, &commands);
@@ -432,7 +437,7 @@ void DBHostObject::create_jsi_functions(jsi::Runtime &rt) {
432437
return {};
433438
});
434439

435-
function_map["setReservedBytes"] =HFN(this) {
440+
function_map["setReservedBytes"] = HFN(this) {
436441
auto reserved_bytes = static_cast<int32_t>(args[0].asNumber());
437442
opsqlite_libsql_set_reserved_bytes(db, reserved_bytes);
438443
return {};
@@ -451,7 +456,8 @@ void DBHostObject::create_jsi_functions(jsi::Runtime &rt) {
451456
const std::string sqlFileName = args[0].asString(rt).utf8(rt);
452457

453458
return promisify(
454-
rt, [this, sqlFileName]() { return import_sql_file(db, sqlFileName); },
459+
rt, thread_pool,
460+
[this, sqlFileName]() { return import_sql_file(db, sqlFileName); },
455461
[](jsi::Runtime &rt, std::any prev) {
456462
auto result = std::any_cast<BatchResult>(prev);
457463
auto res = jsi::Object(rt);
@@ -583,7 +589,8 @@ void DBHostObject::create_jsi_functions(jsi::Runtime &rt) {
583589
sqlite3_stmt *statement = opsqlite_prepare_statement(db, query);
584590
#endif
585591
auto preparedStatementHostObject =
586-
std::make_shared<PreparedStatementHostObject>(db, statement);
592+
std::make_shared<PreparedStatementHostObject>(db, statement,
593+
thread_pool);
587594

588595
return jsi::Object::createFromHostObject(rt, preparedStatementHostObject);
589596
});
@@ -621,7 +628,7 @@ void DBHostObject::create_jsi_functions(jsi::Runtime &rt) {
621628
flush_pending_reactive_queries(resolve);
622629
};
623630

624-
_thread_pool->queueWork(task);
631+
thread_pool->queueWork(task);
625632

626633
return {};
627634
}));
@@ -664,7 +671,7 @@ void DBHostObject::invalidate() {
664671
}
665672

666673
invalidated = true;
667-
_thread_pool->restartPool();
674+
thread_pool->restartPool();
668675
#ifdef OP_SQLITE_USE_LIBSQL
669676
opsqlite_libsql_close(db);
670677
#else

cpp/DBHostObject.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ class JSI_EXPORT DBHostObject : public jsi::HostObject {
7878

7979
std::unordered_map<std::string, jsi::Value> function_map;
8080
std::string base_path;
81-
std::shared_ptr<ThreadPool> _thread_pool;
81+
std::shared_ptr<ThreadPool> thread_pool;
8282
std::string db_name;
8383
std::shared_ptr<jsi::Value> update_hook_callback;
8484
std::shared_ptr<jsi::Value> commit_hook_callback;

cpp/PreparedStatementHostObject.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ jsi::Value PreparedStatementHostObject::get(jsi::Runtime &rt,
3232
std::vector<JSVariant> params = to_variant_vec(rt, js_params);
3333

3434
return promisify(
35-
rt,
35+
rt, _thread_pool,
3636
[this, params]() {
3737
#ifdef OP_SQLITE_USE_LIBSQL
3838
opsqlite_libsql_bind_statement(_stmt, &params);
@@ -77,7 +77,7 @@ jsi::Value PreparedStatementHostObject::get(jsi::Runtime &rt,
7777
}
7878

7979
return promisify(
80-
rt,
80+
rt, _thread_pool,
8181
[this]() {
8282
std::vector<DumbHostObject> results;
8383
auto metadata = std::make_shared<std::vector<SmartHostObject>>();

cpp/PreparedStatementHostObject.h

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,20 +24,23 @@ namespace react = facebook::react;
2424
class PreparedStatementHostObject : public jsi::HostObject {
2525
public:
2626
#ifdef OP_SQLITE_USE_LIBSQL
27-
PreparedStatementHostObject(
28-
DB const &db, libsql_stmt_t stmt)
29-
: _db(db), _stmt(stmt) {};
27+
PreparedStatementHostObject(DB const &db, libsql_stmt_t stmt,
28+
std::shared_ptr<ThreadPool> thread_pool)
29+
: _db(db), _stmt(stmt), _thread_pool(thread_pool) {};
3030
#else
31-
PreparedStatementHostObject(sqlite3 *db, sqlite3_stmt *stmt)
32-
: _db(db), _stmt(stmt) {};
31+
PreparedStatementHostObject(sqlite3 *db, sqlite3_stmt *stmt,
32+
std::shared_ptr<ThreadPool> thread_pool)
33+
: _db(db), _stmt(stmt), _thread_pool(thread_pool) {};
3334
#endif
35+
3436
~PreparedStatementHostObject() override;
3537

3638
std::vector<jsi::PropNameID> getPropertyNames(jsi::Runtime &rt) override;
3739

3840
jsi::Value get(jsi::Runtime &rt, const jsi::PropNameID &propNameID) override;
3941

4042
private:
43+
std::shared_ptr<ThreadPool> _thread_pool;
4144
#ifdef OP_SQLITE_USE_LIBSQL
4245
DB _db;
4346
libsql_stmt_t _stmt;

cpp/utils.cpp

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,16 @@
55
#include "bridge.h"
66
#endif
77
#include "OPThreadPool.h"
8+
#include "macros.hpp"
89
#include <fstream>
910
#include <sys/stat.h>
1011
#include <utility>
11-
#include "macros.hpp"
1212

1313
namespace opsqlite {
1414

1515
namespace jsi = facebook::jsi;
1616
namespace react = facebook::react;
1717

18-
auto __thread_pool = std::make_shared<ThreadPool>();
19-
2018
inline jsi::Value to_jsi(jsi::Runtime &rt, const JSVariant &value) {
2119
if (std::holds_alternative<bool>(value)) {
2220
return std::get<bool>(value);
@@ -324,17 +322,20 @@ void log_to_console(jsi::Runtime &runtime, const std::string &message) {
324322
}
325323

326324
jsi::Value
327-
promisify(jsi::Runtime &rt, std::function<std::any()> lambda,
325+
promisify(jsi::Runtime &rt, std::shared_ptr<ThreadPool> thread_pool,
326+
std::function<std::any()> lambda,
328327
std::function<jsi::Value(jsi::Runtime &rt, std::any result)>
329328
resolve_callback) {
330329
auto promise_constructor = rt.global().getPropertyAsFunction(rt, "Promise");
331330

332-
auto executor = HFN2(lambda = std::move(lambda),
333-
resolve_callback = std::move(resolve_callback)) {
331+
auto executor =
332+
HFN3(lambda = std::move(lambda),
333+
resolve_callback = std::move(resolve_callback), thread_pool) {
334334
auto resolve = std::make_shared<jsi::Value>(rt, args[0]);
335335
auto reject = std::make_shared<jsi::Value>(rt, args[1]);
336336

337-
auto task = [lambda = lambda, resolve_callback = resolve_callback,
337+
auto task = [lambda = lambda, thread_pool,
338+
resolve_callback = resolve_callback,
338339
resolve = std::move(resolve), reject = std::move(reject)]() {
339340
try {
340341
std::any result = lambda();
@@ -374,7 +375,7 @@ promisify(jsi::Runtime &rt, std::function<std::any()> lambda,
374375
}
375376
};
376377

377-
__thread_pool->queueWork(task);
378+
thread_pool->queueWork(task);
378379

379380
return jsi::Value(nullptr);
380381
});

cpp/utils.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include <ReactCommon/CallInvoker.h>
1313
#include <string>
1414
#include <vector>
15+
#include "OPThreadPool.h"
1516

1617
namespace opsqlite {
1718

@@ -51,7 +52,7 @@ bool file_exists(const std::string &path);
5152
void log_to_console(jsi::Runtime &rt, const std::string &message);
5253

5354
jsi::Value
54-
promisify(jsi::Runtime &rt, std::function<std::any()> lambda,
55+
promisify(jsi::Runtime &rt, std::shared_ptr<ThreadPool> thread_pool, std::function<std::any()> lambda,
5556
std::function<jsi::Value(jsi::Runtime &rt, std::any result)>
5657
resolve_callback);
5758

example/ios/Podfile.lock

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2027,7 +2027,7 @@ EXTERNAL SOURCES:
20272027
SPEC CHECKSUMS:
20282028
FBLazyVector: 2e5b5553df729e080483373db6f045201ff4e6db
20292029
hermes-engine: 273e30e7fb618279934b0b95ffab60ecedb7acf5
2030-
op-sqlite: 44765a0bf429dbb8cc5e301b81114faa080df893
2030+
op-sqlite: 4651f571998e9739cd4fe16f033bd8a159279da6
20312031
OpServer: 9b3ebdeeb095950e760e3c39853cd06849421b35
20322032
RCTDeprecation: c6b36da89aa26090c8684d29c2868dcca2cd4554
20332033
RCTRequired: 1413a0844770d00fa1f1bb2da4680adfa8698065

op-sqlite.podspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ Pod::Spec.new do |s|
147147
end
148148

149149
other_cflags = '$(inherited) -DSQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION=1 -DHAVE_USLEEP=1 -DSQLITE_ENABLE_LOCKING_STYLE=0'
150-
optimizedCflags = ' -DSQLITE_DQS=0 -DSQLITE_DEFAULT_MEMSTATUS=0 -DSQLITE_DEFAULT_WAL_SYNCHRONOUS=1 -DSQLITE_LIKE_DOESNT_MATCH_BLOBS=1 -DSQLITE_MAX_EXPR_DEPTH=0 -DSQLITE_OMIT_DEPRECATED=1 -DSQLITE_OMIT_PROGRESS_CALLBACK=1 -DSQLITE_OMIT_SHARED_CACHE=1 -DSQLITE_USE_ALLOCA=1 -DSQLITE_STRICT_SUBTYPE=1'
150+
optimizedCflags = ' -DSQLITE_DQS=0 -DSQLITE_DEFAULT_MEMSTATUS=0 -DSQLITE_DEFAULT_WAL_SYNCHRONOUS=1 -DSQLITE_LIKE_DOESNT_MATCH_BLOBS=1 -DSQLITE_MAX_EXPR_DEPTH=0 -DSQLITE_OMIT_DEPRECATED=1 -DSQLITE_OMIT_PROGRESS_CALLBACK=1 -DSQLITE_OMIT_SHARED_CACHE=1 -DSQLITE_USE_ALLOCA=1 -DSQLITE_STRICT_SUBTYPE=1 -DSQLITE_THREADSAFE=2'
151151
frameworks = []
152152

153153
if fts5 then

0 commit comments

Comments
 (0)