# HG changeset patch # User Paul Boddie # Date 1614546879 -3600 # Node ID 12afa5ea8d0b3dabe5282e25ad0757407734c105 # Parent 1746e650715f651833410d1a9782b4f1e781f779 Included offset_t from libsystypes. Introduced testing convenience functions. diff -r 1746e650715f -r 12afa5ea8d0b Makefile --- a/Makefile Sat Feb 27 23:41:06 2021 +0100 +++ b/Makefile Sun Feb 28 22:14:39 2021 +0100 @@ -84,7 +84,7 @@ $(PLAIN_SRC_CC_dstest_test_server) \ $(COMMON_SRC_CC) -REQUIRES_LIBS = l4re_c-util libipc libstdc++ +REQUIRES_LIBS = l4re_c-util libipc libstdc++ libsystypes PRIVATE_INCDIR = $(IDL_BUILD_DIR) $(IDL_EXPORT_DIR) diff -r 1746e650715f -r 12afa5ea8d0b dstest_test_client.cc --- a/dstest_test_client.cc Sat Feb 27 23:41:06 2021 +0100 +++ b/dstest_test_client.cc Sun Feb 28 22:14:39 2021 +0100 @@ -53,11 +53,85 @@ +typedef struct +{ + l4_cap_idx_t ref; + char *memory; + offset_t start_pos, end_pos, data_end, size; +} file_t; + + + +static offset_t file_span(file_t *file) +{ + offset_t size = file->end_pos - file->start_pos; + + return (file->data_end < size) ? file->data_end : size; +} + +static void file_init(file_t *file) +{ + file->memory = NULL; + file->ref = L4_INVALID_CAP; +} + +static long file_open(file_t *file, l4_cap_idx_t context_ref) +{ + client_OpenerContext context(context_ref); + file_init(file); + return context.open(L4_FPAGE_RW, &file->size, &file->ref); +} + +static void file_close(file_t *file) +{ + if (l4_is_valid_cap(file->ref)) + ipc_cap_free_um(file->ref); + + if (file->memory != NULL) + ipc_detach_dataspace(file->memory); + + file_init(file); +} + +static long file_mmap(file_t *file, offset_t position, offset_t length) +{ + client_MappedFile mapped_file(file->ref); + long err = mapped_file.mmap(position, length, &file->start_pos, &file->end_pos, &file->data_end); + + if (err) + return err; + + return ipc_attach_dataspace(file->ref, file->end_pos - file->start_pos, (void **) &file->memory); +} + +static long context_open(file_t *file, l4_cap_idx_t server) +{ + client_Opener opener(server); + unsigned long size, flags; + long err; + + file_init(file); + err = opener.context(&file->ref); + + if (err) + return err; + + client_Dataspace context_ds(file->ref); + + err = context_ds.info(&size, &flags); + + if (err) + return err; + + return ipc_attach_dataspace(file->ref, size, (void **) &file->memory); +} + + + /* An activity opening and reading from a file. */ static long activity(l4_cap_idx_t context_ref, unsigned long fileid, unsigned int start_page) { - client_OpenerContext context(context_ref); unsigned long step = page(1); unsigned long sample = page(1); @@ -67,10 +141,9 @@ /* Invoke the open method to receive the file reference. */ - unsigned long size; - l4_cap_idx_t file_ref; + file_t file; - long err = context.open(L4_FPAGE_RW, &size, &file_ref); + long err = file_open(&file, context_ref); if (err) { @@ -78,52 +151,32 @@ return err; } - client_MappedFile file(file_ref); - /* Some memory to be mapped. */ - size_t start_pos, end_pos, data_end; - - err = file.mmap(page(start_page), page(MAP_PAGES), &start_pos, &end_pos, &data_end); + err = file_mmap(&file, page(start_page), page(MAP_PAGES)); if (err) { printf("Could not map file region for %ld @ page %d: %s\n", fileid, start_page, l4sys_errtostr(err)); - ipc_cap_free_um(file_ref); + file_close(&file); return err; } - size = end_pos - start_pos; - - char *memory; - - err = ipc_attach_dataspace(file_ref, size, (void **) &memory); - - if (err) - { - printf("Could not map memory for %ld @ page %d: %s\n", fileid, start_page, l4sys_errtostr(err)); - ipc_cap_free_um(file_ref); - return err; - } - - if (data_end < size) - size = data_end; - /* Read the region a number of times. */ for (unsigned int read_counter = 0; read_counter < REGION_ITERATIONS; read_counter++) { - for (unsigned long offset = 0; offset < size; offset += step) + for (unsigned long offset = 0; offset < file_span(&file); offset += step) { - unsigned long remaining = size - offset; + unsigned long remaining = file_span(&file) - offset; unsigned long sample_remaining = remaining < sample ? remaining : sample; - strncpy(buf, (memory + offset), sample_remaining); + strncpy(buf, (file.memory + offset), sample_remaining); buf[sample_remaining] = '\0'; /* Test the data obtained. */ - unsigned long filepos = start_pos + offset; + unsigned long filepos = file.start_pos + offset; unsigned long _fileid = 0, _filepos = 0; char *sep = strchr(buf, ':'); @@ -138,15 +191,14 @@ } } - ipc_cap_free_um(file_ref); - ipc_detach_dataspace(memory); + file_close(&file); return L4_EOK; } -static long activity_iterate(l4_cap_idx_t context_ref, unsigned long fileid, unsigned int start_page) +static long activity_iterate(file_t *file, unsigned long fileid, unsigned int start_page) { long err; @@ -154,7 +206,7 @@ for (unsigned int iteration = 0; iteration < ACTIVITY_ITERATIONS; iteration++) { - err = activity(context_ref, fileid, start_page); + err = activity(file->ref, fileid, start_page); if (err) break; } @@ -164,47 +216,20 @@ -static long context_for_file(unsigned long fileid, l4_cap_idx_t *context_ref, char **filename) +static long context_for_file(unsigned long fileid, file_t *file, l4_cap_idx_t server) { - /* Obtain access to the filesystem. */ - - l4_cap_idx_t server = l4re_env_get_cap("server"); - client_Opener opener(server); - - long err = opener.context(context_ref); + long err = context_open(file, server); if (err) { printf("Could not obtain context: %s\n", l4sys_errtostr(err)); - return err; - } - - client_Dataspace context_ds(*context_ref); - unsigned long size, flags; - - err = context_ds.info(&size, &flags); - - if (err) - { - printf("Could not obtain context info: %s\n", l4sys_errtostr(err)); - ipc_cap_free_um(*context_ref); - return err; - } - - /* Map context memory to write the filename. */ - - err = ipc_attach_dataspace(*context_ref, size, (void **) filename); - - if (err) - { - printf("Could not map memory: %s\n", l4sys_errtostr(err)); - ipc_cap_free_um(*context_ref); + file_close(file); return err; } /* Write the filename. */ - sprintf(*filename, "%ld", fileid); + sprintf(file->memory, "%ld", fileid); return L4_EOK; } @@ -218,9 +243,14 @@ ipc_cap_alloc_init(); ipc_mem_init(); + /* Retain activity and context details. */ + std::thread *activities[NUMBER_OF_FILES * START_LIMIT]; - l4_cap_idx_t context_refs[NUMBER_OF_FILES]; - char *filenames[NUMBER_OF_FILES]; + file_t contexts[NUMBER_OF_FILES]; + + /* Obtain access to the filesystem. */ + + l4_cap_idx_t server = l4re_env_get_cap("server"); /* Obtain opener contexts for the files. */ @@ -228,7 +258,7 @@ for (fileid = 0; fileid < NUMBER_OF_FILES; fileid++) { - long err = context_for_file(fileid, &context_refs[fileid], &filenames[fileid]); + long err = context_for_file(fileid, &contexts[fileid], server); if (err) { @@ -243,7 +273,7 @@ for (fileid = 0; fileid < NUMBER_OF_FILES; fileid++) for (unsigned int start_page = 0; start_page < START_LIMIT; start_page++) - activities[current++] = new std::thread(activity_iterate, context_refs[fileid], fileid, start_page); + activities[current++] = new std::thread(activity_iterate, &contexts[fileid], fileid, start_page); /* Wait for the threads. */ @@ -257,10 +287,7 @@ /* Discard the contexts. */ for (fileid = 0; fileid < NUMBER_OF_FILES; fileid++) - { - ipc_cap_free_um(context_refs[fileid]); - ipc_detach_dataspace(filenames[fileid]); - } + file_close(&contexts[fileid]); printf("Activities completed.\n"); diff -r 1746e650715f -r 12afa5ea8d0b file_pager.cc --- a/file_pager.cc Sat Feb 27 23:41:06 2021 +0100 +++ b/file_pager.cc Sun Feb 28 22:14:39 2021 +0100 @@ -19,7 +19,7 @@ return (ipc_server_handler_type) handle_MappedFileObject; } -long FilePager::mmap(size_t position, size_t length, size_t *start_pos, size_t *end_pos, size_t *data_end) +long FilePager::mmap(offset_t position, offset_t length, offset_t *start_pos, offset_t *end_pos, offset_t *data_end) { /* Set the limits of the paged region. */ diff -r 1746e650715f -r 12afa5ea8d0b file_pager.h --- a/file_pager.h Sat Feb 27 23:41:06 2021 +0100 +++ b/file_pager.h Sun Feb 28 22:14:39 2021 +0100 @@ -25,7 +25,7 @@ virtual long map(unsigned long offset, l4_addr_t hot_spot, unsigned long flags, l4_snd_fpage_t *region); - virtual long mmap(size_t position, size_t length, size_t *start_pos, size_t *end_pos, size_t *data_end); + virtual long mmap(offset_t position, offset_t length, offset_t *start_pos, offset_t *end_pos, offset_t *data_end); }; // vim: tabstop=4 expandtab shiftwidth=4 diff -r 1746e650715f -r 12afa5ea8d0b memory.h --- a/memory.h Sat Feb 27 23:41:06 2021 +0100 +++ b/memory.h Sun Feb 28 22:14:39 2021 +0100 @@ -1,11 +1,12 @@ #pragma once +#include + #include #include #include "memory_utils.h" #include "region.h" -#include "types.h" diff -r 1746e650715f -r 12afa5ea8d0b memory_utils.h --- a/memory_utils.h Sat Feb 27 23:41:06 2021 +0100 +++ b/memory_utils.h Sun Feb 28 22:14:39 2021 +0100 @@ -1,6 +1,6 @@ #pragma once -#include "types.h" +#include #define PAGE_SIZE 4096 diff -r 1746e650715f -r 12afa5ea8d0b pager.cc --- a/pager.cc Sat Feb 27 23:41:06 2021 +0100 +++ b/pager.cc Sun Feb 28 22:14:39 2021 +0100 @@ -17,7 +17,7 @@ /* Expose a region of the file. */ -long Pager::mmap(size_t position, size_t length, size_t *start_pos, size_t *end_pos, size_t *data_end) +long Pager::mmap(offset_t position, offset_t length, offset_t *start_pos, offset_t *end_pos, offset_t *data_end) { _start = trunc(position, PAGE_SIZE); _size = round(position + length, PAGE_SIZE) - _start; diff -r 1746e650715f -r 12afa5ea8d0b pager.h --- a/pager.h Sat Feb 27 23:41:06 2021 +0100 +++ b/pager.h Sun Feb 28 22:14:39 2021 +0100 @@ -1,5 +1,7 @@ #pragma once +#include + #include "page_mapper.h" #include "resource.h" @@ -28,7 +30,7 @@ /* Mapped file methods. */ - virtual long mmap(size_t position, size_t length, size_t *start_pos, size_t *end_pos, size_t *data_end); + virtual long mmap(offset_t position, offset_t length, offset_t *start_pos, offset_t *end_pos, offset_t *data_end); }; // vim: tabstop=4 expandtab shiftwidth=4 diff -r 1746e650715f -r 12afa5ea8d0b region.h --- a/region.h Sat Feb 27 23:41:06 2021 +0100 +++ b/region.h Sun Feb 28 22:14:39 2021 +0100 @@ -1,5 +1,7 @@ #pragma once +#include + #include "types.h" diff -r 1746e650715f -r 12afa5ea8d0b types.h --- a/types.h Sat Feb 27 23:41:06 2021 +0100 +++ b/types.h Sun Feb 28 22:14:39 2021 +0100 @@ -6,8 +6,4 @@ #define FILEID_INVALID (~0UL) -/* File and memory region offsets. */ - -typedef unsigned long offset_t; - // vim: tabstop=4 expandtab shiftwidth=4