mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-16 07:00:00 -05:00
parent
053e01177d
commit
7f52246caf
2 changed files with 37 additions and 12 deletions
|
|
@ -18,6 +18,7 @@
|
|||
*/
|
||||
|
||||
#include <pthread.h>
|
||||
#include <errno.h>
|
||||
#include <sys/time.h>
|
||||
|
||||
#include "pipewire.h"
|
||||
|
|
@ -96,28 +97,45 @@ struct pw_thread_loop *pw_thread_loop_new(struct pw_loop *loop,
|
|||
|
||||
this = calloc(1, sizeof(struct pw_thread_loop));
|
||||
if (this == NULL)
|
||||
return NULL;
|
||||
goto error1;
|
||||
|
||||
pw_log_debug("thread-loop %p: new", this);
|
||||
|
||||
this->loop = loop;
|
||||
this->name = name ? strdup(name) : NULL;
|
||||
|
||||
pw_loop_add_hook(loop, &this->hook, &impl_hooks, this);
|
||||
|
||||
spa_hook_list_init(&this->listener_list);
|
||||
|
||||
pthread_mutexattr_init(&attr);
|
||||
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
|
||||
pthread_mutex_init(&this->lock, &attr);
|
||||
if ((errno = pthread_mutex_init(&this->lock, &attr)) != 0)
|
||||
goto error2;
|
||||
|
||||
pthread_condattr_init(&cattr);
|
||||
pthread_condattr_setclock(&cattr, CLOCK_REALTIME);
|
||||
pthread_cond_init(&this->cond, &cattr);
|
||||
pthread_cond_init(&this->accept_cond, &cattr);
|
||||
if ((errno = pthread_cond_init(&this->cond, &cattr)) != 0)
|
||||
goto error3;
|
||||
if ((errno = pthread_cond_init(&this->accept_cond, &cattr)) != 0)
|
||||
goto error4;
|
||||
|
||||
this->event = pw_loop_add_event(this->loop, do_stop, this);
|
||||
if ((this->event = pw_loop_add_event(this->loop, do_stop, this)) == NULL)
|
||||
goto error5;
|
||||
|
||||
pw_loop_add_hook(loop, &this->hook, &impl_hooks, this);
|
||||
|
||||
return this;
|
||||
|
||||
error5:
|
||||
pthread_cond_destroy(&this->accept_cond);
|
||||
error4:
|
||||
pthread_cond_destroy(&this->cond);
|
||||
error3:
|
||||
pthread_mutex_destroy(&this->lock);
|
||||
error2:
|
||||
free(this->name);
|
||||
free(this);
|
||||
error1:
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/** Destroy a threaded loop \memberof pw_thread_loop */
|
||||
|
|
@ -127,8 +145,7 @@ void pw_thread_loop_destroy(struct pw_thread_loop *loop)
|
|||
|
||||
pw_thread_loop_stop(loop);
|
||||
|
||||
if (loop->name)
|
||||
free(loop->name);
|
||||
free(loop->name);
|
||||
pthread_mutex_destroy(&loop->lock);
|
||||
pthread_cond_destroy(&loop->cond);
|
||||
pthread_cond_destroy(&loop->accept_cond);
|
||||
|
|
|
|||
|
|
@ -51,9 +51,17 @@ pw_strip(char *str, const char *whitespace);
|
|||
static inline struct spa_pod *
|
||||
pw_spa_pod_copy(const struct spa_pod *pod)
|
||||
{
|
||||
return pod ?
|
||||
(struct spa_pod *) memcpy(malloc(SPA_POD_SIZE(pod)), pod, SPA_POD_SIZE(pod))
|
||||
: NULL;
|
||||
size_t size;
|
||||
struct spa_pod *c;
|
||||
|
||||
if (pod == NULL)
|
||||
return NULL;
|
||||
|
||||
size = SPA_POD_SIZE(pod);
|
||||
if ((c = malloc(size)) == NULL)
|
||||
return NULL;
|
||||
|
||||
return (struct spa_pod *) memcpy(c, pod, size);
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue