termios: Implement non-blocking write

This commit is contained in:
Sebastian Huber
2017-02-24 14:44:04 +01:00
parent a165a9607a
commit 3663543392
2 changed files with 39 additions and 4 deletions

View File

@@ -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;
}

View File

@@ -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);