亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? lock.c

?? File system using stacked.
?? C
?? 第 1 頁 / 共 4 頁
字號:
/*- * See the file LICENSE for redistribution information. * * Copyright (c) 1996-2002 *	Sleepycat Software.  All rights reserved. */#include "db_config.h"#ifndef lintstatic const char revid[] = "$Id: lock.c,v 1.1.1.1 2004/08/19 23:53:56 gopalan Exp $";#endif /* not lint */#ifndef __KERNEL__# ifndef NO_SYSTEM_INCLUDES#  include <sys/types.h>#  include <string.h># endif#else # include <linux/types.h># include <linux/string.h>#endif#include "db_int.h"#include "dbinc/db_shash.h"#include "dbinc/lock.h"#include "dbinc/log.h"#include "dbinc/txn.h"static int  __lock_checklocker __P((DB_LOCKTAB *,		struct __db_lock *, u_int32_t, u_int32_t));static void __lock_expires __P((DB_ENV *, db_timeval_t *, db_timeout_t));static void __lock_freelocker		__P((DB_LOCKTAB *, DB_LOCKREGION *, DB_LOCKER *, u_int32_t));static int  __lock_get_internal __P((DB_LOCKTAB *, u_int32_t, u_int32_t,		const DBT *, db_lockmode_t, db_timeout_t, DB_LOCK *));static int  __lock_getobj		__P((DB_LOCKTAB *, const DBT *, u_int32_t, int, DB_LOCKOBJ **));static int  __lock_is_parent __P((DB_LOCKTAB *, u_int32_t, DB_LOCKER *));static int  __lock_put_internal __P((DB_LOCKTAB *,		struct __db_lock *, u_int32_t,  u_int32_t));static int  __lock_put_nolock __P((DB_ENV *, DB_LOCK *, int *, u_int32_t));static void __lock_remove_waiter __P((DB_LOCKTAB *,		DB_LOCKOBJ *, struct __db_lock *, db_status_t));static int __lock_trade __P((DB_ENV *, DB_LOCK *, u_int32_t));static const char __db_lock_err[] = "Lock table is out of available %s";static const char __db_lock_invalid[] = "%s: Lock is no longer valid";static const char __db_locker_invalid[] = "Locker is not valid";/* * __lock_id -- *	Generate a unique locker id. * * PUBLIC: int __lock_id __P((DB_ENV *, u_int32_t *)); */int__lock_id(dbenv, idp)	DB_ENV *dbenv;	u_int32_t *idp;{	DB_LOCKER *lk;	DB_LOCKTAB *lt;	DB_LOCKREGION *region;	u_int32_t *ids, locker_ndx;	int nids, ret;	PANIC_CHECK(dbenv);	ENV_REQUIRES_CONFIG(dbenv,	    dbenv->lk_handle, "DB_ENV->lock_id", DB_INIT_LOCK);	lt = dbenv->lk_handle;	region = lt->reginfo.primary;	ret = 0;	/*	 * Allocate a new lock id.  If we wrap around then we	 * find the minimum currently in use and make sure we	 * can stay below that.  This code is similar to code	 * in __txn_begin_int for recovering txn ids.	 */	LOCKREGION(dbenv, lt);	/*	 * Our current valid range can span the maximum valid value, so check	 * for it and wrap manually.	 */	if (region->stat.st_id == DB_LOCK_MAXID &&	    region->stat.st_cur_maxid != DB_LOCK_MAXID)		region->stat.st_id = DB_LOCK_INVALIDID;	if (region->stat.st_id == region->stat.st_cur_maxid) {		if ((ret = __os_malloc(dbenv,		    sizeof(u_int32_t) * region->stat.st_nlockers, &ids)) != 0)			goto err;		nids = 0;		for (lk = SH_TAILQ_FIRST(&region->lockers, __db_locker);		    lk != NULL;		    lk = SH_TAILQ_NEXT(lk, ulinks, __db_locker))			ids[nids++] = lk->id;		region->stat.st_id = DB_LOCK_INVALIDID;		region->stat.st_cur_maxid = DB_LOCK_MAXID;		if (nids != 0)			__db_idspace(ids, nids,			    &region->stat.st_id, &region->stat.st_cur_maxid);		__os_free(dbenv, ids);	}	*idp = ++region->stat.st_id;	/* Allocate a locker for this id. */	LOCKER_LOCK(lt, region, *idp, locker_ndx);	ret = __lock_getlocker(lt, *idp, locker_ndx, 1, &lk);err:	UNLOCKREGION(dbenv, lt);	return (ret);}/* * __lock_id_free -- *	Free a locker id. * * PUBLIC: int __lock_id_free __P((DB_ENV *, u_int32_t)); */int__lock_id_free(dbenv, id)	DB_ENV *dbenv;	u_int32_t id;{	DB_LOCKER *sh_locker;	DB_LOCKTAB *lt;	DB_LOCKREGION *region;	u_int32_t locker_ndx;	int ret;	PANIC_CHECK(dbenv);	ENV_REQUIRES_CONFIG(dbenv,	    dbenv->lk_handle, "DB_ENV->lock_id_free", DB_INIT_LOCK);	lt = dbenv->lk_handle;	region = lt->reginfo.primary;	LOCKREGION(dbenv, lt);	LOCKER_LOCK(lt, region, id, locker_ndx);	if ((ret =	    __lock_getlocker(lt, id, locker_ndx, 0, &sh_locker)) != 0)		goto err;	if (sh_locker == NULL) {		ret = EINVAL;		goto err;	}	if (sh_locker->nlocks != 0) {		__db_err(dbenv, "Locker still has locks");		ret = EINVAL;		goto err;	}	__lock_freelocker(lt, region, sh_locker, locker_ndx);err:	UNLOCKREGION(dbenv, lt);	return (ret);}/* * __lock_vec -- *	Vector lock routine.  This function takes a set of operations *	and performs them all at once.  In addition, lock_vec provides *	functionality for lock inheritance, releasing all locks for a *	given locker (used during transaction commit/abort), releasing *	all locks on a given object, and generating debugging information. * * PUBLIC: int __lock_vec __P((DB_ENV *, * PUBLIC:     u_int32_t, u_int32_t, DB_LOCKREQ *, int, DB_LOCKREQ **)); */int__lock_vec(dbenv, locker, flags, list, nlist, elistp)	DB_ENV *dbenv;	u_int32_t locker, flags;	int nlist;	DB_LOCKREQ *list, **elistp;{	struct __db_lock *lp, *next_lock;	DB_LOCK lock;	DB_LOCKER *sh_locker, *sh_parent;	DB_LOCKOBJ *obj, *sh_obj;	DB_LOCKREGION *region;	DB_LOCKTAB *lt;	u_int32_t lndx, ndx;	int did_abort, i, ret, run_dd, upgrade, writes;	PANIC_CHECK(dbenv);	ENV_REQUIRES_CONFIG(dbenv,	    dbenv->lk_handle, "DB_ENV->lock_vec", DB_INIT_LOCK);	/* Check if locks have been globally turned off. */	if (F_ISSET(dbenv, DB_ENV_NOLOCKING))		return (0);	/* Validate arguments. */	if ((ret = __db_fchk(dbenv, "DB_ENV->lock_vec",	    flags, DB_LOCK_FREE_LOCKER | DB_LOCK_NOWAIT)) != 0)		return (ret);	lt = dbenv->lk_handle;	region = lt->reginfo.primary;	run_dd = 0;	LOCKREGION(dbenv, (DB_LOCKTAB *)dbenv->lk_handle);	for (i = 0, ret = 0; i < nlist && ret == 0; i++)		switch (list[i].op) {		case DB_LOCK_GET_TIMEOUT:			LF_SET(DB_LOCK_SET_TIMEOUT);		case DB_LOCK_GET:			ret = __lock_get_internal(dbenv->lk_handle,			    locker, flags, list[i].obj,			    list[i].mode, list[i].timeout, &list[i].lock);			break;		case DB_LOCK_INHERIT:			/*			 * Get the committing locker and mark it as deleted.			 * This allows us to traverse the locker links without			 * worrying that someone else is deleting locks out			 * from under us.  However, if the locker doesn't			 * exist, that just means that the child holds no			 * locks, so inheritance is easy!			 */			LOCKER_LOCK(lt, region, locker, ndx);			if ((ret = __lock_getlocker(lt,			    locker, ndx, 0, &sh_locker)) != 0 ||			    sh_locker == NULL ||			    F_ISSET(sh_locker, DB_LOCKER_DELETED)) {				if (ret == 0 && sh_locker != NULL)					ret = EINVAL;				__db_err(dbenv, __db_locker_invalid);				break;			}			/* Make sure we are a child transaction. */			if (sh_locker->parent_locker == INVALID_ROFF) {				__db_err(dbenv, "Not a child transaction");				ret = EINVAL;				break;			}			sh_parent = (DB_LOCKER *)			    R_ADDR(&lt->reginfo, sh_locker->parent_locker);			F_SET(sh_locker, DB_LOCKER_DELETED);			/*			 * Now, lock the parent locker; move locks from			 * the committing list to the parent's list.			 */			LOCKER_LOCK(lt, region, locker, ndx);			if (F_ISSET(sh_parent, DB_LOCKER_DELETED)) {				if (ret == 0) {					__db_err(dbenv,					    "Parent locker is not valid");					ret = EINVAL;				}				break;			}			for (lp = SH_LIST_FIRST(&sh_locker->heldby, __db_lock);			    lp != NULL;			    lp = SH_LIST_FIRST(&sh_locker->heldby, __db_lock)) {				SH_LIST_REMOVE(lp, locker_links, __db_lock);				SH_LIST_INSERT_HEAD(&sh_parent->heldby, lp,				    locker_links, __db_lock);				lp->holder = sh_parent->id;				/* Get the object associated with this lock. */				obj = (DB_LOCKOBJ *)((u_int8_t *)lp + lp->obj);				(void)__lock_promote(lt, obj,				    LF_ISSET(DB_LOCK_NOWAITERS));			}			/* Transfer child counts to parent. */			sh_parent->nlocks += sh_locker->nlocks;			sh_parent->nwrites += sh_locker->nwrites;			/* Now free the original locker. */			ret = __lock_checklocker(lt,			    NULL, locker, DB_LOCK_IGNOREDEL);			break;		case DB_LOCK_PUT:			ret = __lock_put_nolock(dbenv,			    &list[i].lock, &run_dd, flags);			break;		case DB_LOCK_PUT_ALL:		case DB_LOCK_PUT_READ:		case DB_LOCK_UPGRADE_WRITE:			/*			 * Get the locker and mark it as deleted.  This			 * allows us to traverse the locker links without			 * worrying that someone else is deleting locks out			 * from under us.  Since the locker may hold no			 * locks (i.e., you could call abort before you've			 * done any work), it's perfectly reasonable for there			 * to be no locker; this is not an error.			 */			LOCKER_LOCK(lt, region, locker, ndx);			if ((ret = __lock_getlocker(lt,			    locker, ndx, 0, &sh_locker)) != 0 ||			    sh_locker == NULL ||			    F_ISSET(sh_locker, DB_LOCKER_DELETED))				/*				 * If ret is set, then we'll generate an				 * error.  If it's not set, we have nothing				 * to do.				 */				break;			upgrade = 0;			writes = 1;			if (list[i].op == DB_LOCK_PUT_READ)				writes = 0;			else if (list[i].op == DB_LOCK_UPGRADE_WRITE) {				if (F_ISSET(sh_locker, DB_LOCKER_DIRTY))					upgrade = 1;				writes = 0;			}			F_SET(sh_locker, DB_LOCKER_DELETED);			/* Now traverse the locks, releasing each one. */			for (lp = SH_LIST_FIRST(&sh_locker->heldby, __db_lock);			    lp != NULL;) {				sh_obj = (DB_LOCKOBJ *)				    ((u_int8_t *)lp + lp->obj);				if (writes == 1 || lp->mode == DB_LOCK_READ) {					SH_LIST_REMOVE(lp,					    locker_links, __db_lock);					sh_obj = (DB_LOCKOBJ *)					    ((u_int8_t *)lp + lp->obj);					SHOBJECT_LOCK(lt, region, sh_obj, lndx);					/*					 * We are not letting lock_put_internal					 * unlink the lock, so we'll have to					 * update counts here.					 */					sh_locker->nlocks--;					if (IS_WRITELOCK(lp->mode))						sh_locker->nwrites--;					ret = __lock_put_internal(lt, lp,					    lndx, DB_LOCK_FREE | DB_LOCK_DOALL);					if (ret != 0)						break;					lp = SH_LIST_FIRST(					    &sh_locker->heldby, __db_lock);				} else					lp = SH_LIST_NEXT(lp,					    locker_links, __db_lock);			}			switch (list[i].op) {			case DB_LOCK_UPGRADE_WRITE:				if (upgrade != 1)					goto up_done;				for (lp = SH_LIST_FIRST(				    &sh_locker->heldby, __db_lock);				    lp != NULL;				    lp = SH_LIST_NEXT(lp,					    locker_links, __db_lock)) {					if (ret != 0)						break;					lock.off = R_OFFSET(&lt->reginfo, lp);					lock.gen = lp->gen;					F_SET(sh_locker, DB_LOCKER_INABORT);					ret = __lock_get_internal(lt,					    locker, DB_LOCK_UPGRADE,					    NULL, DB_LOCK_WRITE, 0, &lock);				}			up_done:				/* FALL THROUGH */			case DB_LOCK_PUT_READ:				F_CLR(sh_locker, DB_LOCKER_DELETED);				break;			case DB_LOCK_PUT_ALL:				if (ret == 0)					ret = __lock_checklocker(lt,					    NULL, locker, DB_LOCK_IGNOREDEL);				break;			default:				break;			}			break;		case DB_LOCK_PUT_OBJ:			/* Remove all the locks associated with an object. */			OBJECT_LOCK(lt, region, list[i].obj, ndx);			if ((ret = __lock_getobj(lt, list[i].obj,			    ndx, 0, &sh_obj)) != 0 || sh_obj == NULL) {				if (ret == 0)					ret = EINVAL;				break;			}			/*			 * Go through both waiters and holders.  Don't bother			 * to run promotion, because everyone is getting			 * released.  The processes waiting will still get			 * awakened as their waiters are released.			 */			for (lp = SH_TAILQ_FIRST(&sh_obj->waiters, __db_lock);			    ret == 0 && lp != NULL;			    lp = SH_TAILQ_FIRST(&sh_obj->waiters, __db_lock))				ret = __lock_put_internal(lt, lp, ndx,				    DB_LOCK_UNLINK |				    DB_LOCK_NOPROMOTE | DB_LOCK_DOALL);			/*			 * On the last time around, the object will get			 * reclaimed by __lock_put_internal, structure the			 * loop carefully so we do not get bitten.			 */			for (lp = SH_TAILQ_FIRST(&sh_obj->holders, __db_lock);			    ret == 0 && lp != NULL;			    lp = next_lock) {				next_lock = SH_TAILQ_NEXT(lp, links, __db_lock);				ret = __lock_put_internal(lt, lp, ndx,				    DB_LOCK_UNLINK |				    DB_LOCK_NOPROMOTE | DB_LOCK_DOALL);			}			break;		case DB_LOCK_TIMEOUT:			ret = __lock_set_timeout(dbenv,			    locker, 0, DB_SET_TXN_NOW);			region->need_dd = 1;			break;		case DB_LOCK_TRADE:			/*			 * INTERNAL USE ONLY.			 * Change the holder of the lock described in			 * list[i].lock to the locker-id specified by			 * the locker parameter.			 */			/*			 * You had better know what you're doing here.			 * We are trading locker-id's on a lock to			 * facilitate file locking on open DB handles.			 * We do not do any conflict checking on this,			 * so heaven help you if you use this flag under			 * any other circumstances.			 */			ret = __lock_trade(dbenv, &list[i].lock, locker);			break;#ifdef DEBUG		case DB_LOCK_DUMP:			/* Find the locker. */			LOCKER_LOCK(lt, region, locker, ndx);			if ((ret = __lock_getlocker(lt,			    locker, ndx, 0, &sh_locker)) != 0 ||			    sh_locker == NULL ||			    F_ISSET(sh_locker, DB_LOCKER_DELETED))				break;			for (lp = SH_LIST_FIRST(&sh_locker->heldby, __db_lock);			    lp != NULL;			    lp = SH_LIST_NEXT(lp, locker_links, __db_lock)) {				__lock_printlock(lt, lp, 1);			}			break;#endif		default:			__db_err(dbenv,			    "Invalid lock operation: %d", list[i].op);			ret = EINVAL;			break;		}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲一二三区在线观看| 在线成人免费观看| 国产精品青草久久| 久久国产综合精品| 91精品国产91久久综合桃花 | 色婷婷激情久久| 久久久www成人免费无遮挡大片| 蜜桃视频在线观看一区| 欧美一区二区三区视频在线| 秋霞国产午夜精品免费视频| 午夜婷婷国产麻豆精品| 亚洲一区在线观看视频| 91美女在线看| 亚洲精品综合在线| 欧美在线播放高清精品| 亚洲最色的网站| 欧美男男青年gay1069videost| 亚洲一区免费在线观看| 欧美日韩大陆在线| 日韩电影在线观看一区| 精品第一国产综合精品aⅴ| 国产麻豆91精品| 国产精品久久久久一区二区三区 | 久久黄色级2电影| 久久久精品免费免费| 精品一区二区三区久久久| 2020国产精品自拍| 99国产精品久| 国产无人区一区二区三区| 国产风韵犹存在线视精品| 亚洲美女视频一区| 欧美系列在线观看| 精品一区二区精品| 国产精品久久久久久久久果冻传媒 | 色婷婷久久一区二区三区麻豆| 亚洲国产精品视频| 日韩制服丝袜av| 国产一区二区三区在线观看免费视频 | 91同城在线观看| 亚洲chinese男男1069| 日韩精品中文字幕一区| 粉嫩aⅴ一区二区三区四区五区| 一区二区三区免费看视频| 91精品国产综合久久久久久久| 国产传媒久久文化传媒| 亚洲国产一二三| 国产亚洲一区二区三区在线观看 | 日本乱码高清不卡字幕| 日本不卡的三区四区五区| 日本一区二区三区在线观看| 精品视频资源站| 激情综合色播激情啊| 亚洲欧美国产毛片在线| 精品国产一二三| 717成人午夜免费福利电影| 91女神在线视频| 懂色av一区二区三区免费看| 日本欧美肥老太交大片| 欧美成人综合网站| 国产在线精品一区二区夜色| 三级影片在线观看欧美日韩一区二区| 成人欧美一区二区三区视频网页 | 麻豆国产欧美日韩综合精品二区| 一区2区3区在线看| 国产精品免费视频网站| 久久在线观看免费| 欧美大胆人体bbbb| 日韩一区二区三区在线| 欧美精品一卡两卡| 欧美日韩的一区二区| 欧美色图激情小说| 欧美私人免费视频| 欧美午夜电影网| 欧美日韩综合在线免费观看| 色吊一区二区三区| 欧美午夜不卡视频| 欧美视频一二三区| 欧美日韩dvd在线观看| 欧美精品色综合| 91精品国产综合久久精品| 欧美一区二区高清| 精品99久久久久久| 久久久夜色精品亚洲| 欧美激情自拍偷拍| 亚洲色图.com| 亚洲福利一二三区| 日韩av一区二区在线影视| 日本一区二区不卡视频| 在线观看欧美日本| 欧美日韩电影在线| 日韩欧美电影一区| 国产亚洲一区二区在线观看| 国产精品免费丝袜| 一区二区三区四区不卡在线| 亚洲va在线va天堂| 麻豆成人av在线| 国产成人av电影在线观看| 99久久精品国产精品久久| 色综合婷婷久久| 制服丝袜国产精品| 久久精品人人做人人爽97| 国产精品人成在线观看免费| 亚洲激情av在线| 免费高清成人在线| 国产精品一级片在线观看| 99综合电影在线视频| 欧美日韩国产免费一区二区| 久久午夜国产精品| 亚洲男同性视频| 青青国产91久久久久久| 大胆欧美人体老妇| 欧美久久久久免费| 国产精品丝袜91| 亚洲一区二三区| 国精产品一区一区三区mba视频| av激情亚洲男人天堂| 欧美日韩国产另类一区| 国产日韩精品一区二区三区| 亚洲高清免费观看| 粉嫩13p一区二区三区| 欧美午夜精品一区二区三区| 久久久蜜桃精品| 亚洲国产成人精品视频| 国产成人精品亚洲日本在线桃色 | 国产大陆亚洲精品国产| 欧美三级乱人伦电影| 国产欧美日产一区| 视频在线在亚洲| 91日韩一区二区三区| 欧美精品一区二区三区高清aⅴ| 樱花草国产18久久久久| 国产成人精品aa毛片| 欧美另类久久久品| 自拍偷拍欧美精品| 国产精品一级片| 日韩一本二本av| 亚洲精品国产第一综合99久久| 蜜臀国产一区二区三区在线播放 | 久久综合久久久久88| 午夜视频在线观看一区| 91亚洲永久精品| 国产亚洲短视频| 精品在线一区二区三区| 欧美日韩一区二区三区在线| 国产精品国产三级国产普通话蜜臀| 日本亚洲三级在线| 欧美三级乱人伦电影| 最新不卡av在线| 成人免费视频视频在线观看免费 | 日本一道高清亚洲日美韩| 色先锋久久av资源部| 日韩理论在线观看| 成人在线一区二区三区| 久久综合久久综合九色| 日本vs亚洲vs韩国一区三区 | 成人91在线观看| wwwwww.欧美系列| 久久精品99久久久| 欧美精品丝袜久久久中文字幕| 一二三四社区欧美黄| 在线观看一区二区视频| 综合久久久久久| 91免费在线看| 亚洲精品国产成人久久av盗摄| 成人av在线一区二区三区| 国产喂奶挤奶一区二区三区| 国产高清久久久| 国产亲近乱来精品视频| 国产激情精品久久久第一区二区| 欧美大片国产精品| 激情文学综合网| 久久综合狠狠综合久久激情 | 日韩欧美亚洲国产精品字幕久久久 | 亚洲乱码中文字幕| 99精品国产99久久久久久白柏| 中文字幕中文字幕一区| 色先锋aa成人| 亚洲第一久久影院| 一区二区三区日韩在线观看| 欧美在线短视频| 亚洲一区二区三区视频在线| 欧美伦理影视网| 美女视频免费一区| 国产调教视频一区| 99久久99久久综合| 香蕉加勒比综合久久| 日韩午夜激情电影| 国内外成人在线| 中文字幕视频一区| 在线观看视频一区二区欧美日韩| 亚洲国产综合91精品麻豆| 欧美一卡2卡3卡4卡| 国产精品一区二区在线播放 | 亚洲精品国产a| 欧美日本一区二区三区四区| 狠狠色丁香久久婷婷综| 国产精品九色蝌蚪自拍| 欧美日本一区二区三区四区| 国产精品99久久久久久宅男| 亚洲欧美影音先锋|