Commit 8e20684f authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

Add the missing function to allocate and get the object event OS pipe

parent b2dc803b
...@@ -186,3 +186,5 @@ static inline void __vlc_object_signal( vlc_object_t *obj ) ...@@ -186,3 +186,5 @@ static inline void __vlc_object_signal( vlc_object_t *obj )
VLC_EXPORT( void, __vlc_object_kill, ( vlc_object_t * ) ); VLC_EXPORT( void, __vlc_object_kill, ( vlc_object_t * ) );
#define vlc_object_kill(a) \ #define vlc_object_kill(a) \
__vlc_object_kill( VLC_OBJECT(a) ) __vlc_object_kill( VLC_OBJECT(a) )
int vlc_object_waitpipe( vlc_object_t *obj );
...@@ -59,6 +59,12 @@ ...@@ -59,6 +59,12 @@
#include "vlc_meta.h" #include "vlc_meta.h"
#include "variables.h" #include "variables.h"
#ifndef WIN32
# include <unistd.h>
#else
# include <io.h>
# include <fcntl.h>
#endif
/***************************************************************************** /*****************************************************************************
* Local prototypes * Local prototypes
...@@ -460,6 +466,43 @@ void __vlc_object_unlock( vlc_object_t *obj ) ...@@ -460,6 +466,43 @@ void __vlc_object_unlock( vlc_object_t *obj )
vlc_mutex_unlock( &obj->object_lock ); vlc_mutex_unlock( &obj->object_lock );
} }
/**
* Returns the readable end of a pipe that becomes readable whenever
* an object is signaled. This can be used to wait for VLC object events
* inside select(), poll() loops or frameworks providing an event loop.
*
* Note that the pipe will remain the same for the lifetime of the object.
* DO NOT close it yourself. Ever.
*
* DO NOT try to read from the pipe either: call vlc_object_wait() instead.
* Assuming the pipe is readable, vlc_object_wait() will not block.
* Also note that, as with vlc_object_wait(), there may be spurious wakeups.
*
* @param obj object that would be signaled (object lock MUST hold)
* @return a readable pipe descriptor, or -1 on error.
*/
int vlc_object_waitpipe( vlc_object_t *obj )
{
int *pipes = obj->p_internals->pipes;
vlc_assert_locked( &obj->object_lock );
if( pipes[1] == -1 )
{
/* This can only ever happen if someone killed us without locking */
assert( pipes[0] == -1 );
#ifndef WIN32
if( pipe( pipes ) )
#else
if( _pipe( pipes, 1, _O_BINARY ) )
#endif
return -1;
}
return pipes[0];
}
/** /**
* Waits for the object to be signaled (using vlc_object_signal()). * Waits for the object to be signaled (using vlc_object_signal()).
* If the object already has a signal pending, this function will return * If the object already has a signal pending, this function will return
...@@ -528,17 +571,16 @@ void __vlc_object_signal_unlocked( vlc_object_t *obj ) ...@@ -528,17 +571,16 @@ void __vlc_object_signal_unlocked( vlc_object_t *obj )
void __vlc_object_kill( vlc_object_t *p_this ) void __vlc_object_kill( vlc_object_t *p_this )
{ {
vlc_mutex_lock( &p_this->object_lock ); vlc_mutex_lock( &p_this->object_lock );
p_this->b_die = VLC_TRUE;
if( p_this->i_object_type == VLC_OBJECT_LIBVLC ) if( p_this->i_object_type == VLC_OBJECT_LIBVLC )
for( int i = 0; i < p_this->i_children ; i++ ) for( int i = 0; i < p_this->i_children ; i++ )
vlc_object_kill( p_this->pp_children[i] ); vlc_object_kill( p_this->pp_children[i] );
p_this->b_die = VLC_TRUE;
int fd = p_this->p_internals->pipes[1]; int fd = p_this->p_internals->pipes[1];
if( fd != -1 ) if( fd != -1 )
{ {
close( fd ); close( fd ); /* closing a pipe makes it readable too */
p_this->p_internals->pipes[1] = -1; p_this->p_internals->pipes[1] = -1;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment