+static void provider_remove(struct connman_provider *provider)
+{
+ if (provider->driver != NULL) {
+ provider->driver->remove(provider);
+ provider->driver = NULL;
+ }
+}
+
+static int provider_register(struct connman_provider *provider)
+{
+ return provider_probe(provider);
+}
+
+static void provider_unregister(struct connman_provider *provider)
+{
+ provider_remove(provider);
+}
+
+struct connman_provider *connman_provider_ref(struct connman_provider *provider)
+{
+ DBG("provider %p", provider);
+
+ g_atomic_int_inc(&provider->refcount);
+
+ return provider;
+}
+
+static void provider_destruct(struct connman_provider *provider)
+{
+ DBG("provider %p", provider);
+
+ g_free(provider->name);
+ g_free(provider->type);
+ g_free(provider->domain);
+ g_free(provider->identifier);
+ g_hash_table_destroy(provider->routes);
+ g_hash_table_destroy(provider->setting_strings);
+}
+
+void connman_provider_unref(struct connman_provider *provider)
+{
+ DBG("provider %p", provider);
+
+ if (g_atomic_int_dec_and_test(&provider->refcount) == FALSE)
+ return;
+
+ provider_remove(provider);
+
+ provider_destruct(provider);
+}
+