mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-06 12:36:58 +00:00
backport some mutex initialization and linked list handling fixes from trunk
git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.2@29732 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -132,7 +132,7 @@ struct ast_PGSQL_id {
|
|||||||
AST_LIST_ENTRY(ast_PGSQL_id) entries;
|
AST_LIST_ENTRY(ast_PGSQL_id) entries;
|
||||||
} *ast_PGSQL_id;
|
} *ast_PGSQL_id;
|
||||||
|
|
||||||
AST_LIST_HEAD(PGSQLidshead,ast_PGSQL_id) PGSQLidshead;
|
static AST_LIST_HEAD_STATIC(PGSQLidshead,ast_PGSQL_id);
|
||||||
|
|
||||||
static void *find_identifier(int identifier,int identifier_type) {
|
static void *find_identifier(int identifier,int identifier_type) {
|
||||||
struct PGSQLidshead *headp;
|
struct PGSQLidshead *headp;
|
||||||
@@ -551,11 +551,6 @@ int unload_module(void)
|
|||||||
|
|
||||||
int load_module(void)
|
int load_module(void)
|
||||||
{
|
{
|
||||||
struct PGSQLidshead *headp;
|
|
||||||
|
|
||||||
headp=&PGSQLidshead;
|
|
||||||
|
|
||||||
AST_LIST_HEAD_INIT(headp);
|
|
||||||
return ast_register_application(app, PGSQL_exec, synopsis, descrip);
|
return ast_register_application(app, PGSQL_exec, synopsis, descrip);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
3
dnsmgr.c
3
dnsmgr.c
@@ -57,7 +57,7 @@ struct ast_dnsmgr_entry {
|
|||||||
char name[1];
|
char name[1];
|
||||||
};
|
};
|
||||||
|
|
||||||
static AST_LIST_HEAD(entry_list, ast_dnsmgr_entry) entry_list;
|
static AST_LIST_HEAD_STATIC(entry_list, ast_dnsmgr_entry);
|
||||||
|
|
||||||
AST_MUTEX_DEFINE_STATIC(refresh_lock);
|
AST_MUTEX_DEFINE_STATIC(refresh_lock);
|
||||||
|
|
||||||
@@ -289,7 +289,6 @@ int dnsmgr_init(void)
|
|||||||
ast_log(LOG_ERROR, "Unable to create schedule context.\n");
|
ast_log(LOG_ERROR, "Unable to create schedule context.\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
AST_LIST_HEAD_INIT(&entry_list);
|
|
||||||
ast_cli_register(&cli_reload);
|
ast_cli_register(&cli_reload);
|
||||||
ast_cli_register(&cli_status);
|
ast_cli_register(&cli_status);
|
||||||
return do_reload(1);
|
return do_reload(1);
|
||||||
|
@@ -100,6 +100,23 @@ struct name { \
|
|||||||
struct type *last; \
|
struct type *last; \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\brief Defines initial values for a declaration of AST_LIST_HEAD
|
||||||
|
*/
|
||||||
|
#define AST_LIST_HEAD_INIT_VALUE { \
|
||||||
|
.first = NULL, \
|
||||||
|
.last = NULL, \
|
||||||
|
.lock = AST_MUTEX_INIT_VALUE, \
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\brief Defines initial values for a declaration of AST_LIST_HEAD_NOLOCK
|
||||||
|
*/
|
||||||
|
#define AST_LIST_HEAD_NOLOCK_INIT_VALUE { \
|
||||||
|
.first = NULL, \
|
||||||
|
.last = NULL, \
|
||||||
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\brief Defines a structure to be used to hold a list of specified type, statically initialized.
|
\brief Defines a structure to be used to hold a list of specified type, statically initialized.
|
||||||
\param name This will be the name of the defined structure.
|
\param name This will be the name of the defined structure.
|
||||||
@@ -122,11 +139,18 @@ struct name { \
|
|||||||
struct type *first; \
|
struct type *first; \
|
||||||
struct type *last; \
|
struct type *last; \
|
||||||
ast_mutex_t lock; \
|
ast_mutex_t lock; \
|
||||||
} name = { \
|
} name = AST_LIST_HEAD_INIT_VALUE
|
||||||
.first = NULL, \
|
|
||||||
.last = NULL, \
|
/*!
|
||||||
.lock = AST_MUTEX_INIT_VALUE, \
|
\brief Defines a structure to be used to hold a list of specified type, statically initialized.
|
||||||
};
|
|
||||||
|
This is the same as AST_LIST_HEAD_STATIC, except without the lock included.
|
||||||
|
*/
|
||||||
|
#define AST_LIST_HEAD_NOLOCK_STATIC(name, type) \
|
||||||
|
struct name { \
|
||||||
|
struct type *first; \
|
||||||
|
struct type *last; \
|
||||||
|
} name = AST_LIST_HEAD_NOLOCK_INIT_VALUE
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\brief Initializes a list head structure with a specified first entry.
|
\brief Initializes a list head structure with a specified first entry.
|
||||||
@@ -183,6 +207,12 @@ struct { \
|
|||||||
*/
|
*/
|
||||||
#define AST_LIST_FIRST(head) ((head)->first)
|
#define AST_LIST_FIRST(head) ((head)->first)
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\brief Returns the last entry contained in a list.
|
||||||
|
\param head This is a pointer to the list tail structure
|
||||||
|
*/
|
||||||
|
#define AST_LIST_LAST(head) ((head)->last)
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\brief Returns the next entry in the list after the given entry.
|
\brief Returns the next entry in the list after the given entry.
|
||||||
\param elm This is a pointer to the current entry.
|
\param elm This is a pointer to the current entry.
|
||||||
@@ -433,11 +463,13 @@ struct { \
|
|||||||
(head)->last = NULL; \
|
(head)->last = NULL; \
|
||||||
} else { \
|
} else { \
|
||||||
typeof(elm) curelm = (head)->first; \
|
typeof(elm) curelm = (head)->first; \
|
||||||
while (curelm->field.next != (elm)) \
|
while (curelm && (curelm->field.next != (elm))) \
|
||||||
curelm = curelm->field.next; \
|
curelm = curelm->field.next; \
|
||||||
curelm->field.next = (elm)->field.next; \
|
if (curelm) { \
|
||||||
if ((head)->last == (elm)) \
|
curelm->field.next = (elm)->field.next; \
|
||||||
(head)->last = curelm; \
|
if ((head)->last == (elm)) \
|
||||||
|
(head)->last = curelm; \
|
||||||
|
} \
|
||||||
} \
|
} \
|
||||||
(elm)->field.next = NULL; \
|
(elm)->field.next = NULL; \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
@@ -97,6 +97,13 @@ typedef struct ast_mutex_info ast_mutex_t;
|
|||||||
|
|
||||||
typedef pthread_cond_t ast_cond_t;
|
typedef pthread_cond_t ast_cond_t;
|
||||||
|
|
||||||
|
static pthread_mutex_t empty_mutex;
|
||||||
|
|
||||||
|
static void __attribute__((constructor)) init_empty_mutex(void)
|
||||||
|
{
|
||||||
|
memset(&empty_mutex, 0, sizeof(empty_mutex));
|
||||||
|
}
|
||||||
|
|
||||||
static inline int __ast_pthread_mutex_init_attr(const char *filename, int lineno, const char *func,
|
static inline int __ast_pthread_mutex_init_attr(const char *filename, int lineno, const char *func,
|
||||||
const char *mutex_name, ast_mutex_t *t,
|
const char *mutex_name, ast_mutex_t *t,
|
||||||
pthread_mutexattr_t *attr)
|
pthread_mutexattr_t *attr)
|
||||||
@@ -105,14 +112,16 @@ static inline int __ast_pthread_mutex_init_attr(const char *filename, int lineno
|
|||||||
int canlog = strcmp(filename, "logger.c");
|
int canlog = strcmp(filename, "logger.c");
|
||||||
|
|
||||||
if ((t->mutex) != ((pthread_mutex_t) PTHREAD_MUTEX_INITIALIZER)) {
|
if ((t->mutex) != ((pthread_mutex_t) PTHREAD_MUTEX_INITIALIZER)) {
|
||||||
__ast_mutex_logger("%s line %d (%s): Error: mutex '%s' is already initialized.\n",
|
if ((t->mutex) != (empty_mutex)) {
|
||||||
filename, lineno, func, mutex_name);
|
__ast_mutex_logger("%s line %d (%s): Error: mutex '%s' is already initialized.\n",
|
||||||
__ast_mutex_logger("%s line %d (%s): Error: previously initialization of mutex '%s'.\n",
|
filename, lineno, func, mutex_name);
|
||||||
t->file, t->lineno, t->func, mutex_name);
|
__ast_mutex_logger("%s line %d (%s): Error: previously initialization of mutex '%s'.\n",
|
||||||
|
t->file, t->lineno, t->func, mutex_name);
|
||||||
#ifdef THREAD_CRASH
|
#ifdef THREAD_CRASH
|
||||||
DO_THREAD_CRASH;
|
DO_THREAD_CRASH;
|
||||||
#endif
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
1
pbx.c
1
pbx.c
@@ -3706,6 +3706,7 @@ void ast_merge_contexts_and_delete(struct ast_context **extcontexts, const char
|
|||||||
int length;
|
int length;
|
||||||
struct ast_state_cb *thiscb, *prevcb;
|
struct ast_state_cb *thiscb, *prevcb;
|
||||||
|
|
||||||
|
memset(&store, 0, sizeof(store));
|
||||||
AST_LIST_HEAD_INIT(&store);
|
AST_LIST_HEAD_INIT(&store);
|
||||||
|
|
||||||
/* it is very important that this function hold the hintlock _and_ the conlock
|
/* it is very important that this function hold the hintlock _and_ the conlock
|
||||||
|
@@ -866,7 +866,7 @@ struct ast_call_feature builtin_features[] =
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
static AST_LIST_HEAD(feature_list,ast_call_feature) feature_list;
|
static AST_LIST_HEAD_STATIC(feature_list,ast_call_feature);
|
||||||
|
|
||||||
/* register new feature into feature_list*/
|
/* register new feature into feature_list*/
|
||||||
void ast_register_feature(struct ast_call_feature *feature)
|
void ast_register_feature(struct ast_call_feature *feature)
|
||||||
@@ -2145,7 +2145,6 @@ int load_module(void)
|
|||||||
{
|
{
|
||||||
int res;
|
int res;
|
||||||
|
|
||||||
AST_LIST_HEAD_INIT(&feature_list);
|
|
||||||
memset(parking_ext, 0, sizeof(parking_ext));
|
memset(parking_ext, 0, sizeof(parking_ext));
|
||||||
memset(parking_con, 0, sizeof(parking_con));
|
memset(parking_con, 0, sizeof(parking_con));
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user