Browse Source

IPC is now round tripping

Josh Engebretson 10 years ago
parent
commit
05fab7ad99

+ 24 - 11
Source/Atomic/IPC/IPC.cpp

@@ -14,26 +14,40 @@
 namespace Atomic
 {
 
-IPC::IPC(Context* context, int fd1, int fd2) : Object(context)
+IPC::IPC(Context* context) : Object(context)
 {
     SubscribeToEvent(E_UPDATE, HANDLER(IPC, HandleUpdate));
+}
 
-    if (fd1 != -1 && fd2 != -1)
-    {
-        // close server fd
-        close(fd1);
+IPC::~IPC()
+{
 
-        worker_ = new IPCWorker(fd2, context_);
-        worker_->Run();
+}
 
-        SendEventToBroker(E_IPCWORKERSTART);
-    }
+bool IPC::InitWorker(int fd1, int fd2)
+{
+    // close server fd
+    close(fd1);
 
+    worker_ = new IPCWorker(fd2, context_);
+    worker_->Run();
+
+    SendEventToBroker(E_IPCWORKERSTART);
+
+    return true;
 }
 
-IPC::~IPC()
+IPCBroker* IPC::SpawnWorker(const String& command, const Vector<String>& args, const String& initialDirectory)
 {
+    SharedPtr<IPCBroker> broker(new IPCBroker(context_));
 
+    if (broker->SpawnWorker(command, args, initialDirectory))
+    {
+        brokers_.Push(broker);
+        return broker;
+    }
+
+    return 0;
 }
 
 void IPC::SendEventToBroker(StringHash eventType)
@@ -49,7 +63,6 @@ void IPC::SendEventToBroker(StringHash eventType, VariantMap& eventData)
     }
 }
 
-
 void IPC::HandleUpdate(StringHash eventType, VariantMap& eventData)
 {
     eventMutex_.Acquire();

+ 6 - 1
Source/Atomic/IPC/IPC.h

@@ -24,12 +24,17 @@ class IPC : public Object
 public:
 
     /// Construct.
-    IPC(Context* context, int fd1 = -1, int fd2 = -1);
+    IPC(Context* context);
     /// Destruct.
     virtual ~IPC();
 
     void QueueEvent(StringHash eventType, VariantMap& eventData);
 
+    bool InitWorker(int fd1, int fd2);
+
+    IPCBroker* SpawnWorker(const String& command, const Vector<String>& args, const String& initialDirectory = "");
+
+    // worker -> broker
     void SendEventToBroker(StringHash eventType);
     void SendEventToBroker(StringHash eventType, VariantMap& eventData);
 

+ 4 - 3
Source/Atomic/IPC/IPCBroker.h

@@ -10,6 +10,8 @@ class IPCProcess;
 
 class IPCBroker : public IPCChannel
 {
+    friend class IPC;
+
     OBJECT(IPCBroker);
 
 public:
@@ -20,12 +22,11 @@ public:
 
     void ThreadFunction();
 
-    bool SpawnWorker(const String& command, const Vector<String>& args, const String& initialDirectory = "");
-
 private:
 
-    SharedPtr<IPCProcess> workerProcess_;
+    bool SpawnWorker(const String& command, const Vector<String>& args, const String& initialDirectory = "");
 
+    SharedPtr<IPCProcess> workerProcess_;
 
 };
 

+ 8 - 0
Source/Atomic/IPC/IPCEvents.h

@@ -11,4 +11,12 @@ EVENT(E_IPCWORKERSTART, WorkerStart)
 
 }
 
+/// Worker start
+EVENT(E_IPCHELLOFROMBROKER, HelloFromBroker)
+{
+    PARAM(P_HELLO, Hello);      // string
+    PARAM(P_LIFETHEUNIVERSEANDEVERYTHING, LifeTheUniverseAndEverything); // 42
+}
+
+
 }

+ 1 - 0
Source/Atomic/IPC/IPCWorker.h

@@ -1,6 +1,7 @@
 
 #pragma once
 
+#include "IPC.h"
 #include "IPCChannel.h"
 
 namespace Atomic

+ 8 - 18
Source/AtomicEditor/Source/Player/AEPlayer.cpp

@@ -14,10 +14,6 @@
 #include <Atomic/Resource/ResourceCache.h>
 #include <Atomic/UI/UI.h>
 
-#include <Atomic/IPC/IPC.h>
-#include <Atomic/IPC/IPCEvents.h>
-#include <Atomic/IPC/IPCBroker.h>
-
 #include <ToolCore/ToolEnvironment.h>
 
 #include "AEPlayer.h"
@@ -46,7 +42,7 @@ AEPlayer::AEPlayer(Context* context) :
 
 AEPlayer::~AEPlayer()
 {
-
+    LOGINFO("Player down");
 }
 
 void AEPlayer::Invalidate()
