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

📄 mprlock.c

📁 samba最新软件
💻 C
字号:
/** *	@file 	mprThread.c *	@brief 	Mbedthis Portable Runtime Base Thread Locking Support *//* *	@copy	default * *	Copyright (c) Mbedthis Software LLC, 2003-2006. All Rights Reserved. *	 *	This software is distributed under commercial and open source licenses. *	You may use the GPL open source license described below or you may acquire  *	a commercial license from Mbedthis Software. You agree to be fully bound  *	by the terms of either license. Consult the LICENSE.TXT distributed with  *	this software for full details. *	 *	This software is open source; you can redistribute it and/or modify it  *	under the terms of the GNU General Public License as published by the  *	Free Software Foundation; either version 2 of the License, or (at your  *	option) any later version. See the GNU General Public License for more  *	details at: http://www.mbedthis.com/downloads/gplLicense.html *	 *	This program is distributed WITHOUT ANY WARRANTY; without even the  *	implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  *	 *	This GPL license does NOT permit incorporating this software into  *	proprietary programs. If you are unable to comply with the GPL, you must *	acquire a commercial license to use this software. Commercial licenses  *	for this software and support services are available from Mbedthis  *	Software at http://www.mbedthis.com  *	 *	@end */#include	"mpr.h"#if BLD_FEATURE_MULTITHREAD/************************************ Code ************************************/void mprInitThreads(MprApp *app){	mprAssert(app);	if (app->globalLock == 0) {		app->globalLock = mprCreateLock(app);		app->allocLock = mprCreateLock(app);	}}/******************************************************************************/void mprTermThreads(MprApp *app){	mprAssert(app);	if (app->globalLock) {		mprDestroyLock(app->globalLock);		app->globalLock = 0;	}	if (app->allocLock) {		MprLock *lock = app->allocLock;		app->allocLock = 0;		mprDestroyLock(lock);	}}/******************************************************************************/MprLock *mprCreateLock(MprCtx ctx){	MprLock	*lock;	mprAssert(ctx);	lock = mprAllocType(ctx, MprLock);#if BLD_HOST_UNIX	pthread_mutexattr_t	attr;	pthread_mutexattr_init(&attr);	pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE_NP);	pthread_mutex_init(&lock->cs, &attr);	pthread_mutexattr_destroy(&attr);#elif WIN	InitializeCriticalSectionAndSpinCount(&lock->cs, 5000);#elif VXWORKS	lock->cs = semMCreate(SEM_Q_PRIORITY | SEM_DELETE_SAFE | 		SEM_INVERSION_SAFE);	if (lock->cs == 0) {		mprAssert(0);		mprFree(lock);		return 0;	}#endif	return lock;}/******************************************************************************//* *	Destroy a lock. Must be locked on entrance. */ void mprDestroyLock(MprLock *lock){	mprAssert(lock);	if (lock == 0) {		return;	}#if BLD_HOST_UNIX	pthread_mutex_unlock(&lock->cs);	pthread_mutex_destroy(&lock->cs);#elif WIN	DeleteCriticalSection(&lock->cs);#elif VXWORKS	semDelete(lock->cs);#endif	mprFree(lock);}/******************************************************************************//* *	Lock a mutex */ void mprLock(MprLock *lock){	/*	 *	OPT -- Do this just so we can allocate MprApp before we have created its	 *	lock. Should remove this test here and in mprUnlock.	 */	if (lock == 0) {		return;	}#if BLD_HOST_UNIX	pthread_mutex_lock(&lock->cs);#elif WIN	EnterCriticalSection(&lock->cs);#elif VXWORKS	semTake(lock->cs, WAIT_FOREVER);#endif}/******************************************************************************//* *	Try to attain a lock. Do not block! */ int mprTryLock(MprLock *lock){	mprAssert(lock);#if BLD_HOST_UNIX	{		int		err;		if ((err = pthread_mutex_trylock(&lock->cs)) != 0) {			if (err == EBUSY) {				return MPR_ERR_BUSY;			} else {				return MPR_ERR_CANT_ACCESS;			}		}		return 0;	}#elif WIN	if (TryEnterCriticalSection(&lock->cs) == 0) {		return MPR_ERR_BUSY;	}#elif VXWORKS	{		int		rc;		rc = semTake(cs, NO_WAIT);		if (rc == -1) {			mprAssert(0);		}		if (rc == S_objLib_OBJ_UNAVAILABLE) {			return MPR_ERR_BUSY;		} else {			return MPR_ERR_CANT_ACCESS;		}		/* Success */		return 0;	}#endif	return 0;}/******************************************************************************//* *	Unlock. */ void mprUnlock(MprLock *lock){	if (lock == 0) {		return;	}#if BLD_HOST_UNIX	pthread_mutex_unlock(&lock->cs);#elif WIN	LeaveCriticalSection(&lock->cs);#elif VXWORKS	semGive(lock->cs);#endif}/******************************************************************************//* *	Big global lock. Avoid using this. */void mprGlobalLock(MprCtx ctx){	MprApp	*app;	app = mprGetApp(ctx);	mprAssert(app);	if (app && app->globalLock) {		mprLock(app->globalLock);	}}/******************************************************************************/void mprGlobalUnlock(MprCtx ctx){	MprApp	*app;	app = mprGetApp(ctx);	mprAssert(app);	if (app && app->globalLock) {		mprUnlock(app->globalLock);	}}/******************************************************************************/int mprGetCurrentThreadID(){#if BLD_HOST_UNIX	return (int) pthread_self();#elif WIN	return GetCurrentThreadId();#elif VXWORKS	return (int) pthread_self();#endif}/******************************************************************************/#endif /* BLD_FEATURE_MULTITHREAD *//* * Local variables: * tab-width: 4 * c-basic-offset: 4 * End: * vim:tw=78 * vim600: sw=4 ts=4 fdm=marker * vim<600: sw=4 ts=4 */

⌨️ 快捷键说明

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