ipconfig: Add ipconfig unref function
authorJukka Rissanen <jukka.rissanen@linux.intel.com>
Mon, 12 Nov 2012 12:07:39 +0000 (14:07 +0200)
committerPatrik Flykt <patrik.flykt@linux.intel.com>
Fri, 23 Nov 2012 10:58:51 +0000 (12:58 +0200)
vpn/vpn-ipconfig.c
vpn/vpn.h

index cb5167f..7e1d77e 100644 (file)
@@ -257,6 +257,23 @@ int __vpn_ipconfig_gateway_add(struct vpn_ipconfig *ipconfig, int family)
        return 0;
 }
 
+void __vpn_ipconfig_unref_debug(struct vpn_ipconfig *ipconfig,
+                               const char *file, int line, const char *caller)
+{
+       if (ipconfig == NULL)
+               return;
+
+       DBG("%p ref %d by %s:%d:%s()", ipconfig, ipconfig->refcount - 1,
+               file, line, caller);
+
+       if (__sync_fetch_and_sub(&ipconfig->refcount, 1) != 1)
+               return;
+
+       connman_ipaddress_free(ipconfig->system);
+       connman_ipaddress_free(ipconfig->address);
+       g_free(ipconfig);
+}
+
 static struct vpn_ipconfig *create_ipv6config(int index)
 {
        struct vpn_ipconfig *ipv6config;
index 93894d1..96f4e87 100644 (file)
--- a/vpn/vpn.h
+++ b/vpn/vpn.h
@@ -52,6 +52,10 @@ void __vpn_ipconfig_set_prefixlen(struct vpn_ipconfig *ipconfig,
 unsigned char __vpn_ipconfig_get_prefixlen(struct vpn_ipconfig *ipconfig);
 int __vpn_ipconfig_address_add(struct vpn_ipconfig *ipconfig, int family);
 int __vpn_ipconfig_gateway_add(struct vpn_ipconfig *ipconfig, int family);
+void __vpn_ipconfig_unref_debug(struct vpn_ipconfig *ipconfig,
+                       const char *file, int line, const char *caller);
+#define __vpn_ipconfig_unref(ipconfig) \
+       __vpn_ipconfig_unref_debug(ipconfig, __FILE__, __LINE__, __func__)
 struct vpn_ipconfig *__vpn_ipconfig_create(int index, int family);
 void __vpn_ipconfig_set_index(struct vpn_ipconfig *ipconfig,
                                                                int index);