Mailing List archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[vdr] Re: vdr[3330]: ERROR: can't record MPEG1! - possible cause



Andreas Schultz wrote:
> 
> Andreas Schultz wrote:
> 
> > Hi all,
> 
> [...]
> 
> > An untested patch for the problem.is attached.
> 
> attachements don't work :-(, so here it is again:
> 
> --- ./thread.c.orig     Fri Sep 21 12:57:35 2001
> +++ ./thread.c  Fri Sep 21 13:14:06 2001
> @@ -53,32 +53,30 @@
> 
>   // --- cMutex
> ----------------------------------------------------------------
> 
> -cMutex::cMutex(void)
> +cMutex::cMutex( Attribute attr )
>   {
> -  lockingPid = 0;
> -  locked = 0;
> -  pthread_mutex_init(&mutex, NULL);
> +  pthread_mutexattr_t m_attr;
> +
> +  pthread_mutexattr_init( &m_attr);
> +  if ( attr != Normal ) {
> +    switch (attr) {
> +    case Recursive:
> +      pthread_mutexattr_settype( &m_attr, PTHREAD_MUTEX_RECURSIVE );
> +      break;
> +    default:
> +      break;
> +    }
> +  }
> +  pthread_mutex_init(&_mutex, &m_attr);
> +  pthread_mutexattr_destroy( &m_attr);
>   }
> 
> +
>   cMutex::~cMutex()
>   {
>     pthread_mutex_destroy(&mutex);
>   }
> 
> -void cMutex::Lock(void)
> -{
> -  if (getpid() != lockingPid || !locked)
> -     pthread_mutex_lock(&mutex);
> -  lockingPid = getpid();
> -  locked++;
> -}
> -
> -void cMutex::Unlock(void)
> -{
> - if (!--locked)
> -    pthread_mutex_unlock(&mutex);
> -}
> -
>   // --- cThread
> ---------------------------------------------------------------
> 
>   // The signal handler is necessary to be able to use SIGIO to wake up any
> @@ -96,8 +94,7 @@
>        signalHandlerInstalled = true;
>        }
>     running = false;
> -  parentPid = threadPid = lockingPid = 0;
> -  locked = 0;
> +  parentPid = threadPid = 0;
>   }
> 
>   cThread::~cThread()
> @@ -158,20 +155,13 @@
> 
>   bool cThread::Lock(void)
>   {
> -  if (!lockingPid || lockingPid != getpid()) {
> -     Mutex.Lock();
> -     lockingPid = getpid();
> -     }
> -  locked++;
> +  Mutex.Lock();
>     return true;
>   }
> 
>   void cThread::Unlock(void)
>   {
> -  if (!--locked) {
> -     lockingPid = 0;
> -     Mutex.Unlock();
> -     }
> +  Mutex.Unlock();
>   }
> 
>   void cThread::WakeUp(void)
> --- ./thread.h.orig     Fri Sep 21 12:57:58 2001
> +++ ./thread.h  Fri Sep 21 13:16:12 2001
> @@ -32,13 +32,19 @@
>     friend class cCondVar;
>   private:
>     pthread_mutex_t mutex;
> -  pid_t lockingPid;
> -  int locked;
>   public:
> -  cMutex(void);
> +  enum Attribute { Normal, Recursive };
> +
> +  cMutex(Attribute attr = Recursive);
>     ~cMutex();
> -  void Lock(void);
> -  void Unlock(void);
> +  void Lock(void)
> +    {
> +
> pthread_mutex_lock( &mutex );
> +    }
> +  void Unlock(void)
> +    {
> +
> pthread_mutex_unlock( &mutex );
> +    }
>     };
> 
>   class cThread {
> @@ -46,8 +52,7 @@
>   private:
>     pthread_t thread;
>     cMutex Mutex;
> -  pid_t parentPid, threadPid, lockingPid;
> -  int locked;
> +  pid_t parentPid, threadPid;
>     bool running;
>     static time_t lastPanic;
>     static int panicLevel;

I like this idea a lot - but apparently this doesn't compile under Linux :-(

The function pthread_mutexattr_settype() is only available if __USE_UNIX98
is defined in /usr/include/pthread.h, which apparently is not the case.
Simply declaring this function in VDR's thread.c doesn't help, either, because
then the linker doesn't find it.

Do you have any futher idea how this can be used?

BTW: there are in fact cases where the mutexes are used recursively, for instance
when switching channels, so we do need this functionality...

Klaus
-- 
_______________________________________________________________

Klaus Schmidinger                       Phone: +49-8635-6989-10
CadSoft Computer GmbH                   Fax:   +49-8635-6989-40
Hofmark 2                               Email:   kls@cadsoft.de
D-84568 Pleiskirchen, Germany           URL:     www.cadsoft.de
_______________________________________________________________



Home | Main Index | Thread Index