libubus: fix publishing objects after reconnect
authorFelix Fietkau <nbd@openwrt.org>
Thu, 8 Aug 2013 20:14:27 +0000 (22:14 +0200)
committerFelix Fietkau <nbd@openwrt.org>
Thu, 8 Aug 2013 20:20:39 +0000 (22:20 +0200)
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
libubus-io.c

index 1f7b0fb6d0076a813eae9a59a6e66a9c32b703cc..589ba20926d4cd2b4d513a2c4fcc6a905423ff3e 100644 (file)
@@ -190,6 +190,8 @@ static void
 ubus_refresh_state(struct ubus_context *ctx)
 {
        struct ubus_object *obj, *tmp;
+       struct ubus_object **objs;
+       int n, i = 0;
 
        /* clear all type IDs, they need to be registered again */
        avl_for_each_element(&ctx->objects, obj, avl)
@@ -197,11 +199,14 @@ ubus_refresh_state(struct ubus_context *ctx)
                        obj->type->id = 0;
 
        /* push out all objects again */
-       avl_for_each_element_safe(&ctx->objects, obj, avl, tmp) {
+       objs = alloca(ctx->objects.count * sizeof(*objs));
+       avl_remove_all_elements(&ctx->objects, obj, avl, tmp) {
+               objs[i++] = obj;
                obj->id = 0;
-               avl_delete(&ctx->objects, &obj->avl);
-               ubus_add_object(ctx, obj);
        }
+
+       for (n = i, i = 0; i < n; i++)
+               ubus_add_object(ctx, objs[i]);
 }
 
 int ubus_reconnect(struct ubus_context *ctx, const char *path)