Use a Windows event to stop tinc when running as a service.
authorEtienne Dechamps <etienne@edechamps.fr>
Sat, 28 Jun 2014 14:19:11 +0000 (15:19 +0100)
committerEtienne Dechamps <etienne@edechamps.fr>
Sat, 28 Jun 2014 19:00:05 +0000 (20:00 +0100)
commitffbc99558cae4dff876645fe205349d8c4cd7acb
treeeb64a49149f00dc9ea26177126c0f254c196cbf6
parent2f9a1d4ab5ff51b05a5e8cc41a1528fdeb36c723
Use a Windows event to stop tinc when running as a service.

Currently, when the tinc service handler callback (which runs in a
separate thread) receives a service shutdown request, it calls
event_exit() to request the event loop to exit.

This approach has a few issues:

 - The event loop will only notice the exit request when the next event
   fires. This slows down tinc service shutdown. In some extreme cases
   (DeviceStandby enabled, long PingTimeout and no connections),
   shutdown can take ages.

 - Strictly speaking, because of the absence of memory barriers, there
   is no guarantee that the event loop will even notice an exit request
   coming from another thread. I suppose marking the "running" variable
   as "volatile" is supposed to alleviate that, but it's unclear whether
   that provides any guarantees with modern systems and compilers.

This commit fixes the issue by leveraging the new event loop Windows
interface, using a custom Windows event that is manually set when
shutdown is requested.
src/event.c
src/process.c