File:  [ELWIX - Embedded LightWeight unIX -] / libaitio / src / aio.c
Revision 1.1.2.1: download - view: text, annotated - select for diffs - revision graph
Mon Jul 5 09:25:06 2010 UTC (13 years, 11 months ago) by misho
Branches: io1_3
added AIO operations

#include "global.h"


/*
 * io_rread() Raw read function
 * @fd = File handle
 * @buf = Read buffer
 * @nbytes = Read buffer size
 * @offset = Read from position, if -1 read nbytes from current position
 * @update = Update file handle position !0
 * return: -1 error or !=-1 readed bytes
 */
inline int
io_rread(int fd, void * __restrict buf, size_t nbytes, off_t offset, int update)
{
	int ret;
#ifdef AIO_OPS
	struct aiocb acb;
#endif

	if (!buf) {
		io_SetErr(EINVAL, "Error:: invalid arguments ...\n");
		return -1;
	}
	if (!nbytes)
		return 0;
	if (offset == -1) {
		offset = lseek(fd, 0, SEEK_CUR);
		if (offset == -1) {
			LOGERR;
			return -1;
		}
	}

#ifdef AIO_OPS
	memset(buf, 0, nbytes);
	memset(&acb, 0, sizeof acb);
	acb.aio_fildes = fd;
	acb.aio_nbytes = nbytes;
	acb.aio_buf = buf;
	acb.aio_offset = offset;

	if (aio_read(&acb) == -1) {
		LOGERR;
		return -1;
	}

	while (aio_error(&acb) == EINPROGRESS);
	ret = aio_return(&acb);
	if (ret == -1) {
		LOGERR;
		return -1;
	} else
		ret = acb.aio_nbytes;
#else
	ret = pread(fd, buf, nbytes, offset);
	if (ret == -1) {
		LOGERR;
		return -1;
	}
#endif

	if (update)
		lseek(fd, offset + ret, SEEK_SET);

	return ret;
}

/*
 * io_rwrite() Raw write function
 * @fd = File handle
 * @buf = Write buffer
 * @nbytes = Write bytes from buffer
 * @offset = Write at position, if -1 write nbytes from current position
 * @update = Update file handle position !0
 * return: -1 error or !=-1 writed bytes
 */
inline int
io_rwrite(int fd, void * __restrict buf, size_t nbytes, off_t offset, int update)
{
	int ret;
#ifdef AIO_OPS
	struct aiocb acb;
#endif

	if (!buf) {
		io_SetErr(EINVAL, "Error:: invalid arguments ...\n");
		return -1;
	}
	if (!nbytes)
		return 0;
	if (offset == -1) {
		offset = lseek(fd, 0, SEEK_CUR);
		if (offset == -1) {
			LOGERR;
			return -1;
		}
	}

#ifdef AIO_OPS
	memset(buf, 0, nbytes);
	memset(&acb, 0, sizeof acb);
	acb.aio_fildes = fd;
	acb.aio_nbytes = nbytes;
	acb.aio_buf = buf;
	acb.aio_offset = offset;

	if (aio_write(&acb) == -1) {
		LOGERR;
		return -1;
	}

	while (aio_error(&acb) == EINPROGRESS);
	ret = aio_return(&acb);
	if (ret == -1) {
		LOGERR;
		return -1;
	} else
		ret = acb.aio_nbytes;
#else
	ret = pwrite(fd, buf, nbytes, offset);
	if (ret == -1) {
		LOGERR;
		return -1;
	}
#endif

	if (update)
		lseek(fd, offset + ret, SEEK_SET);


	return ret;
}

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>