12
12
#include < map>
13
13
#include < vector>
14
14
#include < mutex>
15
+ #include < atomic>
15
16
16
17
/* *
17
18
* Forward declarations.
@@ -943,6 +944,7 @@ struct Iterator final : public BaseIterator {
943
944
first_(true ),
944
945
nexting_(false ),
945
946
isClosing_(false ),
947
+ aborted_(false ),
946
948
ended_(false ),
947
949
state_(state),
948
950
ref_(NULL ) {
@@ -966,7 +968,7 @@ struct Iterator final : public BaseIterator {
966
968
size_t bytesRead = 0 ;
967
969
leveldb::Slice empty;
968
970
969
- while (true ) {
971
+ while (!aborted_ ) {
970
972
if (!first_) Next ();
971
973
else first_ = false ;
972
974
@@ -1005,6 +1007,7 @@ struct Iterator final : public BaseIterator {
1005
1007
bool first_;
1006
1008
bool nexting_;
1007
1009
bool isClosing_;
1010
+ std::atomic<bool > aborted_;
1008
1011
bool ended_;
1009
1012
unsigned char * state_;
1010
1013
std::vector<Entry> cache_;
@@ -1819,6 +1822,16 @@ NAPI_METHOD(iterator_close) {
1819
1822
return promise;
1820
1823
}
1821
1824
1825
+ /* *
1826
+ * Aborts a NextWorker (if any, eventually).
1827
+ */
1828
+ NAPI_METHOD (iterator_abort) {
1829
+ NAPI_ARGV (1 );
1830
+ NAPI_ITERATOR_CONTEXT ();
1831
+ iterator->aborted_ = true ;
1832
+ NAPI_RETURN_UNDEFINED ();
1833
+ }
1834
+
1822
1835
/* *
1823
1836
* Worker class for nexting an iterator.
1824
1837
*/
@@ -1842,6 +1855,15 @@ struct NextWorker final : public BaseWorker {
1842
1855
}
1843
1856
1844
1857
void HandleOKCallback (napi_env env, napi_deferred deferred) override {
1858
+ if (iterator_->aborted_ ) {
1859
+ napi_value err = CreateCodeError (env, " LEVEL_ABORTED" , " Operation has been aborted" );
1860
+ napi_value name;
1861
+ napi_create_string_utf8 (env, " AbortError" , NAPI_AUTO_LENGTH, &name);
1862
+ napi_set_named_property (env, err, " name" , name);
1863
+ napi_reject_deferred (env, deferred, err);
1864
+ return ;
1865
+ }
1866
+
1845
1867
size_t size = iterator_->cache_ .size ();
1846
1868
napi_value jsArray;
1847
1869
napi_create_array_with_length (env, size, &jsArray);
@@ -2173,6 +2195,7 @@ NAPI_INIT() {
2173
2195
NAPI_EXPORT_FUNCTION (iterator_seek);
2174
2196
NAPI_EXPORT_FUNCTION (iterator_close);
2175
2197
NAPI_EXPORT_FUNCTION (iterator_nextv);
2198
+ NAPI_EXPORT_FUNCTION (iterator_abort);
2176
2199
2177
2200
NAPI_EXPORT_FUNCTION (batch_do);
2178
2201
NAPI_EXPORT_FUNCTION (batch_init);
0 commit comments