michael@0: #ifndef mozilla__ipdltest_TestInterruptRaces_h michael@0: #define mozilla__ipdltest_TestInterruptRaces_h michael@0: michael@0: #include "mozilla/_ipdltest/IPDLUnitTests.h" michael@0: michael@0: #include "mozilla/_ipdltest/PTestInterruptRacesParent.h" michael@0: #include "mozilla/_ipdltest/PTestInterruptRacesChild.h" michael@0: michael@0: namespace mozilla { michael@0: namespace _ipdltest { michael@0: michael@0: mozilla::ipc::RacyInterruptPolicy michael@0: MediateRace(const mozilla::ipc::MessageChannel::Message& parent, michael@0: const mozilla::ipc::MessageChannel::Message& child); michael@0: michael@0: class TestInterruptRacesParent : michael@0: public PTestInterruptRacesParent michael@0: { michael@0: public: michael@0: TestInterruptRacesParent() : mHasReply(false), michael@0: mChildHasReply(false), michael@0: mAnsweredParent(false) michael@0: { } michael@0: virtual ~TestInterruptRacesParent() { } michael@0: michael@0: static bool RunTestInProcesses() { return true; } michael@0: static bool RunTestInThreads() { return true; } michael@0: michael@0: void Main(); michael@0: michael@0: protected: michael@0: virtual bool michael@0: RecvStartRace() MOZ_OVERRIDE; michael@0: michael@0: virtual bool michael@0: AnswerRace(bool* hasRace) MOZ_OVERRIDE; michael@0: michael@0: virtual bool michael@0: AnswerStackFrame() MOZ_OVERRIDE; michael@0: michael@0: virtual bool michael@0: AnswerStackFrame3() MOZ_OVERRIDE; michael@0: michael@0: virtual bool michael@0: AnswerParent() MOZ_OVERRIDE; michael@0: michael@0: virtual bool michael@0: RecvGetAnsweredParent(bool* answeredParent) MOZ_OVERRIDE; michael@0: michael@0: virtual mozilla::ipc::RacyInterruptPolicy michael@0: MediateInterruptRace(const Message& parent, const Message& child) MOZ_OVERRIDE michael@0: { michael@0: return MediateRace(parent, child); michael@0: } michael@0: michael@0: virtual void ActorDestroy(ActorDestroyReason why) MOZ_OVERRIDE michael@0: { michael@0: if (NormalShutdown != why) michael@0: fail("unexpected destruction!"); michael@0: if (!(mHasReply && mChildHasReply)) michael@0: fail("both sides should have replies!"); michael@0: passed("ok"); michael@0: QuitParent(); michael@0: } michael@0: michael@0: private: michael@0: void OnRaceTime(); michael@0: michael@0: void Test2(); michael@0: void Test3(); michael@0: michael@0: bool mHasReply; michael@0: bool mChildHasReply; michael@0: bool mAnsweredParent; michael@0: }; michael@0: michael@0: michael@0: class TestInterruptRacesChild : michael@0: public PTestInterruptRacesChild michael@0: { michael@0: public: michael@0: TestInterruptRacesChild() : mHasReply(false) { } michael@0: virtual ~TestInterruptRacesChild() { } michael@0: michael@0: protected: michael@0: virtual bool michael@0: RecvStart() MOZ_OVERRIDE; michael@0: michael@0: virtual bool michael@0: AnswerRace(bool* hasRace) MOZ_OVERRIDE; michael@0: michael@0: virtual bool michael@0: AnswerStackFrame() MOZ_OVERRIDE; michael@0: michael@0: virtual bool michael@0: AnswerStackFrame3() MOZ_OVERRIDE; michael@0: michael@0: virtual bool michael@0: RecvWakeup() MOZ_OVERRIDE; michael@0: michael@0: virtual bool michael@0: RecvWakeup3() MOZ_OVERRIDE; michael@0: michael@0: virtual bool michael@0: AnswerChild() MOZ_OVERRIDE; michael@0: michael@0: virtual mozilla::ipc::RacyInterruptPolicy michael@0: MediateInterruptRace(const Message& parent, const Message& child) MOZ_OVERRIDE michael@0: { michael@0: return MediateRace(parent, child); michael@0: } michael@0: michael@0: virtual void ActorDestroy(ActorDestroyReason why) MOZ_OVERRIDE michael@0: { michael@0: if (NormalShutdown != why) michael@0: fail("unexpected destruction!"); michael@0: QuitChild(); michael@0: } michael@0: michael@0: private: michael@0: bool mHasReply; michael@0: }; michael@0: michael@0: michael@0: } // namespace _ipdltest michael@0: } // namespace mozilla michael@0: michael@0: michael@0: #endif // ifndef mozilla__ipdltest_TestInterruptRaces_h