On 04/08/08 10:25, Tuomas Jormola wrote:
> Hi,
>
> I forgot to post this earlier, but in the attachment you'll find logs of
> this issue on my system. I modified the code like this:
>
> eModuleStatus cCamSlot::ModuleStatus(void)
> {
> cMutexLock MutexLock(&mutex);
> eModuleStatus ms = ciAdapter ? ciAdapter->ModuleStatus(slotIndex) :
> msNone;
> isyslog("CAM DEBUG: ms: %d resetTime: %d", ms, resetTime);
> if (resetTime) {
> if (ms <= msReset) {
> isyslog("CAM DEBUG: ms le msReset");
> if (time(NULL) - resetTime < MODULE_RESET_TIMEOUT) {
> isyslog("CAM DEBUG: return msReset");
> return msReset;
> }
> }
> isyslog("CAM DEBUG: resetTime zero");
> resetTime = 0;
> }
> return ms;
> }
>
> btw. it looks like a bug crept into Arthur's code below. After
> if (time(NULL) - resetTime < MODULE_RESET_TIMEOUT)
> if this if expression evaluates true, only the debug message is printed,
> and return msReset is executed always due to missing brackets.
While you are right about this, I don't think that it even got there,
because resetTime was actually 0 when the switch from 3 ("ready") to
2 ("present") occurred:
Apr 7 09:06:41 vdr vdr: [4862] ms: 3
Apr 7 09:06:41 vdr vdr: [4862] resetTime1: 0
Apr 7 09:06:41 vdr vdr: [4862] ms: 2
> Intendation of the closing brackets of the if blocks in the original
> piece of code seem to be incorrect, which makes it difficult to spot
> things like this.
Closing brackets are of course indented, since they are part of
the block. But I guess this is a philosophical argument, so let's not
get into this ;-)
Klaus
> Tuomas Jormola
>
> On 7 Apr 2008, at 19:12, Klaus Schmidinger wrote:
>> On 04/07/08 08:34, Arthur Konovalov wrote:
>>> Well,
>>> I'm not big guru of debugging.
>>> I made following changes to mentioned part of code:
>>>
>>> eModuleStatus cCamSlot::ModuleStatus(void)
>>> {
>>> cMutexLock MutexLock(&mutex);
>>> eModuleStatus ms = ciAdapter ? ciAdapter->ModuleStatus(slotIndex) :
>>> msNone;
>>> isyslog("ms: %d", ms); //AKO
>>> isyslog("resetTime1: %d", resetTime); //AK
>>> if (resetTime) {
>>> isyslog("resetTime2: %d", resetTime); //AK
>>> if (ms <= msReset) {
>>> isyslog("resetTime3: %d", resetTime); //AK
>>> if (time(NULL) - resetTime < MODULE_RESET_TIMEOUT)
>>> isyslog("resetTime4: %d", resetTime); //AK
>>> return msReset;
>>> }
>>> resetTime = 0;
>>> }
>>> return ms;
>>> }
>>>
>>> Log file attached. I suspect that additional instructions are welcome.
>>
>> At this point...
>>
>>> Apr 7 09:06:41 vdr vdr: [4862] ms: 3
>>> Apr 7 09:06:41 vdr vdr: [4862] resetTime1: 0
>>> Apr 7 09:06:41 vdr vdr: [4862] ms: 2
>>
>> ...the module status changed from 3 ("ready") to 2 ("present").
>> The module status is retrieved from the driver in
>> cDvbCiAdapter::ModuleStatus():
>>
>> eModuleStatus cDvbCiAdapter::ModuleStatus(int Slot)
>> {
>> ca_slot_info_t sinfo;
>> sinfo.num = Slot;
>> if (ioctl(fd, CA_GET_SLOT_INFO, &sinfo) != -1) {
>> if ((sinfo.flags & CA_CI_MODULE_READY) != 0)
>> return msReady;
>> else if ((sinfo.flags & CA_CI_MODULE_PRESENT) != 0)
>> return msPresent;
>> }
>> else
>> esyslog("ERROR: can't get info of CAM slot %d on device %d: %m",
>> Slot, device->DeviceNumber());
>> return msNone;
>> }
>>
>> So for some reason the sinfo.flags doesn't seem to have the
>> CA_CI_MODULE_READY
>> flag set any longer.
>>
>>
>> Klaus
_______________________________________________
vdr mailing list
[email protected]
http://www.linuxtv.org/cgi-bin/mailman/listinfo/vdr