EventManager rewritten to support a push arch instead of an internal poll. Crash finally fixed!!! The dangers of threading.

This commit is contained in:
watsonb8
2019-07-15 12:14:38 -04:00
parent d78dce44f0
commit 00b39b1d84
6 changed files with 254 additions and 327 deletions

View File

@ -1,10 +1,11 @@
using System;
using System.Threading.Tasks;
using System.Threading;
using System.Collections.Generic;
using System.Linq;
using Aurora.Services;
using System.Linq;
using Aurora.Services.EventManager;
using Aurora.Proto.Events;
using Aurora.Proto.General;
namespace Aurora.RemoteImpl
{
@ -24,24 +25,19 @@ namespace Aurora.RemoteImpl
/// <returns></returns>
public async override Task GetEvents(EventsRequest request, Grpc.Core.IServerStreamWriter<BaseEvent> responseStream, Grpc.Core.ServerCallContext context)
{
try
string peerId = Combine(new string[] { context.Peer, request.ClientId });
Console.WriteLine(string.Format("SERVER - Events request received from peer: {0}", peerId));
AutoResetEvent are = new AutoResetEvent(false);
Action<BaseEvent> callback = (BaseEvent bEvent) =>
{
while (EventManager.Instance.GetSubscriptionCount(Combine(new string[] { context.Peer, request.ClientId })) > 0)
{
Console.WriteLine("Peer " + context.Peer);
//TODO this causes crashes when two or more members are connected
//TODO Change this to events based stream instead of a poll based...
List<BaseEvent> events = EventManager.Instance.GetSessionEvents(Combine(new string[] { context.Peer, request.ClientId }));
foreach (BaseEvent currentEvent in events)
{
await responseStream.WriteAsync(currentEvent);
}
}
}
catch (Exception ex)
{
Console.WriteLine("Exception caught:" + ex.Message);
}
Console.WriteLine(string.Format("SERVER - Event fired for peer: {0}", peerId));
responseStream.WriteAsync(bEvent);
};
EventManager.Instance.AddEventHandler(callback, Combine(new string[] { context.Peer, request.ClientId }));
are.WaitOne();
}
/// <summary>
@ -52,6 +48,7 @@ namespace Aurora.RemoteImpl
/// <returns></returns>
public override Task<SubscriptionResponse> SubscribeToEvents(SubscribeRequest request, Grpc.Core.ServerCallContext context)
{
Console.WriteLine(string.Format("SERVER - Subscription from client with id: {0}", request.ClientId));
EventManager.Instance.AddSubscriptionList(Combine(new string[] { context.Peer, request.ClientId }), request.EventTypes.ToList());
return Task.FromResult(new SubscriptionResponse { Successful = true });

View File

@ -2,12 +2,9 @@ using System;
using System.Threading.Tasks;
using System.Collections.ObjectModel;
using System.Linq;
using Google.Protobuf.WellKnownTypes;
using Aurora.Proto.Party;
using Aurora.Proto.General;
using Aurora.Proto.Events;
using Aurora.Models;
using Aurora.Services;
using Aurora.Services.EventManager;
namespace Aurora.RemoteImpl
{
@ -39,6 +36,8 @@ namespace Aurora.RemoteImpl
IpAddress = context.Host,
};
Console.WriteLine("SERVER - Client joined party: " + partyMember.Id);
_partyMembers.Add(partyMember);
BaseEvent e = new BaseEvent
@ -50,7 +49,7 @@ namespace Aurora.RemoteImpl
}
};
EventManager.Instance.PushEvent(e);
EventManager.Instance.FireEvent(e);
JoinPartyResponse response = new JoinPartyResponse() { Status = PartyJoinedStatusEnum.Connected, ClientId = partyMember.Id };
return Task.FromResult(response);
@ -71,7 +70,7 @@ namespace Aurora.RemoteImpl
}
};
EventManager.Instance.PushEvent(bv);
EventManager.Instance.FireEvent(bv);
LeavePartyResponse response = new LeavePartyResponse() { Status = PartyJoinedStatusEnum.Disconnected };
return Task.FromResult(response);