epgsearchext.c: Da nichts verändert wird, sollte der READLOCK der richtige sein ???
searchtimer_thread.c: da die Locks jeweils bis zum Ende des umschließenden Codeblocks gehalten werden, sind die Änderungen unnötig und störend.
Hier erst mal ohne diese beiden Sachen, der VDR-Absturz:
Jan 09 13:55:06 home-05.home.de vdr[11723]: [11747] EPGSearch: search timer update finished
Jan 09 13:55:06 home-05.home.de kernel: EPGSearch: sear[11747]: segfault at 8 ip 00007fe1f9142531 sp 00007fe1f84a19a0 error 4 in libvdr-epgsearch.so.2.3.1[7fe1f90dc000+108000]
der Backtrace dazu :
#0 0x00007fe1f9142531 in cRecordingsLock::cRecordingsLock (Write=<optimized out>, this=<optimized out>) at /home/DVB/Test/vdr-2.3.1/include/vdr/recording.h:291
No locals.
#1 cSearchExt::GetCountRecordings (this=0x12d48c0) at epgsearchext.c:1444
countRecs = 0
RecordingsLock = {stateKey = {stateLock = 0x0, write = false, state = -1, timedOut = false}, list = 0x0}
vdrrecordings = 0x0
#2 0x00007fe1f919dddd in cSearchTimerThread::CheckExpiredRecs (this=this@entry=0x1381dc0) at searchtimer_thread.c:885
recording = 0x7fe1e80204c0
search = <optimized out>
rc = <optimized out>
recordingObj = 0x7fe1e588d470
RecordingsLock = {stateKey = {stateLock = 0x7f6bc0 <cRecordings::recordings+32>, write = true, state = -1, timedOut = false}, list = 0x7f6ba0 <cRecordings::recordings>}
vdrrecordings = 0x7f6ba0 <cRecordings::recordings>
DelRecordings = {<cListBase> = {_vptr.cListBase = 0x7fe1f93e7970 <vtable for cList<cRecordingObj>+16>, objects = 0x7fe1e588d470, lastObject = 0x7fe1e588d470, count = 1,
stateLock = {name = 0x0, threadId = 0, rwLock = {rwlock = {__data = {__lock = 0, __nr_readers = 0, __readers_wakeup = 0, __writer_wakeup = 0, __nr_readers_queued = 0,
__nr_writers_queued = 0, __writer = 0, __shared = 0, __rwelision = 0 '\000', __pad1 = "\000\000\000\000\000\000", __pad2 = 0, __flags = 0},
__size = '\000' <repeats 55 times>, __align = 0}}, numWriteLocks = 0, state = 0, explicitModify = false}, needsLocking = 0x0,
useGarbageCollector = false}, <No data fields>}
#3 0x00007fe1f91a05c7 in cSearchTimerThread::Action (this=0x1381dc0) at searchtimer_thread.c:625
pOutdatedTimers = <optimized out>
localSearchExts = 0x7fe1f0000960
searchExt = 0x0
now = 1452344102
needUpdate = <optimized out>
nextUpdate = <optimized out>
#4 0x000000000051bc49 in cThread::StartThread (Thread=0x1381dc0) at thread.c:272
No locals.
#5 0x00007fe20421360a in start_thread (arg=0x7fe1f84a2700) at pthread_create.c:334
__res = <optimized out>
pd = 0x7fe1f84a2700
now = <optimized out>
unwind_buf = {cancel_jmp_buf = {{jmp_buf = {140608509978368, 4475398727729918408, 140729325419247, 140608509978368, 8388608, 8388608, -4478759484946927160, -4476640512638864952},
mask_was_saved = 0}}, priv = {pad = {0x0, 0x0, 0x0, 0x0}, data = {prev = 0x0, cleanup = 0x0, canceltype = 0}}}
not_first_call = <optimized out>
pagesize_m1 = <optimized out>
sp = <optimized out>
freesize = <optimized out>
#6 0x00007fe202b8ea4d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:109
No locals.
Alles anzeigen
und der epgsearch-Abschnitt der setup.conf:
Beim nochmaligen Testen hat sich gezeigt, das ein absturzfreier Start nur mit der Änderung in epgsearchext.c Zeile 1444 möglich ist.
Die beiden LOCK's in epgsearchext.c Zeile 1444 und searchtimer_thread.c Zeile 824 scheinen hier direkt voneinander abhängig zu sein, denn wenn man beide gleich als WRITE oder als READ definiert, startet der VDR absturzfrei. Ein WRITE ist aber wohl logischer???
Naja, vielleicht gibt es aber noch eine ganz andere Lösung.
Grüße
kamel5