Skip to content

Commit

Permalink
Move datapipe helpers from tklock to datapipe module
Browse files Browse the repository at this point in the history
Many datapipes have their content managed by plugins. This makes
the initial state evaluation depend on the plugin load order and
just installing change notifiers might result in missing the
first changes.

The tklock module has array based datapipe binding helpers that
use idle callback to ensure that the datapipe state after mce
startup is fed to notification callbacks.

Move the array based binding utilities to datapipe module and make
available for all mce modules.
  • Loading branch information
spiiroin committed Jan 22, 2015
1 parent 8c260c4 commit 37c38a6
Show file tree
Hide file tree
Showing 3 changed files with 147 additions and 105 deletions.
113 changes: 113 additions & 0 deletions datapipe.c
Expand Up @@ -969,3 +969,116 @@ const char *device_lock_state_repr(device_lock_state_t state)

return res;
}

void datapipe_handlers_install(datapipe_handler_t *bindings)
{
if( !bindings )
goto EXIT;

for( size_t i = 0; bindings[i].datapipe; ++i ) {
if( bindings[i].bound )
continue;

if( bindings[i].input_cb )
append_input_trigger_to_datapipe(bindings[i].datapipe,
bindings[i].input_cb);

if( bindings[i].output_cb )
append_output_trigger_to_datapipe(bindings[i].datapipe,
bindings[i].output_cb);
bindings[i].bound = true;
}

EXIT:
return;
}

void datapipe_handlers_remove(datapipe_handler_t *bindings)
{
if( !bindings )
goto EXIT;

for( size_t i = 0; bindings[i].datapipe; ++i ) {
if( !bindings[i].bound )
continue;

if( bindings[i].input_cb )
remove_input_trigger_from_datapipe(bindings[i].datapipe,
bindings[i].input_cb);

if( bindings[i].output_cb )
remove_output_trigger_from_datapipe(bindings[i].datapipe,
bindings[i].output_cb);
bindings[i].bound = false;
}

EXIT:
return;
}

void datapipe_handlers_execute(datapipe_handler_t *bindings)
{
if( !bindings )
goto EXIT;

for( size_t i = 0; bindings[i].datapipe; ++i ) {
if( !bindings[i].bound )
continue;

if( bindings[i].output_cb )
bindings[i].output_cb(bindings[i].datapipe->cached_data);
}

EXIT:
return;
}

static gboolean datapipe_handlers_execute_cb(gpointer aptr)
{
datapipe_bindings_t *self = aptr;

if( !self )
goto EXIT;

if( !self->execute_id )
goto EXIT;

self->execute_id = 0;

mce_log(LL_CRIT, "module=%s", self->module ?: "unknown");
datapipe_handlers_execute(self->handlers);

EXIT:
return FALSE;
}

/** Append triggers/filters to datapipes
*/
void datapipe_bindings_init(datapipe_bindings_t *self)
{
mce_log(LL_CRIT, "module=%s", self->module ?: "unknown");

/* Set up datapipe callbacks */
datapipe_handlers_install(self->handlers);

/* Get initial values for output triggers from idle
* callback, i.e. when all modules have been loaded */
if( !self->execute_id )
self->execute_id = g_idle_add(datapipe_handlers_execute_cb, self);
}

/** Remove triggers/filters from datapipes
*/
void datapipe_bindings_quit(datapipe_bindings_t *self)
{
mce_log(LL_CRIT, "module=%s", self->module ?: "unknown");

/* Remove the get initial values timer if still active */
if( self->execute_id ) {
g_source_remove(self->execute_id),
self->execute_id = 0;
}

/* Remove datapipe callbacks */
datapipe_handlers_remove(self->handlers);
}
26 changes: 26 additions & 0 deletions datapipe.h
Expand Up @@ -21,6 +21,7 @@
#ifndef _DATAPIPE_H_
#define _DATAPIPE_H_

#include <stdbool.h>
#include <glib.h>

/** Device lock states used in device_lock_state_pipe */
Expand Down Expand Up @@ -217,6 +218,31 @@ void setup_datapipe(datapipe_struct *const datapipe,
const gsize datasize, gpointer initial_data);
void free_datapipe(datapipe_struct *const datapipe);

/* Binding arrays */

typedef struct
{
datapipe_struct *datapipe;
void (*output_cb)(gconstpointer data);
void (*input_cb)(gconstpointer data);
bool bound;
} datapipe_handler_t;

void datapipe_handlers_install(datapipe_handler_t *bindings);
void datapipe_handlers_remove(datapipe_handler_t *bindings);
void datapipe_handlers_execute(datapipe_handler_t *bindings);

typedef struct
{
const char *module;
datapipe_handler_t *handlers;
guint execute_id;
} datapipe_bindings_t;

void datapipe_bindings_init(datapipe_bindings_t *self);
void datapipe_bindings_quit(datapipe_bindings_t *self);

