Changes in / [0cc43e1:78a8440]
- Files:
-
- 13 edited
Legend:
- Unmodified
- Added
- Removed
-
benchmark/io/http/filecache.cfa
r0cc43e1 r78a8440 209 209 210 210 [int *, int] filefds(int extra) { 211 if(!options.file_cache.path) { 212 int * data = alloc(extra); 213 return [data, 0]; 214 } 215 211 216 if(!file_cache.entries) { 212 217 abort("File cache not filled!\n"); -
benchmark/io/http/main.cfa
r0cc43e1 r78a8440 80 80 //=================== 81 81 // Parse args 82 const char * path =parse_options(argc, argv);82 parse_options(argc, argv); 83 83 84 84 //=================== 85 85 // Open Files 86 sout | "Filling cache from" | path; 87 fill_cache( path ); 86 if( options.file_cache.path ) { 87 sout | "Filling cache from" | options.file_cache.path; 88 fill_cache( options.file_cache.path ); 89 } 88 90 89 91 //=================== … … 147 149 } 148 150 149 if(options.file_cache. fixed_fds) {151 if(options.file_cache.path && options.file_cache.fixed_fds) { 150 152 register_fixed_files(cl, fds, pipe_off); 151 153 } … … 184 186 } 185 187 186 sout | "Notifying connections ";188 sout | "Notifying connections..." | nonl; flush( sout ); 187 189 for(i; options.clopts.nworkers) { 188 190 workers[i].done = true; 189 191 cancel(workers[i].cancel); 190 192 } 191 192 sout | "Shutting down socket"; 193 sout | "done"; 194 195 sout | "Shutting down socket..." | nonl; flush( sout ); 193 196 int ret = shutdown( server_fd, SHUT_RD ); 194 if( ret < 0 ) { abort( "shutdown error: (%d) %s\n", (int)errno, strerror(errno) ); } 197 if( ret < 0 ) { 198 abort( "shutdown error: (%d) %s\n", (int)errno, strerror(errno) ); 199 } 200 sout | "done"; 195 201 196 202 //=================== 197 203 // Close Socket 198 sout | "Closing Socket ";204 sout | "Closing Socket..." | nonl; flush( sout ); 199 205 ret = close( server_fd ); 200 206 if(ret < 0) { 201 207 abort( "close socket error: (%d) %s\n", (int)errno, strerror(errno) ); 202 208 } 203 sout | "Stopping connection threads..." | nonl; 209 sout | "done"; 210 211 sout | "Stopping connection threads..." | nonl; flush( sout ); 204 212 } 205 213 sout | "done"; 206 214 207 sout | "Stopping protocol threads..." | nonl; 215 sout | "Stopping protocol threads..." | nonl; flush( sout ); 208 216 deinit_protocol(); 209 217 sout | "done"; 210 218 211 sout | "Stopping processors..." | nonl; 219 sout | "Stopping processors..." | nonl; flush( sout ); 212 220 } 213 221 sout | "done"; 214 222 215 sout | "Closing splice fds..." | nonl; 223 sout | "Closing splice fds..." | nonl; flush( sout ); 216 224 for(i; pipe_cnt) { 217 225 ret = close( fds[pipe_off + i] ); … … 223 231 sout | "done"; 224 232 225 sout | "Stopping processors..." | nonl; 233 sout | "Stopping processors..." | nonl; flush( sout ); 226 234 } 227 235 sout | "done"; … … 229 237 //=================== 230 238 // Close Files 231 sout | "Closing open files..." | nonl; 232 close_cache(); 233 sout | "done"; 234 } 239 if( options.file_cache.path ) { 240 sout | "Closing open files..." | nonl; flush( sout ); 241 close_cache(); 242 sout | "done"; 243 } 244 } -
benchmark/io/http/options.cfa
r0cc43e1 r78a8440 9 9 } 10 10 11 #include <fstream.hfa> 11 12 #include <kernel.hfa> 12 13 #include <parseargs.hfa> 13 14 15 #include <stdlib.h> 14 16 #include <string.h> 15 17 … … 18 20 19 21 { // file_cache 22 0, // path 20 23 0, // open_flags; 21 24 42u, // hash_seed; … … 34 37 1, // nprocs; 35 38 1, // nworkers; 36 0, // flags;39 {}, // params; 37 40 false, // procstats 38 41 false, // viewhalts … … 41 44 }; 42 45 43 const char *parse_options( int argc, char * argv[] ) {46 void parse_options( int argc, char * argv[] ) { 44 47 bool subthrd = false; 45 48 bool eagrsub = false; … … 97 100 98 101 if( left[0] != 0p ) { 99 abort("Too many trailing arguments!\n"); 102 serr | "Too many trailing arguments!"; 103 exit(EXIT_FAILURE); 100 104 } 101 105 102 returnpath;106 options.file_cache.path = path; 103 107 } -
benchmark/io/http/options.hfa
r0cc43e1 r78a8440 11 11 12 12 struct { 13 const char * path; 13 14 int open_flags; 14 15 uint32_t hash_seed; … … 36 37 extern Options options; 37 38 38 const char *parse_options( int argc, char * argv[] );39 void parse_options( int argc, char * argv[] ); -
benchmark/io/http/protocol.cfa
r0cc43e1 r78a8440 26 26 "HTTP/1.1 400 Bad Request\nServer: HttoForall\nDate: %s \nContent-Type: text/plain\nContent-Length: 0 \n\n", 27 27 "HTTP/1.1 404 Not Found\nServer: HttoForall\nDate: %s \nContent-Type: text/plain\nContent-Length: 0 \n\n", 28 "HTTP/1.1 405 Method Not Allowed\nServer: HttoForall\nDate: %s \nContent-Type: text/plain\nContent-Length: 0 \n\n", 28 29 "HTTP/1.1 408 Request Timeout\nServer: HttoForall\nDate: %s \nContent-Type: text/plain\nContent-Length: 0 \n\n", 29 30 "HTTP/1.1 413 Payload Too Large\nServer: HttoForall\nDate: %s \nContent-Type: text/plain\nContent-Length: 0 \n\n", … … 37 38 400, 38 39 404, 40 405, 39 41 408, 40 42 413, … … 104 106 if( errno == EAGAIN || errno == EWOULDBLOCK) continue READ; 105 107 if( errno == ECONNRESET ) return [E408, true, 0, 0]; 108 if( errno == EPIPE ) return [E408, true, 0, 0]; 106 109 abort( "read error: (%d) %s\n", (int)errno, strerror(errno) ); 107 110 } -
benchmark/io/http/protocol.hfa
r0cc43e1 r78a8440 7 7 E400, 8 8 E404, 9 E405, 9 10 E408, 10 11 E413, -
benchmark/io/http/worker.cfa
r0cc43e1 r78a8440 97 97 } 98 98 99 if( !options.file_cache.path ) { 100 if( options.log ) { 101 sout | "=== File Not Found (" | nonl; 102 write(sout, file, name_size); 103 sout | ") ==="; 104 } 105 answer_error(fd, E405); 106 continue REQUEST; 107 } 108 99 109 // Get the fd from the file cache 100 110 int ans_fd; … … 104 114 // If we can't find the file, return 404 105 115 if( ans_fd < 0 ) { 106 sout | "=== File Not Found (" | nonl; 107 write(sout, file, name_size); 108 sout | ") ==="; 116 if( options.log ) { 117 sout | "=== File Not Found (" | nonl; 118 write(sout, file, name_size); 119 sout | ") ==="; 120 } 109 121 answer_error(fd, E404); 110 122 continue REQUEST; -
libcfa/src/concurrency/io.cfa
r0cc43e1 r78a8440 318 318 319 319 __cfadbg_print_safe(io_core, "Kernel I/O : Fast poller %d (%p) stopping\n", this.ring->fd, &this); 320 321 __ioctx_unregister( this ); 320 322 } 321 323 -
libcfa/src/concurrency/io/setup.cfa
r0cc43e1 r78a8440 113 113 114 114 static struct { 115 pthread_t thrd; // pthread handle to io poller thread 116 void * stack; // pthread stack for io poller thread 117 int epollfd; // file descriptor to the epoll instance 118 volatile bool run; // Whether or not to continue 115 pthread_t thrd; // pthread handle to io poller thread 116 void * stack; // pthread stack for io poller thread 117 int epollfd; // file descriptor to the epoll instance 118 volatile bool run; // Whether or not to continue 119 volatile size_t epoch; // Epoch used for memory reclamation 119 120 } iopoll; 120 121 … … 131 132 iopoll.run = true; 132 133 iopoll.stack = __create_pthread( &iopoll.thrd, iopoll_loop, 0p ); 134 iopoll.epoch = 0; 133 135 } 134 136 … … 174 176 while( iopoll.run ) { 175 177 __cfadbg_print_safe(io_core, "Kernel I/O - epoll : waiting on io_uring contexts\n"); 178 179 // increment the epoch to notify any deleters we are starting a new cycle 180 __atomic_fetch_add(&iopoll.epoch, 1, __ATOMIC_SEQ_CST); 176 181 177 182 // Wait for events … … 496 501 // I/O Context Sleep 497 502 //============================================================================================= 498 #define IOEVENTS EPOLLIN | EPOLLONESHOT499 500 503 static inline void __ioctx_epoll_ctl($io_ctx_thread & ctx, int op, const char * error) { 501 504 struct epoll_event ev; 502 ev.events = IOEVENTS;505 ev.events = EPOLLIN | EPOLLONESHOT; 503 506 ev.data.u64 = (__u64)&ctx; 504 507 int ret = epoll_ctl(iopoll.epollfd, op, ctx.ring->efd, &ev); … … 517 520 } 518 521 522 void __ioctx_unregister($io_ctx_thread & ctx) { 523 // Read the current epoch so we know when to stop 524 size_t curr = __atomic_load_n(&iopoll.epoch, __ATOMIC_SEQ_CST); 525 526 // Remove the fd from the iopoller 527 __ioctx_epoll_ctl(ctx, EPOLL_CTL_DEL, "REMOVE"); 528 529 // Notify the io poller thread of the shutdown 530 iopoll.run = false; 531 sigval val = { 1 }; 532 pthread_sigqueue( iopoll.thrd, SIGUSR1, val ); 533 534 // Make sure all this is done 535 __atomic_thread_fence(__ATOMIC_SEQ_CST); 536 537 // Wait for the next epoch 538 while(curr == __atomic_load_n(&iopoll.epoch, __ATOMIC_RELAXED)) yield(); 539 } 540 519 541 //============================================================================================= 520 542 // I/O Context Misc Setup -
libcfa/src/concurrency/io/types.hfa
r0cc43e1 r78a8440 133 133 struct $io_ctx_thread; 134 134 void __ioctx_register($io_ctx_thread & ctx); 135 void __ioctx_unregister($io_ctx_thread & ctx); 135 136 void __ioctx_prepare_block($io_ctx_thread & ctx); 136 137 void __sqe_clean( volatile struct io_uring_sqe * sqe ); -
libcfa/src/concurrency/kernel.cfa
r0cc43e1 r78a8440 633 633 // abort cannot be recursively entered by the same or different processors because all signal handlers return when 634 634 // the globalAbort flag is true. 635 bool first = __atomic_test_and_set( &kernel_abort_called, __ATOMIC_SEQ_CST);635 bool first = !__atomic_test_and_set( &kernel_abort_called, __ATOMIC_SEQ_CST); 636 636 637 637 // first task to abort ? -
libcfa/src/concurrency/mutex.hfa
r0cc43e1 r78a8440 42 42 }; 43 43 44 void ?{}(mutex_lock & this) ;45 void ^?{}(mutex_lock & this) ;46 void lock(mutex_lock & this) ;47 bool try_lock(mutex_lock & this) ;48 void unlock(mutex_lock & this) ;44 void ?{}(mutex_lock & this) __attribute__((deprecated("use concurrency/locks.hfa instead"))); 45 void ^?{}(mutex_lock & this) __attribute__((deprecated("use concurrency/locks.hfa instead"))); 46 void lock(mutex_lock & this) __attribute__((deprecated("use concurrency/locks.hfa instead"))); 47 bool try_lock(mutex_lock & this) __attribute__((deprecated("use concurrency/locks.hfa instead"))); 48 void unlock(mutex_lock & this) __attribute__((deprecated("use concurrency/locks.hfa instead"))); 49 49 50 50 // Exclusive lock - recursive … … 64 64 }; 65 65 66 void ?{}(recursive_mutex_lock & this) ;67 void ^?{}(recursive_mutex_lock & this) ;68 void lock(recursive_mutex_lock & this) ;69 bool try_lock(recursive_mutex_lock & this) ;70 void unlock(recursive_mutex_lock & this) ;66 void ?{}(recursive_mutex_lock & this) __attribute__((deprecated("use concurrency/locks.hfa instead"))); 67 void ^?{}(recursive_mutex_lock & this) __attribute__((deprecated("use concurrency/locks.hfa instead"))); 68 void lock(recursive_mutex_lock & this) __attribute__((deprecated("use concurrency/locks.hfa instead"))); 69 bool try_lock(recursive_mutex_lock & this) __attribute__((deprecated("use concurrency/locks.hfa instead"))); 70 void unlock(recursive_mutex_lock & this) __attribute__((deprecated("use concurrency/locks.hfa instead"))); 71 71 72 72 trait is_lock(dtype L | sized(L)) { … … 86 86 }; 87 87 88 void ?{}(condition_variable & this) ;89 void ^?{}(condition_variable & this) ;88 void ?{}(condition_variable & this) __attribute__((deprecated("use concurrency/locks.hfa instead"))); 89 void ^?{}(condition_variable & this) __attribute__((deprecated("use concurrency/locks.hfa instead"))); 90 90 91 void notify_one(condition_variable & this) ;92 void notify_all(condition_variable & this) ;91 void notify_one(condition_variable & this) __attribute__((deprecated("use concurrency/locks.hfa instead"))); 92 void notify_all(condition_variable & this) __attribute__((deprecated("use concurrency/locks.hfa instead"))); 93 93 94 void wait(condition_variable & this) ;94 void wait(condition_variable & this) __attribute__((deprecated("use concurrency/locks.hfa instead"))); 95 95 96 96 forall(dtype L | is_lock(L)) 97 void wait(condition_variable & this, L & l) ;97 void wait(condition_variable & this, L & l) __attribute__((deprecated("use concurrency/locks.hfa instead"))); 98 98 99 99 //----------------------------------------------------------------------------- -
libcfa/src/parseargs.cfa
r0cc43e1 r78a8440 148 148 if(hwidth <= 0) hwidth = max; 149 149 150 fprintf(out, " -%c, --%-*s %.*s\n", sn, width, ln, hwidth, help); 150 char sname[4] = { ' ', ' ', ' ', '\0' }; 151 if(sn != '\0') { 152 sname[0] = '-'; 153 sname[1] = sn; 154 sname[2] = ','; 155 } 156 157 fprintf(out, " %s --%-*s %.*s\n", sname, width, ln, hwidth, help); 151 158 for() { 152 159 help += min(strlen(help), hwidth);
Note: See TracChangeset
for help on using the changeset viewer.