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

📄 findfree.c

📁 unix高级编程源代码.<<unix高级编程>>
💻 C
字号:
#include	"db.h"

/* Try to find a free index record and accompanying data record
 * of the correct sizes.  We're only called by db_store(). */

int
_db_findfree(DB *db, int keylen, int datlen)
{
	int		rc;
	off_t	offset, nextoffset, saveoffset;

		/* Lock the free list */
	if (writew_lock(db->idxfd, FREE_OFF, SEEK_SET, 1) < 0)
		err_dump("writew_lock error");

		/* Read the free list pointer */
	saveoffset = FREE_OFF;
	offset = _db_readptr(db, saveoffset);

	while (offset != 0) {
		nextoffset = _db_readidx(db, offset);
		if (strlen(db->idxbuf) == keylen && db->datlen == datlen)
			break;		/* found a match */

		saveoffset = offset;
		offset = nextoffset;
	}

	if (offset == 0)
		rc = -1;	/* no match found */
	else {
			/* Found a free record with matching sizes.
			   The index record was read in by _db_readidx() above,
			   which sets db->ptrval.  Also, saveoffset points to
			   the chain ptr that pointed to this empty record on
			   the free list.  We set this chain ptr to db->ptrval,
			   which removes the empty record from the free list. */

		_db_writeptr(db, saveoffset, db->ptrval);
		rc = 0;

			/* Notice also that _db_readidx() set both db->idxoff
			   and db->datoff.  This is used by the caller, db_store(),
			   to write the new index record and data record. */
	}
			/* Unlock the free list */
	if (un_lock(db->idxfd, FREE_OFF, SEEK_SET, 1) < 0)
		err_dump("un_lock error");
	return(rc);
}

⌨️ 快捷键说明

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