summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2006-08-24 21:37:18 +0000
committerLennart Poettering <lennart@poettering.net>2006-08-24 21:37:18 +0000
commite7bcb6b9a448332e34855128b4d496b852dfd2af (patch)
tree073d06bd38e0695e8f63c527feb74dd54bdce93d
parentfc3830c24fd0341d762a2c4f05198f27fc3ccac0 (diff)
rethink r1269 once again: instead of updating the entry group state in
EntryGroup::Commit() immediately (which would cause the state change callback function to be called from the current stack frame which might be roblem for some programs), do it asynchronously again, like in pre-r1269. However, modify GetState() to always return the real state by asking the server if we have doubt that our locally cached state is out-of-date. git-svn-id: file:///home/lennart/svn/public/avahi/trunk@1271 941a03a8-eaeb-0310-b9a0-b1bbd8fe43fe
-rw-r--r--avahi-client/entrygroup.c31
-rw-r--r--avahi-client/internal.h1
2 files changed, 20 insertions, 12 deletions
diff --git a/avahi-client/entrygroup.c b/avahi-client/entrygroup.c
index ea9b676..e2fc3b9 100644
--- a/avahi-client/entrygroup.c
+++ b/avahi-client/entrygroup.c
@@ -41,10 +41,11 @@
void avahi_entry_group_set_state(AvahiEntryGroup *group, AvahiEntryGroupState state) {
assert(group);
- if (group->state == state)
+ if (group->state_valid && group->state == state)
return;
group->state = state;
+ group->state_valid = 1;
if (group->callback)
group->callback(group, state, group->userdata);
@@ -82,9 +83,7 @@ static int retrieve_state(AvahiEntryGroup *group) {
dbus_message_unref(message);
dbus_message_unref(reply);
- avahi_entry_group_set_state(group, (AvahiEntryGroupState) state);
-
- return AVAHI_OK;
+ return state;
fail:
if (dbus_error_is_set(&error)) {
@@ -106,6 +105,7 @@ AvahiEntryGroup* avahi_entry_group_new (AvahiClient *client, AvahiEntryGroupCall
DBusMessage *message = NULL, *reply = NULL;
DBusError error;
char *path;
+ int state;
assert(client);
@@ -124,7 +124,7 @@ AvahiEntryGroup* avahi_entry_group_new (AvahiClient *client, AvahiEntryGroupCall
group->client = client;
group->callback = callback;
group->userdata = userdata;
- group->state = AVAHI_ENTRY_GROUP_UNCOMMITED;
+ group->state_valid = 0;
group->path = NULL;
AVAHI_LLIST_PREPEND(AvahiEntryGroup, groups, client->groups, group);
@@ -157,8 +157,12 @@ AvahiEntryGroup* avahi_entry_group_new (AvahiClient *client, AvahiEntryGroupCall
goto fail;
}
- if (retrieve_state(group) < 0)
+ if ((state = retrieve_state(group)) < 0) {
+ avahi_client_set_errno(client, state);
goto fail;
+ }
+
+ avahi_entry_group_set_state(group, (AvahiEntryGroupState) state);
dbus_message_unref(message);
dbus_message_unref(reply);
@@ -258,8 +262,8 @@ int avahi_entry_group_commit(AvahiEntryGroup *group) {
if ((ret = entry_group_simple_method_call(group, "Commit")) < 0)
return ret;
- avahi_entry_group_set_state(group, AVAHI_ENTRY_GROUP_REGISTERING);
- return 0;
+ group->state_valid = 0;
+ return ret;
}
int avahi_entry_group_reset(AvahiEntryGroup *group) {
@@ -271,15 +275,18 @@ int avahi_entry_group_reset(AvahiEntryGroup *group) {
if ((ret = entry_group_simple_method_call(group, "Reset")) < 0)
return ret;
-
- avahi_entry_group_set_state(group, AVAHI_ENTRY_GROUP_UNCOMMITED);
- return 0;
+
+ group->state_valid = 0;
+ return ret;
}
int avahi_entry_group_get_state (AvahiEntryGroup *group) {
assert (group);
- return group->state;
+ if (group->state_valid)
+ return group->state;
+
+ return retrieve_state(group);
}
AvahiClient* avahi_entry_group_get_client (AvahiEntryGroup *group) {
diff --git a/avahi-client/internal.h b/avahi-client/internal.h
index 7a79dd7..e49dd15 100644
--- a/avahi-client/internal.h
+++ b/avahi-client/internal.h
@@ -56,6 +56,7 @@ struct AvahiClient {
struct AvahiEntryGroup {
char *path;
AvahiEntryGroupState state;
+ int state_valid;
AvahiClient *client;
AvahiEntryGroupCallback callback;
void *userdata;