int main(int argc, char *argv[]) { if (argc != 2) { printf("usage: %s file-name\n", argv[0]); return 1; } PMEMobjpool *pop = pmemobj_create(argv[1], LAYOUT_NAME, PMEMOBJ_MIN_POOL, 0666); if (pop == NULL) { perror("pmemobj_create"); return 1; } PMEMoid root = pmemobj_root(pop, sizeof(struct my_root)); struct my_root *rootp = pmemobj_direct(root); char buf[MAX_BUF_LEN]; if (scanf("%9s", buf) == EOF) { fprintf(stderr, "EOF\n"); return 1; } rootp->len = strlen(buf); pmemobj_persist(pop, &rootp->len, sizeof(rootp->len)); pmemobj_memcpy_persist(pop, rootp->buf, buf, rootp->len); pmemobj_close(pop); return 0; }
/* * pocli_str_root_copy -- copy a string into a root object data */ static enum pocli_ret pocli_str_root_copy(struct pocli_ctx *ctx, struct pocli_args *args) { if (args->argc != 3) return POCLI_ERR_ARGS; size_t offset = 0; enum pocli_ret ret = pocli_args_size(args, 1, &offset); if (ret) return ret; const char *str = args->argv[2]; if (str == NULL) return POCLI_ERR_ARGS; size_t len = strlen(str); size_t root_size = pmemobj_root_size(ctx->pop); if (offset + len > root_size) return POCLI_ERR_ARGS; PMEMoid root = pmemobj_root(ctx->pop, root_size); assert(!OID_IS_NULL(root)); char *root_data = pmemobj_direct(root); pmemobj_memcpy_persist(ctx->pop, root_data + offset, str, len); return ret; }
static int test_constructor(PMEMobjpool *pop, void *addr, void *args) { /* do not use pmem_memcpy_persist() here */ pmemobj_memcpy_persist(pop, addr, buf, ALLOC_SIZE); return 0; }
/* * create_log_entry -- (internal) constructor for the log entry */ static int create_log_entry(PMEMobjpool *pop, void *ptr, void *arg) { struct log *logptr = ptr; struct create_args *carg = arg; logptr->size = carg->size; pmemobj_persist(pop, &logptr->size, sizeof(logptr->size)); pmemobj_memcpy_persist(pop, logptr->data, carg->src, carg->size); return 0; }
/* * pocli_pmemobj_memcpy_persist -- pmemobj_memcpy_persist() command */ static enum pocli_ret pocli_pmemobj_memcpy_persist(struct pocli_ctx *ctx, struct pocli_args *args) { if (args->argc != 6) return POCLI_ERR_ARGS; PMEMoid *dest; PMEMoid *src; enum pocli_ret ret; uint64_t offset; uint64_t len; if ((ret = pocli_args_obj(ctx, args, 1, &dest))) return ret; if ((ret = pocli_args_number(args, 2, &offset))) return ret; char *dest_p = pmemobj_direct(*dest); dest_p += offset; if ((ret = pocli_args_obj(ctx, args, 3, &src))) return ret; if ((ret = pocli_args_number(args, 4, &offset))) return ret; char *src_p = pmemobj_direct(*src); src_p += offset; if ((ret = pocli_args_number(args, 5, &len))) return ret; void *result = pmemobj_memcpy_persist(ctx->pop, dest_p, src_p, len); pocli_printf(ctx, "%s(%p, %p, %u): ptr = %p\n", args->argv[0], dest_p, src_p, len, result); return ret; }
/** * Performs memcpy and persist operation on a given chunk of * memory. * * @param[in] dest destination memory address * @param[in] src source memory address * @param[in] len size of memory chunk * * @return A pointer to dest */ void * memcpy_persist(void *dest, const void *src, size_t len) noexcept { return pmemobj_memcpy_persist(this->pop, dest, src, len); }