@@ -361,9 +361,14 @@ struct Database {
361361 filterPolicy_(leveldb::NewBloomFilterPolicy(10 )),
362362 currentIteratorId_(0 ),
363363 pendingCloseWorker_(NULL ),
364+ ref_(NULL ),
364365 priorityWork_(0 ) {}
365366
366367 ~Database () {
368+ if (ref_ != NULL ) {
369+ napi_delete_reference (env_, ref_);
370+ }
371+
367372 if (db_ != NULL ) {
368373 delete db_;
369374 db_ = NULL ;
@@ -444,11 +449,13 @@ struct Database {
444449 }
445450
446451 void IncrementPriorityWork () {
447- ++ priorityWork_;
452+ napi_reference_ref (env_, ref_, & priorityWork_) ;
448453 }
449454
450455 void DecrementPriorityWork () {
451- if (--priorityWork_ == 0 && pendingCloseWorker_ != NULL ) {
456+ napi_reference_unref (env_, ref_, &priorityWork_);
457+
458+ if (priorityWork_ == 0 && pendingCloseWorker_ != NULL ) {
452459 pendingCloseWorker_->Queue ();
453460 pendingCloseWorker_ = NULL ;
454461 }
@@ -465,6 +472,7 @@ struct Database {
465472 uint32_t currentIteratorId_;
466473 BaseWorker *pendingCloseWorker_;
467474 std::map< uint32_t , Iterator * > iterators_;
475+ napi_ref ref_;
468476
469477private:
470478 uint32_t priorityWork_;
@@ -828,11 +836,16 @@ NAPI_METHOD(db_init) {
828836 NAPI_STATUS_THROWS (napi_create_external (env, database,
829837 FinalizeDatabase,
830838 NULL , &result));
839+
840+ // Reference counter to prevent GC of database while priority workers are active
841+ NAPI_STATUS_THROWS (napi_create_reference (env, result, 0 , &database->ref_ ));
842+
831843 return result;
832844}
833845
834846/* *
835847 * Worker class for opening a database.
848+ * TODO: shouldn't this be a PriorityWorker?
836849 */
837850struct OpenWorker final : public BaseWorker {
838851 OpenWorker (napi_env env,
@@ -1133,7 +1146,6 @@ struct ClearWorker final : public PriorityWorker {
11331146 }
11341147
11351148 ~ClearWorker () {
1136- // TODO: write GC tests
11371149 delete baseIterator_;
11381150 delete writeOptions_;
11391151 }
@@ -1476,6 +1488,7 @@ struct EndWorker final : public BaseWorker {
14761488 }
14771489
14781490 void HandleOKCallback () override {
1491+ // TODO: if we don't use EndWorker, do we still delete the reference?
14791492 napi_delete_reference (env_, iterator_->Detach ());
14801493 BaseWorker::HandleOKCallback ();
14811494 }
0 commit comments