// TODO: these functions should not block the ipc thread /// <summary> /// Handles messages that are sent by clients by dispatching functions and then sending the results back /// </summary> /// <param name="connection"></param> /// <param name="message"></param> private static void OnClientMessage(NamedPipeConnection <SerializedFunction, SerializedResult> connection, SerializedFunction message) { // The pipeId that comes in from the message is the clients unique pipe id, // But that is not unique on the server, so we use the connections id. lock (client_lock) { // Log.WriteLine("Client message..."); // Log.WriteLine("{{"); // Log.WriteLine("\tClientId = {0}", message.ClientId); // Log.WriteLine("\tJobId = {0}", message.JobId); // Log.WriteLine("\tInterfaceId = {0}", message.InterfaceId); // Log.WriteLine("\tPipeId = \"{0}\"", connection.Id); // Log.WriteLine("\tName = \"{0}\"", message.Name); // if (message.Args == null) // { // Log.WriteLine("\tArgs = {}"); // } // else // { // Log.WriteLine("\tArgs = {{{0}}}", String.Join(",", message.Args)); // } // Log.WriteLine("}}"); Log.WriteLine("[{3}] [ClientMessage c: {1} p: {2}] \"{0}\"", message.Name, message.ClientId, message.PipeId, message.JobId); object result = null; try { result = Client.CallSerializedFunction(connection.Id, message.ClientId, message.InterfaceId, message.Name, message.Args); } catch (Exception e) { Console.WriteLine("Error occured processing job {0}, \"{1}\"", message.JobId, e.Message); } var result_message = new SerializedResult { PipeId = message.PipeId, ClientId = message.ClientId, InterfaceId = message.InterfaceId, JobId = message.JobId, Result = result, Args = message.Args, }; connection.PushMessage(result_message); } }
/// <summary> /// Called on every message send from the server /// </summary> /// <param name="connection">Current connection</param> /// <param name="message">Message recieved from the server</param> private static void OnServerMessage(NamedPipeConnection <SerializedResult, SerializedFunction> connection, SerializedResult message) { var pipe = ActivePipes[message.PipeId]; pipe.current_results.Add(message); var semaphore = pipe.result_semaphores[message.JobId]; semaphore.Release(); }
private string serializeResult(Result x) { SerializedResult c = new SerializedResult(x, Prefix, ResultResourceTemplate, FencerResourceTemplate, CompetitionResourceTemplate); return JsonConvert.SerializeObject(c); }