Hello,

I'm having a problem that I did not use to have, using vibe.d + ddb (postgres driver with vibe.d support). I'm not sure with which version of vibe.d or ddb it started with, so I provide details for several vibe.d releases. I did not test with several ddb releases because there is only one release tag, which I actually did help create :-) (it used to use a ~master dependency).

The bug can be exercised with the following program. It should be compiled and run as part of vibe.d, but it does not even require that one does a vibe.d's listenHTTP for the problem to appear (I think):

import ddb.postgres;

PGConnection pgdb;

shared static this()
{
	auto pdb = new PostgresDB([
		"host":     "localhost",
		"database": "foo",
		"user":     "bar",
		"password": "baz",
	]);
    
	pgdb = pdb.lockConnection();
}

shared static ~this()
{
    pgdb.close();
}

The program works correctly except when closing (with ctrl-C), after which it complains and often crashes. Here is the output for several vibe.d versions:

0.7.19

OS X:
Received signal 2. Shutting down.
Exception in lev_lock_mutex: Unknown lock handle
Exception in lev_unlock_mutex: Unknown lock handle
Exception in lev_lock_mutex: Unknown lock handle
Exception in lev_unlock_mutex: Unknown lock handle
Exception in lev_lock_mutex: Unknown lock handle
Exception in lev_unlock_mutex: Unknown lock handle
Exception in lev_lock_mutex: Unknown lock handle
Exception in lev_unlock_mutex: Unknown lock handle
Exception in lev_lock_mutex: Unknown lock handle

Linux:
Received signal 2. Shutting down.
Exception in lev_lock_mutex: Unknown lock handle
Exception in lev_unlock_mutex: Unknown lock handle
Exception in lev_lock_mutex: Unknown lock handle
[warn] Epoll ADD(4) on fd 8 failed.  Old events were 0; read change was 0 (none); write change was 1 (add): Invalid argument
Exception in lev_unlock_mutex: Unknown lock handle
Exception in lev_lock_mutex: Unknown lock handle
Exception in lev_unlock_mutex: Unknown lock handle
Exception in lev_lock_mutex: Unknown lock handle
[warn] Epoll ADD(4) on fd 8 failed.  Old events were 0; read change was 0 (none); write change was 1 (add): Invalid argument
Exception in lev_unlock_mutex: Unknown lock handle
Exception in lev_lock_mutex: Unknown lock handle
Exception in lev_unlock_mutex: Unknown lock handle
Exception in lev_lock_mutex: Unknown lock handle
Exception in lev_unlock_mutex: Unknown lock handle
core.exception.AssertError@../.dub/packages/vibe-d-0.7.19/source/vibe/core/driver.d(27): No event driver loaded. Did the vibe.core.core module constructor run?
----------------
./appname(_d_assert_msg+0x45) [0x739d7d]
./appname(vibe.core.driver.EventDriver vibe.core.driver.getEventDriver(bool)+0x5f) [0x630ae3]
./appname(void vibe.core.core.VibeDriverCore.yieldForEvent()+0x1c1) [0x62c99d]
./appname(void vibe.core.drivers.libevent2_tcp.Libevent2TCPConnection.close()+0x14b) [0x63f86f]
./appname(void ddb.postgres.PGConnection.close()+0x7d) [0x6124c9]
./appname(void app._sharedStaticDtor2()+0x1f) [0x5f5b67]
./appname(void app.__modshareddtor()+0x9) [0x60f0b1]
./appname(pure void rt.minfo.__T17runModuleFuncsRevS452rt5minfo11ModuleGroup8runDtorsMFZv9__lambda1Z.runModuleFuncsRev(object.ModuleInfo*[])+0x61) [0x77869d]
./appname(void rt.minfo.ModuleGroup.runDtors()+0x1d) [0x778319]
./appname(int rt.minfo.rt_moduleDtor().__foreachbody1(ref rt.sections_linux.DSO)+0x1c) [0x744c58]
./appname(int rt.sections_linux.DSO.opApplyReverse(scope int delegate(ref rt.sections_linux.DSO))+0x46) [0x744eca]
./appname(rt_moduleDtor+0x19) [0x744c35]
./appname(rt_term+0x4a) [0x74003a]
./appname(void rt.dmain2._d_run_main(int, char**, extern (C) int function(char[][])*).runAll()+0x3e) [0x74034e]
./appname(void rt.dmain2._d_run_main(int, char**, extern (C) int function(char[][])*).tryExec(scope void delegate())+0x2a) [0x7402da]
./appname(_d_run_main+0x1a3) [0x74025b]
./appname(main+0x25) [0x60f185]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf5) [0x7f804f51fde5]

0.7.18

