diff options
Diffstat (limited to 'src/maat_object.c')
| -rw-r--r-- | src/maat_object.c | 144 |
1 files changed, 113 insertions, 31 deletions
diff --git a/src/maat_object.c b/src/maat_object.c index f57558d..6712730 100644 --- a/src/maat_object.c +++ b/src/maat_object.c @@ -65,6 +65,14 @@ struct object_group_runtime { long long update_err_cnt; int updating_flag; + size_t max_thread_num; + UT_array **all_hit_group_ids; + UT_array **candidate_group_ids; + UT_array **candidate_super_group_ids; + UT_array **kept_super_group_ids; + UT_array **verify_candidate_group_ids; + + struct maat_garbage_bin *ref_garbage_bin; struct log_handle *logger; }; @@ -245,6 +253,23 @@ void *object_group_runtime_new(void *object_group_schema, size_t max_thread_num, object_group_rt->ref_garbage_bin = garbage_bin; object_group_rt->logger = logger; + object_group_rt->max_thread_num = max_thread_num; + object_group_rt->all_hit_group_ids = ALLOC(UT_array *, max_thread_num); + object_group_rt->candidate_group_ids = ALLOC(UT_array *, max_thread_num); + object_group_rt->kept_super_group_ids = ALLOC(UT_array *, max_thread_num); + object_group_rt->candidate_super_group_ids = ALLOC(UT_array *, max_thread_num); + object_group_rt->verify_candidate_group_ids = ALLOC(UT_array *, max_thread_num); + + for (int i = 0; i < max_thread_num; i++) { + utarray_new(object_group_rt->all_hit_group_ids[i], &ut_object_uuid_icd); + utarray_new(object_group_rt->candidate_group_ids[i], &ut_object_uuid_icd); + utarray_new(object_group_rt->kept_super_group_ids[i], &ut_object_uuid_icd); + utarray_new(object_group_rt->candidate_super_group_ids[i], &ut_object_uuid_icd); + utarray_new(object_group_rt->verify_candidate_group_ids[i], &ut_object_uuid_icd); + } + + + return object_group_rt; } @@ -266,6 +291,66 @@ void object_group_runtime_free(void *object_group_runtime) object_group_rt->updating_object_topo = NULL; } + if (object_group_rt->all_hit_group_ids != NULL) { + for (int i = 0; i < object_group_rt->max_thread_num; i++) { + if (object_group_rt->all_hit_group_ids[i] != NULL) { + utarray_free(object_group_rt->all_hit_group_ids[i]); + object_group_rt->all_hit_group_ids[i] = NULL; + } + } + FREE(object_group_rt->all_hit_group_ids); + object_group_rt->all_hit_group_ids = NULL; + + } + + if (object_group_rt->candidate_group_ids != NULL) { + for (int i = 0; i < object_group_rt->max_thread_num; i++) { + if (object_group_rt->candidate_group_ids[i] != NULL) { + utarray_free(object_group_rt->candidate_group_ids[i]); + object_group_rt->candidate_group_ids[i] = NULL; + } + } + FREE(object_group_rt->candidate_group_ids); + object_group_rt->candidate_group_ids = NULL; + + } + + if (object_group_rt->kept_super_group_ids != NULL) { + for (int i = 0; i < object_group_rt->max_thread_num; i++) { + if (object_group_rt->kept_super_group_ids[i] != NULL) { + utarray_free(object_group_rt->kept_super_group_ids[i]); + object_group_rt->kept_super_group_ids[i] = NULL; + } + } + FREE(object_group_rt->kept_super_group_ids); + object_group_rt->kept_super_group_ids = NULL; + + } + + if (object_group_rt->candidate_super_group_ids != NULL) { + for (int i = 0; i < object_group_rt->max_thread_num; i++) { + if (object_group_rt->candidate_super_group_ids[i] != NULL) { + utarray_free(object_group_rt->candidate_super_group_ids[i]); + object_group_rt->candidate_super_group_ids[i] = NULL; + } + } + FREE(object_group_rt->candidate_super_group_ids); + object_group_rt->candidate_super_group_ids = NULL; + + } + + if (object_group_rt->verify_candidate_group_ids != NULL) { + for (int i = 0; i < object_group_rt->max_thread_num; i++) { + if (object_group_rt->verify_candidate_group_ids[i] != NULL) { + utarray_free(object_group_rt->verify_candidate_group_ids[i]); + object_group_rt->verify_candidate_group_ids[i] = NULL; + } + } + FREE(object_group_rt->verify_candidate_group_ids); + object_group_rt->verify_candidate_group_ids = NULL; + } + + FREE(object_group_rt); } @@ -959,15 +1044,14 @@ static void verify_object_by_sub_exclude_objects(struct maat_object *object, } } -static void verify_candidate_super_object_ids(struct maat_object_topology *object_topo, +static void verify_candidate_super_object_ids(struct object_group_runtime *object_group_rt, UT_array *candidate_super_object_uuids, UT_array *all_hit_object_uuids, - UT_array *kept_super_object_uuids) + UT_array *kept_super_object_uuids, int thread_id) { uuid_t *p = NULL; - UT_array *candidate_object_uuids; - - utarray_new(candidate_object_uuids, &ut_object_uuid_icd); + UT_array *candidate_object_uuids = object_group_rt->verify_candidate_group_ids[thread_id]; + struct maat_object_topology *object_topo = object_group_rt->object_topo; /* merge this round of candidate super objects with hit objects from the previous round */ for (p = (uuid_t *)utarray_front(candidate_super_object_uuids); p != NULL; @@ -1049,15 +1133,18 @@ static void verify_candidate_super_object_ids(struct maat_object_topology *objec kept_super_object_uuids, all_hit_object_uuids); } - utarray_free(candidate_object_uuids); + utarray_clear(candidate_object_uuids); } -static void get_super_object_ids(struct maat_object_topology *object_topo, +static void get_super_object_ids(struct object_group_runtime *object_group_rt, UT_array *hit_object_uuids, UT_array *all_hit_object_uuids, - size_t depth) + size_t depth, int thread_id) { - UT_array *candidate_super_object_uuids; - UT_array *kept_super_object_uuids; + UT_array *candidate_super_object_uuids = object_group_rt->candidate_super_group_ids[thread_id]; + UT_array *kept_super_object_uuids = object_group_rt->kept_super_group_ids[thread_id]; + struct maat_object_topology *object_topo = object_group_rt->object_topo; + + utarray_clear(candidate_super_object_uuids); if (depth >= MAX_RECURSION_DEPTH) { log_error(object_topo->logger, MODULE_OBJECT, @@ -1072,10 +1159,7 @@ static void get_super_object_ids(struct maat_object_topology *object_topo, __FUNCTION__, __LINE__, uuid_str); } return; - } - - utarray_new(kept_super_object_uuids, &ut_object_uuid_icd); - utarray_new(candidate_super_object_uuids, &ut_object_uuid_icd); + } /** candidate super objects means all hit objects' super include object, @@ -1090,7 +1174,7 @@ static void get_super_object_ids(struct maat_object_topology *object_topo, get_candidate_super_object_ids(object_topo, hit_object_uuids, candidate_super_object_uuids); if (0 == utarray_len(candidate_super_object_uuids)) { - goto next; + return; } /** @@ -1117,24 +1201,22 @@ static void get_super_object_ids(struct maat_object_topology *object_topo, after verify candidates, kept super objects = {g7, g8}, all hit objects = {g4, g11, g7, g8} */ - verify_candidate_super_object_ids(object_topo, candidate_super_object_uuids, all_hit_object_uuids, - kept_super_object_uuids); + utarray_clear(kept_super_object_uuids);//kept_super_object_ids is used as the hit_object_ids parameter when invoke get_super_object_ids recursively, so can't clear it at the beginning + verify_candidate_super_object_ids(object_group_rt, candidate_super_object_uuids, all_hit_object_uuids, + kept_super_object_uuids, thread_id); depth++; - get_super_object_ids(object_topo, kept_super_object_uuids, all_hit_object_uuids, depth); -next: - utarray_free(candidate_super_object_uuids); - utarray_free(kept_super_object_uuids); + get_super_object_ids(object_group_rt, kept_super_object_uuids, all_hit_object_uuids, depth, thread_id); } -static size_t object_topology_get_super_objects(struct maat_object_topology *object_topo, +static size_t object_topology_get_super_objects(struct object_group_runtime *object_group_rt, uuid_t *object_uuids, size_t n_object_uuids, uuid_t *super_object_uuids, - size_t super_object_uuids_size) + size_t super_object_uuids_size, int thread_id) { size_t i = 0, idx = 0; - UT_array *all_hit_object_uuids; - UT_array *candidate_object_uuids; + UT_array *all_hit_object_uuids = object_group_rt->all_hit_group_ids[thread_id]; + UT_array *candidate_object_uuids = object_group_rt->candidate_group_ids[thread_id]; utarray_new(all_hit_object_uuids, &ut_object_uuid_icd); utarray_new(candidate_object_uuids, &ut_object_uuid_icd); @@ -1144,7 +1226,7 @@ static size_t object_topology_get_super_objects(struct maat_object_topology *obj utarray_push_back(candidate_object_uuids, &(object_uuids[i])); } - get_super_object_ids(object_topo, candidate_object_uuids, all_hit_object_uuids, 0); + get_super_object_ids(object_group_rt, candidate_object_uuids, all_hit_object_uuids, 0, thread_id); for (i = 0; i < n_object_uuids; i++) { uuid_t *tmp_id = utarray_find(all_hit_object_uuids, &(object_uuids[i]), @@ -1164,15 +1246,15 @@ static size_t object_topology_get_super_objects(struct maat_object_topology *obj uuid_copy(super_object_uuids[idx++], *p); } - utarray_free(all_hit_object_uuids); - utarray_free(candidate_object_uuids); + utarray_clear(all_hit_object_uuids); + utarray_clear(candidate_object_uuids); return idx; } size_t object_group_runtime_get_super_objects(void *object_group_runtime, uuid_t *object_uuids, size_t n_object_uuids, uuid_t *super_object_uuids, - size_t super_object_uuids_size) + size_t super_object_uuids_size, int thread_id) { if (NULL == object_group_runtime || NULL == object_uuids || 0 == n_object_uuids) { return 0; @@ -1195,8 +1277,8 @@ size_t object_group_runtime_get_super_objects(void *object_group_runtime, uuid_t return 0; } - return object_topology_get_super_objects(object_group_rt->object_topo, object_group_object_uuids, object_group_object_uuids_cnt, - super_object_uuids, super_object_uuids_size); + return object_topology_get_super_objects(object_group_rt, object_group_object_uuids, object_group_object_uuids_cnt, + super_object_uuids, super_object_uuids_size, thread_id); } long long object_group_runtime_rule_count(void *object_group_runtime) |
