loop: add before_iterate signal

Add before_iterate signal and use it to flush data to clients.
This commit is contained in:
Wim Taymans 2017-03-14 16:13:29 +01:00
parent 9b93fd396a
commit 3e472c2dae
5 changed files with 60 additions and 19 deletions

View file

@ -291,7 +291,6 @@ pinos_connection_end_write (PinosConnection *conn,
*p++ = (opcode << 24) | (size & 0xffffff);
buf->buffer_size += 8 + size;
pinos_connection_flush (conn);
}
bool

View file

@ -38,6 +38,7 @@ typedef struct {
SpaSource source;
bool disconnecting;
PinosListener before_iterate;
} PinosContextImpl;
/**
@ -353,6 +354,14 @@ static const PinosRegistryEvents registry_events = {
typedef bool (*PinosDemarshalFunc) (void *object, void *data, size_t size);
static void
on_before_iterate (PinosListener *listener,
PinosLoop *loop)
{
PinosContextImpl *impl = SPA_CONTAINER_OF (listener, PinosContextImpl, before_iterate);
pinos_connection_flush (impl->connection);
}
static void
on_context_data (SpaSource *source,
int fd,
@ -446,6 +455,10 @@ pinos_context_new (PinosLoop *loop,
this->state = PINOS_CONTEXT_STATE_UNCONNECTED;
pinos_signal_add (&loop->before_iterate,
&impl->before_iterate,
on_before_iterate);
pinos_map_init (&this->objects, 64);
spa_list_init (&this->stream_list);
@ -482,6 +495,8 @@ pinos_context_destroy (PinosContext *context)
spa_list_for_each_safe (proxy, t2, &context->proxy_list, link)
pinos_proxy_destroy (proxy);
pinos_signal_remove (&impl->before_iterate);
pinos_map_clear (&context->objects);
free (context->name);

View file

@ -274,9 +274,12 @@ loop_iterate (SpaLoopControl *ctrl,
int timeout)
{
PinosLoopImpl *impl = SPA_CONTAINER_OF (ctrl, PinosLoopImpl, control);
PinosLoop *loop = &impl->this;
struct epoll_event ep[32];
int i, nfds, save_errno;
pinos_signal_emit (&loop->before_iterate, loop);
if (SPA_UNLIKELY (impl->pre_func))
impl->pre_func (ctrl, impl->hook_data);
@ -592,6 +595,7 @@ pinos_loop_new (void)
spa_list_init (&impl->source_list);
pinos_signal_init (&this->before_iterate);
pinos_signal_init (&this->destroy_signal);
impl->loop.size = sizeof (SpaLoop);

View file

@ -40,6 +40,8 @@ struct _PinosLoop {
SpaLoopControl *control;
SpaLoopUtils *utils;
PINOS_SIGNAL (before_iterate, (PinosListener *listener,
PinosLoop *loop));
PINOS_SIGNAL (destroy_signal, (PinosListener *listener,
PinosLoop *loop));
};