[asterisk-commits] russell: branch russell/events r103507 - in /team/russell/events: include/ast...
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Tue Feb 12 16:43:10 CST 2008
Author: russell
Date: Tue Feb 12 16:43:09 2008
New Revision: 103507
URL: http://svn.digium.com/view/asterisk?view=rev&rev=103507
Log:
Add code which pulls the device state for each server out of the event cache
when the state of a device changes on any one server. Next, process the collection
of device states and determine the new aggregate device state ...
Modified:
team/russell/events/include/asterisk/event.h
team/russell/events/main/devicestate.c
team/russell/events/main/event.c
Modified: team/russell/events/include/asterisk/event.h
URL: http://svn.digium.com/view/asterisk/team/russell/events/include/asterisk/event.h?view=diff&rev=103507&r1=103506&r2=103507
==============================================================================
--- team/russell/events/include/asterisk/event.h (original)
+++ team/russell/events/include/asterisk/event.h Tue Feb 12 16:43:09 2008
@@ -116,6 +116,8 @@
struct ast_event_sub *ast_event_subscribe_new(enum ast_event_type type,
ast_event_cb_t cb, void *userdata);
+void ast_event_sub_destroy(struct ast_event_sub *sub);
+
int ast_event_sub_append_ie_uint(struct ast_event_sub *sub,
enum ast_event_ie_type, uint32_t uint);
Modified: team/russell/events/main/devicestate.c
URL: http://svn.digium.com/view/asterisk/team/russell/events/main/devicestate.c?view=diff&rev=103507&r1=103506&r2=103507
==============================================================================
--- team/russell/events/main/devicestate.c (original)
+++ team/russell/events/main/devicestate.c Tue Feb 12 16:43:09 2008
@@ -562,6 +562,68 @@
ast_free(sc);
}
+#define MAX_SERVERS 64
+struct change_collection {
+ struct devstate_change states[MAX_SERVERS];
+ size_t num_states;
+};
+
+static void devstate_cache_cb(const struct ast_event *event, void *data)
+{
+ struct change_collection *collection = data;
+ int i;
+ const struct ast_eid *eid;
+
+ if (collection->num_states == ARRAY_LEN(collection->states)) {
+ ast_log(LOG_ERROR, "More per-server state values than we have room for (MAX_SERVERS is %d)\n",
+ MAX_SERVERS);
+ return;
+ }
+
+ if (!(eid = ast_event_get_ie_raw(event, AST_EVENT_IE_EID))) {
+ ast_log(LOG_ERROR, "Device state change event with no EID\n");
+ return;
+ }
+
+ i = collection->num_states;
+
+ collection->states[i].state = ast_event_get_ie_uint(event, AST_EVENT_IE_STATE);
+ collection->states[i].eid = *eid;
+
+ collection->num_states++;
+}
+
+static void process_collection(struct change_collection *collection)
+{
+ /* XXX */
+}
+
+static void handle_devstate_change(struct devstate_change *sc)
+{
+ struct ast_event_sub *tmp_sub;
+ struct change_collection collection = {
+ .num_states = 0,
+ };
+
+ if (!(tmp_sub = ast_event_subscribe_new(AST_EVENT_DEVICE_STATE_CHANGE, devstate_cache_cb, &collection))) {
+ ast_log(LOG_ERROR, "Failed to create subscription\n");
+ return;
+ }
+
+ if (ast_event_sub_append_ie_str(tmp_sub, AST_EVENT_IE_DEVICE, sc->device)) {
+ ast_log(LOG_ERROR, "Failed to append device IE\n");
+ ast_event_sub_destroy(tmp_sub);
+ return;
+ }
+
+ /* Populate the collection of device states from the cache */
+ ast_event_dump_cache(tmp_sub);
+
+ process_collection(&collection);
+
+ ast_event_sub_destroy(tmp_sub);
+}
+
static void *run_devstate_collector(void *data)
{
for (;;) {
@@ -572,7 +634,7 @@
ast_cond_wait(&devstate_collector.cond, &devstate_collector.lock);
ast_mutex_unlock(&devstate_collector.lock);
- /* XXX */
+ handle_devstate_change(sc);
destroy_devstate_change(sc);
}
Modified: team/russell/events/main/event.c
URL: http://svn.digium.com/view/asterisk/team/russell/events/main/event.c?view=diff&rev=103507&r1=103506&r2=103507
==============================================================================
--- team/russell/events/main/event.c (original)
+++ team/russell/events/main/event.c Tue Feb 12 16:43:09 2008
@@ -513,7 +513,7 @@
return sub;
}
-static void ast_event_sub_destroy(struct ast_event_sub *sub)
+void ast_event_sub_destroy(struct ast_event_sub *sub)
{
struct ast_event_ie_val *ie_val;
More information about the asterisk-commits
mailing list