/* Startup / exit */
void mce_datapipe_init(void);
void mce_datapipe_quit(void);

Expand Down
113 changes: 8 additions & 105 deletions tklock.c
Expand Up @@ -108,14 +108,6 @@ enum
* DATATYPES
* ========================================================================= */

typedef struct
{
datapipe_struct *datapipe;
void (*output_cb)(gconstpointer data);
void (*input_cb)(gconstpointer data);
bool bound;
} datapipe_binding_t;

typedef struct
{
/** BOOTTIME tick when notification autostops */
Expand Down Expand Up @@ -206,10 +198,6 @@ static void tklock_datapipe_user_activity_cb(gconstpointer data);
static bool tklock_datapipe_have_tklock_submode(void);
static void tklock_datapipe_set_device_lock_state(device_lock_state_t state);

static void tklock_datapipe_append_triggers(datapipe_binding_t *bindings);
static void tklock_datapipe_initialize_triggers(datapipe_binding_t *bindings);
static void tklock_datapipe_remove_triggers(datapipe_binding_t *bindings);
static gboolean tklock_datapipe_init_cb(gpointer aptr);
static void tklock_datapipe_init(void);
static void tklock_datapipe_quit(void);

Expand Down Expand Up @@ -1737,8 +1725,8 @@ static void tklock_datapipe_user_activity_cb(gconstpointer data)
return;
}

/** Array of datapipe bindings */
static datapipe_binding_t tklock_datapipe_triggers[] =
/** Array of datapipe handlers */
static datapipe_handler_t tklock_datapipe_handlers[] =
{
// output triggers
{
Expand Down Expand Up @@ -1880,109 +1868,24 @@ static datapipe_binding_t tklock_datapipe_triggers[] =
}
};

static void tklock_datapipe_append_triggers(datapipe_binding_t *bindings)
{
if( !bindings )
goto EXIT;

for( size_t i = 0; bindings[i].datapipe; ++i ) {
if( bindings[i].bound )
continue;

if( bindings[i].input_cb )
append_input_trigger_to_datapipe(bindings[i].datapipe,
bindings[i].input_cb);

if( bindings[i].output_cb )
append_output_trigger_to_datapipe(bindings[i].datapipe,
bindings[i].output_cb);
bindings[i].bound = true;
}

EXIT:
return;
}

static void tklock_datapipe_initialize_triggers(datapipe_binding_t *bindings)
{
if( !bindings )
goto EXIT;

for( size_t i = 0; bindings[i].datapipe; ++i ) {
if( !bindings[i].bound )
continue;

if( bindings[i].output_cb )
bindings[i].output_cb(bindings[i].datapipe->cached_data);
}

EXIT:
return;
}

static void tklock_datapipe_remove_triggers(datapipe_binding_t *bindings)
static datapipe_bindings_t tklock_datapipe_bindings =
{
if( !bindings )
goto EXIT;

for( size_t i = 0; bindings[i].datapipe; ++i ) {
if( !bindings[i].bound )
continue;

if( bindings[i].input_cb )
remove_input_trigger_from_datapipe(bindings[i].datapipe,
bindings[i].input_cb);

if( bindings[i].output_cb )
remove_output_trigger_from_datapipe(bindings[i].datapipe,
bindings[i].output_cb);
bindings[i].bound = false;
}

EXIT:
return;
}

static guint tklock_datapipe_init_id = 0;

static gboolean tklock_datapipe_init_cb(gpointer aptr)
{
(void)aptr;

if( !tklock_datapipe_init_id )
goto EXIT;

tklock_datapipe_init_id = 0;

tklock_datapipe_initialize_triggers(tklock_datapipe_triggers);

EXIT:
return FALSE;
}
.module = "tklock",
.handlers = tklock_datapipe_handlers,
};

/** Append triggers/filters to datapipes
*/
static void tklock_datapipe_init(void)
{
/* Set up datapipe callbacks */
tklock_datapipe_append_triggers(tklock_datapipe_triggers);

/* Get initial values for output triggers from idle
* callback, i.e. when all modules have been loaded */
tklock_datapipe_init_id = g_idle_add(tklock_datapipe_init_cb, 0);
datapipe_bindings_init(&tklock_datapipe_bindings);
}

/** Remove triggers/filters from datapipes
*/
static void tklock_datapipe_quit(void)
{
/* Remove the get initial values timer if still active */
if( tklock_datapipe_init_id )
g_source_remove(tklock_datapipe_init_id),
tklock_datapipe_init_id = 0;

/* Remove datapipe callbacks */
tklock_datapipe_remove_triggers(tklock_datapipe_triggers);
datapipe_bindings_quit(&tklock_datapipe_bindings);
}

/* ========================================================================= *
Expand Down

0 comments on commit 37c38a6

Please sign in to comment.