Index: res/res_config_mysql.c =================================================================== --- res/res_config_mysql.c (revision 722) +++ res/res_config_mysql.c (working copy) @@ -79,7 +79,7 @@ enum requirements { RQ_WARN, RQ_CREATECLOSE, RQ_CREATECHAR }; struct mysql_conn { - AST_LIST_ENTRY(mysql_conn) list; + AST_RWLIST_ENTRY(mysql_conn) list; ast_mutex_t lock; MYSQL handle; char host[50]; @@ -112,7 +112,7 @@ }; static AST_LIST_HEAD_STATIC(mysql_tables, tables); -static AST_LIST_HEAD_STATIC(databases, mysql_conn); +static AST_RWLIST_HEAD_STATIC(databases, mysql_conn); static int parse_config(int reload); static int mysql_reconnect(struct mysql_conn *conn); @@ -146,14 +146,14 @@ whichdb = ast_strdupa(database); } - AST_LIST_LOCK(&databases); - AST_LIST_TRAVERSE(&databases, cur, list) { + AST_RWLIST_RDLOCK(&databases); + AST_RWLIST_TRAVERSE(&databases, cur, list) { if (!strcmp(cur->unique_name, whichdb)) { ast_mutex_lock(&cur->lock); break; } } - AST_LIST_UNLOCK(&databases); + AST_RWLIST_UNLOCK(&databases); return cur; } @@ -1277,12 +1277,13 @@ ast_module_user_hangup_all(); usleep(1); - AST_LIST_LOCK(&databases); - while ((cur = AST_LIST_REMOVE_HEAD(&databases, list))) { + AST_RWLIST_WRLOCK(&databases); + while ((cur = AST_RWLIST_REMOVE_HEAD(&databases, list))) { mysql_close(&cur->handle); ast_mutex_destroy(&cur->lock); ast_free(cur); } + AST_RWLIST_UNLOCK(&databases); /* Destroy cached table info */ AST_LIST_LOCK(&mysql_tables); @@ -1318,10 +1319,10 @@ return 0; } - AST_LIST_LOCK(&databases); + AST_RWLIST_WRLOCK(&databases); for (catg = ast_category_browse(config, NULL); catg; catg = ast_category_browse(config, catg)) { /* Does this category already exist? */ - AST_LIST_TRAVERSE(&databases, cur, list) { + AST_RWLIST_TRAVERSE(&databases, cur, list) { if (!strcmp(cur->unique_name, catg)) { break; } @@ -1335,12 +1336,12 @@ strcpy(cur->unique_name, catg); /* SAFE */ ast_mutex_init(&cur->lock); - AST_LIST_INSERT_TAIL(&databases, cur, list); + AST_RWLIST_INSERT_TAIL(&databases, cur, list); } load_mysql_config(config, catg, cur); } - AST_LIST_UNLOCK(&databases); + AST_RWLIST_UNLOCK(&databases); ast_config_destroy(config); @@ -1510,14 +1511,14 @@ AST_LIST_UNLOCK(&mysql_tables); } else { struct mysql_conn *cur; - AST_LIST_LOCK(&databases); - AST_LIST_TRAVERSE(&databases, cur, list) { + AST_RWLIST_RDLOCK(&databases); + AST_RWLIST_TRAVERSE(&databases, cur, list) { if (!strncasecmp(a->word, cur->unique_name, l) && ++which > a->n) { ret = ast_strdup(cur->unique_name); break; } } - AST_LIST_UNLOCK(&databases); + AST_RWLIST_UNLOCK(&databases); } return ret; } @@ -1577,14 +1578,14 @@ return NULL; case CLI_GENERATE: if (a->argc == 4) { - AST_LIST_LOCK(&databases); - AST_LIST_TRAVERSE(&databases, cur, list) { + AST_RWLIST_RDLOCK(&databases); + AST_RWLIST_TRAVERSE(&databases, cur, list) { if (!strncasecmp(a->word, cur->unique_name, l) && ++which > a->n) { ret = ast_strdup(cur->unique_name); break; } } - AST_LIST_UNLOCK(&databases); + AST_RWLIST_UNLOCK(&databases); } return ret; } @@ -1592,8 +1593,8 @@ if (a->argc != 3) return CLI_SHOWUSAGE; - AST_LIST_LOCK(&databases); - AST_LIST_TRAVERSE(&databases, cur, list) { + AST_RWLIST_RDLOCK(&databases); + AST_RWLIST_TRAVERSE(&databases, cur, list) { if (a->argc == 3 || (a->argc == 4 && !strcasecmp(a->argv[3], cur->unique_name))) { found = 1; @@ -1634,7 +1635,7 @@ } } } - AST_LIST_UNLOCK(&databases); + AST_RWLIST_UNLOCK(&databases); if (!found) { ast_cli(a->fd, "No connections configured.\n");