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) {
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) {
Database* db = static_cast<Database*>(data);
if (db->handle) {
......
......@@ -77,7 +77,8 @@ protected:
}
~Database() {
fprintf(stderr, "Calling destructor\n");
assert(handle == NULL);
fprintf(stderr, "Deleted Database\n");
}
static Handle<Value> New(const Arguments& args);
......@@ -95,6 +96,8 @@ protected:
static int EIO_AfterClose(eio_req *req);
void Wrap (Handle<Object> handle);
inline void MakeWeak();
virtual void Unref();
static void Destruct (Persistent<Value> value, void *data);
static int EIO_Destruct(eio_req *req);
static int EIO_AfterDestruct(eio_req *req);
......
......@@ -100,7 +100,7 @@ Handle<Value> Statement::New(const Arguments& args) {
void Statement::EIO_BeginPrepare(Baton* baton) {
assert(baton->db->open);
assert(!baton->db->locked);
// static_cast<PrepareBaton*>(baton)->stmt->Ref();
static_cast<PrepareBaton*>(baton)->stmt->Ref();
ev_ref(EV_DEFAULT_UC);
fprintf(stderr, "Prepare started\n");
eio_custom(EIO_Prepare, EIO_PRI_DEFAULT, EIO_AfterPrepare, baton);
......@@ -191,9 +191,19 @@ void Statement::Wrap(Handle<Object> handle) {
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) {
Statement* stmt = static_cast<Statement*>(data);
fprintf(stderr, "Auto-Finalizing handle started\n");
if (stmt->handle) {
eio_custom(EIO_Destruct, EIO_PRI_DEFAULT, EIO_AfterDestruct, stmt);
ev_ref(EV_DEFAULT_UC);
......
......@@ -52,6 +52,7 @@ public:
~Statement() {
fprintf(stderr, "Deleted Statement\n");
assert(handle == NULL);
db->pending--;
Database::Process(db);
db->Unref();
......@@ -63,7 +64,9 @@ protected:
static int EIO_AfterPrepare(eio_req *req);
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_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