mirror of
				https://github.com/isar/libmdbx.git
				synced 2025-10-31 03:29:01 +08:00 
			
		
		
		
	lmdb: Renumber MDB_TXN_* flags, simplify flag code.
Change-Id: I91b0836a84ce80049dbe0829dfc3101fae94c7c9
This commit is contained in:
		
				
					committed by
					
						 Leo Yuriev
						Leo Yuriev
					
				
			
			
				
	
			
			
			
						parent
						
							5daf811dcb
						
					
				
				
					commit
					c4097ec898
				
			
							
								
								
									
										40
									
								
								mdb.c
									
									
									
									
									
								
							
							
						
						
									
										40
									
								
								mdb.c
									
									
									
									
									
								
							| @@ -1224,7 +1224,13 @@ struct MDB_txn { | ||||
|  *	@ingroup internal | ||||
|  *	@{ | ||||
|  */ | ||||
| #define MDB_TXN_RDONLY		0x01		/**< read-only transaction */ | ||||
| 	/** #mdb_txn_begin() flags */ | ||||
| #define MDB_TXN_BEGIN_FLAGS	(MDB_NOMETASYNC|MDB_NOSYNC|MDB_RDONLY) | ||||
| #define MDB_TXN_NOMETASYNC	MDB_NOMETASYNC	/**< don't sync meta for this txn on commit */ | ||||
| #define MDB_TXN_NOSYNC		MDB_NOSYNC	/**< don't sync this txn on commit */ | ||||
| #define MDB_TXN_RDONLY		MDB_RDONLY	/**< read-only transaction */ | ||||
| 	/* internal txn flags */ | ||||
| #define MDB_TXN_WRITEMAP	MDB_WRITEMAP	/**< copy of #MDB_env flag in writers */ | ||||
| #define MDB_TXN_ERROR		0x02		/**< txn is unusable after an error */ | ||||
| #define MDB_TXN_DIRTY		0x04		/**< must write, even if dirty list is empty */ | ||||
| #define MDB_TXN_SPILLS		0x08		/**< txn or a parent has spilled pages */ | ||||
| @@ -2228,7 +2234,7 @@ mdb_page_dirty(MDB_txn *txn, MDB_page *mp) | ||||
| 	MDB_ID2 mid; | ||||
| 	int rc, (*insert)(MDB_ID2L, MDB_ID2 *); | ||||
|  | ||||
| 	if (txn->mt_env->me_flags & MDB_WRITEMAP) { | ||||
| 	if (txn->mt_flags & MDB_TXN_WRITEMAP) { | ||||
| 		insert = mdb_mid2l_append; | ||||
| 	} else { | ||||
| 		insert = mdb_mid2l_insert; | ||||
| @@ -2953,7 +2959,7 @@ mdb_txn_renew0(MDB_txn *txn) | ||||
| 	int rc, new_notls = 0; | ||||
|  | ||||
| 	if (txn->mt_flags & MDB_TXN_RDONLY) { | ||||
| 		txn->mt_flags = MDB_TXN_RDONLY; | ||||
| 		txn->mt_flags &= MDB_TXN_BEGIN_FLAGS; | ||||
| 		/* Setup db info */ | ||||
| 		txn->mt_numdbs = env->me_numdbs; | ||||
| 		txn->mt_dbxs = env->me_dbxs;	/* mostly static anyway */ | ||||
| @@ -3110,18 +3116,20 @@ mdb_txn_begin(MDB_env *env, MDB_txn *parent, unsigned int flags, MDB_txn **ret) | ||||
| 	MDB_ntxn *ntxn; | ||||
| 	int rc, size, tsize = sizeof(MDB_txn); | ||||
|  | ||||
| 	flags &= MDB_TXN_BEGIN_FLAGS; | ||||
| 	flags |= env->me_flags & MDB_WRITEMAP; | ||||
|  | ||||
| 	if (env->me_flags & MDB_FATAL_ERROR) { | ||||
| 		DPUTS("environment had fatal error, must shutdown!"); | ||||
| 		return MDB_PANIC; | ||||
| 	} | ||||
| 	if ((env->me_flags & MDB_RDONLY) && !(flags & MDB_RDONLY)) | ||||
| 	if (env->me_flags & MDB_RDONLY & ~flags) /* write txn in RDONLY env */ | ||||
| 		return EACCES; | ||||
| 	if (parent) { | ||||
| 		/* Nested transactions: Max 1 child, write txns only, no writemap */ | ||||
| 		if (parent->mt_child || | ||||
| 			(flags & MDB_RDONLY) || | ||||
| 			(parent->mt_flags & (MDB_TXN_RDONLY|MDB_TXN_ERROR)) || | ||||
| 			(env->me_flags & MDB_WRITEMAP)) | ||||
| 			((flags | parent->mt_flags) & | ||||
| 			 (MDB_RDONLY|MDB_WRITEMAP|MDB_TXN_ERROR))) | ||||
| 		{ | ||||
| 			return (parent->mt_flags & MDB_TXN_RDONLY) ? EINVAL : MDB_BAD_TXN; | ||||
| 		} | ||||
| @@ -3144,7 +3152,6 @@ mdb_txn_begin(MDB_env *env, MDB_txn *parent, unsigned int flags, MDB_txn **ret) | ||||
| 	} | ||||
| 	txn->mt_dbs = (MDB_db *) ((char *)txn + tsize); | ||||
| 	if (flags & MDB_RDONLY) { | ||||
| 		txn->mt_flags |= MDB_TXN_RDONLY; | ||||
| 		txn->mt_dbflags = (unsigned char *)(txn->mt_dbs + env->me_maxdbs); | ||||
| 		txn->mt_dbiseqs = env->me_dbiseqs; | ||||
| 	} else { | ||||
| @@ -3158,6 +3165,7 @@ mdb_txn_begin(MDB_env *env, MDB_txn *parent, unsigned int flags, MDB_txn **ret) | ||||
| 		} | ||||
| 		txn->mt_dbxs = env->me_dbxs; | ||||
| 	} | ||||
| 	txn->mt_flags = flags; | ||||
| 	txn->mt_env = env; | ||||
|  | ||||
| ok: | ||||
| @@ -3209,7 +3217,7 @@ ok: | ||||
| 	} else { | ||||
| 		*ret = txn; | ||||
| 		DPRINTF(("begin txn %"Z"u%c %p on mdbenv %p, root page %"Z"u", | ||||
| 			txn->mt_txnid, (txn->mt_flags & MDB_TXN_RDONLY) ? 'r' : 'w', | ||||
| 			txn->mt_txnid, (flags & MDB_RDONLY) ? 'r' : 'w', | ||||
| 			(void *) txn, (void *) env, txn->mt_dbs[MAIN_DBI].md_root)); | ||||
| 	} | ||||
|  | ||||
| @@ -4223,7 +4231,8 @@ static int | ||||
| mdb_env_write_meta(MDB_txn *txn, int force) | ||||
| { | ||||
| 	MDB_env *env; | ||||
| 	MDB_meta	meta, metab, *mp; | ||||
| 	MDB_meta meta, metab, *mp; | ||||
| 	unsigned flags; | ||||
| 	size_t mapsize; | ||||
| 	off_t off; | ||||
| 	int rc, len, toggle; | ||||
| @@ -4240,13 +4249,14 @@ mdb_env_write_meta(MDB_txn *txn, int force) | ||||
| 		toggle, txn->mt_dbs[MAIN_DBI].md_root)); | ||||
|  | ||||
| 	env = txn->mt_env; | ||||
| 	flags = txn->mt_flags & env->me_flags; | ||||
| 	mp = env->me_metas[toggle]; | ||||
| 	mapsize = env->me_metas[toggle ^ 1]->mm_mapsize; | ||||
| 	/* Persist any increases of mapsize config */ | ||||
| 	if (mapsize < env->me_mapsize) | ||||
| 		mapsize = env->me_mapsize; | ||||
|  | ||||
| 	if (env->me_flags & MDB_WRITEMAP) { | ||||
| 	if (flags & MDB_WRITEMAP) { | ||||
| 		mp->mm_mapsize = mapsize; | ||||
| 		mp->mm_dbs[0] = txn->mt_dbs[0]; | ||||
| 		mp->mm_dbs[1] = txn->mt_dbs[1]; | ||||
| @@ -4254,7 +4264,7 @@ mdb_env_write_meta(MDB_txn *txn, int force) | ||||
| 		/* (LY) ITS#7969: issue a memory barrier, it is noop for x86. */ | ||||
| 		mdb_coherent_barrier(); | ||||
| 		mp->mm_txnid = txn->mt_txnid; | ||||
| 		if (force || !(env->me_flags & (MDB_NOMETASYNC|MDB_NOSYNC))) { | ||||
| 		if (force || !(flags & (MDB_NOMETASYNC|MDB_NOSYNC))) { | ||||
| 			unsigned meta_size = env->me_psize; | ||||
| 			int flags = (!force && (env->me_flags & MDB_MAPASYNC)) ? MS_ASYNC : MS_SYNC; | ||||
| 			ptr = env->me_map; | ||||
| @@ -4296,8 +4306,8 @@ mdb_env_write_meta(MDB_txn *txn, int force) | ||||
| 	off += PAGEHDRSZ; | ||||
|  | ||||
| 	/* Write to the SYNC fd */ | ||||
| 	mfd = (!force || (env->me_flags & (MDB_NOSYNC|MDB_NOMETASYNC))) ? | ||||
| 		env->me_fd : env->me_mfd; | ||||
| 	mfd = (force || !(flags & (MDB_NOSYNC|MDB_NOMETASYNC))) ? | ||||
| 		env->me_mfd : env->me_fd; | ||||
| #ifdef _WIN32 | ||||
| 	{ | ||||
| 		memset(&ov, 0, sizeof(ov)); | ||||
| @@ -5728,7 +5738,7 @@ mdb_page_get(MDB_txn *txn, pgno_t pgno, MDB_page **ret, int *lvl) | ||||
| 	MDB_page *p = NULL; | ||||
| 	int level; | ||||
|  | ||||
| 	if (!((txn->mt_flags & MDB_TXN_RDONLY) | (env->me_flags & MDB_WRITEMAP))) { | ||||
| 	if (! (txn->mt_flags & (MDB_TXN_RDONLY|MDB_TXN_WRITEMAP))) { | ||||
| 		MDB_txn *tx2 = txn; | ||||
| 		level = 1; | ||||
| 		do { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user