Move immediate connection notification logic into Dispatcher.

This prevents a race condition that could result in out of order
notifications.
This commit is contained in:
Peter Johnson
2017-09-30 23:37:02 -07:00
parent e4a8bff70e
commit e68a71022c
6 changed files with 48 additions and 14 deletions

View File

@@ -388,11 +388,7 @@ NT_ConnectionListener AddConnectionListener(
auto ii = InstanceImpl::Get(i);
if (!ii) return 0;
unsigned int uid = ii->connection_notifier.Add(callback);
if (immediate_notify) {
for (auto& conn : ii->dispatcher.GetConnections())
ii->connection_notifier.NotifyConnection(true, conn, uid);
}
unsigned int uid = ii->dispatcher.AddListener(callback, immediate_notify);
return Handle(i, uid, Handle::kConnectionListener);
}
@@ -422,12 +418,7 @@ NT_ConnectionListener AddPolledConnectionListener(
auto ii = InstanceImpl::Get(i);
if (id < 0 || !ii) return 0;
unsigned int uid = ii->connection_notifier.AddPolled(id);
// perform immediate notifications
if (immediate_notify) {
for (auto& conn : ii->dispatcher.GetConnections())
ii->connection_notifier.NotifyConnection(true, conn, uid);
}
unsigned int uid = ii->dispatcher.AddPolledListener(id, immediate_notify);
return Handle(i, uid, Handle::kConnectionListener);
}