在线exprid2region_id命中大量相同的district,导致锁冲突,将group中的互斥锁改为读写锁。

This commit is contained in:
zhengchao
2017-08-02 18:30:16 +08:00
parent 45cf4a61f2
commit 80d620de70
3 changed files with 12 additions and 12 deletions

View File

@@ -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; int i=0,region_id=-1;
struct _Maat_region_rule_t* region_rule=NULL; struct _Maat_region_rule_t* region_rule=NULL;
assert(group_rule->group_id>=0); assert(group_rule->group_id>=0);
pthread_mutex_lock(&(group_rule->mutex)); pthread_rwlock_rdlock(&(group_rule->rwlock));
for(i=0;i<group_rule->region_boundary;i++) for(i=0;i<group_rule->region_boundary;i++)
{ {
region_rule=(struct _Maat_region_rule_t*)dynamic_array_read(group_rule->region_rules, 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; *district_id=region_rule->district_id;
} }
} }
pthread_mutex_unlock(&(group_rule->mutex)); pthread_rwlock_unlock(&(group_rule->rwlock));
return region_id; return region_id;
} }
int match_district(struct _OUTER_scan_status_t *_mid,scan_result_t *region_hit,int region_hit_num) int match_district(struct _OUTER_scan_status_t *_mid,scan_result_t *region_hit,int region_hit_num)

View File

@@ -28,7 +28,7 @@
#include "mesa_fuzzy.h" #include "mesa_fuzzy.h"
#include "great_index_engine.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 *maat_module="MAAT Frame";
const char* CHARSET_STRING[]={"NONE","gbk","big5","unicode","utf8","bin", 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->ref_cnt=0;
group->region_rules=dynamic_array_create(1,8); group->region_rules=dynamic_array_create(1,8);
group->compile_shortcut=NULL; group->compile_shortcut=NULL;
pthread_mutex_init(&(group->mutex), NULL); pthread_rwlock_init(&(group->rwlock), NULL);
return group; return group;
} }
void destroy_group_rule(struct _Maat_group_rule_t* 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->region_rules=NULL;
group->ref_cnt=0; group->ref_cnt=0;
group->group_id=-1; group->group_id=-1;
pthread_mutex_destroy(&(group->mutex)); pthread_rwlock_destroy(&(group->rwlock));
free(group); 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->expr_id=expr_id;
region_rule->district_id=district_id; region_rule->district_id=district_id;
region_rule->region_type=region_type; 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); dynamic_array_write(group->region_rules,group->region_boundary,region_rule);
group->region_cnt++; group->region_cnt++;
group->region_boundary++; group->region_boundary++;
pthread_mutex_unlock(&(group->mutex)); pthread_rwlock_unlock(&(group->rwlock));
return group; return group;
} }
void cancel_last_region_from_group(struct _Maat_group_rule_t* group,int region_id,int expr_id) 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; struct _Maat_region_rule_t* region_rule=NULL;
pthread_mutex_lock(&(group->mutex)); pthread_rwlock_wrlock(&(group->rwlock));
group->region_boundary--; group->region_boundary--;
region_rule=(struct _Maat_region_rule_t*)dynamic_array_read(group->region_rules,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&&region_rule->region_id==region_id); assert(region_rule->expr_id==expr_id&&region_rule->region_id==region_id);
free(region_rule); free(region_rule);
dynamic_array_write(group->region_rules,group->region_boundary,NULL); dynamic_array_write(group->region_rules,group->region_boundary,NULL);
group->region_cnt--; group->region_cnt--;
pthread_mutex_unlock(&(group->mutex)); pthread_rwlock_unlock(&(group->rwlock));
return; return;
} }
unsigned int del_region_from_group(struct _Maat_group_rule_t* group,int region_id,unsigned int *output_expr_id,int output_size) 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; int i=0,j=0;
struct _Maat_region_rule_t* region_rule=NULL; struct _Maat_region_rule_t* region_rule=NULL;
pthread_mutex_lock(&(group->mutex)); pthread_rwlock_wrlock(&(group->rwlock));
for(i=0;i<group->region_boundary;i++) for(i=0;i<group->region_boundary;i++)
{ {
region_rule=(struct _Maat_region_rule_t*)dynamic_array_read(group->region_rules, 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--; group->region_cnt--;
} }
} }
pthread_mutex_unlock(&(group->mutex)); pthread_rwlock_unlock(&(group->rwlock));
return j; return j;
} }

View File

@@ -189,7 +189,7 @@ struct _Maat_group_rule_t
int ref_cnt; int ref_cnt;
dynamic_array_t *region_rules; dynamic_array_t *region_rules;
void* compile_shortcut; void* compile_shortcut;
pthread_mutex_t mutex; pthread_mutex_t rwlock;
}; };
struct _Maat_compile_rule_t struct _Maat_compile_rule_t
{ {