@@ -63,9 +59,12 @@ void AEPlayer::HandleJSError(StringHash eventType, VariantMap& eventData)
 
 void AEPlayer::HandleIPCWorkerStarted(StringHash eventType, VariantMap& eventData)
 {
-
     LOGINFOF("Yay");
 
+    VariantMap weventData;
+    weventData[HelloFromBroker::P_HELLO] = "Hello";
+    weventData[HelloFromBroker::P_LIFETHEUNIVERSEANDEVERYTHING] = 42;
+    broker_->PostMessage(E_IPCHELLOFROMBROKER, weventData);
 }
 
 bool AEPlayer::Play(AEPlayerMode mode, const IntRect &rect)
@@ -73,8 +72,6 @@ bool AEPlayer::Play(AEPlayerMode mode, const IntRect &rect)
     ToolCore::ToolEnvironment* env = GetSubsystem<ToolCore::ToolEnvironment>();
     const String& editorBinary = env->GetEditorBinary();
 
-    IPCBroker* broker = new IPCBroker(context_);
-
     Vector<String> paths;
     paths.Push(env->GetCoreDataDir());
     paths.Push("/Users/josh/Dev/atomic/AtomicExamples/Basic2D/Resources");
@@ -86,20 +83,13 @@ bool AEPlayer::Play(AEPlayerMode mode, const IntRect &rect)
 
     String args = ToString("--editor-resource-paths \"%s\"", resourcePaths.CString());
 
-
     vargs = args.Split(' ');
     vargs.Insert(0, "--player");
 
-    broker->SpawnWorker(editorBinary, vargs);
-
-    /*
-    SubprocessSystem* system = GetSubsystem<SubprocessSystem>();
-
-
-    system->Launch(playerBinary, vargs);
-    */
+    IPC* ipc = GetSubsystem<IPC>();
+    broker_ = ipc->SpawnWorker(editorBinary, vargs);
 
-    return true;
+    return broker_.NotNull();
 }
 
 void AEPlayer::SetUIPlayer(UIPlayer* uiPlayer)

+ 6 - 0
Source/AtomicEditor/Source/Player/AEPlayer.h

@@ -5,6 +5,9 @@
 #pragma once
 
 #include <Atomic/Core/Object.h>
+#include <Atomic/IPC/IPC.h>
+#include <Atomic/IPC/IPCEvents.h>
+#include <Atomic/IPC/IPCBroker.h>
 
 #include "../AETypes.h"
 
@@ -65,6 +68,9 @@ private:
 
     void HandleIPCWorkerStarted(StringHash eventType, VariantMap& eventData);
 
+    SharedPtr<IPCBroker> broker_;
+
+
     SharedPtr<UIPlayer> uiPlayer_;    
 
 };

+ 15 - 1
Source/AtomicEditor/Source/Player/AEPlayerApplication.cpp

@@ -30,6 +30,7 @@
 #include <Atomic/Resource/ResourceEvents.h>
 
 #include <Atomic/IPC/IPC.h>
+#include <Atomic/IPC/IPCEvents.h>
 #include <Atomic/IPC/IPCWorker.h>
 
 // Move me
@@ -138,9 +139,22 @@ void AEPlayerApplication::Setup()
     engineParameters_["LogName"] = filesystem->GetAppPreferencesDir("AtomicPlayer", "Logs") + "AtomicPlayer.log";
 }
 
+void AEPlayerApplication::HandleHelloFromBroker(StringHash eventType, VariantMap& eventData)
+{
+    assert(eventData[HelloFromBroker::P_HELLO].GetString() == "Hello");
+    assert(eventData[HelloFromBroker::P_LIFETHEUNIVERSEANDEVERYTHING].GetInt() == 42);
+
+    LOGERROR("Passed Test!");
+}
+
 void AEPlayerApplication::Start()
 {
-    context_->RegisterSubsystem(new IPC(context_, fd_[0], fd_[1]));
+
+    SubscribeToEvent(E_IPCHELLOFROMBROKER, HANDLER(AEPlayerApplication, HandleHelloFromBroker));
+
+    IPC* ipc = new IPC(context_);
+    context_->RegisterSubsystem(ipc);
+    ipc->InitWorker(fd_[0], fd_[1]);
 
     // Instantiate and register the Javascript subsystem
     javascript = new Javascript(context_);

+ 2 - 0
Source/AtomicEditor/Source/Player/AEPlayerApplication.h

@@ -52,6 +52,8 @@ private:
     /// Handle reload failure of the script file.
     void HandleScriptReloadFailed(StringHash eventType, VariantMap& eventData);
 
+    void HandleHelloFromBroker(StringHash eventType, VariantMap& eventData);
+
     int fd_[2];
 
 };