diff --git a/src/entry/Maat_api.cpp b/src/entry/Maat_api.cpp index 0e10c92..a6dc98c 100644 --- a/src/entry/Maat_api.cpp +++ b/src/entry/Maat_api.cpp @@ -188,7 +188,7 @@ int exprid2region_id(struct _Maat_group_rule_t* group_rule,int expr_id,int* dist int i=0,region_id=-1; struct _Maat_region_rule_t* region_rule=NULL; assert(group_rule->group_id>=0); - pthread_mutex_lock(&(group_rule->mutex)); + pthread_rwlock_rdlock(&(group_rule->rwlock)); for(i=0;iregion_boundary;i++) { region_rule=(struct _Maat_region_rule_t*)dynamic_array_read(group_rule->region_rules, i); @@ -202,7 +202,7 @@ int exprid2region_id(struct _Maat_group_rule_t* group_rule,int expr_id,int* dist *district_id=region_rule->district_id; } } - pthread_mutex_unlock(&(group_rule->mutex)); + pthread_rwlock_unlock(&(group_rule->rwlock)); return region_id; } int match_district(struct _OUTER_scan_status_t *_mid,scan_result_t *region_hit,int region_hit_num) diff --git a/src/entry/Maat_rule.cpp b/src/entry/Maat_rule.cpp index 3caecac..dd9afb8 100644 --- a/src/entry/Maat_rule.cpp +++ b/src/entry/Maat_rule.cpp @@ -28,7 +28,7 @@ #include "mesa_fuzzy.h" #include "great_index_engine.h" -int MAAT_FRAME_VERSION_1_9_20170626=1; +int MAAT_FRAME_VERSION_1_9_20170802=1; const char *maat_module="MAAT Frame"; const char* CHARSET_STRING[]={"NONE","gbk","big5","unicode","utf8","bin", @@ -630,7 +630,7 @@ struct _Maat_group_rule_t* create_group_rule(int group_id) group->ref_cnt=0; group->region_rules=dynamic_array_create(1,8); group->compile_shortcut=NULL; - pthread_mutex_init(&(group->mutex), NULL); + pthread_rwlock_init(&(group->rwlock), NULL); return group; } void destroy_group_rule(struct _Maat_group_rule_t* group) @@ -647,7 +647,7 @@ void destroy_group_rule(struct _Maat_group_rule_t* group) group->region_rules=NULL; group->ref_cnt=0; group->group_id=-1; - pthread_mutex_destroy(&(group->mutex)); + pthread_rwlock_destroy(&(group->rwlock)); free(group); } @@ -1299,31 +1299,31 @@ struct _Maat_group_rule_t* add_region_to_group(struct _Maat_group_rule_t* group, region_rule->expr_id=expr_id; region_rule->district_id=district_id; region_rule->region_type=region_type; - pthread_mutex_lock(&(group->mutex)); + pthread_rwlock_wrlock(&(group->rwlock)); dynamic_array_write(group->region_rules,group->region_boundary,region_rule); group->region_cnt++; group->region_boundary++; - pthread_mutex_unlock(&(group->mutex)); + pthread_rwlock_unlock(&(group->rwlock)); return group; } void cancel_last_region_from_group(struct _Maat_group_rule_t* group,int region_id,int expr_id) { struct _Maat_region_rule_t* region_rule=NULL; - pthread_mutex_lock(&(group->mutex)); + pthread_rwlock_wrlock(&(group->rwlock)); group->region_boundary--; region_rule=(struct _Maat_region_rule_t*)dynamic_array_read(group->region_rules,group->region_boundary); assert(region_rule->expr_id==expr_id&®ion_rule->region_id==region_id); free(region_rule); dynamic_array_write(group->region_rules,group->region_boundary,NULL); group->region_cnt--; - pthread_mutex_unlock(&(group->mutex)); + pthread_rwlock_unlock(&(group->rwlock)); return; } unsigned int del_region_from_group(struct _Maat_group_rule_t* group,int region_id,unsigned int *output_expr_id,int output_size) { int i=0,j=0; struct _Maat_region_rule_t* region_rule=NULL; - pthread_mutex_lock(&(group->mutex)); + pthread_rwlock_wrlock(&(group->rwlock)); for(i=0;iregion_boundary;i++) { region_rule=(struct _Maat_region_rule_t*)dynamic_array_read(group->region_rules, i); @@ -1344,7 +1344,7 @@ unsigned int del_region_from_group(struct _Maat_group_rule_t* group,int region_i group->region_cnt--; } } - pthread_mutex_unlock(&(group->mutex)); + pthread_rwlock_unlock(&(group->rwlock)); return j; } diff --git a/src/entry/Maat_rule_internal.h b/src/entry/Maat_rule_internal.h index d2e3e22..272a68a 100644 --- a/src/entry/Maat_rule_internal.h +++ b/src/entry/Maat_rule_internal.h @@ -189,7 +189,7 @@ struct _Maat_group_rule_t int ref_cnt; dynamic_array_t *region_rules; void* compile_shortcut; - pthread_mutex_t mutex; + pthread_mutex_t rwlock; }; struct _Maat_compile_rule_t {