EventManager rewritten to support a push arch instead of an internal poll. Crash finally fixed!!! The dangers of threading.
This commit is contained in:
@ -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 });
|
||||
|
@ -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);
|
||||
|
Reference in New Issue
Block a user