sectionsd: funktioniert EIT update bei jemandem?

Das Original Benutzerinterface Neutrino-SD incl. zapit, sectionsd, yWeb etc...
seife
Developer
Beiträge: 4189
Registriert: Sonntag 2. November 2003, 12:36

Beitrag von seife »

Nein, ich habe es auch auf der dbox getestet und es hat funktioniert.
mb405
Tuxboxer
Tuxboxer
Beiträge: 2331
Registriert: Donnerstag 24. März 2005, 21:52

Beitrag von mb405 »

ja die schmiert ja nicht gleich ab sondern immer erst nach ner gewissen zeit.
ich mach mal paar ausgaben rein. mal sehn.
seife
Developer
Beiträge: 4189
Registriert: Sonntag 2. November 2003, 12:36

Beitrag von seife »

Ja, und wenn die Bahn mich heimfährt, dann probier ich es am Wochenende auch nochmal :-) Auf Kinowelt TV, Premiere 4, hatte ich nie gezappt, da das schwarze Bild nicht sooo interessant ist, aber wenn ich weiß, daß das Probleme macht, kann ichs ja mal probieren :-) Allerdings ist er ja einmal auch auf ZDFinfokanal abgesemmelt... Seltsam.
mb405
Tuxboxer
Tuxboxer
Beiträge: 2331
Registriert: Donnerstag 24. März 2005, 21:52

Beitrag von mb405 »

auch auf zdf infokanal passiert das :)
ich hab mal dutzende debugs eingebaut :)
...
[eitThread] skipping to next filter(6) (> DMX_TIMEOUT_SKIPPING)
dmx.cpp:change:677
dmx.cpp:change:680
dmx.cpp:change:682
dmx.cpp:change:685
dmx.cpp:change:707
changeDMX [12]-> 6 (0x4e/0xff) actual transport stream, now/next (collect EIT version)
dmx.cpp:change:719
dmx.cpp:change:721
dmx.cpp:change:726
dmx.cpp:change:739
dmx.cpp:change:752
dmx.cpp:change:754
dmx.cpp:change:758
dmx.cpp:change:760
dmx.cpp:change:677
dmx.cpp:change:680
dmx.cpp:change:682
dmx.cpp:change:685
dmx.cpp:change:707
Segmentation fault
der code sieht so aus dort ab zeile 688-739

Code: Alles auswählen

#ifdef PAUSE_EQUALS_STOP
fprintf(stderr,"%s:%s:%d\n",__FILE__,__FUNCTION__,__LINE__);
		pthread_cond_signal(&change_cond);
#endif
		unlock();
fprintf(stderr,"%s:%s:%d\n",__FILE__,__FUNCTION__,__LINE__);
		return 1;
	}

	if (real_pauseCounter > 0)
	{
fprintf(stderr,"%s:%s:%d\n",__FILE__,__FUNCTION__,__LINE__);
		dprintf("changeDMX: for 0x%x ignored! because of real_pauseCounter> 0\n", filters[new_filter_index].filter);
		unlock();
		return 0;	// laeuft nicht (zB streaming)
	}

	//	if(pID==0x12) // Nur bei EIT
//int _debug=debug; debug=1;
fprintf(stderr,"%s:%s:%d\n",__FILE__,__FUNCTION__,__LINE__);
	dprintf("changeDMX [%x]-> %d (0x%x/0x%x)%s\n",pID,new_filter_index,filters[new_filter_index].filter,filters[new_filter_index].mask,dmx_filter_types[new_filter_index]);
//debug=_debug;

/*	if (ioctl(fd, DMX_STOP, 0) == -1)
	{
	closefd();
	perror("[sectionsd] DMX: DMX_STOP");
	pthread_mutex_unlock(&start_stop_mutex);
	return 2;
	}
*/
fprintf(stderr,"%s:%s:%d\n",__FILE__,__FUNCTION__,__LINE__);
	closefd();
fprintf(stderr,"%s:%s:%d\n",__FILE__,__FUNCTION__,__LINE__);


//	if (new_filter_index != filter_index)
	{
fprintf(stderr,"%s:%s:%d\n",__FILE__,__FUNCTION__,__LINE__);
/*		filter_index = new_filter_index; */

		int rc = immediate_start();

		if (rc != 0)
		{
			unlock();
			return rc;
		}

		showProfiling("after DMX_SET_FILTER");
	}
