Skip to content

Commit 4960195

Browse files
committed
Define GAutoPtr for glib objects memory management
1 parent 790f32a commit 4960195

File tree

6 files changed

+122
-58
lines changed

6 files changed

+122
-58
lines changed

src/lib/support/GLibTypes.h

+48
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
#include <gio/gio.h>
2323
#include <glib.h>
2424

25+
namespace chip {
26+
2527
template <typename T, typename Deleter>
2628
class UniquePointerReceiver
2729
{
@@ -72,3 +74,49 @@ struct GBytesDeleter
7274
{
7375
void operator()(GBytes * object) { g_bytes_unref(object); }
7476
};
77+
78+
template <typename T>
79+
struct GAutoPtrDeleter
80+
{
81+
};
82+
83+
template <>
84+
struct GAutoPtrDeleter<char>
85+
{
86+
using deleter = GFree;
87+
};
88+
89+
template <>
90+
struct GAutoPtrDeleter<GBytes>
91+
{
92+
using deleter = GBytesDeleter;
93+
};
94+
95+
template <>
96+
struct GAutoPtrDeleter<GDBusConnection>
97+
{
98+
using deleter = GObjectDeleter;
99+
};
100+
101+
template <>
102+
struct GAutoPtrDeleter<GError>
103+
{
104+
using deleter = GErrorDeleter;
105+
};
106+
107+
template <>
108+
struct GAutoPtrDeleter<GVariant>
109+
{
110+
using deleter = GVariantDeleter;
111+
};
112+
113+
template <>
114+
struct GAutoPtrDeleter<GVariantIter>
115+
{
116+
using deleter = GVariantIterDeleter;
117+
};
118+
119+
template <typename T>
120+
using GAutoPtr = std::unique_ptr<T, typename GAutoPtrDeleter<T>::deleter>;
121+
122+
} // namespace chip

src/platform/Linux/ConnectivityManagerImpl.cpp

+29-15
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,19 @@ using namespace ::chip::app::Clusters::WiFiNetworkDiagnostics;
7676
using namespace ::chip::DeviceLayer::NetworkCommissioning;
7777

7878
namespace chip {
79+
80+
template <>
81+
struct GAutoPtrDeleter<WpaFiW1Wpa_supplicant1BSS>
82+
{
83+
using deleter = GObjectDeleter;
84+
};
85+
86+
template <>
87+
struct GAutoPtrDeleter<WpaFiW1Wpa_supplicant1Network>
88+
{
89+
using deleter = GObjectDeleter;
90+
};
91+
7992
namespace DeviceLayer {
8093

8194
ConnectivityManagerImpl ConnectivityManagerImpl::sInstance;
@@ -1070,7 +1083,7 @@ ConnectivityManagerImpl::ConnectWiFiNetworkAsync(ByteSpan ssid, ByteSpan credent
10701083
void ConnectivityManagerImpl::_ConnectWiFiNetworkAsyncCallback(GObject * source_object, GAsyncResult * res, gpointer user_data)
10711084
{
10721085
ConnectivityManagerImpl * this_ = reinterpret_cast<ConnectivityManagerImpl *>(user_data);
1073-
std::unique_ptr<GError, GErrorDeleter> err;
1086+
GAutoPtr<GError> err;
10741087

10751088
std::lock_guard<std::mutex> lock(mWpaSupplicantMutex);
10761089

@@ -1158,7 +1171,7 @@ void ConnectivityManagerImpl::PostNetworkConnect()
11581171
CHIP_ERROR ConnectivityManagerImpl::CommitConfig()
11591172
{
11601173
gboolean result;
1161-
std::unique_ptr<GError, GErrorDeleter> err;
1174+
GAutoPtr<GError> err;
11621175

11631176
std::lock_guard<std::mutex> lock(mWpaSupplicantMutex);
11641177

@@ -1289,7 +1302,7 @@ CHIP_ERROR ConnectivityManagerImpl::GetWiFiVersion(WiFiVersionEnum & wiFiVersion
12891302
int32_t ConnectivityManagerImpl::GetDisconnectReason()
12901303
{
12911304
std::lock_guard<std::mutex> lock(mWpaSupplicantMutex);
1292-
std::unique_ptr<GError, GErrorDeleter> err;
1305+
GAutoPtr<GError> err;
12931306

12941307
gint errorValue = wpa_fi_w1_wpa_supplicant1_interface_get_disconnect_reason(mWpaSupplicant.iface);
12951308
// wpa_supplicant DBus API: DisconnectReason: The most recent IEEE 802.11 reason code for disconnect. Negative value
@@ -1305,7 +1318,7 @@ CHIP_ERROR ConnectivityManagerImpl::GetConfiguredNetwork(NetworkCommissioning::N
13051318
// with the proxy object.
13061319

13071320
std::lock_guard<std::mutex> lock(mWpaSupplicantMutex);
1308-
std::unique_ptr<GError, GErrorDeleter> err;
1321+
GAutoPtr<GError> err;
13091322

13101323
if (mWpaSupplicant.iface == nullptr)
13111324
{
@@ -1321,10 +1334,9 @@ CHIP_ERROR ConnectivityManagerImpl::GetConfiguredNetwork(NetworkCommissioning::N
13211334
return CHIP_ERROR_KEY_NOT_FOUND;
13221335
}
13231336

1324-
std::unique_ptr<WpaFiW1Wpa_supplicant1Network, GObjectDeleter> networkInfo(
1325-
wpa_fi_w1_wpa_supplicant1_network_proxy_new_for_bus_sync(G_BUS_TYPE_SYSTEM, G_DBUS_PROXY_FLAGS_NONE,
1326-
kWpaSupplicantServiceName, networkPath, nullptr,
1327-
&MakeUniquePointerReceiver(err).Get()));
1337+
GAutoPtr<WpaFiW1Wpa_supplicant1Network> networkInfo(wpa_fi_w1_wpa_supplicant1_network_proxy_new_for_bus_sync(
1338+
G_BUS_TYPE_SYSTEM, G_DBUS_PROXY_FLAGS_NONE, kWpaSupplicantServiceName, networkPath, nullptr,
1339+
&MakeUniquePointerReceiver(err).Get()));
13281340
if (networkInfo == nullptr)
13291341
{
13301342
return CHIP_ERROR_INTERNAL;
@@ -1350,7 +1362,7 @@ CHIP_ERROR ConnectivityManagerImpl::StopAutoScan()
13501362
std::lock_guard<std::mutex> lock(mWpaSupplicantMutex);
13511363
VerifyOrReturnError(mWpaSupplicant.iface != nullptr, CHIP_ERROR_INCORRECT_STATE);
13521364

1353-
std::unique_ptr<GError, GErrorDeleter> err;
1365+
GAutoPtr<GError> err;
13541366
gboolean result;
13551367

13561368
ChipLogDetail(DeviceLayer, "wpa_supplicant: disabling auto scan");
@@ -1407,6 +1419,7 @@ CHIP_ERROR ConnectivityManagerImpl::StartWiFiScan(ByteSpan ssid, WiFiDriver::Sca
14071419
}
14081420

14091421
namespace {
1422+
14101423
// wpa_supplicant's scan results don't contains the channel infomation, so we need this lookup table for resolving the band and
14111424
// channel infomation.
14121425
std::pair<WiFiBand, uint16_t> GetBandAndChannelFromFrequency(uint32_t freq)
@@ -1505,6 +1518,7 @@ std::pair<WiFiBand, uint16_t> GetBandAndChannelFromFrequency(uint32_t freq)
15051518
}
15061519
return ret;
15071520
}
1521+
15081522
} // namespace
15091523

15101524
bool ConnectivityManagerImpl::_GetBssInfo(const gchar * bssPath, NetworkCommissioning::WiFiScanResponse & result)
@@ -1514,8 +1528,8 @@ bool ConnectivityManagerImpl::_GetBssInfo(const gchar * bssPath, NetworkCommissi
15141528
// completed before this function returns. Also, no external callbacks are registered
15151529
// with the proxy object.
15161530

1517-
std::unique_ptr<GError, GErrorDeleter> err;
1518-
std::unique_ptr<WpaFiW1Wpa_supplicant1BSS, GObjectDeleter> bss(
1531+
GAutoPtr<GError> err;
1532+
GAutoPtr<WpaFiW1Wpa_supplicant1BSS> bss(
15191533
wpa_fi_w1_wpa_supplicant1_bss_proxy_new_for_bus_sync(G_BUS_TYPE_SYSTEM, G_DBUS_PROXY_FLAGS_NONE, kWpaSupplicantServiceName,
15201534
bssPath, nullptr, &MakeUniquePointerReceiver(err).Get()));
15211535

@@ -1526,8 +1540,8 @@ bool ConnectivityManagerImpl::_GetBssInfo(const gchar * bssPath, NetworkCommissi
15261540

15271541
WpaFiW1Wpa_supplicant1BSSProxy * bssProxy = WPA_FI_W1_WPA_SUPPLICANT1_BSS_PROXY(bss.get());
15281542

1529-
std::unique_ptr<GVariant, GVariantDeleter> ssid(g_dbus_proxy_get_cached_property(G_DBUS_PROXY(bssProxy), "SSID"));
1530-
std::unique_ptr<GVariant, GVariantDeleter> bssid(g_dbus_proxy_get_cached_property(G_DBUS_PROXY(bssProxy), "BSSID"));
1543+
GAutoPtr<GVariant> ssid(g_dbus_proxy_get_cached_property(G_DBUS_PROXY(bssProxy), "SSID"));
1544+
GAutoPtr<GVariant> bssid(g_dbus_proxy_get_cached_property(G_DBUS_PROXY(bssProxy), "BSSID"));
15311545

15321546
// Network scan is performed in the background, so the BSS
15331547
// may be gone when we try to get the properties.
@@ -1635,8 +1649,8 @@ bool ConnectivityManagerImpl::_GetBssInfo(const gchar * bssPath, NetworkCommissi
16351649
return res;
16361650
};
16371651
auto GetNetworkSecurityType = [IsNetworkWPAPSK, IsNetworkWPA2PSK](WpaFiW1Wpa_supplicant1BSSProxy * proxy) -> uint8_t {
1638-
std::unique_ptr<GVariant, GVariantDeleter> wpa(g_dbus_proxy_get_cached_property(G_DBUS_PROXY(proxy), "WPA"));
1639-
std::unique_ptr<GVariant, GVariantDeleter> rsn(g_dbus_proxy_get_cached_property(G_DBUS_PROXY(proxy), "RSN"));
1652+
GAutoPtr<GVariant> wpa(g_dbus_proxy_get_cached_property(G_DBUS_PROXY(proxy), "WPA"));
1653+
GAutoPtr<GVariant> rsn(g_dbus_proxy_get_cached_property(G_DBUS_PROXY(proxy), "RSN"));
16401654

16411655
uint8_t res = IsNetworkWPAPSK(wpa.get()) | IsNetworkWPA2PSK(rsn.get());
16421656
if (res == 0)

0 commit comments

Comments
 (0)