From: Daniel Wagner <[email protected]>
Reduce the size of struct connman_session so that we don't have to
load the whole data structure and increase the likeklihood that the
data structure can stay in cache.
---
src/session.c | 73 +++++++++++++++++++++++++++++++++++++-------------------
1 files changed, 48 insertions(+), 25 deletions(-)
diff --git a/src/session.c b/src/session.c
index febc506..49c3397 100644
--- a/src/session.c
+++ b/src/session.c
@@ -92,8 +92,8 @@ struct connman_session {
connman_bool_t append_all;
connman_bool_t info_dirty;
- struct session_info info;
- struct session_info info_last;
+ struct session_info *info;
+ struct session_info *info_last;
GSequence *service_list;
GHashTable *service_hash;
@@ -338,8 +338,8 @@ static void append_ipconfig_ipv6(DBusMessageIter *iter,
void *user_data)
static void append_notify(DBusMessageIter *dict,
struct connman_session *session)
{
- struct session_info *info = &session->info;
- struct session_info *info_last = &session->info_last;
+ struct session_info *info = session->info;
+ struct session_info *info_last = session->info_last;
const char *policy;
struct connman_service *service;
const char *name, *ifname, *bearer;
@@ -502,7 +502,7 @@ static gboolean session_notify(gpointer user_data)
static void ipconfig_ipv4_changed(struct connman_session *session)
{
- struct session_info *info = &session->info;
+ struct session_info *info = session->info;
connman_dbus_setting_changed_dict(session->owner, session->notify_path,
"IPv4", append_ipconfig_ipv4,
@@ -511,7 +511,7 @@ static void ipconfig_ipv4_changed(struct connman_session
*session)
static void ipconfig_ipv6_changed(struct connman_session *session)
{
- struct session_info *info = &session->info;
+ struct session_info *info = session->info;
connman_dbus_setting_changed_dict(session->owner, session->notify_path,
"IPv6", append_ipconfig_ipv6,
@@ -521,7 +521,7 @@ static void ipconfig_ipv6_changed(struct connman_session
*session)
static connman_bool_t service_type_match(struct connman_session *session,
struct connman_service *service)
{
- struct session_info *info = &session->info;
+ struct session_info *info = session->info;
GSList *list;
for (list = info->allowed_bearers;
@@ -587,7 +587,7 @@ static gint sort_allowed_bearers(struct connman_service
*service_a,
struct connman_service *service_b,
struct connman_session *session)
{
- struct session_info *info = &session->info;
+ struct session_info *info = session->info;
GSList *list;
enum connman_service_type type_a, type_b;
int weight_a, weight_b;
@@ -645,7 +645,7 @@ static gint sort_services(gconstpointer a, gconstpointer b,
gpointer user_data)
static void cleanup_session(gpointer user_data)
{
struct connman_session *session = user_data;
- struct session_info *info = &session->info;
+ struct session_info *info = session->info;
DBG("remove %s", session->session_path);
@@ -663,6 +663,8 @@ static void cleanup_session(gpointer user_data)
g_free(session->owner);
g_free(session->session_path);
g_free(session->notify_path);
+ g_free(session->info);
+ g_free(session->info_last);
g_free(session);
}
@@ -760,7 +762,7 @@ static connman_bool_t explicit_connect(enum
connman_session_reason reason)
static void test_and_disconnect(struct connman_session *session)
{
- struct session_info *info = &session->info;
+ struct session_info *info = session->info;
if (info->entry == NULL)
return;
@@ -794,7 +796,7 @@ out:
static void select_and_connect(struct connman_session *session,
enum connman_session_reason reason)
{
- struct session_info *info = &session->info;
+ struct session_info *info = session->info;
struct service_entry *entry = NULL;
GSequenceIter *iter;
connman_bool_t do_connect = FALSE;
@@ -850,8 +852,8 @@ static void select_and_connect(struct connman_session
*session,
static void session_changed(struct connman_session *session,
enum connman_session_trigger trigger)
{
- struct session_info *info = &session->info;
- struct session_info *info_last = &session->info_last;
+ struct session_info *info = session->info;
+ struct session_info *info_last = session->info_last;
GSequenceIter *iter;
/*
@@ -1041,7 +1043,7 @@ static void update_allowed_bearers(struct connman_session
*session)
static void update_ecall_sessions(struct connman_session *session)
{
- struct session_info *info = &session->info;
+ struct session_info *info = session->info;
struct connman_session *session_iter;
GHashTableIter iter;
gpointer key, value;
@@ -1054,7 +1056,7 @@ static void update_ecall_sessions(struct connman_session
*session)
if (session_iter == session)
continue;
- session_iter->info.ecall = info->ecall;
+ session_iter->info->ecall = info->ecall;
session_iter->info_dirty = TRUE;
session_changed(session_iter, CONNMAN_SESSION_TRIGGER_ECALL);
@@ -1063,8 +1065,8 @@ static void update_ecall_sessions(struct connman_session
*session)
static void update_ecall(struct connman_session *session)
{
- struct session_info *info = &session->info;
- struct session_info *info_last = &session->info_last;
+ struct session_info *info = session->info;
+ struct session_info *info_last = session->info_last;
DBG("session %p ecall_session %p ecall %d -> %d", session,
ecall_session, info_last->ecall, info->ecall);
@@ -1097,8 +1099,8 @@ static DBusMessage *change_session(DBusConnection *conn,
DBusMessage *msg, void *user_data)
{
struct connman_session *session = user_data;
- struct session_info *info = &session->info;
- struct session_info *info_last = &session->info_last;
+ struct session_info *info = session->info;
+ struct session_info *info_last = session->info_last;
DBusMessageIter iter, value;
const char *name;
GSList *allowed_bearers;
@@ -1331,8 +1333,20 @@ int __connman_session_create(DBusMessage *msg)
goto err;
}
- info = &session->info;
- info_last = &session->info_last;
+ session->info = g_try_new0(struct session_info, 1);
+ if (session->info == NULL) {
+ err = -ENOMEM;
+ goto err;
+ }
+
+ session->info_last = g_try_new0(struct session_info, 1);
+ if (session->info_last == NULL) {
+ err = -ENOMEM;
+ goto err;
+ }
+
+ info = session->info;
+ info_last = session->info_last;
session->owner = g_strdup(owner);
session->session_path = session_path;
@@ -1415,6 +1429,15 @@ int __connman_session_create(DBusMessage *msg)
err:
connman_error("Failed to create session");
+
+ if (session != NULL) {
+ if (session->info_last != NULL)
+ g_free(session->info_last);
+ if (session->info != NULL)
+ g_free(session->info);
+ g_free(session);
+ }
+
g_free(session_path);
g_slist_foreach(allowed_bearers, cleanup_bearer_info, NULL);
@@ -1511,7 +1534,7 @@ static void service_remove(struct connman_service
*service)
while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
GSequenceIter *iter;
session = value;
- info = &session->info;
+ info = session->info;
iter = g_hash_table_lookup(session->service_hash, service);
if (iter == NULL)
@@ -1538,8 +1561,8 @@ static void service_state_changed(struct connman_service
*service,
while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
session = value;
- info = &session->info;
- info_last = &session->info_last;
+ info = session->info;
+ info_last = session->info_last;
if (info->entry != NULL && info->entry->service == service) {
info->entry->state = state;
@@ -1570,7 +1593,7 @@ static void ipconfig_changed(struct connman_service
*service,
while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
session = value;
- info = &session->info;
+ info = session->info;
if (info->entry != NULL && info->entry->service == service) {
if (type == CONNMAN_IPCONFIG_TYPE_IPV4)
--
1.7.4.4
_______________________________________________
connman mailing list
[email protected]
http://lists.connman.net/listinfo/connman