Commit 1c2210b5 by Konstantin Käfer

properly close database handles in all circumstances

parent 32b1b552
...@@ -279,6 +279,17 @@ void Database::Wrap(Handle<Object> handle) { ...@@ -279,6 +279,17 @@ void Database::Wrap(Handle<Object> handle) {
handle_.MakeWeak(this, Destruct); handle_.MakeWeak(this, Destruct);
} }
inline void Database::MakeWeak (void) {
handle_.MakeWeak(this, Destruct);
}
void Database::Unref() {
assert(!handle_.IsEmpty());
assert(!handle_.IsWeak());
assert(refs_ > 0);
if (--refs_ == 0) { MakeWeak(); }
}
void Database::Destruct(Persistent<Value> value, void *data) { void Database::Destruct(Persistent<Value> value, void *data) {
Database* db = static_cast<Database*>(data); Database* db = static_cast<Database*>(data);
if (db->handle) { if (db->handle) {
......
...@@ -77,7 +77,8 @@ protected: ...@@ -77,7 +77,8 @@ protected:
} }
~Database() { ~Database() {
fprintf(stderr, "Calling destructor\n"); assert(handle == NULL);
fprintf(stderr, "Deleted Database\n");
} }
static Handle<Value> New(const Arguments& args); static Handle<Value> New(const Arguments& args);
...@@ -95,6 +96,8 @@ protected: ...@@ -95,6 +96,8 @@ protected:
static int EIO_AfterClose(eio_req *req); static int EIO_AfterClose(eio_req *req);
void Wrap (Handle<Object> handle); void Wrap (Handle<Object> handle);
inline void MakeWeak();
virtual void Unref();
static void Destruct (Persistent<Value> value, void *data); static void Destruct (Persistent<Value> value, void *data);
static int EIO_Destruct(eio_req *req); static int EIO_Destruct(eio_req *req);
static int EIO_AfterDestruct(eio_req *req); static int EIO_AfterDestruct(eio_req *req);
......
...@@ -100,7 +100,7 @@ Handle<Value> Statement::New(const Arguments& args) { ...@@ -100,7 +100,7 @@ Handle<Value> Statement::New(const Arguments& args) {
void Statement::EIO_BeginPrepare(Baton* baton) { void Statement::EIO_BeginPrepare(Baton* baton) {
assert(baton->db->open); assert(baton->db->open);
assert(!baton->db->locked); assert(!baton->db->locked);
// static_cast<PrepareBaton*>(baton)->stmt->Ref(); static_cast<PrepareBaton*>(baton)->stmt->Ref();
ev_ref(EV_DEFAULT_UC); ev_ref(EV_DEFAULT_UC);
fprintf(stderr, "Prepare started\n"); fprintf(stderr, "Prepare started\n");
eio_custom(EIO_Prepare, EIO_PRI_DEFAULT, EIO_AfterPrepare, baton); eio_custom(EIO_Prepare, EIO_PRI_DEFAULT, EIO_AfterPrepare, baton);
...@@ -191,9 +191,19 @@ void Statement::Wrap(Handle<Object> handle) { ...@@ -191,9 +191,19 @@ void Statement::Wrap(Handle<Object> handle) {
handle_.MakeWeak(this, Destruct); handle_.MakeWeak(this, Destruct);
} }
inline void Statement::MakeWeak (void) {
handle_.MakeWeak(this, Destruct);
}
void Statement::Unref() {
assert(!handle_.IsEmpty());
assert(!handle_.IsWeak());
assert(refs_ > 0);
if (--refs_ == 0) { MakeWeak(); }
}
void Statement::Destruct(Persistent<Value> value, void *data) { void Statement::Destruct(Persistent<Value> value, void *data) {
Statement* stmt = static_cast<Statement*>(data); Statement* stmt = static_cast<Statement*>(data);
fprintf(stderr, "Auto-Finalizing handle started\n");
if (stmt->handle) { if (stmt->handle) {
eio_custom(EIO_Destruct, EIO_PRI_DEFAULT, EIO_AfterDestruct, stmt); eio_custom(EIO_Destruct, EIO_PRI_DEFAULT, EIO_AfterDestruct, stmt);
ev_ref(EV_DEFAULT_UC); ev_ref(EV_DEFAULT_UC);
......
...@@ -52,6 +52,7 @@ public: ...@@ -52,6 +52,7 @@ public:
~Statement() { ~Statement() {
fprintf(stderr, "Deleted Statement\n"); fprintf(stderr, "Deleted Statement\n");
assert(handle == NULL);
db->pending--; db->pending--;
Database::Process(db); Database::Process(db);
db->Unref(); db->Unref();
...@@ -63,7 +64,9 @@ protected: ...@@ -63,7 +64,9 @@ protected:
static int EIO_AfterPrepare(eio_req *req); static int EIO_AfterPrepare(eio_req *req);
void Wrap (Handle<Object> handle); void Wrap (Handle<Object> handle);
static void Destruct (Persistent<Value> value, void *data); inline void MakeWeak();
virtual void Unref();
static void Destruct(Persistent<Value> value, void *data);
static int EIO_Destruct(eio_req *req); static int EIO_Destruct(eio_req *req);
static int EIO_AfterDestruct(eio_req *req); static int EIO_AfterDestruct(eio_req *req);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment