diff options
author | Felipe Contreras <felipe.contreras@gmail.com> | 2010-06-14 02:54:53 +0300 |
---|---|---|
committer | Felipe Contreras <felipe.contreras@gmail.com> | 2010-06-14 03:57:54 +0300 |
commit | 54ff389121af56e2e6b01a9e266a15613b94ddba (patch) | |
tree | d010fc9f4dd8e16b61161b678900edb48c613d73 | |
parent | 4046cf07c3d5ed41182c1a931f4d477879b91c88 (diff) |
cmd_node: keep track of transactions
Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
-rw-r--r-- | pn_cmd_node.c | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/pn_cmd_node.c b/pn_cmd_node.c index fd2da76..327f19c 100644 --- a/pn_cmd_node.c +++ b/pn_cmd_node.c @@ -11,6 +11,7 @@ static void *parent_class; struct pn_cmd_node_priv { unsigned counter; + GHashTable *transactions; }; struct pn_cmd_node * @@ -51,6 +52,8 @@ send_valist(struct pn_cmd_node *self, trans->command = g_strdup(command); trans->params = g_strdup_vprintf(format, args); + g_hash_table_insert(priv->transactions, GINT_TO_POINTER(trans->id), trans); + { char *data; size_t len; @@ -62,8 +65,6 @@ send_valist(struct pn_cmd_node *self, pn_node_write(PN_NODE(self), data, len); } - - pn_trans_free(trans); } void @@ -85,9 +86,15 @@ got_command(struct pn_cmd_node *self, const char *string, gsize length) { + struct pn_cmd_node_priv *priv = self->priv; struct pn_cmd *cmd; + struct pn_trans *trans; + show_cmd(true, string, length); + cmd = pn_cmd_new_from_string(string, length); + if (cmd->tr_id) + trans = g_hash_table_lookup(priv->transactions, GINT_TO_POINTER(cmd->tr_id)); pn_warn(self, "unhandled command: %.*s", length, string); pn_cmd_free(cmd); } @@ -110,15 +117,27 @@ parse_impl(struct pn_node *node, /* GObject stuff */ static void +finalize(GObject *obj) +{ + struct pn_cmd_node_priv *priv = PN_CMD_NODE(obj)->priv; + g_hash_table_destroy(priv->transactions); + + G_OBJECT_CLASS(parent_class)->finalize(obj); +} + +static void class_init(void *g_class, void *class_data) { struct pn_node_class *node_class = PN_NODE_CLASS(g_class); + GObjectClass *gobject_class = G_OBJECT_CLASS(g_class); parent_class = g_type_class_peek_parent(g_class); g_type_class_add_private(g_class, sizeof(struct pn_cmd_node_priv)); node_class->parse = &parse_impl; + + gobject_class->finalize = finalize; } static void @@ -129,6 +148,7 @@ instance_init(GTypeInstance *instance, struct pn_cmd_node_priv *priv = self->priv; self->priv = priv = G_TYPE_INSTANCE_GET_PRIVATE(instance, PN_CMD_NODE_TYPE, struct pn_cmd_node_priv); + priv->transactions = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, (GDestroyNotify) pn_trans_free); } GType |