fprintf(stderr,"%s:%s:%d\n",__FILE__,__FUNCTION__,__LINE__);
nur gut . das ich net weis was das alles bedeutet :)
ich seh, das weit unten ein if ... auskommentiert ist :(
seife
Developer
Beiträge: 4189
Registriert: Sonntag 2. November 2003, 12:36

Beitrag von seife »

Super. Moment.

Edit:
Ich vermute, daß der filter_index irgendwie aus dem Ruder läuft.

Bau bitte mal das in dmx.cpp ein, ca. Zeile 661:

Code: Alles auswählen

int DMX::change(const int new_filter_index)
{
if (new_filter_index > filters.size() -1) {
        fprintf(stderr, "ERROR changeDMX: filter_index out of range! index: %d, max: %d\n", new_filter_index, filters.size()-1);
        return 1;
}

        showProfiling("changeDMX: before pthread_mutex_lock(&start_stop_mutex)");
Dann müßte diese Meldung in den Fällen kommen, wo er früher abgeschmiert ist (und evtl. irgendwas ganz schreckliches passieren :-). Warum es überhaupt dazu kommen kann ist mir immer noch unklar, ist evtl. ein threading / locking-Problem. Dummerweise genau das, womit ich mich nicht wirklich auskenne :-)
mb405
Tuxboxer
Tuxboxer
Beiträge: 2331
Registriert: Donnerstag 24. März 2005, 21:52

Beitrag von mb405 »

irgendwie haste recht :)
dmx.read timeout - filter: 61 - timeout# 0
sectionsd.cpp:eitThread:6926
sectionsd.cpp:eitThread:6930
sectionsd.cpp:eitThread:6924
dmx.read timeout - filter: 61 - timeout# 1
sectionsd.cpp:eitThread:6926
sectionsd.cpp:eitThread:6930
sectionsd.cpp:eitThread:6924
dmx.read timeout - filter: 61 - timeout# 2
sectionsd.cpp:eitThread:6926
sectionsd.cpp:eitThread:6930
sectionsd.cpp:eitThread:6924
dmx.read timeout - filter: 61 - timeout# 3
sectionsd.cpp:eitThread:6926
sectionsd.cpp:eitThread:6930
[eitThread] skipping to next filter(6) (> DMX_TIMEOUT_SKIPPING)
dmx.cpp:change:682
dmx.cpp:change:685
dmx.cpp:change:687
dmx.cpp:change:690
dmx.cpp:change:712
changeDMX [12]-> 6 (0x4e/0xff)actual transport stream, now/next (collect EIT version)
dmx.cpp:change:724
dmx.cpp:change:726
dmx.cpp:change:731
dmx.cpp:change:744
dmx.cpp:change:757
dmx.cpp:change:759
dmx.cpp:change:763
dmx.cpp:change:765
ERROR changeDMX: filter_index out of range! index: 7, max: 6
sectionsd.cpp:eitThread:6924
dmx.cpp:getSection:285
dmx.cpp:getSection:288
dmx.cpp:getSection:300
dmx.cpp:getSection:323
dmx.cpp:getSection:336
dmx.cpp:getSection:339
dmx.cpp:getSection:347
dmx.cpp:getSection:352
old_version: 255 new version: 10
eit_version 10
dmx.cpp:getSection:380
dmx.cpp:getSection:386
sectionsd.cpp:eitThread:6926
sectionsd.cpp:eitThread:6930
dmxEIT: going to sleep...
eit_set_update_filter, servicekey = 0x110085000e, current version 10
mit dem hack :) gehts jetzt ohne segfault.
seife
Developer
Beiträge: 4189
Registriert: Sonntag 2. November 2003, 12:36

Beitrag von seife »

Ich kann mir das nicht wirklich erklären, es sei denn, dmxEIT.filter_index müßte auch durch einen lock "beschützt" werden.

Man müßte nun rausfinden, welcher der "dmxEIT.change()" bzw. der dmxEIT_next_filter()-Aufrufe das triggert. Also alle debug-printf's wieder raus (die mit __FUNCTION__,__LINE__,...) und stattdessen vor jedem dmxEIT.change() bzw. dmxEIT_next_filter() jeweils einen reinmachen... Dann sehen wir, wo es triggert. Allerdings sind alle dmxEIT_next_filter hinter if-Abfragen, ob der Wert noch im grünen Bereich ist, ich kann mir also nicht vorstellen, woran es liegt.

