[vdr] Memory access error while attach player?
Patrick Fischer
patrick_fischer at gmx.de
Fri Dec 16 12:35:57 CET 2005
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;
}
I think it would be nice if we have a function(e.g. main) in each
Plugin, that will be called from the mail loop each time.
In my case I could do this:
-set an bool from the thread that signal that the thread want to attach
a player
-on the next call of the Plugin main function, my Plugin can check this
bool and attach the player
I know that this will have side effects if the work in the plugins main
function takes to long time. But this would be a nice way to sync
threads with the main thread.
Patrick
Patrick Fischer schrieb:
> I have implemanded a mutex but the problem might be the same.
>
> Now I know the real problem.
>
> If I make a cControl::Launch(new cReplayControl); from a thread, you
> told me that the main loop will Attach it. The Attach call is at the
> beginning of the main loop.
> But if my Thread will call the Launch(..) only a short time after the
> main loop has called the Attach(..), then the line 814 will call
> ProcessKey from my cReplayControl. But if this cReplayControl is not
> activ it will return osEnd and the main loop will call
> cControl::Shutdown() my ReplayControl.
>
> Its an vicious circle :-(
> I can defuse it by calling cControl::Attach(); directly after
> cControl::Launch(new cReplayControl); but this will not fix the problem.
>
> Tomorrow I will test if it works better if I inherit from
> cReplayControl and don't return osEnd from calling ProcessKey().
>
> Cu
> Patrick
>
> Klaus Schmidinger schrieb:
>
>> Patrick Fischer wrote:
>>
>>>
>>>> You could remove the
>>>>
>>>> cControl::Attach();
>>>>
>>>> call from your code (this is done in VDR's main loop in the
>>>> foreground thread) and add a mutex to cControl that guards
>>>> all calls to its member functions.
>>>>
>>>> Klaus
>>>
>>>
>>>
>>>
>>> What did you mean by "add"? I can't find a mutex in cControl.
>>
>>
>>
>> That's why I wrote "add" ;-)
>>
>>> Did you mean this?: (myMutex is a private cMutex from cMyPlayer)
>>>
>>> bool cMyPlayer::start(const char *path)
>>> {
>>> cMutexLock MutexLock(&myMutex); cRecording *recording =
>>> Recordings.GetByName(path);
>>> if (recording) {
>>> cReplayControl::SetRecording(NULL, NULL);
>>> cControl::Shutdown();
>>> cResumeFile resume(recording->FileName());
>>> resume.Delete();
>>> cReplayControl::SetRecording(recording->FileName(),
>>> recording->Title());
>>> cControl::Launch(new cReplayControl);
>>> // cControl::Attach(); //will done in the foreground thread
>>> return true;
>>> }else
>>> return false;
>>> }
>>>
>>> In this case I only protect my own function. This will protect that
>>> my thread can't recall start until it is done. Thats OK.
>>> Or did you mean that I need to patch the cControl by adding a Mutex
>>> and protect all memberfunctions?
>>
>>
>>
>> Yes.
>>
>>> If I do so, will you add this patch to
>>> upcoming vdr versions? I don't want to patch all upcoming versions.
>>
>>
>>
>> If it works, yes.
>>
>> Klaus
>>
>> _______________________________________________
>> vdr mailing list
>> vdr at linuxtv.org
>> http://www.linuxtv.org/cgi-bin/mailman/listinfo/vdr
>>
>>
>
>
> _______________________________________________
> vdr mailing list
> vdr at linuxtv.org
> http://www.linuxtv.org/cgi-bin/mailman/listinfo/vdr
>
>
More information about the vdr
mailing list