Hi,
attached patch should make the rcu code NPTL compatible. Without the patch using an RCU will fail (vdr hang during startup) on an NPTL enabled system.
I have only move over L. Nussels lirc NPTL fix to the rcu code.
Greetings
Andreas
--- rcu.c.org 2005-10-21 23:29:58.000000000 +0200 +++ rcu.c 2005-10-21 23:29:36.000000000 +0200 @@ -53,7 +53,11 @@
cRcuRemote::~cRcuRemote() { + int fh = f; + f = -1; Cancel(); + if (fh >= 0) + close(fh); }
bool cRcuRemote::Ready(void) @@ -100,7 +104,6 @@
while (Running() && f >= 0) {
- LOCK_THREAD;
if (ReceiveByte(REPEATLIMIT) == 'X') { for (int i = 0; i < 6; i++) { @@ -192,7 +195,6 @@
bool cRcuRemote::SendByte(unsigned char c) { - LOCK_THREAD;
for (int retry = 5; retry--;) { if (SendByteHandshake(c)) @@ -225,7 +227,6 @@
bool cRcuRemote::Number(int n, bool Hex) { - LOCK_THREAD;
if (!Hex) { char buf[8]; @@ -248,7 +249,6 @@
bool cRcuRemote::String(char *s) { - LOCK_THREAD;
const char *chars = mode == modeH ? "0123456789ABCDEF" : "0123456789-EHLP "; int n = 0;
----- Original Message ----- From: "Klaus Schmidinger" Klaus.Schmidinger@cadsoft.de To: vdr@linuxtv.org Sent: Friday, November 04, 2005 4:40 PM Subject: Re: [vdr] [PATCH] rcu NPTL fix for 1.3.34
Yes, i have tested the patch on my system. With the lock´s the rcu-code block vdr completely during startup with NPTL enabled libraries, especialy this ones in /lib/tls. LD_ASSUME_KERNEL doesn´t work for this problem, only moving the tls-folder away from /lib (and do a ldconfig afters this) have let the rcu work again on my suse 9.1.
Removing the lock in the main loop only will resolve this, but IR learning will fail, so i have removed the other locks also.
With the patch vdr/rcu (learning included) works without any sideeffect in daily use since 21.10. on my system (internal IR-Header, DBox IR Codes).
Greetings
Andreas Share
Andreas Share wrote:
Well, I don't have a good feeling simply throwing out the locks here just because NPTL can't handle them.
I guess this will have to wait then until I use NPTL myself, although I don't see this happening any time soon... ;-)
Unless, of course, you can come up with a solution that still does some locking and runs with NPTL. The file handle _is_ accessed from both the foreground and the background thread, so this just can't work reliably without locking.
Klaus
Klaus Schmidinger wrote:
NPTL is fine. The way vdr used and maybe still uses locks at some places was/is wrong (stuff like sleeping while locked). LinuxThreads support has been removed from glibc btw. LD_ASSUME_KERNEL=... will no longer work as workaround in the future.
cu Ludwig
Andreas Share wrote:
Ok, so I finally switched to kernel 2.6 and the dvb-kernel driver for good, and now I get the problems with rcu.c, too.
I have modified rcu.c so that it now does all actual data transmission in the Action() function, so no more locking is necessary. Simply dropping the locking caused lots of errors like
ERROR (rcu.c,188): Invalid argument
when background and foreground thread tried to access the interface at the same time.
Maybe you'd like to take a look at the attached patch.
Klaus