1.1 --- a/dstest_test_client.cc Sat Feb 27 23:41:06 2021 +0100
1.2 +++ b/dstest_test_client.cc Sun Feb 28 22:14:39 2021 +0100
1.3 @@ -53,11 +53,85 @@
1.4
1.5
1.6
1.7 +typedef struct
1.8 +{
1.9 + l4_cap_idx_t ref;
1.10 + char *memory;
1.11 + offset_t start_pos, end_pos, data_end, size;
1.12 +} file_t;
1.13 +
1.14 +
1.15 +
1.16 +static offset_t file_span(file_t *file)
1.17 +{
1.18 + offset_t size = file->end_pos - file->start_pos;
1.19 +
1.20 + return (file->data_end < size) ? file->data_end : size;
1.21 +}
1.22 +
1.23 +static void file_init(file_t *file)
1.24 +{
1.25 + file->memory = NULL;
1.26 + file->ref = L4_INVALID_CAP;
1.27 +}
1.28 +
1.29 +static long file_open(file_t *file, l4_cap_idx_t context_ref)
1.30 +{
1.31 + client_OpenerContext context(context_ref);
1.32 + file_init(file);
1.33 + return context.open(L4_FPAGE_RW, &file->size, &file->ref);
1.34 +}
1.35 +
1.36 +static void file_close(file_t *file)
1.37 +{
1.38 + if (l4_is_valid_cap(file->ref))
1.39 + ipc_cap_free_um(file->ref);
1.40 +
1.41 + if (file->memory != NULL)
1.42 + ipc_detach_dataspace(file->memory);
1.43 +
1.44 + file_init(file);
1.45 +}
1.46 +
1.47 +static long file_mmap(file_t *file, offset_t position, offset_t length)
1.48 +{
1.49 + client_MappedFile mapped_file(file->ref);
1.50 + long err = mapped_file.mmap(position, length, &file->start_pos, &file->end_pos, &file->data_end);
1.51 +
1.52 + if (err)
1.53 + return err;
1.54 +
1.55 + return ipc_attach_dataspace(file->ref, file->end_pos - file->start_pos, (void **) &file->memory);
1.56 +}
1.57 +
1.58 +static long context_open(file_t *file, l4_cap_idx_t server)
1.59 +{
1.60 + client_Opener opener(server);
1.61 + unsigned long size, flags;
1.62 + long err;
1.63 +
1.64 + file_init(file);
1.65 + err = opener.context(&file->ref);
1.66 +
1.67 + if (err)
1.68 + return err;
1.69 +
1.70 + client_Dataspace context_ds(file->ref);
1.71 +
1.72 + err = context_ds.info(&size, &flags);
1.73 +
1.74 + if (err)
1.75 + return err;
1.76 +
1.77 + return ipc_attach_dataspace(file->ref, size, (void **) &file->memory);
1.78 +}
1.79 +
1.80 +
1.81 +
1.82 /* An activity opening and reading from a file. */
1.83
1.84 static long activity(l4_cap_idx_t context_ref, unsigned long fileid, unsigned int start_page)
1.85 {
1.86 - client_OpenerContext context(context_ref);
1.87 unsigned long step = page(1);
1.88 unsigned long sample = page(1);
1.89
1.90 @@ -67,10 +141,9 @@
1.91
1.92 /* Invoke the open method to receive the file reference. */
1.93
1.94 - unsigned long size;
1.95 - l4_cap_idx_t file_ref;
1.96 + file_t file;
1.97
1.98 - long err = context.open(L4_FPAGE_RW, &size, &file_ref);
1.99 + long err = file_open(&file, context_ref);
1.100
1.101 if (err)
1.102 {
1.103 @@ -78,52 +151,32 @@
1.104 return err;
1.105 }
1.106
1.107 - client_MappedFile file(file_ref);
1.108 -
1.109 /* Some memory to be mapped. */
1.110
1.111 - size_t start_pos, end_pos, data_end;
1.112 -
1.113 - err = file.mmap(page(start_page), page(MAP_PAGES), &start_pos, &end_pos, &data_end);
1.114 + err = file_mmap(&file, page(start_page), page(MAP_PAGES));
1.115
1.116 if (err)
1.117 {
1.118 printf("Could not map file region for %ld @ page %d: %s\n", fileid, start_page, l4sys_errtostr(err));
1.119 - ipc_cap_free_um(file_ref);
1.120 + file_close(&file);
1.121 return err;
1.122 }
1.123
1.124 - size = end_pos - start_pos;
1.125 -
1.126 - char *memory;
1.127 -
1.128 - err = ipc_attach_dataspace(file_ref, size, (void **) &memory);
1.129 -
1.130 - if (err)
1.131 - {
1.132 - printf("Could not map memory for %ld @ page %d: %s\n", fileid, start_page, l4sys_errtostr(err));
1.133 - ipc_cap_free_um(file_ref);
1.134 - return err;
1.135 - }
1.136 -
1.137 - if (data_end < size)
1.138 - size = data_end;
1.139 -
1.140 /* Read the region a number of times. */
1.141
1.142 for (unsigned int read_counter = 0; read_counter < REGION_ITERATIONS; read_counter++)
1.143 {
1.144 - for (unsigned long offset = 0; offset < size; offset += step)
1.145 + for (unsigned long offset = 0; offset < file_span(&file); offset += step)
1.146 {
1.147 - unsigned long remaining = size - offset;
1.148 + unsigned long remaining = file_span(&file) - offset;
1.149 unsigned long sample_remaining = remaining < sample ? remaining : sample;
1.150
1.151 - strncpy(buf, (memory + offset), sample_remaining);
1.152 + strncpy(buf, (file.memory + offset), sample_remaining);
1.153 buf[sample_remaining] = '\0';
1.154
1.155 /* Test the data obtained. */
1.156
1.157 - unsigned long filepos = start_pos + offset;
1.158 + unsigned long filepos = file.start_pos + offset;
1.159 unsigned long _fileid = 0, _filepos = 0;
1.160 char *sep = strchr(buf, ':');
1.161
1.162 @@ -138,15 +191,14 @@
1.163 }
1.164 }
1.165
1.166 - ipc_cap_free_um(file_ref);
1.167 - ipc_detach_dataspace(memory);
1.168 + file_close(&file);
1.169
1.170 return L4_EOK;
1.171 }
1.172
1.173
1.174
1.175 -static long activity_iterate(l4_cap_idx_t context_ref, unsigned long fileid, unsigned int start_page)
1.176 +static long activity_iterate(file_t *file, unsigned long fileid, unsigned int start_page)
1.177 {
1.178 long err;
1.179
1.180 @@ -154,7 +206,7 @@
1.181
1.182 for (unsigned int iteration = 0; iteration < ACTIVITY_ITERATIONS; iteration++)
1.183 {
1.184 - err = activity(context_ref, fileid, start_page);
1.185 + err = activity(file->ref, fileid, start_page);
1.186 if (err)
1.187 break;
1.188 }
1.189 @@ -164,47 +216,20 @@
1.190
1.191
1.192
1.193 -static long context_for_file(unsigned long fileid, l4_cap_idx_t *context_ref, char **filename)
1.194 +static long context_for_file(unsigned long fileid, file_t *file, l4_cap_idx_t server)
1.195 {
1.196 - /* Obtain access to the filesystem. */
1.197 -
1.198 - l4_cap_idx_t server = l4re_env_get_cap("server");
1.199 - client_Opener opener(server);
1.200 -
1.201 - long err = opener.context(context_ref);
1.202 + long err = context_open(file, server);
1.203
1.204 if (err)
1.205 {
1.206 printf("Could not obtain context: %s\n", l4sys_errtostr(err));
1.207 - return err;
1.208 - }
1.209 -
1.210 - client_Dataspace context_ds(*context_ref);
1.211 - unsigned long size, flags;
1.212 -
1.213 - err = context_ds.info(&size, &flags);
1.214 -
1.215 - if (err)
1.216 - {
1.217 - printf("Could not obtain context info: %s\n", l4sys_errtostr(err));
1.218 - ipc_cap_free_um(*context_ref);
1.219 - return err;
1.220 - }
1.221 -
1.222 - /* Map context memory to write the filename. */
1.223 -
1.224 - err = ipc_attach_dataspace(*context_ref, size, (void **) filename);
1.225 -
1.226 - if (err)
1.227 - {
1.228 - printf("Could not map memory: %s\n", l4sys_errtostr(err));
1.229 - ipc_cap_free_um(*context_ref);
1.230 + file_close(file);
1.231 return err;
1.232 }
1.233
1.234 /* Write the filename. */
1.235
1.236 - sprintf(*filename, "%ld", fileid);
1.237 + sprintf(file->memory, "%ld", fileid);
1.238
1.239 return L4_EOK;
1.240 }
1.241 @@ -218,9 +243,14 @@
1.242 ipc_cap_alloc_init();
1.243 ipc_mem_init();
1.244
1.245 + /* Retain activity and context details. */
1.246 +
1.247 std::thread *activities[NUMBER_OF_FILES * START_LIMIT];
1.248 - l4_cap_idx_t context_refs[NUMBER_OF_FILES];
1.249 - char *filenames[NUMBER_OF_FILES];
1.250 + file_t contexts[NUMBER_OF_FILES];
1.251 +
1.252 + /* Obtain access to the filesystem. */
1.253 +
1.254 + l4_cap_idx_t server = l4re_env_get_cap("server");
1.255
1.256 /* Obtain opener contexts for the files. */
1.257
1.258 @@ -228,7 +258,7 @@
1.259
1.260 for (fileid = 0; fileid < NUMBER_OF_FILES; fileid++)
1.261 {
1.262 - long err = context_for_file(fileid, &context_refs[fileid], &filenames[fileid]);
1.263 + long err = context_for_file(fileid, &contexts[fileid], server);
1.264
1.265 if (err)
1.266 {
1.267 @@ -243,7 +273,7 @@
1.268
1.269 for (fileid = 0; fileid < NUMBER_OF_FILES; fileid++)
1.270 for (unsigned int start_page = 0; start_page < START_LIMIT; start_page++)
1.271 - activities[current++] = new std::thread(activity_iterate, context_refs[fileid], fileid, start_page);
1.272 + activities[current++] = new std::thread(activity_iterate, &contexts[fileid], fileid, start_page);
1.273
1.274 /* Wait for the threads. */
1.275
1.276 @@ -257,10 +287,7 @@
1.277 /* Discard the contexts. */
1.278
1.279 for (fileid = 0; fileid < NUMBER_OF_FILES; fileid++)
1.280 - {
1.281 - ipc_cap_free_um(context_refs[fileid]);
1.282 - ipc_detach_dataspace(filenames[fileid]);
1.283 - }
1.284 + file_close(&contexts[fileid]);
1.285
1.286 printf("Activities completed.\n");
1.287