When building with -DENABLE_LIBWINIO, initializing the Windows event loop (specifically the pointer process::libwinio_loop) becomes a prerequisite to creating a Socket. If it has not been initialized, then when the Socket constructor calls prepare_async(), a null pointer is dereferenced, leading to a hang on Windows.
This was discovered in the simple program test-linkee where a Socket is created and used, but the entire libprocess event loop is unused. This is temporarily fixed by calling process::initialize() early in test-linkee, but this should probably not be required. Instead, prepare_async() (or any use of libwinio_loop should probably auto-initialize the event loop if required.
For now, I am adding fatal checks before a null pointer dereference.