Skip to content
GitLab
Menu
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
Xiph.Org
Icecast-Server
Commits
1e171a8e
Commit
1e171a8e
authored
Sep 20, 2018
by
Philipp Schafft
🦁
Browse files
Fix: Corrected a number of lockings to avoid race conditions
parent
3f3191ce
Changes
5
Hide whitespace changes
Inline
Side-by-side
src/auth.c
View file @
1e171a8e
...
...
@@ -197,7 +197,9 @@ void auth_release (auth_t *authenticator) {
/* cleanup auth thread attached to this auth */
if
(
authenticator
->
running
)
{
authenticator
->
running
=
0
;
thread_mutex_unlock
(
&
authenticator
->
lock
);
thread_join
(
authenticator
->
thread
);
thread_mutex_lock
(
&
authenticator
->
lock
);
}
if
(
authenticator
->
free
)
...
...
@@ -389,15 +391,18 @@ static void *auth_run_thread (void *arg)
auth_t
*
auth
=
arg
;
ICECAST_LOG_INFO
(
"Authentication thread started"
);
while
(
auth
->
running
)
{
/* usually no clients are waiting, so don't bother taking locks */
if
(
auth
->
head
)
{
while
(
1
)
{
thread_mutex_lock
(
&
auth
->
lock
);
if
(
!
auth
->
running
)
{
thread_mutex_unlock
(
&
auth
->
lock
);
break
;
}
if
(
auth
->
head
)
{
auth_client
*
auth_user
;
/* may become NULL before lock taken */
thread_mutex_lock
(
&
auth
->
lock
);
auth_user
=
(
auth_client
*
)
auth
->
head
;
if
(
auth_user
==
NULL
)
{
...
...
@@ -415,6 +420,8 @@ static void *auth_run_thread (void *arg)
__handle_auth_client
(
auth
,
auth_user
);
continue
;
}
else
{
thread_mutex_unlock
(
&
auth
->
lock
);
}
thread_sleep
(
150000
);
}
...
...
src/event.c
View file @
1e171a8e
...
...
@@ -36,7 +36,9 @@ static thread_type *event_thread = NULL;
static
void
event_addref
(
event_t
*
event
)
{
if
(
!
event
)
return
;
thread_mutex_lock
(
&
event_lock
);
event
->
refcount
++
;
thread_mutex_unlock
(
&
event_lock
);
}
static
void
event_release
(
event_t
*
event
)
{
...
...
@@ -44,9 +46,13 @@ static void event_release(event_t *event) {
if
(
!
event
)
return
;
thread_mutex_lock
(
&
event_lock
);
event
->
refcount
--
;
if
(
event
->
refcount
)
if
(
event
->
refcount
)
{
thread_mutex_unlock
(
&
event_lock
);
return
;
}
for
(
i
=
0
;
i
<
(
sizeof
(
event
->
reglist
)
/
sizeof
(
*
event
->
reglist
));
i
++
)
event_registration_release
(
event
->
reglist
[
i
]);
...
...
@@ -60,6 +66,7 @@ static void event_release(event_t *event) {
event_release
(
event
->
next
);
free
(
event
);
thread_mutex_unlock
(
&
event_lock
);
}
static
void
event_push
(
event_t
**
event
,
event_t
*
next
)
{
...
...
@@ -78,7 +85,7 @@ static void event_push(event_t **event, event_t *next) {
return
;
}
event_addref
(
*
event
=
next
)
;
*
event
=
next
;
}
static
void
event_push_reglist
(
event_t
*
event
,
event_registration_t
*
reglist
)
{
...
...
@@ -336,6 +343,7 @@ void event_registration_push(event_registration_t **er, event_registration_t *ta
/* event signaling */
void
event_emit
(
event_t
*
event
)
{
fastevent_emit
(
FASTEVENT_TYPE_SLOWEVENT
,
FASTEVENT_FLAG_NONE
,
FASTEVENT_DATATYPE_EVENT
,
event
);
event_addref
(
event
);
thread_mutex_lock
(
&
event_lock
);
event_push
(
&
event_queue
,
event
);
thread_mutex_unlock
(
&
event_lock
);
...
...
src/slave.c
View file @
1e171a8e
...
...
@@ -72,7 +72,7 @@ static int slave_running = 0;
static
volatile
int
update_settings
=
0
;
static
volatile
int
update_all_mounts
=
0
;
static
volatile
unsigned
int
max_interval
=
0
;
static
mutex_t
_slave_mutex
;
// protects update_settings, update_all_mounts, max_interval
static
mutex_t
_slave_mutex
;
// protects
slave_running,
update_settings, update_all_mounts, max_interval
static
inline
void
relay_config_upstream_free
(
relay_config_upstream_t
*
upstream
)
{
...
...
@@ -222,9 +222,14 @@ void slave_initialize(void)
void
slave_shutdown
(
void
)
{
if
(
!
slave_running
)
thread_mutex_lock
(
&
_slave_mutex
);
if
(
!
slave_running
)
{
thread_mutex_unlock
(
&
_slave_mutex
);
return
;
}
slave_running
=
0
;
thread_mutex_unlock
(
&
_slave_mutex
);
ICECAST_LOG_DEBUG
(
"waiting for slave thread"
);
thread_join
(
_slave_thread_id
);
}
...
...
@@ -895,8 +900,12 @@ static void *_slave_thread(void *arg)
global_unlock
();
thread_sleep
(
1000000
);
if
(
slave_running
==
0
)
thread_mutex_lock
(
&
_slave_mutex
);
if
(
slave_running
==
0
)
{
thread_mutex_unlock
(
&
_slave_mutex
);
break
;
}
thread_mutex_unlock
(
&
_slave_mutex
);
++
interval
;
...
...
src/stats.c
View file @
1e171a8e
...
...
@@ -154,7 +154,9 @@ void stats_shutdown(void)
return
;
/* wait for thread to exit */
thread_mutex_lock
(
&
_stats_mutex
);
_stats_running
=
0
;
thread_mutex_unlock
(
&
_stats_mutex
);
thread_join
(
_stats_thread_id
);
/* wait for other threads to shut down */
...
...
@@ -691,7 +693,14 @@ static void *_stats_thread(void *arg)
stats_event
(
NULL
,
"listener_connections"
,
"0"
);
ICECAST_LOG_INFO
(
"stats thread started"
);
while
(
_stats_running
)
{
while
(
1
)
{
thread_mutex_lock
(
&
_stats_mutex
);
if
(
!
_stats_running
)
{
thread_mutex_unlock
(
&
_stats_mutex
);
break
;
}
thread_mutex_unlock
(
&
_stats_mutex
);
thread_mutex_lock
(
&
_global_event_mutex
);
if
(
_global_event_queue
.
head
!=
NULL
)
{
/* grab the next event from the queue */
...
...
@@ -971,7 +980,14 @@ void *stats_connection(void *arg)
_register_listener
(
&
listener
);
while
(
_stats_running
)
{
while
(
1
)
{
thread_mutex_lock
(
&
_stats_mutex
);
if
(
!
_stats_running
)
{
thread_mutex_unlock
(
&
_stats_mutex
);
break
;
}
thread_mutex_unlock
(
&
_stats_mutex
);
thread_mutex_lock
(
&
listener
.
mutex
);
event
=
_get_event_from_queue
(
&
listener
.
queue
);
thread_mutex_unlock
(
&
listener
.
mutex
);
...
...
src/yp.c
View file @
1e171a8e
...
...
@@ -721,10 +721,12 @@ static void delete_marked_yp(struct yp_server *server)
static
void
*
yp_update_thread
(
void
*
arg
)
{
ICECAST_LOG_INFO
(
"YP update thread started"
);
int
running
;
yp_running
=
1
;
while
(
yp_running
)
{
running
=
1
;
while
(
running
)
{
struct
yp_server
*
server
;
thread_sleep
(
200000
);
...
...
@@ -738,11 +740,10 @@ static void *yp_update_thread(void *arg)
yp_process_server
(
server
);
server
=
server
->
next
;
}
thread_rwlock_unlock
(
&
yp_lock
);
/* update the local YP structure */
if
(
yp_update
)
{
thread_rwlock_unlock
(
&
yp_lock
);
thread_rwlock_wlock
(
&
yp_lock
);
check_servers
();
server
=
(
struct
yp_server
*
)
active_yps
;
...
...
@@ -754,8 +755,9 @@ static void *yp_update_thread(void *arg)
server
=
server
->
next
;
}
yp_update
=
0
;
thread_rwlock_unlock
(
&
yp_lock
);
}
running
=
yp_running
;
thread_rwlock_unlock
(
&
yp_lock
);
}
thread_rwlock_destroy
(
&
yp_lock
);
thread_mutex_destroy
(
&
yp_pending_lock
);
...
...
@@ -984,8 +986,11 @@ void yp_touch (const char *mount)
void
yp_shutdown
(
void
)
{
thread_rwlock_wlock
(
&
yp_lock
);
yp_running
=
0
;
yp_update
=
1
;
thread_rwlock_unlock
(
&
yp_lock
);
if
(
yp_thread
)
thread_join
(
yp_thread
);
free
((
char
*
)
server_version
);
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment