diff options
author | Marcel Holtmann <marcel@holtmann.org> | 2009-07-18 07:09:51 +0200 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2009-07-18 07:09:51 +0200 |
commit | 199f5292b2f26f0b2f4648e35076cc9eae86e1cc (patch) | |
tree | cf038a550283de35f3774a5c2f7ad66cded568e0 | |
parent | 92dd9ae92ba44204507760e57844d0277ef990f7 (diff) | |
download | connman-199f5292b2f26f0b2f4648e35076cc9eae86e1cc.tar.gz connman-199f5292b2f26f0b2f4648e35076cc9eae86e1cc.tar.bz2 connman-199f5292b2f26f0b2f4648e35076cc9eae86e1cc.zip |
Fix another reference counting imbalance when adding networks
-rw-r--r-- | src/service.c | 58 |
1 files changed, 16 insertions, 42 deletions
diff --git a/src/service.c b/src/service.c index c78afdb3..333ff7f7 100644 --- a/src/service.c +++ b/src/service.c @@ -1413,9 +1413,7 @@ struct connman_service *__connman_service_lookup_from_device(struct connman_devi name = g_strdup_printf("%s_%s", __connman_device_get_type(device), ident); - service = __connman_service_lookup(name); - g_free(name); return service; @@ -1463,15 +1461,15 @@ struct connman_service *__connman_service_create_from_device(struct connman_devi name = g_strdup_printf("%s_%s", __connman_device_get_type(device), ident); - service = __connman_service_get(name); + g_free(name); + if (service == NULL) - goto done; + return NULL; if (service->path != NULL) { - __connman_service_put(service); - service = NULL; - goto done; + __connman_profile_changed(TRUE); + return service; } service->type = convert_device_type(device); @@ -1480,12 +1478,11 @@ struct connman_service *__connman_service_create_from_device(struct connman_devi service_register(service); + __connman_profile_changed(TRUE); + if (service->favorite == TRUE) __connman_service_auto_connect(); -done: - g_free(name); - return service; } @@ -1522,9 +1519,7 @@ struct connman_service *__connman_service_lookup_from_network(struct connman_net name = g_strdup_printf("%s_%s_%s", __connman_network_get_type(network), ident, group); - service = __connman_service_lookup(name); - g_free(name); return service; @@ -1663,23 +1658,6 @@ struct connman_service *__connman_service_create_from_network(struct connman_net const char *ident, *group; char *name; - service = __connman_service_lookup_from_network(network); - if (service != NULL) { - if (g_atomic_int_get(&service->refcount) == 0) { - if (service->timeout > 0) { - g_source_remove(service->timeout); - service->timeout = 0; - } - - set_idle(service); - } - - connman_service_ref(service); - - update_from_network(service, network); - return service; - } - ident = __connman_network_get_ident(network); if (ident == NULL) return NULL; @@ -1688,24 +1666,21 @@ struct connman_service *__connman_service_create_from_network(struct connman_net if (group == NULL) return NULL; - if (__connman_network_get_weakness(network) == TRUE) - return NULL; - name = g_strdup_printf("%s_%s_%s", __connman_network_get_type(network), ident, group); - service = __connman_service_get(name); + g_free(name); + if (service == NULL) - goto done; + return NULL; + + if (__connman_network_get_weakness(network) == TRUE) + return service; if (service->path != NULL) { update_from_network(service, network); - __connman_profile_changed(TRUE); - - __connman_service_put(service); - service = NULL; - goto done; + return service; } service->type = convert_network_type(network); @@ -1716,12 +1691,11 @@ struct connman_service *__connman_service_create_from_network(struct connman_net service_register(service); + __connman_profile_changed(TRUE); + if (service->favorite == TRUE) __connman_service_auto_connect(); -done: - g_free(name); - return service; } |