本文整理汇总了C++中dbuf_read函数的典型用法代码示例。如果您正苦于以下问题:C++ dbuf_read函数的具体用法?C++ dbuf_read怎么用?C++ dbuf_read使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了dbuf_read函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: dmu_buf_hold
int
dmu_buf_hold(objset_t *os, uint64_t object, uint64_t offset,
void *tag, dmu_buf_t **dbp, int flags)
{
dnode_t *dn;
uint64_t blkid;
dmu_buf_impl_t *db;
int err;
int db_flags = DB_RF_CANFAIL;
if (flags & DMU_READ_NO_PREFETCH)
db_flags |= DB_RF_NOPREFETCH;
err = dnode_hold(os, object, FTAG, &dn);
if (err)
return (err);
blkid = dbuf_whichblock(dn, offset);
rw_enter(&dn->dn_struct_rwlock, RW_READER);
db = dbuf_hold(dn, blkid, tag);
rw_exit(&dn->dn_struct_rwlock);
if (db == NULL) {
err = EIO;
} else {
err = dbuf_read(db, NULL, db_flags);
if (err) {
dbuf_rele(db, tag);
db = NULL;
}
}
dnode_rele(dn, FTAG);
*dbp = &db->db; /* NULL db plus first field offset is NULL */
return (err);
}
开发者ID:Acidburn0zzz,项目名称:osv,代码行数:34,代码来源:dmu.c
示例2: dmu_bonus_hold
/*
* returns ENOENT, EIO, or 0.
*/
int
dmu_bonus_hold(objset_t *os, uint64_t object, void *tag, dmu_buf_t **dbp)
{
dnode_t *dn;
dmu_buf_impl_t *db;
int error;
error = dnode_hold(os->os, object, FTAG, &dn);
if (error)
return (error);
rw_enter(&dn->dn_struct_rwlock, RW_READER);
if (dn->dn_bonus == NULL) {
rw_exit(&dn->dn_struct_rwlock);
rw_enter(&dn->dn_struct_rwlock, RW_WRITER);
if (dn->dn_bonus == NULL)
dbuf_create_bonus(dn);
}
db = dn->dn_bonus;
rw_exit(&dn->dn_struct_rwlock);
/* as long as the bonus buf is held, the dnode will be held */
if (refcount_add(&db->db_holds, tag) == 1)
VERIFY(dnode_add_ref(dn, db));
dnode_rele(dn, FTAG);
VERIFY(0 == dbuf_read(db, NULL, DB_RF_MUST_SUCCEED));
*dbp = &db->db;
return (0);
}
开发者ID:YaroslavLitvinov,项目名称:zfs-port,代码行数:35,代码来源:dmu.c
示例3: dbuf_getu32le_p
i64 dbuf_getu32le_p(dbuf *f, i64 *ppos)
{
u8 m[4];
dbuf_read(f, m, *ppos, 4);
(*ppos) += 4;
return de_getu32le_direct(m);
}
开发者ID:jsummers,项目名称:deark,代码行数:7,代码来源:deark-dbuf.c
示例4: dmu_buf_hold
int
dmu_buf_hold(objset_t *os, uint64_t object, uint64_t offset,
void *tag, dmu_buf_t **dbp)
{
dnode_t *dn;
uint64_t blkid;
dmu_buf_impl_t *db;
int err;
err = dnode_hold(os->os, object, FTAG, &dn);
if (err)
return (err);
blkid = dbuf_whichblock(dn, offset);
rw_enter(&dn->dn_struct_rwlock, RW_READER);
db = dbuf_hold(dn, blkid, tag);
rw_exit(&dn->dn_struct_rwlock);
if (db == NULL) {
err = EIO;
} else {
err = dbuf_read(db, NULL, DB_RF_CANFAIL);
if (err) {
dbuf_rele(db, tag);
db = NULL;
}
}
dnode_rele(dn, FTAG);
*dbp = &db->db;
return (err);
}
开发者ID:YaroslavLitvinov,项目名称:zfs-port,代码行数:30,代码来源:dmu.c
示例5: dbuf_getu16le_p
i64 dbuf_getu16le_p(dbuf *f, i64 *ppos)
{
u8 m[2];
dbuf_read(f, m, *ppos, 2);
(*ppos) += 2;
return de_getu16le_direct(m);
}
开发者ID:jsummers,项目名称:deark,代码行数:7,代码来源:deark-dbuf.c
示例6: dbuf_getRGB
u32 dbuf_getRGB(dbuf *f, i64 pos, unsigned int flags)
{
u8 buf[3];
dbuf_read(f, buf, pos, 3);
if(flags&DE_GETRGBFLAG_BGR)
return DE_MAKE_RGB(buf[2], buf[1], buf[0]);
return DE_MAKE_RGB(buf[0], buf[1], buf[2]);
}
开发者ID:jsummers,项目名称:deark,代码行数:8,代码来源:deark-dbuf.c
示例7: dbuf_getint_ext_x
static i64 dbuf_getint_ext_x(dbuf *f, i64 pos, unsigned int nbytes, int is_le)
{
u8 m[24];
if(nbytes>(unsigned int)sizeof(m)) return 0;
dbuf_read(f, m, pos, (i64)nbytes);
if(is_le) {
return 0; // TODO
}
return dbuf_getint_ext_be_direct(m, nbytes);
}
开发者ID:jsummers,项目名称:deark,代码行数:11,代码来源:deark-dbuf.c
示例8: dbuf_standard_read
// A function that works a little more like a standard read/fread function than
// does dbuf_read. It returns the number of bytes read, won't read past end of
// file, and helps track the file position.
i64 dbuf_standard_read(dbuf *f, u8 *buf, i64 n, i64 *fpos)
{
i64 amt_to_read;
if(*fpos < 0 || *fpos >= f->len) return 0;
amt_to_read = n;
if(*fpos + amt_to_read > f->len) amt_to_read = f->len - *fpos;
dbuf_read(f, buf, *fpos, amt_to_read);
*fpos += amt_to_read;
return amt_to_read;
}
开发者ID:jsummers,项目名称:deark,代码行数:15,代码来源:deark-dbuf.c
示例9: dbuf_read_ascii_number
int dbuf_read_ascii_number(dbuf *f, i64 pos, i64 fieldsize,
int base, i64 *value)
{
char buf[32];
*value = 0;
if(fieldsize>(i64)(sizeof(buf)-1)) return 0;
dbuf_read(f, (u8*)buf, pos, fieldsize);
buf[fieldsize] = '\0';
*value = de_strtoll(buf, NULL, base);
return 1;
}
开发者ID:jsummers,项目名称:deark,代码行数:14,代码来源:deark-dbuf.c
示例10: dbuf_read_to_ucstring
// Read (up to) len bytes from f, translate them to characters, and append
// them to s.
void dbuf_read_to_ucstring(dbuf *f, i64 pos, i64 len,
de_ucstring *s, unsigned int conv_flags, int encoding)
{
u8 *buf = NULL;
deark *c = f->c;
if(conv_flags & DE_CONVFLAG_STOP_AT_NUL) {
i64 foundpos = 0;
if(dbuf_search_byte(f, 0x00, pos, len, &foundpos)) {
len = foundpos - pos;
}
}
buf = de_malloc(c, len);
dbuf_read(f, buf, pos, len);
ucstring_append_bytes(s, buf, len, 0, encoding);
de_free(c, buf);
}
开发者ID:jsummers,项目名称:deark,代码行数:20,代码来源:deark-dbuf.c
示例11: de_linereader_readnextline
// TODO: Make the linereader more efficient and flexible, and make
// it a standard library function.
static int de_linereader_readnextline(deark *c, struct de_linereader *lr,
char *buf, size_t buf_len, unsigned int flags)
{
int ret;
i64 content_len = 0;
i64 total_len = 0;
buf[0] = '\0';
ret = dbuf_find_line(lr->f, lr->f_pos, &content_len, &total_len);
if(!ret) return 0;
if(content_len > (i64)buf_len-1) {
lr->f_pos += total_len;
return 0;
}
dbuf_read(lr->f, (u8*)buf, lr->f_pos, content_len);
buf[content_len] = '\0';
lr->f_pos += total_len;
return 1;
}
开发者ID:jsummers,项目名称:deark,代码行数:22,代码来源:unifont.c
示例12: dbuf_copy
void dbuf_copy(dbuf *inf, i64 input_offset, i64 input_len, dbuf *outf)
{
u8 tmpbuf[256];
if(inf->btype==DBUF_TYPE_MEMBUF &&
(input_offset>=0) && (input_offset+input_len<=inf->len))
{
// Fast path if the data to copy is all in memory
dbuf_write(outf, &inf->membuf_buf[input_offset], input_len);
return;
}
if(input_len<=(i64)sizeof(tmpbuf)) {
// Fast path for small sizes
dbuf_read(inf, tmpbuf, input_offset, input_len);
dbuf_write(outf, tmpbuf, input_len);
return;
}
dbuf_buffered_read(inf, input_offset, input_len, copy_cbfn, (void*)outf);
}
开发者ID:jsummers,项目名称:deark,代码行数:21,代码来源:deark-dbuf.c
示例13: dbuf_memcmp
int dbuf_memcmp(dbuf *f, i64 pos, const void *s, size_t n)
{
u8 buf1[128];
if(f->cache &&
pos >= f->cache_start_pos &&
pos + (i64)n <= f->cache_start_pos + f->cache_bytes_used)
{
// Fastest path: Compare directly to cache.
return de_memcmp(s, &f->cache[pos - f->cache_start_pos], n);
}
if(n<=sizeof(buf1)) {
// Use a stack buffer if small enough.
dbuf_read(f, buf1, pos, n);
return de_memcmp(buf1, s, n);
}
// Fallback method.
return !dbuf_buffered_read(f, pos, n, dbufmemcmp_cbfn, (void*)s);
}
开发者ID:jsummers,项目名称:deark,代码行数:21,代码来源:deark-dbuf.c
示例14: dbuf_getbyte
u8 dbuf_getbyte(dbuf *f, i64 pos)
{
switch(f->btype) {
case DBUF_TYPE_MEMBUF:
// Optimization for memory buffers
if(pos>=0 && pos<f->len) {
return f->membuf_buf[pos];
}
break;
default:
if(f->cache2_bytes_used>0 && pos==f->cache2_start_pos) {
return f->cache2[0];
}
dbuf_read(f, &f->cache2[0], pos, 1);
f->cache2_bytes_used = 1;
f->cache2_start_pos = pos;
return f->cache2[0];
}
return 0x00;
}
开发者ID:jsummers,项目名称:deark,代码行数:21,代码来源:deark-dbuf.c
示例15: dmu_bonus_hold
/*
* returns ENOENT, EIO, or 0.
*/
int
dmu_bonus_hold(objset_t *os, uint64_t object, void *tag, dmu_buf_t **dbp)
{
dnode_t *dn;
dmu_buf_impl_t *db;
int error;
error = dnode_hold(os, object, FTAG, &dn);
if (error)
return (error);
rw_enter(&dn->dn_struct_rwlock, RW_READER);
if (dn->dn_bonus == NULL) {
rw_exit(&dn->dn_struct_rwlock);
rw_enter(&dn->dn_struct_rwlock, RW_WRITER);
if (dn->dn_bonus == NULL)
dbuf_create_bonus(dn);
}
db = dn->dn_bonus;
/* as long as the bonus buf is held, the dnode will be held */
if (refcount_add(&db->db_holds, tag) == 1) {
VERIFY(dnode_add_ref(dn, db));
atomic_inc_32(&dn->dn_dbufs_count);
}
/*
* Wait to drop dn_struct_rwlock until after adding the bonus dbuf's
* hold and incrementing the dbuf count to ensure that dnode_move() sees
* a dnode hold for every dbuf.
*/
rw_exit(&dn->dn_struct_rwlock);
dnode_rele(dn, FTAG);
VERIFY(0 == dbuf_read(db, NULL, DB_RF_MUST_SUCCEED | DB_RF_NOPREFETCH));
*dbp = &db->db;
return (0);
}
开发者ID:yaoyutian,项目名称:freebsd,代码行数:43,代码来源:dmu.c
示例16: dmu_spill_hold_by_dnode
/*
* returns ENOENT, EIO, or 0.
*
* This interface will allocate a blank spill dbuf when a spill blk
* doesn't already exist on the dnode.
*
* if you only want to find an already existing spill db, then
* dmu_spill_hold_existing() should be used.
*/
int
dmu_spill_hold_by_dnode(dnode_t *dn, uint32_t flags, void *tag, dmu_buf_t **dbp)
{
dmu_buf_impl_t *db = NULL;
int err;
if ((flags & DB_RF_HAVESTRUCT) == 0)
rw_enter(&dn->dn_struct_rwlock, RW_READER);
db = dbuf_hold(dn, DMU_SPILL_BLKID, tag);
if ((flags & DB_RF_HAVESTRUCT) == 0)
rw_exit(&dn->dn_struct_rwlock);
ASSERT(db != NULL);
err = dbuf_read(db, NULL, flags);
if (err == 0)
*dbp = &db->db;
else
dbuf_rele(db, tag);
return (err);
}
开发者ID:yaoyutian,项目名称:freebsd,代码行数:31,代码来源:dmu.c
示例17: dmu_buf_hold
int
dmu_buf_hold(objset_t *os, uint64_t object, uint64_t offset,
void *tag, dmu_buf_t **dbp, int flags)
{
int err;
int db_flags = DB_RF_CANFAIL;
if (flags & DMU_READ_NO_PREFETCH)
db_flags |= DB_RF_NOPREFETCH;
err = dmu_buf_hold_noread(os, object, offset, tag, dbp);
if (err == 0) {
dmu_buf_impl_t *db = (dmu_buf_impl_t *)(*dbp);
err = dbuf_read(db, NULL, db_flags);
if (err != 0) {
dbuf_rele(db, tag);
*dbp = NULL;
}
}
return (err);
}
开发者ID:yaoyutian,项目名称:freebsd,代码行数:22,代码来源:dmu.c
示例18: dnode_increase_indirection
static void
dnode_increase_indirection(dnode_t *dn, dmu_tx_t *tx)
{
dmu_buf_impl_t *db;
int txgoff = tx->tx_txg & TXG_MASK;
int nblkptr = dn->dn_phys->dn_nblkptr;
int old_toplvl = dn->dn_phys->dn_nlevels - 1;
int new_level = dn->dn_next_nlevels[txgoff];
int i;
rw_enter(&dn->dn_struct_rwlock, RW_WRITER);
/* this dnode can't be paged out because it's dirty */
ASSERT(dn->dn_phys->dn_type != DMU_OT_NONE);
ASSERT(RW_WRITE_HELD(&dn->dn_struct_rwlock));
ASSERT(new_level > 1 && dn->dn_phys->dn_nlevels > 0);
db = dbuf_hold_level(dn, dn->dn_phys->dn_nlevels, 0, FTAG);
ASSERT(db != NULL);
dn->dn_phys->dn_nlevels = new_level;
dprintf("os=%p obj=%llu, increase to %d\n", dn->dn_objset,
dn->dn_object, dn->dn_phys->dn_nlevels);
/* check for existing blkptrs in the dnode */
for (i = 0; i < nblkptr; i++)
if (!BP_IS_HOLE(&dn->dn_phys->dn_blkptr[i]))
break;
if (i != nblkptr) {
/* transfer dnode's block pointers to new indirect block */
(void) dbuf_read(db, NULL, DB_RF_MUST_SUCCEED|DB_RF_HAVESTRUCT);
ASSERT(db->db.db_data);
ASSERT(arc_released(db->db_buf));
ASSERT3U(sizeof (blkptr_t) * nblkptr, <=, db->db.db_size);
bcopy(dn->dn_phys->dn_blkptr, db->db.db_data,
sizeof (blkptr_t) * nblkptr);
arc_buf_freeze(db->db_buf);
}
开发者ID:Acidburn0zzz,项目名称:zfs,代码行数:38,代码来源:dnode_sync.c
示例19: dnode_increase_indirection
static void
dnode_increase_indirection(dnode_t *dn, dmu_tx_t *tx)
{
dmu_buf_impl_t *db;
int txgoff = tx->tx_txg & TXG_MASK;
int nblkptr = dn->dn_phys->dn_nblkptr;
int old_toplvl = dn->dn_phys->dn_nlevels - 1;
int new_level = dn->dn_next_nlevels[txgoff];
int i;
rw_enter(&dn->dn_struct_rwlock, RW_WRITER);
/* this dnode can't be paged out because it's dirty */
ASSERT(dn->dn_phys->dn_type != DMU_OT_NONE);
ASSERT(RW_WRITE_HELD(&dn->dn_struct_rwlock));
ASSERT(new_level > 1 && dn->dn_phys->dn_nlevels > 0);
db = dbuf_hold_level(dn, dn->dn_phys->dn_nlevels, 0, FTAG);
ASSERT(db != NULL);
dn->dn_phys->dn_nlevels = new_level;
dprintf("os=%p obj=%llu, increase to %d\n", dn->dn_objset,
dn->dn_object, dn->dn_phys->dn_nlevels);
/* transfer dnode's block pointers to new indirect block */
(void) dbuf_read(db, NULL, DB_RF_MUST_SUCCEED|DB_RF_HAVESTRUCT);
ASSERT(db->db.db_data);
ASSERT(arc_released(db->db_buf));
ASSERT3U(sizeof (blkptr_t) * nblkptr, <=, db->db.db_size);
bcopy(dn->dn_phys->dn_blkptr, db->db.db_data,
sizeof (blkptr_t) * nblkptr);
arc_buf_freeze(db->db_buf);
/* set dbuf's parent pointers to new indirect buf */
for (i = 0; i < nblkptr; i++) {
dmu_buf_impl_t *child =
dbuf_find(dn->dn_objset, dn->dn_object, old_toplvl, i);
if (child == NULL)
continue;
#ifdef DEBUG
DB_DNODE_ENTER(child);
ASSERT3P(DB_DNODE(child), ==, dn);
DB_DNODE_EXIT(child);
#endif /* DEBUG */
if (child->db_parent && child->db_parent != dn->dn_dbuf) {
ASSERT(child->db_parent->db_level == db->db_level);
ASSERT(child->db_blkptr !=
&dn->dn_phys->dn_blkptr[child->db_blkid]);
mutex_exit(&child->db_mtx);
continue;
}
ASSERT(child->db_parent == NULL ||
child->db_parent == dn->dn_dbuf);
child->db_parent = db;
dbuf_add_ref(db, child);
if (db->db.db_data)
child->db_blkptr = (blkptr_t *)db->db.db_data + i;
else
child->db_blkptr = NULL;
dprintf_dbuf_bp(child, child->db_blkptr,
"changed db_blkptr to new indirect %s", "");
mutex_exit(&child->db_mtx);
}
bzero(dn->dn_phys->dn_blkptr, sizeof (blkptr_t) * nblkptr);
dbuf_rele(db, FTAG);
rw_exit(&dn->dn_struct_rwlock);
}
开发者ID:64116278,项目名称:zfs,代码行数:73,代码来源:dnode_sync.c
示例20: dbuf_getu16le
i64 dbuf_getu16le(dbuf *f, i64 pos)
{
u8 m[2];
dbuf_read(f, m, pos, 2);
return de_getu16le_direct(m);
}
开发者ID:jsummers,项目名称:deark,代码行数:6,代码来源:deark-dbuf.c
注:本文中的dbuf_read函数示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论