summaryrefslogtreecommitdiffstats
path: root/common.c
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2007-05-17 23:42:28 +0000
committerLennart Poettering <lennart@poettering.net>2007-05-17 23:42:28 +0000
commit30562d7cba51a9879489ce88840c5f67ff873026 (patch)
treed9184295ec5310bab0e81c1caae463fec9e136b2 /common.c
parentbef6322859a5dc01e35d884de7afd2eabb1d9e4d (diff)
basic threading model
git-svn-id: file:///home/lennart/svn/public/libsydney/trunk@27 9ba3c220-e4d3-45a2-8aa3-73fcc9aff6ce
Diffstat (limited to 'common.c')
-rw-r--r--common.c25
1 files changed, 23 insertions, 2 deletions
diff --git a/common.c b/common.c
index a08316c..2470cca 100644
--- a/common.c
+++ b/common.c
@@ -323,15 +323,36 @@ int sa_stream_set_driver(sa_stream_t *s, const char *driver) {
return SA_SUCCESS;
}
-int sa_stream_start_thread(sa_stream_t *s, sa_event_callback_t *callback) {
+int sa_stream_start_thread(sa_stream_t *s, sa_event_callback_t callback) {
int r;
sa_return_val_if_fail(s, SA_ERROR_INVALID);
sa_return_val_if_fail(callback, SA_ERROR_INVALID);
sa_mutex_lock(s->mutex);
- sa_return_val_if_fail_mutex(s->mutex, s->state == SA_STATE_INIT, SA_ERROR_STATE);
+ sa_return_val_if_fail_mutex(s->mutex, s->state == SA_STATE_RUNNING || s->state == SA_STATE_STOPPED, SA_ERROR_STATE);
+ sa_return_val_if_fail_mutex(s->mutex, !s->callback, SA_ERROR_STATE);
r = driver_start_thread(s, callback);
+
+ if (r == SA_SUCCESS)
+ s->callback = callback;
+
+ sa_mutex_unlock(s->mutex);
+ return r;
+}
+
+int sa_stream_stop_thread(sa_stream_t *s) {
+ int r;
+
+ sa_return_val_if_fail(s, SA_ERROR_INVALID);
+ sa_mutex_lock(s->mutex);
+ sa_return_val_if_fail_mutex(s->mutex, s->state == SA_STATE_RUNNING || s->state == SA_STATE_STOPPED, SA_ERROR_STATE);
+ sa_return_val_if_fail_mutex(s->mutex, s->callback, SA_ERROR_STATE);
+
+ r = driver_stop_thread(s);
+
+ if (r == SA_SUCCESS)
+ s->callback = NULL;
sa_mutex_unlock(s->mutex);
return r;