Das ist ganz schön anstrengend, was? :-)
mb405
Tuxboxer
Tuxboxer
Beiträge: 2331
Registriert: Donnerstag 24. März 2005, 21:52

Beitrag von mb405 »

macht aber spass :)
weil ich nicht weis was ich da tu. :gruebel:

edit.
in sectionsd.cpp sind sehr viele aufrufe drin in der art

dmxEIT.change( dmxEIT.filter_index + 1 );
seife
Developer
Beiträge: 4189
Registriert: Sonntag 2. November 2003, 12:36

Beitrag von seife »

Eigentlich nicht mehr, die sollten mit meinem patch fast alle (bis auf 1) auskommentiert sein, und ein "dmxEIT_next_filter()" darunter haben (ohne Kommentarzeichen)

edit:

Code: Alles auswählen

seife@susi> grep "dmxEIT\.change.*\+1" sectionsd.cpp
        dmxEIT.change(dmxEIT.filter_index + 1);
//                                      dmxEIT.change(dmxEIT.filter_index + 1);
                                                dmxEIT.change( dmxEIT.filter_index + 1 );
//                                                              dmxEIT.change(dmxEIT.filter_index + 1);
//                                      dmxEIT.change(dmxEIT.filter_index + 1);
//                                              dmxEIT.change(dmxEIT.filter_index + 1);
Sind genau 2, einer in dmxEIT_next_filter und einer ca. in Zeile 6767, der aber auch nur bei index=0, index=2, index=1 oder index=3 aufgerufen werden dürfte.
Ich vermute immer mehr, daß wir einen lock um Zugriffe auf filter_index brauchen :-(
Zuletzt geändert von seife am Mittwoch 14. November 2007, 17:50, insgesamt 1-mal geändert.
mb405
Tuxboxer
Tuxboxer
Beiträge: 2331
Registriert: Donnerstag 24. März 2005, 21:52

Beitrag von mb405 »

so habs
changeDMX [12]-> 5 (0x61/0xf1)other transport stream, scheduled 2/2
dmx.read timeout - filter: 61 - timeout# 0
dmx.read timeout - filter: 61 - timeout# 1
dmx.read timeout - filter: 61 - timeout# 2
dmx.read timeout - filter: 61 - timeout# 3
[eitThread] skipping to next filter(6) (> DMX_TIMEOUT_SKIPPING)
sectionsd.cpp:eitThread:6823
changeDMX [12]-> 6 (0x4e/0xff)actual transport stream, now/next (collect EIT version)
sectionsd.cpp:eitThread:6825
sectionsd.cpp:dmxEIT_next_filter:6649
ERROR changeDMX: filter_index out of range! index: 7, max: 6
waiting for eit_version...
old_version: 255 new version: 26
eit_version 26
dmxEIT: going to sleep...
eit_set_update_filter, servicekey = 0x110085000e, current version 26
und der code drumrum sieht so aus

Code: Alles auswählen

/* the last filter is for retrieving the current EIT version number, so
+   we need to set the current service to let dmxEIT.getSection achieve that */
void dmxEIT_next_filter(void)
{
	if (dmxEIT.filter_index + 1 == (signed)dmxEIT.filters.size() - 1)
	{
		readLockMessaging();
		dmxEIT.setCurrentService(messaging_current_servicekey & 0xffff);
		unlockMessaging();
	}
fprintf(stderr,"%s:%s:%d\n",__FILE__,__FUNCTION__,__LINE__);
	dmxEIT.change(dmxEIT.filter_index + 1);
}
edit
ich bin ein dödel
ich hatte noch 2x dmxEIT.change(dmxEIT.filter_index + 1); nicht ausgeklammert drin.
nächster test kommt gleich.
Zuletzt geändert von mb405 am Mittwoch 14. November 2007, 17:55, insgesamt 1-mal geändert.
seife
Developer
Beiträge: 4189
Registriert: Sonntag 2. November 2003, 12:36

Beitrag von seife »

noch nicht ganz. Jetzt mußt du rausfinden, welcher aufruf von dmxEIT_next_filter das war... :-)

