[IMPROVE] Add preload collection types support 42/33742/1
authorAlexander Aksenov <a.aksenov@samsung.com>
Mon, 29 Sep 2014 14:34:09 +0000 (18:34 +0400)
committerAlexander Aksenov <a.aksenov@samsung.com>
Wed, 14 Jan 2015 08:41:57 +0000 (11:41 +0300)
Change-Id: Ie094514d68bd1c06d5d08071eeafb2bee04f58ef
Signed-off-by: Alexander Aksenov <a.aksenov@samsung.com>
daemon/da_inst.c
daemon/da_protocol_inst.c
daemon/da_protocol_inst.h
daemon/daemon.c

index 6ef8598..843e89d 100644 (file)
@@ -877,7 +877,9 @@ void msg_swap_free_all_data(struct user_space_inst_t *us_inst)
 /******************************************************************************/
 /* TODO support feature_1. hi 64 bits */
 int ld_add_probes_by_feature(uint64_t to_enable_features_0,
+                            uint64_t to_enable_features_1,
                             uint64_t to_disable_features_0,
+                            uint64_t to_disable_features_1,
                             struct user_space_inst_t *us_inst,
                             struct msg_t **msg_reply_add,
                             struct msg_t **msg_reply_remove)
@@ -893,7 +895,17 @@ int ld_add_probes_by_feature(uint64_t to_enable_features_0,
        for (i = 0; i != feature_to_data_count; i++) {
                f = feature_to_data[i];
                LOGI("check feature %016X\n", f.feature_value);
-               if ((f.feature_value & to_enable_features_0) == f.feature_value) {
+               if ((f.feature_value & to_enable_features_0) |
+                   (f.feature_value & to_enable_features_1) == f.feature_value) {
+
+                       int preload_probe_type = 0;
+
+                       if ((f.feature_value & FL_FILE_API_ALWAYS_PROBING) ||
+                           (f.feature_value & FL_MEMORY_ALLOC_ALWAYS_PROBING) ||
+                           (f.feature_value & FL_NETWORK_API_ALWAYS_PROBING) ||
+                           (f.feature_value & FL_OPENGL_API_ALWAYS_PROBING) ||
+                           (f.feature_value & FL_OSP_UI_API_ALWAYS_PROBING))
+                               preload_probe_type = 1;
 
                        buf[0] = '\0';
 
@@ -901,7 +913,8 @@ int ld_add_probes_by_feature(uint64_t to_enable_features_0,
                                         sizeof(buf));
                        LOGI("Set LD probes for %016LX <%s>\n", f.feature_value, &buf[0]);
 
-                       feature_add_lib_inst_list(f.feature_ld, &us_inst->ld_lib_inst_list);
+                       feature_add_lib_inst_list(f.feature_ld, &us_inst->ld_lib_inst_list,
+                                                 preload_probe_type);
                }
        }
 
index 366eca2..a803f66 100644 (file)
@@ -94,7 +94,8 @@ static int parse_us_inst_func(struct msg_buf_t *msg, struct probe_list_t **dest)
                        sizeof(uint32_t);  /* pointer order */
                break;
        case SWAP_LD_PROBE:
-               size += sizeof(uint64_t); /* ld preload handler addr */
+               size += sizeof(uint64_t) + /* ld preload handler addr */
+                       sizeof(char);             /* ld probe type */
                break;
        case SWAP_WEBPROBE:
                break;
@@ -314,10 +315,11 @@ struct ld_preload_probe_t {
        uint64_t orig_addr;
        uint8_t probe_type;
        uint64_t handler_addr;
+       uint8_t preload_type;
 } __attribute__ ((packed));
 
 static int feature_add_func_inst_list(struct ld_lib_list_el_t ld_lib,
-                                     struct data_list_t *dest)
+                                     struct data_list_t *dest, int preload_probe_type)
 {
        uint32_t i = 0, num = 0;
        struct probe_list_t *probe_el;
@@ -340,6 +342,7 @@ static int feature_add_func_inst_list(struct ld_lib_list_el_t ld_lib,
                func->orig_addr = ld_lib.probes[i].orig_addr;
                func->probe_type = SWAP_LD_PROBE;
                func->handler_addr = ld_lib.probes[i].handler_addr;
+               func->preload_type = preload_probe_type;
 
                probe_el->size = sizeof(struct ld_preload_probe_t);
                probe_el->func = (struct us_func_inst_plane_t *)func;
@@ -352,7 +355,7 @@ static int feature_add_func_inst_list(struct ld_lib_list_el_t ld_lib,
 }
 
 static int feature_add_inst_lib(struct ld_lib_list_el_t ld_lib,
-                               struct lib_list_t **dest)
+                               struct lib_list_t **dest, int preload_probe_type)
 {
        *dest = new_lib();
        if (*dest == NULL) {
@@ -367,7 +370,8 @@ static int feature_add_inst_lib(struct ld_lib_list_el_t ld_lib,
 
        (*dest)->lib->bin_path = strdup(ld_lib.lib_name);
 
-       if (!feature_add_func_inst_list(ld_lib, (struct data_list_t *)*dest)) {
+       if (!feature_add_func_inst_list(ld_lib, (struct data_list_t *)*dest,
+           preload_probe_type)) {
                LOGE("funcs parsing error\n");
                return 0;
        }
@@ -379,7 +383,7 @@ static int feature_add_inst_lib(struct ld_lib_list_el_t ld_lib,
 }
 
 int feature_add_lib_inst_list(struct ld_feature_list_el_t *ld_lib_list,
-                             struct lib_list_t **lib_list)
+                             struct lib_list_t **lib_list, int preload_probe_type)
 {
 
        uint32_t i = 0, num;
@@ -393,7 +397,8 @@ int feature_add_lib_inst_list(struct ld_feature_list_el_t *ld_lib_list,
 
        for (i = 0; i < num; i++) {
                LOGI(">add lib #%d <%s> probes_count=%lu\n", i, ld_lib_list->libs[i].lib_name, ld_lib_list->libs[i].probe_count);
-               if (!feature_add_inst_lib(ld_lib_list->libs[i], &lib)) {
+               if (!feature_add_inst_lib(ld_lib_list->libs[i], &lib,
+                   preload_probe_type)) {
                        // TODO maybe need free allocated memory up there
                        LOGE("add LD lib #%d failed\n", i + 1);
                        return 0;
index 9ac7c7b..2fa8d05 100644 (file)
@@ -38,5 +38,5 @@ int parse_app_inst_list(struct msg_buf_t *msg,
                        struct app_list_t **app_list);
 
 int feature_add_lib_inst_list(struct ld_feature_list_el_t *ld_lib_list,
-                             struct lib_list_t **lib_list);
+                             struct lib_list_t **lib_list, int preload_probe_type);
 #endif /* __DA_PROTOCOL_INST__ */
index 07812e6..36038b4 100644 (file)
@@ -490,11 +490,17 @@ static void reconfigure_recording(struct conf_t conf)
 
 static void reconfigure_ld_probes(struct conf_t conf, struct msg_t **msg_reply, struct msg_t **msg_reply_additional)
 {
-       uint64_t old_features = prof_session.conf.use_features0;
-       uint64_t new_features = conf.use_features0;
-       uint64_t to_enable = (new_features ^ old_features) & new_features;
-       uint64_t to_disable = (new_features ^ old_features) & old_features;
-       ld_add_probes_by_feature(to_enable, to_disable, &prof_session.user_space_inst, msg_reply, msg_reply_additional);
+       uint64_t old_features0 = prof_session.conf.use_features0;
+       uint64_t old_features1 = prof_session.conf.use_features1;
+       uint64_t new_features0 = conf.use_features0;
+       uint64_t new_features1 = conf.use_features1;
+       uint64_t to_enable0 = (new_features0 ^ old_features0) & new_features0;
+       uint64_t to_enable1 = (new_features1 ^ old_features1) & new_features1;
+       uint64_t to_disable0 = (new_features0 ^ old_features0) & old_features0;
+       uint64_t to_disable1 = (new_features1 ^ old_features1) & old_features1;
+       ld_add_probes_by_feature(to_enable0, to_enable1, to_disable0, to_disable1,
+                                &prof_session.user_space_inst, msg_reply,
+                                msg_reply_additional);
 }
 
 int reconfigure(struct conf_t conf, struct msg_t **msg_reply, struct msg_t **msg_reply_additional)