[vlc-commits] Fix use of HTTPd from multiple instances in same process
Rémi Denis-Courmont
git at videolan.org
Sun Sep 25 18:00:04 CEST 2011
vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Sun Sep 25 18:54:42 2011 +0300| [62720ebc9528eccbc9baccbbb9c9a19aa3815a8d] | committer: Rémi Denis-Courmont
Fix use of HTTPd from multiple instances in same process
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=62720ebc9528eccbc9baccbbb9c9a19aa3815a8d
---
src/libvlc.h | 1 -
src/network/httpd.c | 78 ++++++++++++--------------------------------------
2 files changed, 19 insertions(+), 60 deletions(-)
diff --git a/src/libvlc.h b/src/libvlc.h
index 34070ce..a1431e8 100644
--- a/src/libvlc.h
+++ b/src/libvlc.h
@@ -188,7 +188,6 @@ typedef struct libvlc_priv_t
vlc_mutex_t ml_lock; ///< Mutex for ML creation
vlm_t *p_vlm; ///< the VLM singleton (or NULL)
vlc_object_t *p_dialog_provider; ///< dialog provider
- httpd_t *p_httpd; ///< HTTP daemon (src/network/httpd.c)
#ifdef ENABLE_SOUT
sap_handler_t *p_sap; ///< SAP SDP advertiser
#endif
diff --git a/src/network/httpd.c b/src/network/httpd.c
index 2b428ce..0014fca 100644
--- a/src/network/httpd.c
+++ b/src/network/httpd.c
@@ -68,22 +68,11 @@
static void httpd_ClientClean( httpd_client_t *cl );
-struct httpd_t
-{
- VLC_COMMON_MEMBERS
-
- int i_host;
- httpd_host_t **host;
-};
-
-
/* each host run in his own thread */
struct httpd_host_t
{
VLC_COMMON_MEMBERS
- httpd_t *httpd;
-
/* ref count */
unsigned i_ref;
@@ -1030,45 +1019,31 @@ httpd_host_t *vlc_rtsp_HostNew( vlc_object_t *p_this )
return httpd_HostCreate( p_this, "rtsp-host", "rtsp-port", NULL );
}
-static vlc_mutex_t httpd_mutex = VLC_STATIC_MUTEX;
+static struct httpd_t
+{
+ vlc_mutex_t mutex;
+
+ httpd_host_t **host;
+ int i_host;
+} httpd = { VLC_STATIC_MUTEX, NULL, 0 };
static httpd_host_t *httpd_HostCreate( vlc_object_t *p_this,
const char *hostvar,
const char *portvar,
vlc_tls_creds_t *p_tls )
{
- httpd_t *httpd;
httpd_host_t *host;
- int i;
/* to be sure to avoid multiple creation */
- vlc_mutex_lock( &httpd_mutex );
- httpd = libvlc_priv (p_this->p_libvlc)->p_httpd;
-
- if( httpd == NULL )
- {
- msg_Info( p_this, "creating httpd" );
- httpd = (httpd_t *)vlc_custom_create( p_this, sizeof (*httpd),
- "http server" );
- if( httpd == NULL )
- {
- vlc_mutex_unlock( &httpd_mutex );
- return NULL;
- }
-
- httpd->i_host = 0;
- httpd->host = NULL;
-
- libvlc_priv (p_this->p_libvlc)->p_httpd = httpd;
- }
+ vlc_mutex_lock( &httpd.mutex );
/* verify if it already exist */
- for( i = httpd->i_host - 1; i >= 0; i-- )
+ for( int i = 0; i < httpd.i_host; i++ )
{
- host = httpd->host[i];
+ host = httpd.host[i];
/* cannot mix TLS and non-TLS hosts */
- if( ( httpd->host[i]->p_tls != NULL ) != ( p_tls != NULL ) )
+ if( ( host->p_tls != NULL ) != ( p_tls != NULL ) )
continue;
/* Increase existing matching host reference count.
@@ -1079,7 +1054,7 @@ static httpd_host_t *httpd_HostCreate( vlc_object_t *p_this,
host->i_ref++;
vlc_mutex_unlock( &host->lock );
- vlc_mutex_unlock( &httpd_mutex );
+ vlc_mutex_unlock( &httpd.mutex );
if( p_tls != NULL )
vlc_tls_ServerDelete( p_tls );
return host;
@@ -1093,7 +1068,6 @@ static httpd_host_t *httpd_HostCreate( vlc_object_t *p_this,
if (host == NULL)
goto error;
- host->httpd = httpd;
vlc_mutex_init( &host->lock );
vlc_cond_init( &host->wait );
host->i_ref = 1;
@@ -1130,18 +1104,13 @@ static httpd_host_t *httpd_HostCreate( vlc_object_t *p_this,
}
/* now add it to httpd */
- TAB_APPEND( httpd->i_host, httpd->host, host );
- vlc_mutex_unlock( &httpd_mutex );
+ TAB_APPEND( httpd.i_host, httpd.host, host );
+ vlc_mutex_unlock( &httpd.mutex );
return host;
error:
- if( httpd->i_host <= 0 )
- {
- libvlc_priv (httpd->p_libvlc)->p_httpd = NULL;
- vlc_object_release( httpd );
- }
- vlc_mutex_unlock( &httpd_mutex );
+ vlc_mutex_unlock( &httpd.mutex );
if( host != NULL )
{
@@ -1160,11 +1129,10 @@ error:
/* delete a host */
void httpd_HostDelete( httpd_host_t *host )
{
- httpd_t *httpd = host->httpd;
int i;
bool delete = false;
- vlc_mutex_lock( &httpd_mutex );
+ vlc_mutex_lock( &httpd.mutex );
vlc_mutex_lock( &host->lock );
host->i_ref--;
@@ -1177,11 +1145,11 @@ void httpd_HostDelete( httpd_host_t *host )
if( !delete )
{
/* still used */
- vlc_mutex_unlock( &httpd_mutex );
+ vlc_mutex_unlock( &httpd.mutex );
msg_Dbg( host, "httpd_HostDelete: host still in use" );
return;
}
- TAB_REMOVE( httpd->i_host, httpd->host, host );
+ TAB_REMOVE( httpd.i_host, httpd.host, host );
vlc_object_kill( host );
vlc_join( host->thread, NULL );
@@ -1210,15 +1178,7 @@ void httpd_HostDelete( httpd_host_t *host )
vlc_cond_destroy( &host->wait );
vlc_mutex_destroy( &host->lock );
vlc_object_release( host );
-
- if( httpd->i_host <= 0 )
- {
- msg_Dbg( httpd, "no hosts left, stopping httpd" );
-
- libvlc_priv (httpd->p_libvlc)->p_httpd = NULL;
- vlc_object_release( httpd );
- }
- vlc_mutex_unlock( &httpd_mutex );
+ vlc_mutex_unlock( &httpd.mutex );
}
/* register a new url */
More information about the vlc-commits
mailing list