struct pt_section *pt_mk_section(const char *filename, uint64_t offset,
				 uint64_t size)
{
	struct pt_section *section;
	uint64_t fsize;
	void *status;
	int errcode;

	errcode = pt_section_mk_status(&status, &fsize, filename);
	if (errcode < 0)
		return NULL;

	/* Fail if the requested @offset lies beyond the end of @file. */
	if (fsize <= offset)
		goto out_status;

	/* Truncate @size so the entire range lies within @file. */
	fsize -= offset;
	if (fsize < size)
		size = fsize;

	section = malloc(sizeof(*section));
	if (!section)
		goto out_status;

	memset(section, 0, sizeof(*section));

	section->filename = dupstr(filename);
	section->status = status;
	section->offset = offset;
	section->size = size;
	section->ucount = 1;

#if defined(FEATURE_THREADS)

	errcode = mtx_init(&section->lock, mtx_plain);
	if (errcode != thrd_success) {
		free(section->filename);
		free(section);
		goto out_status;
	}

#endif /* defined(FEATURE_THREADS) */

	return section;

out_status:
	free(status);
	return NULL;
}
Exemple #2
0
int pt_mk_section(struct pt_section **psection, const char *filename,
		  uint64_t offset, uint64_t size)
{
	struct pt_section *section;
	uint64_t fsize;
	size_t flen;
	void *status;
	char *fname;
	int errcode;

	if (!psection)
		return -pte_internal;

	flen = strnlen(filename, FILENAME_MAX);
	if (FILENAME_MAX <= flen)
		return -pte_invalid;

	flen += 1;

	fname = malloc(flen);
	if (!fname)
		return -pte_nomem;

	memcpy(fname, filename, flen);

	errcode = pt_section_mk_status(&status, &fsize, fname);
	if (errcode < 0)
		goto out_fname;

	/* Fail if the requested @offset lies beyond the end of @file. */
	if (fsize <= offset) {
		errcode = -pte_invalid;
		goto out_status;
	}

	/* Truncate @size so the entire range lies within @file. */
	fsize -= offset;
	if (fsize < size)
		size = fsize;

	section = malloc(sizeof(*section));
	if (!section) {
		errcode = -pte_nomem;
		goto out_status;
	}

	memset(section, 0, sizeof(*section));

	section->filename = fname;
	section->status = status;
	section->offset = offset;
	section->size = size;
	section->ucount = 1;

#if defined(FEATURE_THREADS)

	errcode = mtx_init(&section->lock, mtx_plain);
	if (errcode != thrd_success) {
		free(section);

		errcode = -pte_bad_lock;
		goto out_status;
	}

	errcode = mtx_init(&section->alock, mtx_plain);
	if (errcode != thrd_success) {
		mtx_destroy(&section->lock);
		free(section);

		errcode = -pte_bad_lock;
		goto out_status;
	}

#endif /* defined(FEATURE_THREADS) */

	*psection = section;
	return 0;

out_status:
	free(status);

out_fname:
	free(fname);
	return errcode;
}