OS X:
Exception in lev_unlock_mutex: Unknown lock handle
Exception in lev_lock_mutex: Unknown lock handle
Exception in lev_unlock_mutex: Unknown lock handle
Exception in lev_lock_mutex: Unknown lock handle
Exception in lev_unlock_mutex: Unknown lock handle
core.exception.AssertError@../../../../.dub/packages/vibe-d-0.7.18/source/vibe/core/driver.d(28): No event driver loaded. Did the vibe.core.core module constructor run?
----------------
5   www.luismarques.eu                  0x000000010663ad8d _d_assert_msg + 69
6   www.luismarques.eu                  0x00000001065af336 vibe.core.driver.EventDriver vibe.core.driver.getEventDriver(bool) + 90
7   www.luismarques.eu                  0x00000001065aa49d void vibe.core.core.VibeDriverCore.yieldForEvent() + 329
8   www.luismarques.eu                  0x00000001065b79cd void vibe.core.drivers.libevent2_tcp.Libevent2TCPConnection.close() + 381
9   www.luismarques.eu                  0x000000010655f8d5 void ddb.postgres.PGConnection.close() + 125
10  www.luismarques.eu                  0x000000010654ae4f void db._sharedStaticDtor3() + 55
11  www.luismarques.eu                  0x0000000106511d09 void db.__modshareddtor() + 9
12  www.luismarques.eu                  0x000000010664dc49 pure void rt.minfo.__T17runModuleFuncsRevS452rt5minfo11ModuleGroup8runDtorsMFZv9__lambda1Z.runModuleFuncsRev(object.ModuleInfo*[]) + 97
13  www.luismarques.eu                  0x000000010664d685 void rt.minfo.ModuleGroup.runDtors() + 29
14  www.luismarques.eu                  0x000000010664da0c int rt.minfo.rt_moduleDtor().__foreachbody1(ref rt.sections_osx.SectionGroup) + 28
15  www.luismarques.eu                  0x000000010664d9e9 rt_moduleDtor + 41
16  www.luismarques.eu                  0x0000000106647ec5 rt_term + 73
17  www.luismarques.eu                  0x0000000106648222 void rt.dmain2._d_run_main(int, char**, extern (C) int function(char[][])*).runAll() + 62
18  www.luismarques.eu                  0x00000001066481b1 void rt.dmain2._d_run_main(int, char**, extern (C) int function(char[][])*).tryExec(scope void delegate()) + 45
19  www.luismarques.eu                  0x000000010664812d _d_run_main + 449
20  www.luismarques.eu                  0x000000010656a1ea main + 34
21  libdyld.dylib                       0x00007fff8d5275fd start + 1
22  ???                                 0x0000000000000001 0x0 + 1

0.7.17

OS X:
Received signal 2. Shutting down.
Exception in lev_lock_mutex: Assertion failure

0.7.16

No longer compiles:

Undefined symbols for architecture x86_64:
  "_D4vibe4core3log10ss_loggersAOC4vibe4core3log6Logger", referenced from:
      _D4vibe4core3log186__T3logVE4vibe4core3log8LogLevel2VAyaa67_2e2e2f2e2e2f2e6475622f7061636b616765732f766962652d642d302e372e31392f736f757263652f766962652f636f72652f636f6e6e656374696f6e706f6f6c2e64Vi60TAyaTmZ3logFNbAyaKmZv in libddb.a(log_d80_2457.o)
      _D4vibe4core3log187__T3logVE4vibe4core3log8LogLevel2VAyaa67_2e2e2f2e2e2f2e6475622f7061636b616765732f766962652d642d302e372e31392f736f757263652f766962652f636f72652f636f6e6e656374696f6e706f6f6c2e64Vi55TAyaTPvZ3logFNbAyaKPvZv in libddb.a(log_d7e_2412.o)
      _D4vibe4core3log190__T3logVE4vibe4core3log8LogLevel2VAyaa67_2e2e2f2e2e2f2e6475622f7061636b616765732f766962652d642d302e372e31392f736f757263652f766962652f636f72652f636f6e6e656374696f6e706f6f6c2e64Vi53TAyaTAyaTmZ3logFNbAyaKAyaKmZv in libddb.a(log_d7c_273c.o)
      _D4vibe4core3log192__T3logVE4vibe4core3log8LogLevel0VAyaa67_2e2e2f2e2e2f2e6475622f7061636b616765732f766962652d642d302e372e31392f736f757263652f766962652f636f72652f636f6e6e656374696f6e706f6f6c2e64Vi50TAyaTAyaTmTmZ3logFNbAyaKAyaKmKmZv in libddb.a(log_d78_29a8.o)
ld: symbol(s) not found for architecture x86_64

This behavior does not happen if one skips the module destructor:

shared static ~this()
{
    //pgdb.close();
}

Yet, the close operation of ddb does not have anything very obvious to fix:

void close()
{
    sendTerminateMessage();
    stream.socket.close();
}

void sendTerminateMessage()
{
    stream.write('X');
    stream.write(cast(int)4);
}

...so I don't know how to proceed. Since the crash seems vibe.d-related, I'm asking for help here, for a start. Any ideas?