zapit pmt_update fehler im source?

Kreuzuebersetzer, Diskussion über Änderungen im Tuxbox-CDK und Tuxbox-CVS
wahnfried
Interessierter
Interessierter
Beiträge: 83
Registriert: Mittwoch 29. Mai 2002, 17:50

zapit pmt_update fehler im source?

Beitrag von wahnfried »

zapit.cpp - main funktion

Code: Alles auswählen

	if (update_pmt) {
		while (zapit_server.run(parse_command, CZapitMessages::ACTVERSION, true)) {
			unsigned int i, pollnum = 0;
			struct pollfd pfd[1];

			if (pmt_update_fd != -1) {
				pfd[pollnum].fd = pmt_update_fd;
				pfd[pollnum].events = (POLLIN | POLLPRI);
				pollnum++;
			}

			if (pollnum) {
				if (poll(pfd, pollnum, 0) > 0) {
					for (i = 0; i < pollnum; i++) {
						if (pfd[i].fd == pmt_update_fd) {
							zapit(channel->getChannelID(), current_is_nvod, 0);
						}
					}
				}
			}
			/* yuck, don't waste that much cpu time :) */
			usleep(0);
		}
	}
	else {
		zapit_server.run(parse_command, CZapitMessages::ACTVERSION);
	}
dieses pollnum++ scheint irgendwie nicht in ordnung zu sein.
da wird ja immer um 1 erhöht, aber das array struct pollfd pfd[1] hat
nur 1 element. eigentlich müsste pollnum aber immer 0 sein, weil sonst
ein speicherfehler die folge wäre.

kopfkratz,

wahnfried
mws
Developer
Beiträge: 331
Registriert: Freitag 7. Februar 2003, 22:17

Beitrag von mws »

@wahnfried

nein so ist es nicht

Code: Alles auswählen

         if (pmt_update_fd != -1) { 
            pfd[pollnum].fd = pmt_update_fd; 
            pfd[pollnum].events = (POLLIN | POLLPRI); 
            pollnum++; 
         } 
hier wird pollnum auf 1 erhöht, weil 0 jetzt ja content hat

Code: Alles auswählen

       if (pollnum) { 
            if (poll(pfd, pollnum, 0) > 0) { 
               for (i = 0; i < pollnum; i++) { 
                  if (pfd[i].fd == pmt_update_fd) { 
                     zapit(channel->getChannelID(), current_is_nvod, 0); 
                  } 
               } 
            } 
         } 
hier wird gekuggt ob pollnum != 0 ist, wenn ja wird ein poll durchgeführt

danach wird ein for i = 0; i < pollnum (was ja 1 ist) durchgeführt

also nur für den index pfd[0·] eine abfrage durchgeführt.

von daher ist der code korrekt, könnte aber - insofern man wirklich nur einen fd beobachten muss auf das folgende runteroptimiert werden.

Code: Alles auswählen

     if (update_pmt) 
   {
      while (zapit_server.run(parse_command, CZapitMessages::ACTVERSION, true)) 
      {
         unsigned int i;
         struct pollfd pfd;
 
         if (pmt_update_fd != -1)
         {
            pfd.fd = pmt_update_fd; 
            pfd.events = (POLLIN | POLLPRI); 
 
            if (poll(&pfd, 1, 0) > 0) 
            {
                     zapit(channel->getChannelID(), current_is_nvod, 0); 
            }
         }
         /* yuck, don't waste that much cpu time :) */ 
         usleep(0); 
      } 
   } 
   else
   {
      zapit_server.run(parse_command, CZapitMessages::ACTVERSION); 
   }
es kann aber durchaus sein - habe mir den code im context jetzt nicht angesehen - das die version die implementiert ist, so sein muss.

gruss
mws
wahnfried
Interessierter
Interessierter
Beiträge: 83
Registriert: Mittwoch 29. Mai 2002, 17:50

Beitrag von wahnfried »

@mws,

ausgehend vom original source müsste dann aber unterstellt werden, das

Code: Alles auswählen

if (pmt_update_fd != -1) {
    pfd[pollnum].fd = pmt_update_fd;
    pfd[pollnum].events = (POLLIN | POLLPRI);
    pollnum++;
}
nur 1x durchlaufen wird. da aber das ganze innerhalb einer while schleife liegt, könnte man vermuten, das der obige abschnitt mehrfach durchlaufen wird. in diesem fall, würde pollnum grösser 0 werden.

vieleicht ist es sinnvoll zu schreiben

Code: Alles auswählen

pollnum=0;
if (pmt_update_fd != -1) {
    pfd[pollnum].fd = pmt_update_fd;
    pfd[pollnum].events = (POLLIN | POLLPRI);
    pollnum++;
}
kopfkratz,

wahnfried
ChakaZulu
Developer
Beiträge: 457
Registriert: Sonntag 23. März 2003, 00:39

Beitrag von ChakaZulu »

wahnfried hat geschrieben:@mws,

ausgehend vom original source müsste dann aber unterstellt werden, das

Code: Alles auswählen

if (pmt_update_fd != -1) {
    pfd[pollnum].fd = pmt_update_fd;
    pfd[pollnum].events = (POLLIN | POLLPRI);
    pollnum++;
}
nur 1x durchlaufen wird.
das wird es doch (je "while-Durchgang") auch, pollnum liegt innerhalb des while-scopes und wird mit 0 initialisiert. Also ist pollnum nach dem o.g. Block (mit pollnum++) immer 0 oder 1...

Code: Alles auswählen

      while (zapit_server.run(parse_command, CZapitMessages::ACTVERSION, true)) {
         unsigned int i, pollnum = 0;

ciao,

ChakaZulu
mws
Developer
Beiträge: 331
Registriert: Freitag 7. Februar 2003, 22:17

Beitrag von mws »

danke chakazulu - du warst schneller :)

gruss
mws
cu
mws
wahnfried
Interessierter
Interessierter
Beiträge: 83
Registriert: Mittwoch 29. Mai 2002, 17:50

Beitrag von wahnfried »

@both

danke für die mühe und aufklärung.

wahnfried
mws
Developer
Beiträge: 331
Registriert: Freitag 7. Februar 2003, 22:17

Beitrag von mws »

np - ich hab gerade noch mal in der funktion gehangen

es scheint so zu sein, das die pmt updates auch noch weiter gefiltert werden, wenn man scannen will. hab das mal gefixt und warte auf nen
report vom tester. wenns ok ist commit ich das
cu
mws