2.1 --- a/dstest_test_client.cc Sat Feb 27 23:41:06 2021 +0100
2.2 +++ b/dstest_test_client.cc Sun Feb 28 22:14:39 2021 +0100
2.3 @@ -53,11 +53,85 @@
2.4
2.5
2.6
2.7 +typedef struct
2.8 +{
2.9 + l4_cap_idx_t ref;
2.10 + char *memory;
2.11 + offset_t start_pos, end_pos, data_end, size;
2.12 +} file_t;
2.13 +
2.14 +
2.15 +
2.16 +static offset_t file_span(file_t *file)
2.17 +{
2.18 + offset_t size = file->end_pos - file->start_pos;
2.19 +
2.20 + return (file->data_end < size) ? file->data_end : size;
2.21 +}
2.22 +
2.23 +static void file_init(file_t *file)
2.24 +{
2.25 + file->memory = NULL;
2.26 + file->ref = L4_INVALID_CAP;
2.27 +}
2.28 +
2.29 +static long file_open(file_t *file, l4_cap_idx_t context_ref)
2.30 +{
2.31 + client_OpenerContext context(context_ref);
2.32 + file_init(file);
2.33 + return context.open(L4_FPAGE_RW, &file->size, &file->ref);
2.34 +}
2.35 +
2.36 +static void file_close(file_t *file)
2.37 +{
2.38 + if (l4_is_valid_cap(file->ref))
2.39 + ipc_cap_free_um(file->ref);
2.40 +
2.41 + if (file->memory != NULL)
2.42 + ipc_detach_dataspace(file->memory);
2.43 +
2.44 + file_init(file);
2.45 +}
2.46 +
2.47 +static long file_mmap(file_t *file, offset_t position, offset_t length)
2.48 +{
2.49 + client_MappedFile mapped_file(file->ref);
2.50 + long err = mapped_file.mmap(position, length, &file->start_pos, &file->end_pos, &file->data_end);
2.51 +
2.52 + if (err)
2.53 + return err;
2.54 +
2.55 + return ipc_attach_dataspace(file->ref, file->end_pos - file->start_pos, (void **) &file->memory);
2.56 +}
2.57 +
2.58 +static long context_open(file_t *file, l4_cap_idx_t server)
2.59 +{
2.60 + client_Opener opener(server);
2.61 + unsigned long size, flags;
2.62 + long err;
2.63 +
2.64 + file_init(file);
2.65 + err = opener.context(&file->ref);
2.66 +
2.67 + if (err)
2.68 + return err;
2.69 +
2.70 + client_Dataspace context_ds(file->ref);
2.71 +
2.72 + err = context_ds.info(&size, &flags);
2.73 +
2.74 + if (err)
2.75 + return err;
2.76 +
2.77 + return ipc_attach_dataspace(file->ref, size, (void **) &file->memory);
2.78 +}
2.79 +
2.80 +
2.81 +
2.82 /* An activity opening and reading from a file. */
2.83
2.84 static long activity(l4_cap_idx_t context_ref, unsigned long fileid, unsigned int start_page)
2.85 {
2.86 - client_OpenerContext context(context_ref);
2.87 unsigned long step = page(1);
2.88 unsigned long sample = page(1);
2.89
2.90 @@ -67,10 +141,9 @@
2.91
2.92 /* Invoke the open method to receive the file reference. */
2.93
2.94 - unsigned long size;
2.95 - l4_cap_idx_t file_ref;
2.96 + file_t file;
2.97
2.98 - long err = context.open(L4_FPAGE_RW, &size, &file_ref);
2.99 + long err = file_open(&file, context_ref);
2.100
2.101 if (err)
2.102 {
2.103 @@ -78,52 +151,32 @@
2.104 return err;
2.105 }
2.106
2.107 - client_MappedFile file(file_ref);
2.108 -
2.109 /* Some memory to be mapped. */
2.110
2.111 - size_t start_pos, end_pos, data_end;
2.112 -
2.113 - err = file.mmap(page(start_page), page(MAP_PAGES), &start_pos, &end_pos, &data_end);
2.114 + err = file_mmap(&file, page(start_page), page(MAP_PAGES));
2.115
2.116 if (err)
2.117 {
2.118 printf("Could not map file region for %ld @ page %d: %s\n", fileid, start_page, l4sys_errtostr(err));
2.119 - ipc_cap_free_um(file_ref);
2.120 + file_close(&file);
2.121 return err;
2.122 }
2.123
2.124 - size = end_pos - start_pos;
2.125 -
2.126 - char *memory;
2.127 -
2.128 - err = ipc_attach_dataspace(file_ref, size, (void **) &memory);
2.129 -
2.130 - if (err)
2.131 - {
2.132 - printf("Could not map memory for %ld @ page %d: %s\n", fileid, start_page, l4sys_errtostr(err));
2.133 - ipc_cap_free_um(file_ref);
2.134 - return err;
2.135 - }
2.136 -
2.137 - if (data_end < size)
2.138 - size = data_end;
2.139 -
2.140 /* Read the region a number of times. */
2.141
2.142 for (unsigned int read_counter = 0; read_counter < REGION_ITERATIONS; read_counter++)
2.143 {
2.144 - for (unsigned long offset = 0; offset < size; offset += step)
2.145 + for (unsigned long offset = 0; offset < file_span(&file); offset += step)
2.146 {
2.147 - unsigned long remaining = size - offset;
2.148 + unsigned long remaining = file_span(&file) - offset;
2.149 unsigned long sample_remaining = remaining < sample ? remaining : sample;
2.150
2.151 - strncpy(buf, (memory + offset), sample_remaining);
2.152 + strncpy(buf, (file.memory + offset), sample_remaining);
2.153 buf[sample_remaining] = '\0';
2.154
2.155 /* Test the data obtained. */
2.156
2.157 - unsigned long filepos = start_pos + offset;
2.158 + unsigned long filepos = file.start_pos + offset;
2.159 unsigned long _fileid = 0, _filepos = 0;
2.160 char *sep = strchr(buf, ':');
2.161
2.162 @@ -138,15 +191,14 @@
2.163 }
2.164 }
2.165
2.166 - ipc_cap_free_um(file_ref);
2.167 - ipc_detach_dataspace(memory);
2.168 + file_close(&file);
2.169
2.170 return L4_EOK;
2.171 }
2.172
2.173
2.174
2.175 -static long activity_iterate(l4_cap_idx_t context_ref, unsigned long fileid, unsigned int start_page)
2.176 +static long activity_iterate(file_t *file, unsigned long fileid, unsigned int start_page)
2.177 {
2.178 long err;
2.179
2.180 @@ -154,7 +206,7 @@
2.181
2.182 for (unsigned int iteration = 0; iteration < ACTIVITY_ITERATIONS; iteration++)
2.183 {
2.184 - err = activity(context_ref, fileid, start_page);
2.185 + err = activity(file->ref, fileid, start_page);
2.186 if (err)
2.187 break;
2.188 }
2.189 @@ -164,47 +216,20 @@
2.190
2.191
2.192
2.193 -static long context_for_file(unsigned long fileid, l4_cap_idx_t *context_ref, char **filename)
2.194 +static long context_for_file(unsigned long fileid, file_t *file, l4_cap_idx_t server)
2.195 {
2.196 - /* Obtain access to the filesystem. */
2.197 -
2.198 - l4_cap_idx_t server = l4re_env_get_cap("server");
2.199 - client_Opener opener(server);
2.200 -
2.201 - long err = opener.context(context_ref);
2.202 + long err = context_open(file, server);
2.203
2.204 if (err)
2.205 {
2.206 printf("Could not obtain context: %s\n", l4sys_errtostr(err));
2.207 - return err;
2.208 - }
2.209 -
2.210 - client_Dataspace context_ds(*context_ref);
2.211 - unsigned long size, flags;
2.212 -
2.213 - err = context_ds.info(&size, &flags);
2.214 -
2.215 - if (err)
2.216 - {
2.217 - printf("Could not obtain context info: %s\n", l4sys_errtostr(err));
2.218 - ipc_cap_free_um(*context_ref);
2.219 - return err;
2.220 - }
2.221 -
2.222 - /* Map context memory to write the filename. */
2.223 -
2.224 - err = ipc_attach_dataspace(*context_ref, size, (void **) filename);
2.225 -
2.226 - if (err)
2.227 - {
2.228 - printf("Could not map memory: %s\n", l4sys_errtostr(err));
2.229 - ipc_cap_free_um(*context_ref);
2.230 + file_close(file);
2.231 return err;
2.232 }
2.233
2.234 /* Write the filename. */
2.235
2.236 - sprintf(*filename, "%ld", fileid);
2.237 + sprintf(file->memory, "%ld", fileid);
2.238
2.239 return L4_EOK;
2.240 }
2.241 @@ -218,9 +243,14 @@
2.242 ipc_cap_alloc_init();
2.243 ipc_mem_init();
2.244
2.245 + /* Retain activity and context details. */
2.246 +
2.247 std::thread *activities[NUMBER_OF_FILES * START_LIMIT];
2.248 - l4_cap_idx_t context_refs[NUMBER_OF_FILES];
2.249 - char *filenames[NUMBER_OF_FILES];
2.250 + file_t contexts[NUMBER_OF_FILES];
2.251 +
2.252 + /* Obtain access to the filesystem. */
2.253 +
2.254 + l4_cap_idx_t server = l4re_env_get_cap("server");
2.255
2.256 /* Obtain opener contexts for the files. */
2.257
2.258 @@ -228,7 +258,7 @@
2.259
2.260 for (fileid = 0; fileid < NUMBER_OF_FILES; fileid++)
2.261 {
2.262 - long err = context_for_file(fileid, &context_refs[fileid], &filenames[fileid]);
2.263 + long err = context_for_file(fileid, &contexts[fileid], server);
2.264
2.265 if (err)
2.266 {
2.267 @@ -243,7 +273,7 @@
2.268
2.269 for (fileid = 0; fileid < NUMBER_OF_FILES; fileid++)
2.270 for (unsigned int start_page = 0; start_page < START_LIMIT; start_page++)
2.271 - activities[current++] = new std::thread(activity_iterate, context_refs[fileid], fileid, start_page);
2.272 + activities[current++] = new std::thread(activity_iterate, &contexts[fileid], fileid, start_page);
2.273
2.274 /* Wait for the threads. */
2.275
2.276 @@ -257,10 +287,7 @@
2.277 /* Discard the contexts. */
2.278
2.279 for (fileid = 0; fileid < NUMBER_OF_FILES; fileid++)
2.280 - {
2.281 - ipc_cap_free_um(context_refs[fileid]);
2.282 - ipc_detach_dataspace(filenames[fileid]);
2.283 - }
2.284 + file_close(&contexts[fileid]);
2.285
2.286 printf("Activities completed.\n");
2.287
3.1 --- a/file_pager.cc Sat Feb 27 23:41:06 2021 +0100
3.2 +++ b/file_pager.cc Sun Feb 28 22:14:39 2021 +0100
3.3 @@ -19,7 +19,7 @@
3.4 return (ipc_server_handler_type) handle_MappedFileObject;
3.5 }
3.6
3.7 -long FilePager::mmap(size_t position, size_t length, size_t *start_pos, size_t *end_pos, size_t *data_end)
3.8 +long FilePager::mmap(offset_t position, offset_t length, offset_t *start_pos, offset_t *end_pos, offset_t *data_end)
3.9 {
3.10 /* Set the limits of the paged region. */
3.11
4.1 --- a/file_pager.h Sat Feb 27 23:41:06 2021 +0100
4.2 +++ b/file_pager.h Sun Feb 28 22:14:39 2021 +0100
4.3 @@ -25,7 +25,7 @@
4.4
4.5 virtual long map(unsigned long offset, l4_addr_t hot_spot, unsigned long flags, l4_snd_fpage_t *region);
4.6
4.7 - virtual long mmap(size_t position, size_t length, size_t *start_pos, size_t *end_pos, size_t *data_end);
4.8 + virtual long mmap(offset_t position, offset_t length, offset_t *start_pos, offset_t *end_pos, offset_t *data_end);
4.9 };
4.10
4.11 // vim: tabstop=4 expandtab shiftwidth=4
7.1 --- a/pager.cc Sat Feb 27 23:41:06 2021 +0100
7.2 +++ b/pager.cc Sun Feb 28 22:14:39 2021 +0100
7.3 @@ -17,7 +17,7 @@
7.4
7.5 /* Expose a region of the file. */
7.6
7.7 -long Pager::mmap(size_t position, size_t length, size_t *start_pos, size_t *end_pos, size_t *data_end)
7.8 +long Pager::mmap(offset_t position, offset_t length, offset_t *start_pos, offset_t *end_pos, offset_t *data_end)
7.9 {
7.10 _start = trunc(position, PAGE_SIZE);
7.11 _size = round(position + length, PAGE_SIZE) - _start;
8.1 --- a/pager.h Sat Feb 27 23:41:06 2021 +0100
8.2 +++ b/pager.h Sun Feb 28 22:14:39 2021 +0100
8.3 @@ -1,5 +1,7 @@
8.4 #pragma once
8.5
8.6 +#include <systypes/base.h>
8.7 +
8.8 #include "page_mapper.h"
8.9 #include "resource.h"
8.10
8.11 @@ -28,7 +30,7 @@
8.12
8.13 /* Mapped file methods. */
8.14
8.15 - virtual long mmap(size_t position, size_t length, size_t *start_pos, size_t *end_pos, size_t *data_end);
8.16 + virtual long mmap(offset_t position, offset_t length, offset_t *start_pos, offset_t *end_pos, offset_t *data_end);
8.17 };
8.18
8.19 // vim: tabstop=4 expandtab shiftwidth=4