After hours of tests I found a solution for my thread problems.
I use the workaround specified below and I need to patch the player.c and player.h to make it thread save. The patch is attached.
There were two problems: -if the mainloop will work with my ReplayControl before it is attached it will crash(fixed by workaround) -cControl were not thread safe (fixed by patch)
I hope it will help somebody and maybe Klaus will include my cControlThreadSavePatch.
Greeting Patrick
now I have written a workaround and it works.
I have written cMyReplayControl inherit from cReplayControl.
//---------------cIvvonReplayControl.h------------------- class cIvvonReplayControl: public cReplayControl{ public: cIvvonReplayControl(); virtual ~cIvvonReplayControl(); eOSState ProcessKey(eKeys Key); }; //---------------cIvvonReplayControl.c------------------- cMyReplayControl::cMyReplayControl():cReplayControl(){}
cMyReplayControl::~cMyReplayControl(){}
eOSState cMyReplayControl::ProcessKey(eKeys Key){ if(!cReplayControl::Active()){ dsyslog("ReplayControl is not Active. Use workaround1"); cControl::Attach(); } eOSState tmp = cReplayControl::ProcessKey(Key); if(tmp==osEnd){ dsyslog("ReplayControl is not Active. Use workaround2"); cControl::Attach(); tmp = cReplayControl::ProcessKey(Key); } if(tmp==osEnd){ //only for debug dsyslog("cMyPlayerControl is still not attached and Active!!!!!"); exit(0); } return tmp; }
--- ./vdr-1.3.35/player.c 2005-11-02 08:40:23.000000000 +0100 +++ ./vdr-1.3.37/player.c 2005-12-19 10:41:38.000000000 +0100 @@ -40,6 +40,7 @@ // --- cControl --------------------------------------------------------------
cControl *cControl::control = NULL; +cMutex cControl::mutex;
cControl::cControl(cPlayer *Player, bool Hidden) { @@ -61,12 +62,14 @@
void cControl::Launch(cControl *Control) { + cMutexLock MutexLock(&mutex); delete control; control = Control; }
void cControl::Attach(void) { + cMutexLock MutexLock(&mutex); if (control && !control->attached && control->player && !control->player->IsAttached()) { if (cDevice::PrimaryDevice()->AttachPlayer(control->player)) control->attached = true; @@ -79,6 +82,7 @@
void cControl::Shutdown(void) { + cMutexLock MutexLock(&mutex); cControl *c = control; // avoids recursions control = NULL; delete c;
--- ./vdr-1.3.35/player.h 2005-11-02 08:40:23.000000000 +0100 +++ ./vdr-1.3.37/player.h 2005-12-19 10:41:58.000000000 +0100 @@ -62,6 +62,7 @@ class cControl : public cOsdObject { private: static cControl *control; + static cMutex mutex; bool attached; bool hidden; protected: