diff --git a/src/entry/Maat_api.cpp b/src/entry/Maat_api.cpp index 741afaa..24e6723 100644 --- a/src/entry/Maat_api.cpp +++ b/src/entry/Maat_api.cpp @@ -231,6 +231,35 @@ void hit_path_init(struct Maat_hit_path_t* hit_path) hit_path->virtual_table_id=-1; hit_path->compile_id=-1; } +size_t scan_hit_status_select_hit_path_inner(const struct hit_path_q *hit_path_qhead, struct Maat_hit_path_t* condition, + struct Maat_hit_path_inner* hit_paths, size_t n_path) +{ + struct Maat_hit_path_inner* p=NULL; + size_t i=0; + TAILQ_FOREACH(p, hit_path_qhead, entries) + { + if((condition->compile_id==p->path.compile_id||condition->compile_id<0) + && (condition->Nth_scan==p->path.Nth_scan||condition->Nth_scan<0) + && (condition->region_id=p->path.region_id||condition->region_id<0) + && (condition->sub_group_id=p->path.sub_group_id||condition->sub_group_id<0) + && (condition->top_group_id=p->path.top_group_id||condition->top_group_id<0)) + { + if(ihit_path_qhead, entries) + for(i=0; ihit_path_qhead, entries) { if(TO_RELATION_ID(p->path.virtual_table_id, p->path.top_group_id)==a_set.items[i].item_id && p->path.compile_id!=compile_rule->compile_id) @@ -277,19 +311,32 @@ size_t scan_hit_status_update_by_compile(struct scan_hit_status* hit_status, str } else //current path already have a compile as endpoint, so we duplicate a new path. { - q=ALLOC(struct Maat_hit_path_inner, 1); - *q=*p; - q->path.compile_id=compile_rule->compile_id; - TAILQ_INSERT_HEAD(&hit_status->hit_path_qhead, q, entries); - hit_status->hit_path_cnt++; + condition=p->path; + condition.compile_id=compile_rule->compile_id; + n_exsited_path=scan_hit_status_select_hit_path_inner(&shared_path_qhead, &condition, NULL, 0); + if(n_exsited_path==0) + { + q=ALLOC(struct Maat_hit_path_inner, 1); + *q=*p; + q->path.compile_id=compile_rule->compile_id; + TAILQ_INSERT_TAIL(&shared_path_qhead, q, entries); + hit_status->hit_path_cnt++; + } } - if(p->path.Nth_scan==Nth_scan)//Compile was satisfied by new region hits. + if(p->path.Nth_scan==Nth_scan && n_exsited_path==0)//Compile was satisfied by new region hits. { j++; } - } + } } } + p = TAILQ_FIRST(&shared_path_qhead); + while(p != NULL) + { + TAILQ_REMOVE(&shared_path_qhead, p, entries); + TAILQ_INSERT_TAIL(&hit_status->hit_path_qhead, p, entries); + p = TAILQ_FIRST(&shared_path_qhead); + } return j; } @@ -298,29 +345,8 @@ size_t scan_hit_status_read_group_ids(const struct scan_hit_status* hit_status, *grp_ids=hit_status->all_hit_group_array; return hit_status->all_hit_group_cnt; } -//Maybe select? -size_t scan_hit_status_select_hit_path_inner(const struct scan_hit_status* hit_status, struct Maat_hit_path_t* condition, - struct Maat_hit_path_inner* hit_paths, size_t n_path) -{ - struct Maat_hit_path_inner* p=NULL; - size_t i=0; - TAILQ_FOREACH(p, &hit_status->hit_path_qhead, entries) - { - if((condition->compile_id==p->path.compile_id||condition->compile_id<0) - && (condition->Nth_scan==p->path.Nth_scan||condition->Nth_scan<0) - && (condition->region_id=p->path.region_id||condition->region_id<0)) - { - if(ihit_path_qhead, &condition, hit_paths, MAX_SCANNER_HIT_NUM); for(j=0; jinner, &condition, path_inner, n_read); + n_read=scan_hit_status_select_hit_path_inner(&_mid->inner->hit_path_qhead, &condition, path_inner, n_read); for(i=0; i