# HG changeset patch # User Paul Boddie # Date 1630790612 -7200 # Node ID 225ff3fe520d97dd1dd8076bf55b790258cb3288 # Parent 0d71c011a145ed688cff70d02095190bfb48ccef Moved pipe region initialisation to the first access made by the client library. This avoids memory being mapped straight away for pipe regions which is undesirable when creating pipe endpoints for propagation to other tasks. Updated the host directory listing functionality to use the default blocking I/O regime. diff -r 0d71c011a145 -r 225ff3fe520d libfsclient/lib/src/client.cc --- a/libfsclient/lib/src/client.cc Tue Aug 31 23:51:13 2021 +0200 +++ b/libfsclient/lib/src/client.cc Sat Sep 04 23:23:32 2021 +0200 @@ -77,6 +77,15 @@ } else { + /* Handle the initial condition with no current region. */ + + if (file->memory == NULL) + { + err = client_current_region(file); + if (err) + return err; + } + /* Strict conditions for region navigation in pipes. */ if ((position < file->start_pos) || (position > file->end_pos)) diff -r 0d71c011a145 -r 225ff3fe520d libfsclient/lib/src/file.cc --- a/libfsclient/lib/src/file.cc Tue Aug 31 23:51:13 2021 +0200 +++ b/libfsclient/lib/src/file.cc Sat Sep 04 23:23:32 2021 +0200 @@ -481,21 +481,7 @@ file_init(reader); file_init(writer); - long err = opener.pipe(size, &reader->ref, &writer->ref); - if (err) - return err; - - /* Obtain current region details. */ - - err = pipe_current(writer) || pipe_current(reader); - - if (err) - { - file_close(reader); - file_close(writer); - } - - return err; + return opener.pipe(size, &reader->ref, &writer->ref); } /* Access the current region for a pipe endpoint. */ diff -r 0d71c011a145 -r 225ff3fe520d libfsserver/lib/files/ext2_file_opener.cc --- a/libfsserver/lib/files/ext2_file_opener.cc Tue Aug 31 23:51:13 2021 +0200 +++ b/libfsserver/lib/files/ext2_file_opener.cc Sat Sep 04 23:23:32 2021 +0200 @@ -118,8 +118,8 @@ file_t *reader, *writer; - // NOTE: Might be more appropriate to use lower-level file operations to - // NOTE: avoid unnecessary mapping of the reader's memory region. + // Mapping of the reader's memory region should be avoided because no use + // of the reader will be made here. long err = client_pipe(&reader, &writer, 0); diff -r 0d71c011a145 -r 225ff3fe520d libfsserver/lib/files/host_file_opener.cc --- a/libfsserver/lib/files/host_file_opener.cc Tue Aug 31 23:51:13 2021 +0200 +++ b/libfsserver/lib/files/host_file_opener.cc Sat Sep 04 23:23:32 2021 +0200 @@ -39,16 +39,6 @@ DIR *dir = opendir(path); struct dirent *dirent; - /* Subscribe to space and closure notifications on the pipe. */ - - long err = client_set_blocking(writer, NOTIFY_SPACE_AVAILABLE | NOTIFY_PEER_CLOSED); - - if (err) - { - client_close(writer); - return; - } - /* Write directory entries to the pipe, closing the pipe when finished. */ while ((dirent = readdir(dir)) != NULL) @@ -102,10 +92,10 @@ file_t *reader, *writer; - // NOTE: Might be more appropriate to use lower-level file operations to - // NOTE: avoid unnecessary mapping of the reader's memory region. + // Mapping of the reader's memory region should be avoided because no use + // of the reader will be made here. - long err = client_pipe(&reader, &writer, O_NONBLOCK); + long err = client_pipe(&reader, &writer, 0); if (err) return err;