Merge pull request #4493 from Tilka/evdev

Fix evdev threading
This commit is contained in:
Markus Wick 2016-12-25 20:55:50 +01:00 committed by GitHub
commit 190c6218ab
1 changed files with 11 additions and 10 deletions

View File

@ -116,19 +116,22 @@ static void HotplugThreadFunc()
static void StartHotplugThread()
{
if (s_hotplug_thread_running.IsSet())
// Mark the thread as running.
if (!s_hotplug_thread_running.TestAndSet())
// It was already running.
return;
s_wakeup_eventfd = eventfd(0, 0);
_assert_msg_(PAD, s_wakeup_eventfd != -1, "Couldn't create eventfd.");
s_hotplug_thread_running.Set(true);
s_hotplug_thread = std::thread(HotplugThreadFunc);
}
static void StopHotplugThread()
{
if (s_hotplug_thread_running.TestAndClear())
{
// Tell the hotplug thread to stop.
if (!s_hotplug_thread_running.TestAndClear())
// It wasn't running, we're done.
return;
// Write something to efd so that select() stops blocking.
uint64_t value = 1;
if (write(s_wakeup_eventfd, &value, sizeof(uint64_t)) < 0)
@ -136,12 +139,10 @@ static void StopHotplugThread()
}
s_hotplug_thread.join();
}
}
void Init()
{
s_devnode_name_map.clear();
PopulateDevices();
StartHotplugThread();
}