⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lock.h

📁 asterisk 是一个很有知名度开源软件
💻 H
📖 第 1 页 / 共 3 页
字号:
	if (!res) {		ast_reentrancy_lock(t);		if (t->reentrancy < AST_MAX_REENTRANCY) {			t->file[t->reentrancy] = filename;			t->lineno[t->reentrancy] = lineno;			t->func[t->reentrancy] = func;			t->thread[t->reentrancy] = pthread_self();			t->reentrancy++;		} else {			__ast_mutex_logger("%s line %d (%s): '%s' really deep reentrancy!\n",							   filename, lineno, func, mutex_name);		}		ast_reentrancy_unlock(t);		if (t->track)			ast_mark_lock_acquired(&t->mutex);	} else {		if (t->track)			ast_remove_lock_info(&t->mutex);		__ast_mutex_logger("%s line %d (%s): Error obtaining mutex: %s\n",				   filename, lineno, func, strerror(res));		DO_THREAD_CRASH;	}	return res;}static inline int __ast_pthread_mutex_trylock(const char *filename, int lineno, const char *func,                                              const char* mutex_name, ast_mutex_t *t){	int res;	int canlog = strcmp(filename, "logger.c") & t->track;#if defined(AST_MUTEX_INIT_W_CONSTRUCTORS)	if ((t->mutex) == ((pthread_mutex_t) PTHREAD_MUTEX_INITIALIZER)) {		/* Don't warn abount uninitialized mutex.		 * Simple try to initialize it.		 * May be not needed in linux system.		 */		res = __ast_pthread_mutex_init(t->track, filename, lineno, func, mutex_name, t);		if ((t->mutex) == ((pthread_mutex_t) PTHREAD_MUTEX_INITIALIZER)) {			__ast_mutex_logger("%s line %d (%s): Error: mutex '%s' is uninitialized and unable to initialize.\n",					 filename, lineno, func, mutex_name);			return res;		}			}#endif /* AST_MUTEX_INIT_W_CONSTRUCTORS */	if (t->track)		ast_store_lock_info(AST_MUTEX, filename, lineno, func, mutex_name, &t->mutex);	if (!(res = pthread_mutex_trylock(&t->mutex))) {		ast_reentrancy_lock(t);		if (t->reentrancy < AST_MAX_REENTRANCY) {			t->file[t->reentrancy] = filename;			t->lineno[t->reentrancy] = lineno;			t->func[t->reentrancy] = func;			t->thread[t->reentrancy] = pthread_self();			t->reentrancy++;		} else {			__ast_mutex_logger("%s line %d (%s): '%s' really deep reentrancy!\n",					   filename, lineno, func, mutex_name);		}		ast_reentrancy_unlock(t);		if (t->track)			ast_mark_lock_acquired(&t->mutex);	} else if (t->track) {		ast_mark_lock_failed(&t->mutex);	}	return res;}static inline int __ast_pthread_mutex_unlock(const char *filename, int lineno, const char *func,					     const char *mutex_name, ast_mutex_t *t){	int res;	int canlog = strcmp(filename, "logger.c") & t->track;#ifdef AST_MUTEX_INIT_W_CONSTRUCTORS	if ((t->mutex) == ((pthread_mutex_t) PTHREAD_MUTEX_INITIALIZER)) {		__ast_mutex_logger("%s line %d (%s): Error: mutex '%s' is uninitialized.\n",				   filename, lineno, func, mutex_name);		res = __ast_pthread_mutex_init(t->track, filename, lineno, func, mutex_name, t);		if ((t->mutex) == ((pthread_mutex_t) PTHREAD_MUTEX_INITIALIZER)) {			__ast_mutex_logger("%s line %d (%s): Error: mutex '%s' is uninitialized and unable to initialize.\n",					 filename, lineno, func, mutex_name);		}		return res;	}#endif /* AST_MUTEX_INIT_W_CONSTRUCTORS */	ast_reentrancy_lock(t);	if (t->reentrancy && (t->thread[t->reentrancy-1] != pthread_self())) {		__ast_mutex_logger("%s line %d (%s): attempted unlock mutex '%s' without owning it!\n",				   filename, lineno, func, mutex_name);		__ast_mutex_logger("%s line %d (%s): '%s' was locked here.\n",				   t->file[t->reentrancy-1], t->lineno[t->reentrancy-1], t->func[t->reentrancy-1], mutex_name);		DO_THREAD_CRASH;	}	if (--t->reentrancy < 0) {		__ast_mutex_logger("%s line %d (%s): mutex '%s' freed more times than we've locked!\n",				   filename, lineno, func, mutex_name);		t->reentrancy = 0;	}	if (t->reentrancy < AST_MAX_REENTRANCY) {		t->file[t->reentrancy] = NULL;		t->lineno[t->reentrancy] = 0;		t->func[t->reentrancy] = NULL;		t->thread[t->reentrancy] = 0;	}	ast_reentrancy_unlock(t);	if (t->track)		ast_remove_lock_info(&t->mutex);	if ((res = pthread_mutex_unlock(&t->mutex))) {		__ast_mutex_logger("%s line %d (%s): Error releasing mutex: %s\n", 				   filename, lineno, func, strerror(res));		DO_THREAD_CRASH;	}	return res;}static inline int __ast_cond_init(const char *filename, int lineno, const char *func,				  const char *cond_name, ast_cond_t *cond, pthread_condattr_t *cond_attr){	return pthread_cond_init(cond, cond_attr);}static inline int __ast_cond_signal(const char *filename, int lineno, const char *func,				    const char *cond_name, ast_cond_t *cond){	return pthread_cond_signal(cond);}static inline int __ast_cond_broadcast(const char *filename, int lineno, const char *func,				       const char *cond_name, ast_cond_t *cond){	return pthread_cond_broadcast(cond);}static inline int __ast_cond_destroy(const char *filename, int lineno, const char *func,				     const char *cond_name, ast_cond_t *cond){	return pthread_cond_destroy(cond);}static inline int __ast_cond_wait(const char *filename, int lineno, const char *func,				  const char *cond_name, const char *mutex_name,				  ast_cond_t *cond, ast_mutex_t *t){	int res;	int canlog = strcmp(filename, "logger.c") & t->track;#ifdef AST_MUTEX_INIT_W_CONSTRUCTORS	if ((t->mutex) == ((pthread_mutex_t) PTHREAD_MUTEX_INITIALIZER)) {		__ast_mutex_logger("%s line %d (%s): Error: mutex '%s' is uninitialized.\n",				   filename, lineno, func, mutex_name);		res = __ast_pthread_mutex_init(t->track, filename, lineno, func, mutex_name, t);		if ((t->mutex) == ((pthread_mutex_t) PTHREAD_MUTEX_INITIALIZER)) {			__ast_mutex_logger("%s line %d (%s): Error: mutex '%s' is uninitialized and unable to initialize.\n",					 filename, lineno, func, mutex_name);		}		return res;	}#endif /* AST_MUTEX_INIT_W_CONSTRUCTORS */	ast_reentrancy_lock(t);	if (t->reentrancy && (t->thread[t->reentrancy-1] != pthread_self())) {		__ast_mutex_logger("%s line %d (%s): attempted unlock mutex '%s' without owning it!\n",				   filename, lineno, func, mutex_name);		__ast_mutex_logger("%s line %d (%s): '%s' was locked here.\n",				   t->file[t->reentrancy-1], t->lineno[t->reentrancy-1], t->func[t->reentrancy-1], mutex_name);		DO_THREAD_CRASH;	}	if (--t->reentrancy < 0) {		__ast_mutex_logger("%s line %d (%s): mutex '%s' freed more times than we've locked!\n",				   filename, lineno, func, mutex_name);		t->reentrancy = 0;	}	if (t->reentrancy < AST_MAX_REENTRANCY) {		t->file[t->reentrancy] = NULL;		t->lineno[t->reentrancy] = 0;		t->func[t->reentrancy] = NULL;		t->thread[t->reentrancy] = 0;	}	ast_reentrancy_unlock(t);	if (t->track)		ast_remove_lock_info(&t->mutex);	if ((res = pthread_cond_wait(cond, &t->mutex))) {		__ast_mutex_logger("%s line %d (%s): Error waiting on condition mutex '%s'\n", 				   filename, lineno, func, strerror(res));		DO_THREAD_CRASH;	} else {		ast_reentrancy_lock(t);		if (t->reentrancy < AST_MAX_REENTRANCY) {			t->file[t->reentrancy] = filename;			t->lineno[t->reentrancy] = lineno;			t->func[t->reentrancy] = func;			t->thread[t->reentrancy] = pthread_self();			t->reentrancy++;		} else {			__ast_mutex_logger("%s line %d (%s): '%s' really deep reentrancy!\n",							   filename, lineno, func, mutex_name);		}		ast_reentrancy_unlock(t);		if (t->track)			ast_store_lock_info(AST_MUTEX, filename, lineno, func, mutex_name, &t->mutex);	}	return res;}static inline int __ast_cond_timedwait(const char *filename, int lineno, const char *func,				       const char *cond_name, const char *mutex_name, ast_cond_t *cond,				       ast_mutex_t *t, const struct timespec *abstime){	int res;	int canlog = strcmp(filename, "logger.c") & t->track;#ifdef AST_MUTEX_INIT_W_CONSTRUCTORS	if ((t->mutex) == ((pthread_mutex_t) PTHREAD_MUTEX_INITIALIZER)) {		__ast_mutex_logger("%s line %d (%s): Error: mutex '%s' is uninitialized.\n",				   filename, lineno, func, mutex_name);		res = __ast_pthread_mutex_init(t->track, filename, lineno, func, mutex_name, t);		if ((t->mutex) == ((pthread_mutex_t) PTHREAD_MUTEX_INITIALIZER)) {			__ast_mutex_logger("%s line %d (%s): Error: mutex '%s' is uninitialized and unable to initialize.\n",					 filename, lineno, func, mutex_name);		}		return res;	}#endif /* AST_MUTEX_INIT_W_CONSTRUCTORS */	ast_reentrancy_lock(t);	if (t->reentrancy && (t->thread[t->reentrancy-1] != pthread_self())) {		__ast_mutex_logger("%s line %d (%s): attempted unlock mutex '%s' without owning it!\n",				   filename, lineno, func, mutex_name);		__ast_mutex_logger("%s line %d (%s): '%s' was locked here.\n",				   t->file[t->reentrancy-1], t->lineno[t->reentrancy-1], t->func[t->reentrancy-1], mutex_name);		DO_THREAD_CRASH;	}	if (--t->reentrancy < 0) {		__ast_mutex_logger("%s line %d (%s): mutex '%s' freed more times than we've locked!\n",				   filename, lineno, func, mutex_name);		t->reentrancy = 0;	}	if (t->reentrancy < AST_MAX_REENTRANCY) {		t->file[t->reentrancy] = NULL;		t->lineno[t->reentrancy] = 0;		t->func[t->reentrancy] = NULL;		t->thread[t->reentrancy] = 0;	}	ast_reentrancy_unlock(t);	if (t->track)		ast_remove_lock_info(&t->mutex);	if ((res = pthread_cond_timedwait(cond, &t->mutex, abstime)) && (res != ETIMEDOUT)) {		__ast_mutex_logger("%s line %d (%s): Error waiting on condition mutex '%s'\n", 				   filename, lineno, func, strerror(res));		DO_THREAD_CRASH;	} else {		ast_reentrancy_lock(t);		if (t->reentrancy < AST_MAX_REENTRANCY) {			t->file[t->reentrancy] = filename;			t->lineno[t->reentrancy] = lineno;			t->func[t->reentrancy] = func;			t->thread[t->reentrancy] = pthread_self();			t->reentrancy++;		} else {			__ast_mutex_logger("%s line %d (%s): '%s' really deep reentrancy!\n",							   filename, lineno, func, mutex_name);		}		ast_reentrancy_unlock(t);		if (t->track)			ast_store_lock_info(AST_MUTEX, filename, lineno, func, mutex_name, &t->mutex);	}	return res;}#define ast_mutex_destroy(a)			__ast_pthread_mutex_destroy(__FILE__, __LINE__, __PRETTY_FUNCTION__, #a, a)#define ast_mutex_lock(a)			__ast_pthread_mutex_lock(__FILE__, __LINE__, __PRETTY_FUNCTION__, #a, a)#define ast_mutex_unlock(a)			__ast_pthread_mutex_unlock(__FILE__, __LINE__, __PRETTY_FUNCTION__, #a, a)#define ast_mutex_trylock(a)			__ast_pthread_mutex_trylock(__FILE__, __LINE__, __PRETTY_FUNCTION__, #a, a)#define ast_cond_init(cond, attr)		__ast_cond_init(__FILE__, __LINE__, __PRETTY_FUNCTION__, #cond, cond, attr)#define ast_cond_destroy(cond)			__ast_cond_destroy(__FILE__, __LINE__, __PRETTY_FUNCTION__, #cond, cond)#define ast_cond_signal(cond)			__ast_cond_signal(__FILE__, __LINE__, __PRETTY_FUNCTION__, #cond, cond)#define ast_cond_broadcast(cond)		__ast_cond_broadcast(__FILE__, __LINE__, __PRETTY_FUNCTION__, #cond, cond)#define ast_cond_wait(cond, mutex)		__ast_cond_wait(__FILE__, __LINE__, __PRETTY_FUNCTION__, #cond, #mutex, cond, mutex)#define ast_cond_timedwait(cond, mutex, time)	__ast_cond_timedwait(__FILE__, __LINE__, __PRETTY_FUNCTION__, #cond, #mutex, cond, mutex, time)#else /* !DEBUG_THREADS */typedef pthread_mutex_t ast_mutex_t;#define AST_MUTEX_INIT_VALUE			((ast_mutex_t) PTHREAD_MUTEX_INIT_VALUE)#define AST_MUTEX_INIT_VALUE_NOTRACKING		((ast_mutex_t) PTHREAD_MUTEX_INIT_VALUE)#define ast_mutex_init_notracking(m)		ast_mutex_init(m)static inline int ast_mutex_init(ast_mutex_t *pmutex){	int res;	pthread_mutexattr_t attr;	pthread_mutexattr_init(&attr);	pthread_mutexattr_settype(&attr, AST_MUTEX_KIND);	res = pthread_mutex_init(pmutex, &attr);	pthread_mutexattr_destroy(&attr);	return res;}#define ast_pthread_mutex_init(pmutex,a) pthread_mutex_init(pmutex,a)static inline int ast_mutex_unlock(ast_mutex_t *pmutex){	return pthread_mutex_unlock(pmutex);}static inline int ast_mutex_destroy(ast_mutex_t *pmutex){	return pthread_mutex_destroy(pmutex);}static inline int ast_mutex_lock(ast_mutex_t *pmutex){	__MTX_PROF(pmutex);}static inline int ast_mutex_trylock(ast_mutex_t *pmutex){	return pthread_mutex_trylock(pmutex);}typedef pthread_cond_t ast_cond_t;static inline int ast_cond_init(ast_cond_t *cond, pthread_condattr_t *cond_attr){	return pthread_cond_init(cond, cond_attr);}static inline int ast_cond_signal(ast_cond_t *cond){	return pthread_cond_signal(cond);}static inline int ast_cond_broadcast(ast_cond_t *cond){	return pthread_cond_broadcast(cond);}static inline int ast_cond_destroy(ast_cond_t *cond){	return pthread_cond_destroy(cond);}static inline int ast_cond_wait(ast_cond_t *cond, ast_mutex_t *t){	return pthread_cond_wait(cond, t);}static inline int ast_cond_timedwait(ast_cond_t *cond, ast_mutex_t *t, const struct timespec *abstime){	return pthread_cond_timedwait(cond, t, abstime);}#endif /* !DEBUG_THREADS */#if defined(AST_MUTEX_INIT_W_CONSTRUCTORS)/* * If AST_MUTEX_INIT_W_CONSTRUCTORS is defined, use file scope constructors * and destructors to create/destroy global mutexes. */#define __AST_MUTEX_DEFINE(scope, mutex, init_val, track)	\	scope ast_mutex_t mutex = init_val;			\static void  __attribute__ ((constructor)) init_##mutex(void)	\{								\	if (track)						\		ast_mutex_init(&mutex);				\	else							\		ast_mutex_init_notracking(&mutex);		\}								\								\static void  __attribute__ ((destructor)) fini_##mutex(void)	\{								\	ast_mutex_destroy(&mutex);				\}#else /* !AST_MUTEX_INIT_W_CONSTRUCTORS *//* By default, use static initialization of mutexes. */ #define __AST_MUTEX_DEFINE(scope, mutex, init_val, track)	scope ast_mutex_t mutex = init_val#endif /* AST_MUTEX_INIT_W_CONSTRUCTORS */#ifndef __CYGWIN__	/* temporary disabled for cygwin */#define pthread_mutex_t		use_ast_mutex_t_instead_of_pthread_mutex_t#define pthread_cond_t		use_ast_cond_t_instead_of_pthread_cond_t#endif#define pthread_mutex_lock	use_ast_mutex_lock_instead_of_pthread_mutex_lock#define pthread_mutex_unlock	use_ast_mutex_unlock_instead_of_pthread_mutex_unlock#define pthread_mutex_trylock	use_ast_mutex_trylock_instead_of_pthread_mutex_trylock#define pthread_mutex_init	use_ast_mutex_init_instead_of_pthread_mutex_init#define pthread_mutex_destroy	use_ast_mutex_destroy_instead_of_pthread_mutex_destroy#define pthread_cond_init	use_ast_cond_init_instead_of_pthread_cond_init#define pthread_cond_destroy	use_ast_cond_destroy_instead_of_pthread_cond_destroy#define pthread_cond_signal	use_ast_cond_signal_instead_of_pthread_cond_signal#define pthread_cond_broadcast	use_ast_cond_broadcast_instead_of_pthread_cond_broadcast#define pthread_cond_wait	use_ast_cond_wait_instead_of_pthread_cond_wait#define pthread_cond_timedwait	use_ast_cond_timedwait_instead_of_pthread_cond_timedwait#define AST_MUTEX_DEFINE_STATIC(mutex)			__AST_MUTEX_DEFINE(static, mutex, AST_MUTEX_INIT_VALUE, 1)#define AST_MUTEX_DEFINE_STATIC_NOTRACKING(mutex)	__AST_MUTEX_DEFINE(static, mutex, AST_MUTEX_INIT_VALUE_NOTRACKING, 0)#define AST_MUTEX_INITIALIZER __use_AST_MUTEX_DEFINE_STATIC_rather_than_AST_MUTEX_INITIALIZER__

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -