📄 findfree.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 + -