Commit 62720ebc authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

Fix use of HTTPd from multiple instances in same process

parent 278a69e8
...@@ -188,7 +188,6 @@ typedef struct libvlc_priv_t ...@@ -188,7 +188,6 @@ typedef struct libvlc_priv_t
vlc_mutex_t ml_lock; ///< Mutex for ML creation vlc_mutex_t ml_lock; ///< Mutex for ML creation
vlm_t *p_vlm; ///< the VLM singleton (or NULL) vlm_t *p_vlm; ///< the VLM singleton (or NULL)
vlc_object_t *p_dialog_provider; ///< dialog provider vlc_object_t *p_dialog_provider; ///< dialog provider
httpd_t *p_httpd; ///< HTTP daemon (src/network/httpd.c)
#ifdef ENABLE_SOUT #ifdef ENABLE_SOUT
sap_handler_t *p_sap; ///< SAP SDP advertiser sap_handler_t *p_sap; ///< SAP SDP advertiser
#endif #endif
......
...@@ -68,22 +68,11 @@ ...@@ -68,22 +68,11 @@
static void httpd_ClientClean( httpd_client_t *cl ); 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 */ /* each host run in his own thread */
struct httpd_host_t struct httpd_host_t
{ {
VLC_COMMON_MEMBERS VLC_COMMON_MEMBERS
httpd_t *httpd;
/* ref count */ /* ref count */
unsigned i_ref; unsigned i_ref;
...@@ -1030,45 +1019,31 @@ httpd_host_t *vlc_rtsp_HostNew( vlc_object_t *p_this ) ...@@ -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 ); 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, static httpd_host_t *httpd_HostCreate( vlc_object_t *p_this,
const char *hostvar, const char *hostvar,
const char *portvar, const char *portvar,
vlc_tls_creds_t *p_tls ) vlc_tls_creds_t *p_tls )
{ {
httpd_t *httpd;
httpd_host_t *host; httpd_host_t *host;
int i;
/* to be sure to avoid multiple creation */ /* to be sure to avoid multiple creation */
vlc_mutex_lock( &httpd_mutex ); 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;
}
/* verify if it already exist */ /* 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 */ /* 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; continue;
/* Increase existing matching host reference count. /* Increase existing matching host reference count.
...@@ -1079,7 +1054,7 @@ static httpd_host_t *httpd_HostCreate( vlc_object_t *p_this, ...@@ -1079,7 +1054,7 @@ static httpd_host_t *httpd_HostCreate( vlc_object_t *p_this,
host->i_ref++; host->i_ref++;
vlc_mutex_unlock( &host->lock ); vlc_mutex_unlock( &host->lock );
vlc_mutex_unlock( &httpd_mutex ); vlc_mutex_unlock( &httpd.mutex );
if( p_tls != NULL ) if( p_tls != NULL )
vlc_tls_ServerDelete( p_tls ); vlc_tls_ServerDelete( p_tls );
return host; return host;
...@@ -1093,7 +1068,6 @@ static httpd_host_t *httpd_HostCreate( vlc_object_t *p_this, ...@@ -1093,7 +1068,6 @@ static httpd_host_t *httpd_HostCreate( vlc_object_t *p_this,
if (host == NULL) if (host == NULL)
goto error; goto error;
host->httpd = httpd;
vlc_mutex_init( &host->lock ); vlc_mutex_init( &host->lock );
vlc_cond_init( &host->wait ); vlc_cond_init( &host->wait );
host->i_ref = 1; host->i_ref = 1;
...@@ -1130,18 +1104,13 @@ static httpd_host_t *httpd_HostCreate( vlc_object_t *p_this, ...@@ -1130,18 +1104,13 @@ static httpd_host_t *httpd_HostCreate( vlc_object_t *p_this,
} }
/* now add it to httpd */ /* now add it to httpd */
TAB_APPEND( httpd->i_host, httpd->host, host ); TAB_APPEND( httpd.i_host, httpd.host, host );
vlc_mutex_unlock( &httpd_mutex ); vlc_mutex_unlock( &httpd.mutex );
return host; return host;
error: error:
if( httpd->i_host <= 0 ) vlc_mutex_unlock( &httpd.mutex );
{
libvlc_priv (httpd->p_libvlc)->p_httpd = NULL;
vlc_object_release( httpd );
}
vlc_mutex_unlock( &httpd_mutex );
if( host != NULL ) if( host != NULL )
{ {
...@@ -1160,11 +1129,10 @@ error: ...@@ -1160,11 +1129,10 @@ error:
/* delete a host */ /* delete a host */
void httpd_HostDelete( httpd_host_t *host ) void httpd_HostDelete( httpd_host_t *host )
{ {
httpd_t *httpd = host->httpd;
int i; int i;
bool delete = false; bool delete = false;
vlc_mutex_lock( &httpd_mutex ); vlc_mutex_lock( &httpd.mutex );
vlc_mutex_lock( &host->lock ); vlc_mutex_lock( &host->lock );
host->i_ref--; host->i_ref--;
...@@ -1177,11 +1145,11 @@ void httpd_HostDelete( httpd_host_t *host ) ...@@ -1177,11 +1145,11 @@ void httpd_HostDelete( httpd_host_t *host )
if( !delete ) if( !delete )
{ {
/* still used */ /* still used */
vlc_mutex_unlock( &httpd_mutex ); vlc_mutex_unlock( &httpd.mutex );
msg_Dbg( host, "httpd_HostDelete: host still in use" ); msg_Dbg( host, "httpd_HostDelete: host still in use" );
return; return;
} }
TAB_REMOVE( httpd->i_host, httpd->host, host ); TAB_REMOVE( httpd.i_host, httpd.host, host );
vlc_object_kill( host ); vlc_object_kill( host );
vlc_join( host->thread, NULL ); vlc_join( host->thread, NULL );
...@@ -1210,15 +1178,7 @@ void httpd_HostDelete( httpd_host_t *host ) ...@@ -1210,15 +1178,7 @@ void httpd_HostDelete( httpd_host_t *host )
vlc_cond_destroy( &host->wait ); vlc_cond_destroy( &host->wait );
vlc_mutex_destroy( &host->lock ); vlc_mutex_destroy( &host->lock );
vlc_object_release( host ); vlc_object_release( host );
vlc_mutex_unlock( &httpd.mutex );
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 );
} }
/* register a new url */ /* register a new url */
......
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