Memory access error while attach player?
Commit Message
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.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:
@@ -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;