edit: Zeig mir mal deine Zeilen 6820-6830
mb405
Tuxboxer
Tuxboxer
Beiträge: 2331
Registriert: Donnerstag 24. März 2005, 21:52

Beitrag von mb405 »

also bis jetzt gehts.

wenn ich net so :dash: gewesen wäre, dann hätte man sich das alles erspart.
dank dir trotsdem für deine kostbare zeit. ein prost auf dich.
seife
Developer
Beiträge: 4189
Registriert: Sonntag 2. November 2003, 12:36

Beitrag von seife »

hehe, sowas hatte ich schon fast vermutet :-)
Teste es bitte mal weiter, wenn es keine negativen Nebenwirkungen zeigt würde ich es, irgendwann mal einchecken (in einer Woche oder so. Bis dann habe ich auch wieder mehr vom sectionsd verstanden :-)
mb405
Tuxboxer
Tuxboxer
Beiträge: 2331
Registriert: Donnerstag 24. März 2005, 21:52

Beitrag von mb405 »

klar das ding läuft dauernd nun :)
Striper
Erleuchteter
Erleuchteter
Beiträge: 625
Registriert: Samstag 8. September 2007, 16:17

Beitrag von Striper »

Gibts da mittlerweile ein funktionierendes Diff? Kann ja nun selber kompilieren :)
mb405
Tuxboxer
Tuxboxer
Beiträge: 2331
Registriert: Donnerstag 24. März 2005, 21:52

Beitrag von mb405 »

klar hängt doch an im thread hier.
Striper
Erleuchteter
Erleuchteter
Beiträge: 625
Registriert: Samstag 8. September 2007, 16:17

Beitrag von Striper »

Hö? Dachte das geht noch ned. Oder warum hast du die ganze letze Seite hier dann rumgebastelt?
seife
Developer
Beiträge: 4189
Registriert: Sonntag 2. November 2003, 12:36

Beitrag von seife »

Der alte diff hat wunderbar funktioniert, mb405 hat's selbst verbockt. :-)

Aber ich habe ihn mal ein wenig aufgehübscht, allerdings nur compile-getestet.
sectionsd-1249-fix_eitupdate-try3.diff
Striper
Erleuchteter
Erleuchteter
Beiträge: 625
Registriert: Samstag 8. September 2007, 16:17

Beitrag von Striper »

Alles klar. Kann ich den einfach nach /cdk/Patches schieben und neu kompilieren, oder muss ich das per Hand machen?
seife
Developer
Beiträge: 4189
Registriert: Sonntag 2. November 2003, 12:36

Beitrag von seife »

CVS auschecken, dann
patch -p1 < /dort/wo/der/patch/gespeichert/ist/filename.diff
dann ganz normal bauen.
Du mußt nicht unbedingt neu auschecken, einfach im CVS-"Rootverzeichnis" den Patch einspielen, und dann neutrino neu bauen.
Striper
Erleuchteter
Erleuchteter
Beiträge: 625
Registriert: Samstag 8. September 2007, 16:17

Beitrag von Striper »

OK, wenn du mir nun noch verrätst wie ich den Patch , falls er mir nicht gefällt, wieder rückgängig machen kann, bin ich happy. :)
seife
Developer
Beiträge: 4189
Registriert: Sonntag 2. November 2003, 12:36

Beitrag von seife »

Wie wär's mal mit "man patch"? ;-)
patch -p1 -R < /wo/der/patch/liegt.diff
Striper
Erleuchteter
Erleuchteter
Beiträge: 625
Registriert: Samstag 8. September 2007, 16:17

Beitrag von Striper »

Super, hat geklappt. Und ja... lazy... ;)
Striper
Erleuchteter
Erleuchteter
Beiträge: 625
Registriert: Samstag 8. September 2007, 16:17

Beitrag von Striper »

Nur mal als kleine Rückmeldung. Der Patch funktioniert hier einwandfrei. Danke Seife!
seife
Developer
Beiträge: 4189
Registriert: Sonntag 2. November 2003, 12:36

Beitrag von seife »

Sehr gut, danke für's Feedback. Ich werde mich am Wochenende vermutlich wieder dem sectionsd zuwenden, das letzte Wochenende hatte ich ja einem etwas spektakulärerem Projekt gewidmet :-)