forked from Imagelibrary/rtems
termios: Implement non-blocking write
This commit is contained in:
@@ -1214,9 +1214,10 @@ oproc (unsigned char c, rtems_termios_tty *tty, bool wait)
|
||||
}
|
||||
|
||||
static uint32_t
|
||||
rtems_termios_write_tty (rtems_termios_tty *tty, const char *buf, uint32_t len)
|
||||
rtems_termios_write_tty (rtems_libio_t *iop, rtems_termios_tty *tty,
|
||||
const char *buf, uint32_t len)
|
||||
{
|
||||
bool wait = true;
|
||||
bool wait = ((iop->flags & LIBIO_FLAGS_NO_DELAY) == 0);
|
||||
|
||||
if (tty->termios.c_oflag & OPOST) {
|
||||
uint32_t todo = len;
|
||||
@@ -1252,7 +1253,8 @@ rtems_termios_write (void *arg)
|
||||
rtems_semaphore_release (tty->osem);
|
||||
return sc;
|
||||
}
|
||||
args->bytes_moved = rtems_termios_write_tty (tty, args->buffer, args->count);
|
||||
args->bytes_moved = rtems_termios_write_tty (args->iop, tty,
|
||||
args->buffer, args->count);
|
||||
rtems_semaphore_release (tty->osem);
|
||||
return sc;
|
||||
}
|
||||
@@ -2162,7 +2164,7 @@ rtems_termios_imfs_write (rtems_libio_t *iop, const void *buffer, size_t count)
|
||||
return (ssize_t) args.bytes_moved;
|
||||
}
|
||||
|
||||
bytes_moved = rtems_termios_write_tty (tty, buffer, count);
|
||||
bytes_moved = rtems_termios_write_tty (iop, tty, buffer, count);
|
||||
rtems_semaphore_release (tty->osem);
|
||||
return (ssize_t) bytes_moved;
|
||||
}
|
||||
|
||||
@@ -199,6 +199,24 @@ static void input(test_context *ctx, size_t i, char c)
|
||||
}
|
||||
}
|
||||
|
||||
static void enable_non_blocking(test_context *ctx, size_t i, bool enable)
|
||||
{
|
||||
int flags;
|
||||
int rv;
|
||||
|
||||
flags = fcntl(ctx->fds[i], F_GETFL, 0);
|
||||
rtems_test_assert(flags >= 0);
|
||||
|
||||
if (enable) {
|
||||
flags |= O_NONBLOCK;
|
||||
} else {
|
||||
flags &= ~O_NONBLOCK;
|
||||
}
|
||||
|
||||
rv = fcntl(ctx->fds[i], F_SETFL, flags);
|
||||
rtems_test_assert(rv == 0);
|
||||
}
|
||||
|
||||
static void clear_set_iflag(
|
||||
test_context *ctx,
|
||||
size_t i,
|
||||
@@ -968,6 +986,11 @@ static void test_write(test_context *ctx)
|
||||
|
||||
rtems_test_assert(ctx->context_switch_counter == 0);
|
||||
|
||||
enable_non_blocking(ctx, i, true);
|
||||
n = write(ctx->fds[i], &buf[OUTPUT_BUFFER_SIZE - 1], 1);
|
||||
rtems_test_assert(n == 0);
|
||||
|
||||
enable_non_blocking(ctx, i, false);
|
||||
n = write(ctx->fds[i], &buf[OUTPUT_BUFFER_SIZE - 1], 1);
|
||||
rtems_test_assert(n == 1);
|
||||
|
||||
@@ -994,6 +1017,11 @@ static void test_write(test_context *ctx)
|
||||
|
||||
rtems_test_assert(ctx->context_switch_counter == 2);
|
||||
|
||||
enable_non_blocking(ctx, i, true);
|
||||
n = write(ctx->fds[i], &buf[OUTPUT_BUFFER_SIZE - 2], 1);
|
||||
rtems_test_assert(n == 0);
|
||||
|
||||
enable_non_blocking(ctx, i, false);
|
||||
n = write(ctx->fds[i], &buf[OUTPUT_BUFFER_SIZE - 2], 1);
|
||||
rtems_test_assert(n == 1);
|
||||
|
||||
@@ -1020,6 +1048,11 @@ static void test_write(test_context *ctx)
|
||||
|
||||
rtems_test_assert(ctx->context_switch_counter == 4);
|
||||
|
||||
enable_non_blocking(ctx, i, true);
|
||||
n = write(ctx->fds[i], &buf[OUTPUT_BUFFER_SIZE - 8], 1);
|
||||
rtems_test_assert(n == 0);
|
||||
|
||||
enable_non_blocking(ctx, i, false);
|
||||
n = write(ctx->fds[i], &buf[OUTPUT_BUFFER_SIZE - 8], 1);
|
||||
rtems_test_assert(n == 1);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user