Changes in / [04b73b6:f0c3120]
- Files:
-
- 1 added
- 5 deleted
- 27 edited
-
benchmark/io/http/filecache.cfa (modified) (7 diffs)
-
benchmark/io/http/filecache.hfa (modified) (1 diff)
-
benchmark/io/http/main.cfa (modified) (8 diffs)
-
benchmark/io/http/options.cfa (deleted)
-
benchmark/io/http/options.hfa (modified) (1 diff)
-
benchmark/io/http/parseargs.cfa (modified) (5 diffs)
-
benchmark/io/http/parseargs.hfa (modified) (1 diff)
-
benchmark/io/http/protocol.cfa (modified) (2 diffs)
-
benchmark/io/http/protocol.hfa (modified) (1 diff)
-
benchmark/io/http/worker.cfa (modified) (5 diffs)
-
libcfa/configure (modified) (3 diffs)
-
libcfa/configure.ac (modified) (1 diff)
-
libcfa/prelude/defines.hfa.in (modified) (1 diff)
-
libcfa/src/concurrency/io.cfa (modified) (4 diffs)
-
libcfa/src/concurrency/iocall.cfa (modified) (24 diffs)
-
libcfa/src/concurrency/kernel.cfa (modified) (8 diffs)
-
libcfa/src/concurrency/ready_queue.cfa (modified) (5 diffs)
-
libcfa/src/concurrency/snzi.hfa (modified) (1 diff)
-
libcfa/src/concurrency/stats.cfa (modified) (3 diffs)
-
libcfa/src/concurrency/stats.hfa (modified) (3 diffs)
-
libcfa/src/heap.cfa (modified) (6 diffs)
-
libcfa/src/heap.hfa (modified) (2 diffs)
-
libcfa/src/iostream.cfa (modified) (3 diffs)
-
libcfa/src/stdlib.cfa (modified) (2 diffs)
-
libcfa/src/stdlib.hfa (modified) (5 diffs)
-
src/Common/PassVisitor.proto.h (modified) (1 diff)
-
src/Virtual/ExpandCasts.cc (modified) (9 diffs)
-
tests/.expect/alloc.txt (modified) (1 diff)
-
tests/exceptions/.expect/virtual-cast.txt (deleted)
-
tests/exceptions/.expect/virtual-poly.txt (deleted)
-
tests/exceptions/virtual-cast.cfa (deleted)
-
tests/exceptions/virtual-poly.cfa (deleted)
-
tests/zombies/virtualCast.cfa (added)
Legend:
- Unmodified
- Added
- Removed
-
benchmark/io/http/filecache.cfa
r04b73b6 rf0c3120 56 56 } 57 57 58 static inline [unsigned size, char unit] human_size( size_t size ) {59 int idx = 0;60 static char units [] = { ' ', 'K', 'M', 'G', 'T' };61 while( size >= 1024 ) {62 idx++;63 size /= 1024;64 if(idx >= 5) {65 abort("File too large to print\n");66 }67 }68 69 return [size, units[idx]];70 }71 58 72 59 struct { … … 82 69 83 70 [int fd, size_t size] get_file( * const char file, size_t len ) { 84 uint32_t idx = murmur3_32( (const uint8_t *)file, len, options. file_cache.hash_seed ) % file_cache.size;71 uint32_t idx = murmur3_32( (const uint8_t *)file, len, options.hash_seed ) % file_cache.size; 85 72 86 73 for(int i = 0;; i++) { … … 99 86 100 87 int put_file( cache_line & entry ) { 101 uint32_t idx = murmur3_32( (const uint8_t *)entry.file, strlen(entry.file), options. file_cache.hash_seed ) % file_cache.size;88 uint32_t idx = murmur3_32( (const uint8_t *)entry.file, strlen(entry.file), options.hash_seed ) % file_cache.size; 102 89 103 90 int i = 0; … … 114 101 void fill_cache( const char * path ) { 115 102 int ret; 116 ret = chdir(path);117 if(ret < 0) {118 abort( "chdir error: (%d) %s\n", (int)errno, strerror(errno) );119 }120 121 103 size_t fcount = 0; 122 104 size_t fsize = 16; … … 136 118 raw[idx].file = strdup(fpath+2); 137 119 raw[idx].size = sb->st_size; 138 if( !options.file_cache.list ) { 139 raw[idx].fd = open( fpath, options.file_cache.open_flags ); 140 if(raw[idx].fd < 0) { 141 abort( "open file error: (%d) %s\n", (int)errno, strerror(errno) ); 142 } 120 raw[idx].fd = open( fpath, options.open_flags ); 121 if(raw[idx].fd < 0) { 122 abort( "open file error: (%d) %s\n", (int)errno, strerror(errno) ); 143 123 } 144 124 return 0; 145 125 } 146 126 147 ret = ftw( ".", walk, 10);127 ret = ftw(path, walk, 10); 148 128 if(ret < 0) { 149 129 abort( "ftw error: (%d) %s\n", (int)errno, strerror(errno) ); … … 155 135 156 136 // Step 2 create the cache 157 file_cache.size = options.file_cache .size > 0 ? options.file_cache.size : fsize;137 file_cache.size = options.file_cache_size > 0 ? options.file_cache_size : fsize; 158 138 if( file_cache.size < fcount ) { 159 139 abort("File Cache too small\n"); 160 140 } 161 141 162 file_cache.entries = anew(f ile_cache.size);142 file_cache.entries = anew(fsize); 163 143 164 144 // Step 3 fill the cache 165 145 int conflicts = 0; 166 146 for(i; fcount) { 147 printf("Added file %s\n", raw[i].file); 167 148 conflicts += put_file( raw[i] ); 168 149 } 169 150 printf("Filled cache from path \"%s\" with %zu files\n", path, fcount); 170 151 if( conflicts > 0 ) { 171 printf("Found %d conflicts (seed: %u)\n", conflicts, options. file_cache.hash_seed);152 printf("Found %d conflicts (seed: %u)\n", conflicts, options.hash_seed); 172 153 #if defined(REJECT_CONFLICTS) 173 154 abort("Conflicts found in the cache"); … … 175 156 } 176 157 177 if(options.file_cache.list) {178 printf("Listing files and exiting\n");179 for(i; fcount) {180 int s; char u;181 [s, u] = human_size(raw[i].size);182 printf("%4d%c - %s\n", s, u, raw[i].file);183 free(raw[i].file);184 }185 free(raw);186 adelete(file_cache.size, file_cache.entries);187 exit(0);188 }189 190 158 // Step 4 clean up 191 159 free( raw ); 192 160 } 193 194 [int *, int] filefds(int extra) {195 if(!file_cache.entries) {196 abort("File cache not filled!\n");197 }198 199 return [aalloc(extra), 0];200 }201 202 161 203 162 void close_cache() { -
benchmark/io/http/filecache.hfa
r04b73b6 rf0c3120 11 11 [int fd, size_t size] get_file( * const char file, size_t len ); 12 12 void fill_cache( const char * path ); 13 [int *, int] filefds( int extra );14 13 void close_cache(); -
benchmark/io/http/main.cfa
r04b73b6 rf0c3120 17 17 #include "filecache.hfa" 18 18 #include "options.hfa" 19 #include "parseargs.hfa" 19 20 #include "worker.hfa" 20 21 … … 22 23 // Globals 23 24 //============================================================================================= 25 Options options @= { 26 0, 27 42u, 28 0, 29 false, 30 false, 31 0 32 }; 33 24 34 channel & wait_connect; 25 35 … … 29 39 30 40 void ?{}( ServerProc & this ) { 31 /* paranoid */ assert( options. clopts.instance!= 0p );32 (this.self){ "Benchmark Processor", *options. clopts.instance};41 /* paranoid */ assert( options.the_cluster != 0p ); 42 (this.self){ "Benchmark Processor", *options.the_cluster }; 33 43 34 44 #if !defined(__CFA_NO_STATISTICS__) 35 if( options. clopts.procstats ) {36 print_stats_at_exit( this.self, options. clopts.instance->print_stats );45 if( options.procstats ) { 46 print_stats_at_exit( this.self, options.the_cluster->print_stats ); 37 47 } 38 if( options. clopts.viewhalts ) {48 if( options.viewhalts ) { 39 49 print_halts( this.self ); 40 50 } … … 46 56 //=============================================================================================' 47 57 int main( int argc, char * argv[] ) { 58 int port = 8080; 59 int backlog = 10; 60 int nprocs = 1; 61 int nworkers = 1; 62 int cl_flags = 0; 63 int chan_size = 10; 64 const char * path = "."; 48 65 //=================== 49 66 // Parse args 50 const char * path = parse_options(argc, argv); 67 static cfa_option opt[] = { 68 {'p', "port", "Port the server will listen on", port}, 69 {'c', "cpus", "Number of processors to use", nprocs}, 70 {'t', "threads", "Number of worker threads to use", nworkers}, 71 {'b', "accept-backlog", "Maximum number of pending accepts", backlog}, 72 {'B', "channel-size", "Maximum number of accepted connection pending", chan_size} 73 }; 74 int opt_cnt = sizeof(opt) / sizeof(cfa_option); 75 76 char **left; 77 parse_args( argc, argv, opt, opt_cnt, "[OPTIONS] [PATH] -- cforall http server", left ); 78 51 79 52 80 //=================== … … 57 85 //=================== 58 86 // Open Socket 59 printf("Listening on port %d\n", options.socket.port);87 printf("Listening on port %d\n", port); 60 88 int server_fd = socket(AF_INET, SOCK_STREAM, 0); 61 89 if(server_fd < 0) { … … 69 97 address.sin_family = AF_INET; 70 98 address.sin_addr.s_addr = htonl(INADDR_ANY); 71 address.sin_port = htons( options.socket.port );99 address.sin_port = htons( port ); 72 100 73 101 ret = bind( server_fd, (struct sockaddr *)&address, sizeof(address) ); … … 76 104 } 77 105 78 ret = listen( server_fd, options.socket.backlog );106 ret = listen( server_fd, backlog ); 79 107 if(ret < 0) { 80 108 abort( "listen error: (%d) %s\n", (int)errno, strerror(errno) ); … … 84 112 // Run Server Cluster 85 113 { 86 cluster cl = { "Server Cluster", options.clopts.flags };114 cluster cl = { "Server Cluster", cl_flags }; 87 115 #if !defined(__CFA_NO_STATISTICS__) 88 116 print_stats_at_exit( cl, CFA_STATS_READY_Q | CFA_STATS_IO ); 89 117 #endif 90 options. clopts.instance= &cl;118 options.the_cluster = &cl; 91 119 92 channel chan = { options.clopts.chan_size };120 channel chan = { chan_size }; 93 121 &wait_connect = &chan; 94 122 95 int pipe_cnt = options.clopts.nworkers * 2;96 int pipe_off;97 int * fds;98 [fds, pipe_off] = filefds( pipe_cnt );99 for(i; 0 ~ pipe_cnt ~ 2) {100 int ret = pipe(&fds[pipe_off + i]);101 if( ret < 0 ) { abort( "pipe error: (%d) %s\n", (int)errno, strerror(errno) ); }102 }103 104 123 { 105 ServerProc procs[ options.clopts.nprocs];124 ServerProc procs[nprocs]; 106 125 { 107 Worker workers[options.clopts.nworkers]; 108 for(i; options.clopts.nworkers) { 109 if( options.file_cache.fixed_fds ) { 110 workers[i].pipe[0] = pipe_off + (i * 2) + 0; 111 workers[i].pipe[1] = pipe_off + (i * 2) + 1; 112 } 113 else { 114 workers[i].pipe[0] = fds[pipe_off + (i * 2) + 0]; 115 workers[i].pipe[1] = fds[pipe_off + (i * 2) + 1]; 116 } 117 unpark( workers[i] __cfaabi_dbg_ctx2 ); 118 } 119 printf("%d workers started on %d processors\n", options.clopts.nworkers, options.clopts.nprocs); 126 Worker workers[nworkers]; 127 printf("%d workers started on %d processors\n", nworkers, nprocs); 120 128 { 121 129 Acceptor acceptor = { server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen, 0 }; 122 123 char buffer[128];124 while(!feof(stdin)) {125 fgets(buffer, 128, stdin);126 }127 128 printf("Shutting Down\n");129 130 } 130 printf(" Acceptor Closed\n");131 printf("Shutting Down\n"); 131 132 132 133 // Clean-up the workers 133 for( options.clopts.nworkers) {134 for(nworkers) { 134 135 put( wait_connect, -1 ); 135 136 } 136 137 } 137 printf("Workers Closed\n");138 138 } 139 140 for(i; pipe_cnt) {141 ret = close( fds[pipe_off + i] );142 if(ret < 0) {143 abort( "close pipe error: (%d) %s\n", (int)errno, strerror(errno) );144 }145 }146 free(fds);147 139 } 148 140 -
benchmark/io/http/options.hfa
r04b73b6 rf0c3120 6 6 7 7 struct Options { 8 struct { 9 int open_flags; 10 uint32_t hash_seed; 11 size_t size; 12 bool list; 13 bool fixed_fds; 14 } file_cache; 15 16 struct { 17 int port; 18 int backlog; 19 int buflen; 20 } socket; 21 22 struct { 23 int nprocs; 24 int nworkers; 25 int flags; 26 int chan_size; 27 bool procstats; 28 bool viewhalts; 29 cluster * instance; 30 } clopts; 8 int open_flags; 9 uint32_t hash_seed; 10 size_t file_cache_size; 11 bool procstats; 12 bool viewhalts; 13 cluster * the_cluster; 31 14 }; 32 15 33 16 extern Options options; 34 35 const char * parse_options( int argc, char * argv[] ); -
benchmark/io/http/parseargs.cfa
r04b73b6 rf0c3120 3 3 // #include <stdio.h> 4 4 // #include <stdlib.h> 5 #include <errno.h>6 5 #include <string.h> 7 #include <unistd.h>8 6 extern "C" { 9 7 #include <getopt.h> 10 #include <sys/ioctl.h>11 8 12 9 struct FILE; … … 14 11 extern FILE * stdout; 15 12 16 extern int fileno(FILE *stream);17 18 13 extern int fprintf ( FILE * stream, const char * format, ... ); 19 20 extern long long int strtoll (const char* str, char** endptr, int base); 21 extern unsigned long long int strtoull(const char* str, char** endptr, int base); 22 } 23 24 #include <common.hfa> 25 #include <limits.hfa> 26 27 void printopt(FILE * out, int width, int max, char sn, const char * ln, const char * help) { 28 int hwidth = max - (11 + width); 29 if(hwidth <= 0) hwidth = max; 30 31 fprintf(out, " -%c, --%-*s %.*s\n", sn, width, ln, hwidth, help); 32 for() { 33 help += min(strlen(help), hwidth); 34 if('\0' == *help) break; 35 fprintf(out, "%*s%.*s\n", width + 11, "", hwidth, help); 36 } 14 extern long long int strtoll (const char* str, char** endptr, int base); 37 15 } 38 16 … … 47 25 struct option optarr[opt_count + 2]; 48 26 int width = 0; 49 int max_width = 1_000_000;50 27 { 51 28 int idx = 0; … … 116 93 } 117 94 118 USAGE:; 119 int outfd = fileno(out); 120 if(isatty(outfd)) { 121 struct winsize size; 122 int ret = ioctl(outfd, TIOCGWINSZ, &size); 123 if(ret < 0) abort( "ioctl error: (%d) %s\n", (int)errno, strerror(errno) ); 124 max_width = size.ws_col; 125 } 126 127 fprintf(out, "Usage:\n %s %s\n", argv[0], usage); 95 USAGE: 96 fprintf(out, "%s\n", usage); 128 97 129 98 for(i; opt_count) { 130 printopt(out, width, max_width, options[i].short_name, options[i].long_name, options[i].help);99 fprintf(out, " -%c, --%-*s %s\n", options[i].short_name, width, options[i].long_name, options[i].help); 131 100 } 132 101 fprintf(out, " -%c, --%-*s %s\n", 'h', width, "help", "print this help message"); … … 163 132 } 164 133 165 bool parse(const char * arg, unsigned & value) {166 char * end;167 unsigned long long int r = strtoull(arg, &end, 10);168 if(*end != '\0') return false;169 if(r > (unsigned)MAX) return false;170 171 value = r;172 return true;173 }174 175 bool parse(const char * arg, size_t & value) {176 char * end;177 unsigned long long int r = strtoull(arg, &end, 10);178 if(*end != '\0') return false;179 if(r > (size_t)MAX) return false;180 181 value = r;182 return true;183 }184 185 134 bool parse(const char * arg, int & value) { 186 135 char * end; -
benchmark/io/http/parseargs.hfa
r04b73b6 rf0c3120 38 38 39 39 bool parse(const char *, const char * & ); 40 bool parse(const char *, unsigned & );41 bool parse(const char *, size_t & );42 40 bool parse(const char *, int & ); -
benchmark/io/http/protocol.cfa
r04b73b6 rf0c3120 25 25 }; 26 26 27 _Static_assert( KNOWN_CODES == (sizeof(http_msgs ) / sizeof(http_msgs [0]))); 28 29 const int http_codes[] = { 30 200, 31 400, 32 404, 33 413, 34 414, 35 }; 36 37 _Static_assert( KNOWN_CODES == (sizeof(http_codes) / sizeof(http_codes[0]))); 38 39 int code_val(HttpCode code) { 40 return http_codes[code]; 41 } 27 _Static_assert( KNOWN_CODES == (sizeof(http_msgs) / sizeof(http_msgs[0]))); 42 28 43 29 static inline int answer( int fd, const char * it, int len) { … … 75 61 for() { 76 62 int ret = cfa_read(fd, it, count); 77 if(ret == 0 ) return [OK200, true, 0p, 0];78 63 if(ret < 0 ) { 64 if( errno ) return [OK200, true, 0p, 0]; 79 65 if( errno == EAGAIN || errno == EWOULDBLOCK) continue READ; 80 66 abort( "read error: (%d) %s\n", (int)errno, strerror(errno) ); -
benchmark/io/http/protocol.hfa
r04b73b6 rf0c3120 10 10 }; 11 11 12 int code_val(HttpCode code);13 14 12 int answer_error( int fd, HttpCode code ); 15 13 int answer_header( int fd, size_t size ); -
benchmark/io/http/worker.cfa
r04b73b6 rf0c3120 12 12 #include "filecache.hfa" 13 13 14 extern "C" { 15 // extern ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count); 16 extern ssize_t splice(int fd_in, loff_t *off_in, int fd_out, loff_t *off_out, size_t len, unsigned int flags); 17 } 18 19 ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count) { 20 return splice(in_fd, offset, out_fd, 0p, count, 0); 21 } 22 23 14 24 //============================================================================================= 15 25 // Worker Thread 16 26 //============================================================================================= 17 27 void ?{}( Worker & this ) { 18 ((thread&)this){ "Server Worker Thread", *options. clopts.instance};19 this.pipe[0] = -1;20 this.pipe[1] = -1;28 ((thread&)this){ "Server Worker Thread", *options.the_cluster }; 29 int ret = pipe(this.pipe); 30 if( ret < 0 ) { abort( "pipe error: (%d) %s\n", (int)errno, strerror(errno) ); } 21 31 } 22 32 23 33 void main( Worker & this ) { 24 park( __cfaabi_dbg_ctx );25 /* paranoid */ assert( this.pipe[0] != -1 );26 /* paranoid */ assert( this.pipe[1] != -1 );27 28 34 CONNECTION: 29 for() { 30 int fd = take(wait_connect); 31 if (fd < 0) break; 32 33 printf("New connection %d, waiting for requests\n", fd); 35 while( int fd = take(wait_connect); fd >= 0) { 36 printf("New connection, waiting for requests\n"); 34 37 REQUEST: 35 38 for() { … … 40 43 41 44 // Read the http request 42 size_t len = options.socket.buflen;45 size_t len = 1024; 43 46 char buffer[len]; 44 47 printf("Reading request\n"); … … 53 56 // If this wasn't a request retrun 400 54 57 if( code != OK200 ) { 55 printf("Invalid Request : %d\n", code_val(code));58 printf("Invalid Request\n"); 56 59 answer_error(fd, code); 57 60 continue REQUEST; 58 61 } 59 62 60 printf("Request for file %.*s\n", (int)name_size, file);63 printf("Request for file %.*s\n", name_size, file); 61 64 62 65 // Get the fd from the file cache … … 87 90 //============================================================================================= 88 91 void ?{}( Acceptor & this, int sockfd, struct sockaddr * addr, socklen_t * addrlen, int flags ) { 89 ((thread&)this){ "Acceptor Thread", *options. clopts.instance};92 ((thread&)this){ "Acceptor Thread", *options.the_cluster }; 90 93 this.sockfd = sockfd; 91 94 this.addr = addr; … … 102 105 } 103 106 104 printf("New connection accepted\n");107 printf("New connection accepted\n"); 105 108 put( wait_connect, ret ); 106 }109 } 107 110 } -
libcfa/configure
r04b73b6 rf0c3120 2054 2054 2055 2055 } # ac_fn_c_check_header_mongrel 2056 2057 # ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES2058 # ---------------------------------------------2059 # Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR2060 # accordingly.2061 ac_fn_c_check_decl ()2062 {2063 as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack2064 as_decl_name=`echo $2|sed 's/ *(.*//'`2065 as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'`2066 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&52067 $as_echo_n "checking whether $as_decl_name is declared... " >&6; }2068 if eval \${$3+:} false; then :2069 $as_echo_n "(cached) " >&62070 else2071 cat confdefs.h - <<_ACEOF >conftest.$ac_ext2072 /* end confdefs.h. */2073 $42074 int2075 main ()2076 {2077 #ifndef $as_decl_name2078 #ifdef __cplusplus2079 (void) $as_decl_use;2080 #else2081 (void) $as_decl_name;2082 #endif2083 #endif2084 2085 ;2086 return 0;2087 }2088 _ACEOF2089 if ac_fn_c_try_compile "$LINENO"; then :2090 eval "$3=yes"2091 else2092 eval "$3=no"2093 fi2094 rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext2095 fi2096 eval ac_res=\$$32097 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&52098 $as_echo "$ac_res" >&6; }2099 eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno2100 2101 } # ac_fn_c_check_decl2102 2056 cat >config.log <<_ACEOF 2103 2057 This file contains any messages produced by compilers while … … 17008 16962 17009 16963 17010 17011 17012 #io_uring 5.4 and earlier uses defines17013 #io_uring 5.5 uses enum values17014 #io_uring 5.6 and later uses probes17015 17016 16964 for ac_header in linux/io_uring.h 17017 16965 do : … … 17021 16969 #define HAVE_LINUX_IO_URING_H 1 17022 16970 _ACEOF 17023 17024 $as_echo "#define CFA_HAVE_LINUX_IO_URING_H 1" >>confdefs.h17025 17026 # AC_CHECK_HEADER([liburing.h], [17027 # AC_CHECK_LIB([uring], [io_uring_get_probe])17028 # ])17029 17030 ac_fn_c_check_decl "$LINENO" "IORING_OP_NOP" "ac_cv_have_decl_IORING_OP_NOP" "#include <linux/io_uring.h>17031 "17032 if test "x$ac_cv_have_decl_IORING_OP_NOP" = xyes; then :17033 $as_echo "#define CFA_HAVE_IORING_OP_NOP 1" >>confdefs.h17034 17035 fi17036 17037 17038 ac_fn_c_check_decl "$LINENO" "IORING_OP_READV" "ac_cv_have_decl_IORING_OP_READV" "#include <linux/io_uring.h>17039 "17040 if test "x$ac_cv_have_decl_IORING_OP_READV" = xyes; then :17041 $as_echo "#define CFA_HAVE_IORING_OP_READV 1" >>confdefs.h17042 17043 fi17044 17045 17046 ac_fn_c_check_decl "$LINENO" "IORING_OP_WRITEV" "ac_cv_have_decl_IORING_OP_WRITEV" "#include <linux/io_uring.h>17047 "17048 if test "x$ac_cv_have_decl_IORING_OP_WRITEV" = xyes; then :17049 $as_echo "#define CFA_HAVE_IORING_OP_WRITEV 1" >>confdefs.h17050 17051 fi17052 17053 17054 ac_fn_c_check_decl "$LINENO" "IORING_OP_FSYNC" "ac_cv_have_decl_IORING_OP_FSYNC" "#include <linux/io_uring.h>17055 "17056 if test "x$ac_cv_have_decl_IORING_OP_FSYNC" = xyes; then :17057 $as_echo "#define CFA_HAVE_IORING_OP_FSYNC 1" >>confdefs.h17058 17059 fi17060 17061 17062 ac_fn_c_check_decl "$LINENO" "IORING_OP_READ_FIXED" "ac_cv_have_decl_IORING_OP_READ_FIXED" "#include <linux/io_uring.h>17063 "17064 if test "x$ac_cv_have_decl_IORING_OP_READ_FIXED" = xyes; then :17065 $as_echo "#define CFA_HAVE_IORING_OP_READ_FIXED 1" >>confdefs.h17066 17067 fi17068 17069 17070 ac_fn_c_check_decl "$LINENO" "IORING_OP_WRITE_FIXED" "ac_cv_have_decl_IORING_OP_WRITE_FIXED" "#include <linux/io_uring.h>17071 "17072 if test "x$ac_cv_have_decl_IORING_OP_WRITE_FIXED" = xyes; then :17073 $as_echo "#define CFA_HAVE_IORING_OP_WRITE_FIXED 1" >>confdefs.h17074 17075 fi17076 17077 17078 ac_fn_c_check_decl "$LINENO" "IORING_OP_POLL_ADD" "ac_cv_have_decl_IORING_OP_POLL_ADD" "#include <linux/io_uring.h>17079 "17080 if test "x$ac_cv_have_decl_IORING_OP_POLL_ADD" = xyes; then :17081 $as_echo "#define CFA_HAVE_IORING_OP_POLL_ADD 1" >>confdefs.h17082 17083 fi17084 17085 17086 ac_fn_c_check_decl "$LINENO" "IORING_OP_POLL_REMOVE" "ac_cv_have_decl_IORING_OP_POLL_REMOVE" "#include <linux/io_uring.h>17087 "17088 if test "x$ac_cv_have_decl_IORING_OP_POLL_REMOVE" = xyes; then :17089 $as_echo "#define CFA_HAVE_IORING_OP_POLL_REMOVE 1" >>confdefs.h17090 17091 fi17092 17093 17094 ac_fn_c_check_decl "$LINENO" "IORING_OP_SYNC_FILE_RANGE" "ac_cv_have_decl_IORING_OP_SYNC_FILE_RANGE" "#include <linux/io_uring.h>17095 "17096 if test "x$ac_cv_have_decl_IORING_OP_SYNC_FILE_RANGE" = xyes; then :17097 $as_echo "#define CFA_HAVE_IORING_OP_SYNC_FILE_RANGE 1" >>confdefs.h17098 17099 fi17100 17101 17102 ac_fn_c_check_decl "$LINENO" "IORING_OP_SENDMSG" "ac_cv_have_decl_IORING_OP_SENDMSG" "#include <linux/io_uring.h>17103 "17104 if test "x$ac_cv_have_decl_IORING_OP_SENDMSG" = xyes; then :17105 $as_echo "#define CFA_HAVE_IORING_OP_SENDMSG 1" >>confdefs.h17106 17107 fi17108 17109 17110 ac_fn_c_check_decl "$LINENO" "IORING_OP_RECVMSG" "ac_cv_have_decl_IORING_OP_RECVMSG" "#include <linux/io_uring.h>17111 "17112 if test "x$ac_cv_have_decl_IORING_OP_RECVMSG" = xyes; then :17113 $as_echo "#define CFA_HAVE_IORING_OP_RECVMSG 1" >>confdefs.h17114 17115 fi17116 17117 17118 ac_fn_c_check_decl "$LINENO" "IORING_OP_TIMEOUT" "ac_cv_have_decl_IORING_OP_TIMEOUT" "#include <linux/io_uring.h>17119 "17120 if test "x$ac_cv_have_decl_IORING_OP_TIMEOUT" = xyes; then :17121 $as_echo "#define CFA_HAVE_IORING_OP_TIMEOUT 1" >>confdefs.h17122 17123 fi17124 17125 17126 ac_fn_c_check_decl "$LINENO" "IORING_OP_TIMEOUT_REMOVE" "ac_cv_have_decl_IORING_OP_TIMEOUT_REMOVE" "#include <linux/io_uring.h>17127 "17128 if test "x$ac_cv_have_decl_IORING_OP_TIMEOUT_REMOVE" = xyes; then :17129 $as_echo "#define CFA_HAVE_IORING_OP_TIMEOUT_REMOVE 1" >>confdefs.h17130 17131 fi17132 17133 17134 ac_fn_c_check_decl "$LINENO" "IORING_OP_ACCEPT" "ac_cv_have_decl_IORING_OP_ACCEPT" "#include <linux/io_uring.h>17135 "17136 if test "x$ac_cv_have_decl_IORING_OP_ACCEPT" = xyes; then :17137 $as_echo "#define CFA_HAVE_IORING_OP_ACCEPT 1" >>confdefs.h17138 17139 fi17140 17141 17142 ac_fn_c_check_decl "$LINENO" "IORING_OP_ASYNC_CANCEL" "ac_cv_have_decl_IORING_OP_ASYNC_CANCEL" "#include <linux/io_uring.h>17143 "17144 if test "x$ac_cv_have_decl_IORING_OP_ASYNC_CANCEL" = xyes; then :17145 $as_echo "#define CFA_HAVE_IORING_OP_ASYNC_CANCEL 1" >>confdefs.h17146 17147 fi17148 17149 17150 ac_fn_c_check_decl "$LINENO" "IORING_OP_LINK_TIMEOUT" "ac_cv_have_decl_IORING_OP_LINK_TIMEOUT" "#include <linux/io_uring.h>17151 "17152 if test "x$ac_cv_have_decl_IORING_OP_LINK_TIMEOUT" = xyes; then :17153 $as_echo "#define CFA_HAVE_IORING_OP_LINK_TIMEOUT 1" >>confdefs.h17154 17155 fi17156 17157 17158 ac_fn_c_check_decl "$LINENO" "IORING_OP_CONNECT" "ac_cv_have_decl_IORING_OP_CONNECT" "#include <linux/io_uring.h>17159 "17160 if test "x$ac_cv_have_decl_IORING_OP_CONNECT" = xyes; then :17161 $as_echo "#define CFA_HAVE_IORING_OP_CONNECT 1" >>confdefs.h17162 17163 fi17164 17165 17166 ac_fn_c_check_decl "$LINENO" "IORING_OP_FALLOCATE" "ac_cv_have_decl_IORING_OP_FALLOCATE" "#include <linux/io_uring.h>17167 "17168 if test "x$ac_cv_have_decl_IORING_OP_FALLOCATE" = xyes; then :17169 $as_echo "#define CFA_HAVE_IORING_OP_FALLOCATE 1" >>confdefs.h17170 17171 fi17172 17173 17174 ac_fn_c_check_decl "$LINENO" "IORING_OP_OPENAT" "ac_cv_have_decl_IORING_OP_OPENAT" "#include <linux/io_uring.h>17175 "17176 if test "x$ac_cv_have_decl_IORING_OP_OPENAT" = xyes; then :17177 $as_echo "#define CFA_HAVE_IORING_OP_OPENAT 1" >>confdefs.h17178 17179 fi17180 17181 17182 ac_fn_c_check_decl "$LINENO" "IORING_OP_CLOSE" "ac_cv_have_decl_IORING_OP_CLOSE" "#include <linux/io_uring.h>17183 "17184 if test "x$ac_cv_have_decl_IORING_OP_CLOSE" = xyes; then :17185 $as_echo "#define CFA_HAVE_IORING_OP_CLOSE 1" >>confdefs.h17186 17187 fi17188 17189 17190 ac_fn_c_check_decl "$LINENO" "IORING_OP_FILES_UPDATE" "ac_cv_have_decl_IORING_OP_FILES_UPDATE" "#include <linux/io_uring.h>17191 "17192 if test "x$ac_cv_have_decl_IORING_OP_FILES_UPDATE" = xyes; then :17193 $as_echo "#define CFA_HAVE_IORING_OP_FILES_UPDATE 1" >>confdefs.h17194 17195 fi17196 17197 17198 ac_fn_c_check_decl "$LINENO" "IORING_OP_STATX" "ac_cv_have_decl_IORING_OP_STATX" "#include <linux/io_uring.h>17199 "17200 if test "x$ac_cv_have_decl_IORING_OP_STATX" = xyes; then :17201 $as_echo "#define CFA_HAVE_IORING_OP_STATX 1" >>confdefs.h17202 17203 fi17204 17205 17206 ac_fn_c_check_decl "$LINENO" "IORING_OP_READ" "ac_cv_have_decl_IORING_OP_READ" "#include <linux/io_uring.h>17207 "17208 if test "x$ac_cv_have_decl_IORING_OP_READ" = xyes; then :17209 $as_echo "#define CFA_HAVE_IORING_OP_READ 1" >>confdefs.h17210 17211 fi17212 17213 17214 ac_fn_c_check_decl "$LINENO" "IORING_OP_WRITE" "ac_cv_have_decl_IORING_OP_WRITE" "#include <linux/io_uring.h>17215 "17216 if test "x$ac_cv_have_decl_IORING_OP_WRITE" = xyes; then :17217 $as_echo "#define CFA_HAVE_IORING_OP_WRITE 1" >>confdefs.h17218 17219 fi17220 17221 17222 ac_fn_c_check_decl "$LINENO" "IORING_OP_FADVISE" "ac_cv_have_decl_IORING_OP_FADVISE" "#include <linux/io_uring.h>17223 "17224 if test "x$ac_cv_have_decl_IORING_OP_FADVISE" = xyes; then :17225 $as_echo "#define CFA_HAVE_IORING_OP_FADVISE 1" >>confdefs.h17226 17227 fi17228 17229 17230 ac_fn_c_check_decl "$LINENO" "IORING_OP_MADVISE" "ac_cv_have_decl_IORING_OP_MADVISE" "#include <linux/io_uring.h>17231 "17232 if test "x$ac_cv_have_decl_IORING_OP_MADVISE" = xyes; then :17233 $as_echo "#define CFA_HAVE_IORING_OP_MADVISE 1" >>confdefs.h17234 17235 fi17236 17237 17238 ac_fn_c_check_decl "$LINENO" "IORING_OP_SEND" "ac_cv_have_decl_IORING_OP_SEND" "#include <linux/io_uring.h>17239 "17240 if test "x$ac_cv_have_decl_IORING_OP_SEND" = xyes; then :17241 $as_echo "#define CFA_HAVE_IORING_OP_SEND 1" >>confdefs.h17242 17243 fi17244 17245 17246 ac_fn_c_check_decl "$LINENO" "IORING_OP_RECV" "ac_cv_have_decl_IORING_OP_RECV" "#include <linux/io_uring.h>17247 "17248 if test "x$ac_cv_have_decl_IORING_OP_RECV" = xyes; then :17249 $as_echo "#define CFA_HAVE_IORING_OP_RECV 1" >>confdefs.h17250 17251 fi17252 17253 17254 ac_fn_c_check_decl "$LINENO" "IORING_OP_OPENAT2" "ac_cv_have_decl_IORING_OP_OPENAT2" "#include <linux/io_uring.h>17255 "17256 if test "x$ac_cv_have_decl_IORING_OP_OPENAT2" = xyes; then :17257 $as_echo "#define CFA_HAVE_IORING_OP_OPENAT2 1" >>confdefs.h17258 17259 fi17260 17261 17262 ac_fn_c_check_decl "$LINENO" "IORING_OP_EPOLL_CTL" "ac_cv_have_decl_IORING_OP_EPOLL_CTL" "#include <linux/io_uring.h>17263 "17264 if test "x$ac_cv_have_decl_IORING_OP_EPOLL_CTL" = xyes; then :17265 $as_echo "#define CFA_HAVE_IORING_OP_EPOLL_CTL 1" >>confdefs.h17266 17267 fi17268 17269 17270 ac_fn_c_check_decl "$LINENO" "IORING_OP_SPLICE" "ac_cv_have_decl_IORING_OP_SPLICE" "#include <linux/io_uring.h>17271 "17272 if test "x$ac_cv_have_decl_IORING_OP_SPLICE" = xyes; then :17273 $as_echo "#define CFA_HAVE_IORING_OP_SPLICE 1" >>confdefs.h17274 17275 fi17276 17277 17278 ac_fn_c_check_decl "$LINENO" "IORING_OP_PROVIDE_BUFFERS" "ac_cv_have_decl_IORING_OP_PROVIDE_BUFFERS" "#include <linux/io_uring.h>17279 "17280 if test "x$ac_cv_have_decl_IORING_OP_PROVIDE_BUFFERS" = xyes; then :17281 $as_echo "#define CFA_HAVE_IORING_OP_PROVIDE_BUFFERS 1" >>confdefs.h17282 17283 fi17284 17285 17286 ac_fn_c_check_decl "$LINENO" "IORING_OP_REMOVE_BUFFER" "ac_cv_have_decl_IORING_OP_REMOVE_BUFFER" "#include <linux/io_uring.h>17287 "17288 if test "x$ac_cv_have_decl_IORING_OP_REMOVE_BUFFER" = xyes; then :17289 $as_echo "#define CFA_HAVE_IORING_OP_REMOVE_BUFFER 1" >>confdefs.h17290 17291 fi17292 17293 17294 16971 17295 16972 fi -
libcfa/configure.ac
r04b73b6 rf0c3120 123 123 AC_PROG_MAKE_SET 124 124 125 126 127 #io_uring 5.4 and earlier uses defines 128 #io_uring 5.5 uses enum values 129 #io_uring 5.6 and later uses probes 130 131 AC_CHECK_HEADERS([linux/io_uring.h], [ 132 AC_DEFINE(CFA_HAVE_LINUX_IO_URING_H) 133 # AC_CHECK_HEADER([liburing.h], [ 134 # AC_CHECK_LIB([uring], [io_uring_get_probe]) 135 # ]) 136 m4_foreach([op], [IORING_OP_NOP,IORING_OP_READV,IORING_OP_WRITEV,IORING_OP_FSYNC,IORING_OP_READ_FIXED,IORING_OP_WRITE_FIXED,IORING_OP_POLL_ADD,IORING_OP_POLL_REMOVE,IORING_OP_SYNC_FILE_RANGE,IORING_OP_SENDMSG,IORING_OP_RECVMSG,IORING_OP_TIMEOUT,IORING_OP_TIMEOUT_REMOVE,IORING_OP_ACCEPT,IORING_OP_ASYNC_CANCEL,IORING_OP_LINK_TIMEOUT,IORING_OP_CONNECT,IORING_OP_FALLOCATE,IORING_OP_OPENAT,IORING_OP_CLOSE,IORING_OP_FILES_UPDATE,IORING_OP_STATX,IORING_OP_READ,IORING_OP_WRITE,IORING_OP_FADVISE,IORING_OP_MADVISE,IORING_OP_SEND,IORING_OP_RECV,IORING_OP_OPENAT2,IORING_OP_EPOLL_CTL,IORING_OP_SPLICE,IORING_OP_PROVIDE_BUFFERS,IORING_OP_REMOVE_BUFFER], [ 137 AC_CHECK_DECL(op, [AC_DEFINE([CFA_HAVE_]op)], [], [[#include <linux/io_uring.h>]]) 138 ]) 139 ]) 125 AC_CHECK_HEADERS([linux/io_uring.h]) 140 126 AC_CHECK_FUNCS([preadv2 pwritev2]) 141 127 -
libcfa/prelude/defines.hfa.in
r04b73b6 rf0c3120 14 14 // 15 15 16 #undef CFA_HAVE_LINUX_IO_URING_H 17 18 #undef CFA_HAVE_IORING_OP_NOP 19 #undef CFA_HAVE_IORING_OP_READV 20 #undef CFA_HAVE_IORING_OP_WRITEV 21 #undef CFA_HAVE_IORING_OP_FSYNC 22 #undef CFA_HAVE_IORING_OP_READ_FIXED 23 #undef CFA_HAVE_IORING_OP_WRITE_FIXED 24 #undef CFA_HAVE_IORING_OP_POLL_ADD 25 #undef CFA_HAVE_IORING_OP_POLL_REMOVE 26 #undef CFA_HAVE_IORING_OP_SYNC_FILE_RANGE 27 #undef CFA_HAVE_IORING_OP_SENDMSG 28 #undef CFA_HAVE_IORING_OP_RECVMSG 29 #undef CFA_HAVE_IORING_OP_TIMEOUT 30 #undef CFA_HAVE_IORING_OP_TIMEOUT_REMOVE 31 #undef CFA_HAVE_IORING_OP_ACCEPT 32 #undef CFA_HAVE_IORING_OP_ASYNC_CANCEL 33 #undef CFA_HAVE_IORING_OP_LINK_TIMEOUT 34 #undef CFA_HAVE_IORING_OP_CONNECT 35 #undef CFA_HAVE_IORING_OP_FALLOCATE 36 #undef CFA_HAVE_IORING_OP_OPENAT 37 #undef CFA_HAVE_IORING_OP_CLOSE 38 #undef CFA_HAVE_IORING_OP_FILES_UPDATE 39 #undef CFA_HAVE_IORING_OP_STATX 40 #undef CFA_HAVE_IORING_OP_READ 41 #undef CFA_HAVE_IORING_OP_WRITE 42 #undef CFA_HAVE_IORING_OP_FADVISE 43 #undef CFA_HAVE_IORING_OP_MADVISE 44 #undef CFA_HAVE_IORING_OP_SEND 45 #undef CFA_HAVE_IORING_OP_RECV 46 #undef CFA_HAVE_IORING_OP_OPENAT2 47 #undef CFA_HAVE_IORING_OP_EPOLL_CTL 48 #undef CFA_HAVE_IORING_OP_SPLICE 49 #undef CFA_HAVE_IORING_OP_PROVIDE_BUFFERS 50 #undef CFA_HAVE_IORING_OP_REMOVE_BUFFER 16 #undef HAVE_LINUX_IO_URING_H 51 17 52 18 #undef HAVE_PREADV2 -
libcfa/src/concurrency/io.cfa
r04b73b6 rf0c3120 16 16 #if defined(__CFA_DEBUG__) 17 17 // #define __CFA_DEBUG_PRINT_IO__ 18 //#define __CFA_DEBUG_PRINT_IO_CORE__18 #define __CFA_DEBUG_PRINT_IO_CORE__ 19 19 #endif 20 20 … … 22 22 #include "bitmanip.hfa" 23 23 24 #if !defined( CFA_HAVE_LINUX_IO_URING_H)24 #if !defined(HAVE_LINUX_IO_URING_H) 25 25 void __kernel_io_startup( cluster &, unsigned, bool ) { 26 26 // Nothing to do without io_uring … … 490 490 static uint32_t __release_consumed_submission( struct __io_data & ring ); 491 491 492 static inline void process(struct io_uring_cqe & cqe, struct __processor_id_t * id ) {493 struct __io_user_data_t * data = (struct __io_user_data_t *)(uintptr_t)cqe.user_data;494 __cfadbg_print_safe( io, "Kernel I/O : Syscall completed : cqe %p, result %d for %p\n", data, cqe.res, data->thrd );495 496 data->result = cqe.res;497 if(!id) { unpark( data->thrd __cfaabi_dbg_ctx2 ); }498 else { __unpark( id, data->thrd __cfaabi_dbg_ctx2 ); }499 }500 501 492 // Process a single completion message from the io_uring 502 493 // This is NOT thread-safe … … 547 538 /* paranoid */ verify(&cqe); 548 539 549 process( cqe, !mask ? (struct __processor_id_t *)0p : &ring.poller.slow.id ); 540 struct __io_user_data_t * data = (struct __io_user_data_t *)(uintptr_t)cqe.user_data; 541 __cfadbg_print_safe( io, "Kernel I/O : Performed reading io cqe %p, result %d for %p\n", data, cqe.res, data->thrd ); 542 543 data->result = cqe.res; 544 if(!mask) { unpark( data->thrd __cfaabi_dbg_ctx2 ); } 545 else { __unpark( &ring.poller.slow.id, data->thrd __cfaabi_dbg_ctx2 ); } 550 546 } 551 547 -
libcfa/src/concurrency/iocall.cfa
r04b73b6 rf0c3120 20 20 //============================================================================================= 21 21 22 #if defined( CFA_HAVE_LINUX_IO_URING_H)22 #if defined(HAVE_LINUX_IO_URING_H) 23 23 #include <stdint.h> 24 24 #include <linux/io_uring.h> … … 122 122 #if defined(HAVE_PREADV2) 123 123 ssize_t cfa_preadv2(int fd, const struct iovec *iov, int iovcnt, off_t offset, int flags) { 124 #if !defined( CFA_HAVE_LINUX_IO_URING_H) || !defined(CFA_HAVE_IORING_OP_READV)124 #if !defined(HAVE_LINUX_IO_URING_H) || !defined(IORING_OP_READV) 125 125 return preadv2(fd, iov, iovcnt, offset, flags); 126 126 #else … … 134 134 135 135 ssize_t cfa_preadv2_fixed(int fd, const struct iovec *iov, int iovcnt, off_t offset, int flags) { 136 #if !defined( CFA_HAVE_LINUX_IO_URING_H) || !defined(CFA_HAVE_IORING_OP_READV)136 #if !defined(HAVE_LINUX_IO_URING_H) || !defined(IORING_OP_READV) 137 137 return preadv2(fd, iov, iovcnt, offset, flags); 138 138 #else … … 149 149 #if defined(HAVE_PWRITEV2) 150 150 ssize_t cfa_pwritev2(int fd, const struct iovec *iov, int iovcnt, off_t offset, int flags) { 151 #if !defined( CFA_HAVE_LINUX_IO_URING_H) || !defined(CFA_HAVE_IORING_OP_WRITEV)151 #if !defined(HAVE_LINUX_IO_URING_H) || !defined(IORING_OP_WRITEV) 152 152 return pwritev2(fd, iov, iovcnt, offset, flags); 153 153 #else … … 162 162 163 163 int cfa_fsync(int fd) { 164 #if !defined( CFA_HAVE_LINUX_IO_URING_H) || !defined(CFA_HAVE_IORING_OP_FSYNC)164 #if !defined(HAVE_LINUX_IO_URING_H) || !defined(IORING_OP_FSYNC) 165 165 return fsync(fd); 166 166 #else … … 174 174 175 175 int cfa_sync_file_range(int fd, int64_t offset, int64_t nbytes, unsigned int flags) { 176 #if !defined( CFA_HAVE_LINUX_IO_URING_H) || !defined(CFA_HAVE_IORING_OP_SYNC_FILE_RANGE)176 #if !defined(HAVE_LINUX_IO_URING_H) || !defined(IORING_OP_SYNC_FILE_RANGE) 177 177 return sync_file_range(fd, offset, nbytes, flags); 178 178 #else … … 190 190 191 191 ssize_t cfa_sendmsg(int sockfd, const struct msghdr *msg, int flags) { 192 #if !defined( CFA_HAVE_LINUX_IO_URING_H) || !defined(CFA_HAVE_IORING_OP_SENDMSG)192 #if !defined(HAVE_LINUX_IO_URING_H) || !defined(IORING_OP_SENDMSG) 193 193 return sendmsg(sockfd, msg, flags); 194 194 #else … … 203 203 204 204 ssize_t cfa_recvmsg(int sockfd, struct msghdr *msg, int flags) { 205 #if !defined( CFA_HAVE_LINUX_IO_URING_H) || !defined(CFA_HAVE_IORING_OP_RECVMSG)205 #if !defined(HAVE_LINUX_IO_URING_H) || !defined(IORING_OP_RECVMSG) 206 206 return recvmsg(sockfd, msg, flags); 207 207 #else … … 216 216 217 217 ssize_t cfa_send(int sockfd, const void *buf, size_t len, int flags) { 218 #if !defined( CFA_HAVE_LINUX_IO_URING_H) || !defined(CFA_HAVE_IORING_OP_SEND)218 #if !defined(HAVE_LINUX_IO_URING_H) || !defined(IORING_OP_SEND) 219 219 return send( sockfd, buf, len, flags ); 220 220 #else … … 231 231 232 232 ssize_t cfa_recv(int sockfd, void *buf, size_t len, int flags) { 233 #if !defined( CFA_HAVE_LINUX_IO_URING_H) || !defined(CFA_HAVE_IORING_OP_RECV)233 #if !defined(HAVE_LINUX_IO_URING_H) || !defined(IORING_OP_RECV) 234 234 return recv( sockfd, buf, len, flags ); 235 235 #else … … 246 246 247 247 int cfa_accept4(int sockfd, struct sockaddr *addr, socklen_t *addrlen, int flags) { 248 #if !defined( CFA_HAVE_LINUX_IO_URING_H) || !defined(CFA_HAVE_IORING_OP_ACCEPT)248 #if !defined(HAVE_LINUX_IO_URING_H) || !defined(IORING_OP_ACCEPT) 249 249 return accept4( sockfd, addr, addrlen, flags ); 250 250 #else … … 261 261 262 262 int cfa_connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen) { 263 #if !defined( CFA_HAVE_LINUX_IO_URING_H) || !defined(CFA_HAVE_IORING_OP_CONNECT)263 #if !defined(HAVE_LINUX_IO_URING_H) || !defined(IORING_OP_CONNECT) 264 264 return connect( sockfd, addr, addrlen ); 265 265 #else … … 275 275 276 276 int cfa_fallocate(int fd, int mode, uint64_t offset, uint64_t len) { 277 #if !defined( CFA_HAVE_LINUX_IO_URING_H) || !defined(CFA_HAVE_IORING_OP_FALLOCATE)277 #if !defined(HAVE_LINUX_IO_URING_H) || !defined(IORING_OP_FALLOCATE) 278 278 return fallocate( fd, mode, offset, len ); 279 279 #else … … 290 290 291 291 int cfa_fadvise(int fd, uint64_t offset, uint64_t len, int advice) { 292 #if !defined( CFA_HAVE_LINUX_IO_URING_H) || !defined(CFA_HAVE_IORING_OP_FADVISE)292 #if !defined(HAVE_LINUX_IO_URING_H) || !defined(IORING_OP_FADVISE) 293 293 return posix_fadvise( fd, offset, len, advice ); 294 294 #else … … 305 305 306 306 int cfa_madvise(void *addr, size_t length, int advice) { 307 #if !defined( CFA_HAVE_LINUX_IO_URING_H) || !defined(CFA_HAVE_IORING_OP_MADVISE)307 #if !defined(HAVE_LINUX_IO_URING_H) || !defined(IORING_OP_MADVISE) 308 308 return madvise( addr, length, advice ); 309 309 #else … … 320 320 321 321 int cfa_openat(int dirfd, const char *pathname, int flags, mode_t mode) { 322 #if !defined( CFA_HAVE_LINUX_IO_URING_H) || !defined(CFA_HAVE_IORING_OP_OPENAT)322 #if !defined(HAVE_LINUX_IO_URING_H) || !defined(IORING_OP_OPENAT) 323 323 return openat( dirfd, pathname, flags, mode ); 324 324 #else … … 335 335 336 336 int cfa_close(int fd) { 337 #if !defined( CFA_HAVE_LINUX_IO_URING_H) || !defined(CFA_HAVE_IORING_OP_CLOSE)337 #if !defined(HAVE_LINUX_IO_URING_H) || !defined(IORING_OP_CLOSE) 338 338 return close( fd ); 339 339 #else … … 349 349 struct statx; 350 350 int cfa_statx(int dirfd, const char *pathname, int flags, unsigned int mask, struct statx *statxbuf) { 351 #if !defined( CFA_HAVE_LINUX_IO_URING_H) || !defined(CFA_HAVE_IORING_OP_STATX)351 #if !defined(HAVE_LINUX_IO_URING_H) || !defined(IORING_OP_STATX) 352 352 #if defined(__NR_statx) 353 353 return syscall( __NR_statx, dirfd, pathname, flags, mask, statxbuf ); … … 367 367 368 368 ssize_t cfa_read(int fd, void *buf, size_t count) { 369 #if !defined( CFA_HAVE_LINUX_IO_URING_H) || !defined(CFA_HAVE_IORING_OP_READ)369 #if !defined(HAVE_LINUX_IO_URING_H) || !defined(IORING_OP_READ) 370 370 return read( fd, buf, count ); 371 371 #else … … 379 379 380 380 ssize_t cfa_write(int fd, void *buf, size_t count) { 381 #if !defined( CFA_HAVE_LINUX_IO_URING_H) || !defined(CFA_HAVE_IORING_OP_WRITE)381 #if !defined(HAVE_LINUX_IO_URING_H) || !defined(IORING_OP_WRITE) 382 382 return read( fd, buf, count ); 383 383 #else … … 391 391 392 392 ssize_t cfa_splice(int fd_in, loff_t *off_in, int fd_out, loff_t *off_out, size_t len, unsigned int flags) { 393 #if !defined( CFA_HAVE_LINUX_IO_URING_H) || !defined(CFA_HAVE_IORING_OP_SPLICE)393 #if !defined(HAVE_LINUX_IO_URING_H) || !defined(IORING_OP_SPLICE) 394 394 return splice( fd_in, off_in, fd_out, off_out, len, flags ); 395 395 #else … … 405 405 } 406 406 407 ssize_t cfa_splice(int fd_in, loff_t *off_in, int fd_out, loff_t *off_out, size_t len, unsigned int flags, int in_flags, int out_flags) {408 #if !defined(CFA_HAVE_LINUX_IO_URING_H) || !defined(CFA_HAVE_IORING_OP_SPLICE)409 return splice( fd_in, off_in, fd_out, off_out, len, flags );410 #else411 __submit_prelude412 413 (*sqe){ IORING_OP_SPLICE, fd_out, 0p, len, off_out };414 sqe->splice_fd_in = fd_in;415 sqe->splice_off_in = off_in;416 sqe->splice_flags = flags | out_flags;417 sqe->flags = in_flags;418 419 __submit_wait420 #endif421 }422 423 407 ssize_t cfa_tee(int fd_in, int fd_out, size_t len, unsigned int flags) { 424 #if !defined( CFA_HAVE_LINUX_IO_URING_H) || !defined(CFA_HAVE_IORING_OP_TEE)408 #if !defined(HAVE_LINUX_IO_URING_H) || !defined(IORING_OP_TEE) 425 409 return tee( fd_in, fd_out, len, flags ); 426 410 #else … … 445 429 446 430 bool has_user_level_blocking( fptr_t func ) { 447 #if defined( CFA_HAVE_LINUX_IO_URING_H)431 #if defined(HAVE_LINUX_IO_URING_H) 448 432 #if defined(HAVE_PREADV2) 449 433 if( /*func == (fptr_t)preadv2 || */ 450 434 func == (fptr_t)cfa_preadv2 ) 451 #define _CFA_IO_FEATURE_ CFA_HAVE_IORING_OP_READV ,452 return IS_DEFINED( CFA_HAVE_IORING_OP_READV);435 #define _CFA_IO_FEATURE_IORING_OP_READV , 436 return IS_DEFINED(IORING_OP_READV); 453 437 #endif 454 438 … … 456 440 if( /*func == (fptr_t)pwritev2 || */ 457 441 func == (fptr_t)cfa_pwritev2 ) 458 #define _CFA_IO_FEATURE_ CFA_HAVE_IORING_OP_WRITEV ,459 return IS_DEFINED( CFA_HAVE_IORING_OP_WRITEV);442 #define _CFA_IO_FEATURE_IORING_OP_WRITEV , 443 return IS_DEFINED(IORING_OP_WRITEV); 460 444 #endif 461 445 462 446 if( /*func == (fptr_t)fsync || */ 463 447 func == (fptr_t)cfa_fsync ) 464 #define _CFA_IO_FEATURE_ CFA_HAVE_IORING_OP_FSYNC ,465 return IS_DEFINED( CFA_HAVE_IORING_OP_FSYNC);448 #define _CFA_IO_FEATURE_IORING_OP_FSYNC , 449 return IS_DEFINED(IORING_OP_FSYNC); 466 450 467 451 if( /*func == (fptr_t)ync_file_range || */ 468 452 func == (fptr_t)cfa_sync_file_range ) 469 #define _CFA_IO_FEATURE_ CFA_HAVE_IORING_OP_SYNC_FILE_RANGE ,470 return IS_DEFINED( CFA_HAVE_IORING_OP_SYNC_FILE_RANGE);453 #define _CFA_IO_FEATURE_IORING_OP_SYNC_FILE_RANGE , 454 return IS_DEFINED(IORING_OP_SYNC_FILE_RANGE); 471 455 472 456 if( /*func == (fptr_t)sendmsg || */ 473 457 func == (fptr_t)cfa_sendmsg ) 474 #define _CFA_IO_FEATURE_ CFA_HAVE_IORING_OP_SENDMSG ,475 return IS_DEFINED( CFA_HAVE_IORING_OP_SENDMSG);458 #define _CFA_IO_FEATURE_IORING_OP_SENDMSG , 459 return IS_DEFINED(IORING_OP_SENDMSG); 476 460 477 461 if( /*func == (fptr_t)recvmsg || */ 478 462 func == (fptr_t)cfa_recvmsg ) 479 #define _CFA_IO_FEATURE_ CFA_HAVE_IORING_OP_RECVMSG ,480 return IS_DEFINED( CFA_HAVE_IORING_OP_RECVMSG);463 #define _CFA_IO_FEATURE_IORING_OP_RECVMSG , 464 return IS_DEFINED(IORING_OP_RECVMSG); 481 465 482 466 if( /*func == (fptr_t)send || */ 483 467 func == (fptr_t)cfa_send ) 484 #define _CFA_IO_FEATURE_ CFA_HAVE_IORING_OP_SEND ,485 return IS_DEFINED( CFA_HAVE_IORING_OP_SEND);468 #define _CFA_IO_FEATURE_IORING_OP_SEND , 469 return IS_DEFINED(IORING_OP_SEND); 486 470 487 471 if( /*func == (fptr_t)recv || */ 488 472 func == (fptr_t)cfa_recv ) 489 #define _CFA_IO_FEATURE_ CFA_HAVE_IORING_OP_RECV ,490 return IS_DEFINED( CFA_HAVE_IORING_OP_RECV);473 #define _CFA_IO_FEATURE_IORING_OP_RECV , 474 return IS_DEFINED(IORING_OP_RECV); 491 475 492 476 if( /*func == (fptr_t)accept4 || */ 493 477 func == (fptr_t)cfa_accept4 ) 494 #define _CFA_IO_FEATURE_ CFA_HAVE_IORING_OP_ACCEPT ,495 return IS_DEFINED( CFA_HAVE_IORING_OP_ACCEPT);478 #define _CFA_IO_FEATURE_IORING_OP_ACCEPT , 479 return IS_DEFINED(IORING_OP_ACCEPT); 496 480 497 481 if( /*func == (fptr_t)connect || */ 498 482 func == (fptr_t)cfa_connect ) 499 #define _CFA_IO_FEATURE_ CFA_HAVE_IORING_OP_CONNECT ,500 return IS_DEFINED( CFA_HAVE_IORING_OP_CONNECT);483 #define _CFA_IO_FEATURE_IORING_OP_CONNECT , 484 return IS_DEFINED(IORING_OP_CONNECT); 501 485 502 486 if( /*func == (fptr_t)fallocate || */ 503 487 func == (fptr_t)cfa_fallocate ) 504 #define _CFA_IO_FEATURE_ CFA_HAVE_IORING_OP_FALLOCATE ,505 return IS_DEFINED( CFA_HAVE_IORING_OP_FALLOCATE);488 #define _CFA_IO_FEATURE_IORING_OP_FALLOCATE , 489 return IS_DEFINED(IORING_OP_FALLOCATE); 506 490 507 491 if( /*func == (fptr_t)posix_fadvise || */ 508 492 func == (fptr_t)cfa_fadvise ) 509 #define _CFA_IO_FEATURE_ CFA_HAVE_IORING_OP_FADVISE ,510 return IS_DEFINED( CFA_HAVE_IORING_OP_FADVISE);493 #define _CFA_IO_FEATURE_IORING_OP_FADVISE , 494 return IS_DEFINED(IORING_OP_FADVISE); 511 495 512 496 if( /*func == (fptr_t)madvise || */ 513 497 func == (fptr_t)cfa_madvise ) 514 #define _CFA_IO_FEATURE_ CFA_HAVE_IORING_OP_MADVISE ,515 return IS_DEFINED( CFA_HAVE_IORING_OP_MADVISE);498 #define _CFA_IO_FEATURE_IORING_OP_MADVISE , 499 return IS_DEFINED(IORING_OP_MADVISE); 516 500 517 501 if( /*func == (fptr_t)openat || */ 518 502 func == (fptr_t)cfa_openat ) 519 #define _CFA_IO_FEATURE_ CFA_HAVE_IORING_OP_OPENAT ,520 return IS_DEFINED( CFA_HAVE_IORING_OP_OPENAT);503 #define _CFA_IO_FEATURE_IORING_OP_OPENAT , 504 return IS_DEFINED(IORING_OP_OPENAT); 521 505 522 506 if( /*func == (fptr_t)close || */ 523 507 func == (fptr_t)cfa_close ) 524 #define _CFA_IO_FEATURE_ CFA_HAVE_IORING_OP_CLOSE ,525 return IS_DEFINED( CFA_HAVE_IORING_OP_CLOSE);508 #define _CFA_IO_FEATURE_IORING_OP_CLOSE , 509 return IS_DEFINED(IORING_OP_CLOSE); 526 510 527 511 if( /*func == (fptr_t)read || */ 528 512 func == (fptr_t)cfa_read ) 529 #define _CFA_IO_FEATURE_ CFA_HAVE_IORING_OP_READ ,530 return IS_DEFINED( CFA_HAVE_IORING_OP_READ);513 #define _CFA_IO_FEATURE_IORING_OP_READ , 514 return IS_DEFINED(IORING_OP_READ); 531 515 532 516 if( /*func == (fptr_t)write || */ 533 517 func == (fptr_t)cfa_write ) 534 #define _CFA_IO_FEATURE_ CFA_HAVE_IORING_OP_WRITE ,535 return IS_DEFINED( CFA_HAVE_IORING_OP_WRITE);518 #define _CFA_IO_FEATURE_IORING_OP_WRITE , 519 return IS_DEFINED(IORING_OP_WRITE); 536 520 537 521 if( /*func == (fptr_t)splice || */ 538 func == (fptr_t)(ssize_t (*)(int, loff_t *, int, loff_t *, size_t, unsigned int))cfa_splice, 539 func == (fptr_t)(ssize_t (*)(int, loff_t *, int, loff_t *, size_t, unsigned int, int, int))cfa_splice ) 540 #define _CFA_IO_FEATURE_CFA_HAVE_IORING_OP_SPLICE , 541 return IS_DEFINED(CFA_HAVE_IORING_OP_SPLICE); 522 func == (fptr_t)cfa_splice ) 523 #define _CFA_IO_FEATURE_IORING_OP_SPLICE , 524 return IS_DEFINED(IORING_OP_SPLICE); 542 525 543 526 if( /*func == (fptr_t)tee || */ 544 527 func == (fptr_t)cfa_tee ) 545 #define _CFA_IO_FEATURE_ CFA_HAVE_IORING_OP_TEE ,546 return IS_DEFINED( CFA_HAVE_IORING_OP_TEE);528 #define _CFA_IO_FEATURE_IORING_OP_TEE , 529 return IS_DEFINED(IORING_OP_TEE); 547 530 #endif 548 531 -
libcfa/src/concurrency/kernel.cfa
r04b73b6 rf0c3120 228 228 static void * __invoke_processor(void * arg); 229 229 230 static init(processor & this, const char name[], cluster & _cltr) with( this ) {230 void ?{}(processor & this, const char name[], cluster & _cltr) with( this ) { 231 231 this.name = name; 232 232 this.cltr = &_cltr; 233 233 id = -1u; 234 terminated{ 0 }; 234 235 destroyer = 0p; 235 236 do_terminate = false; 236 237 preemption_alarm = 0p; 237 238 pending_preemption = false; 239 runner.proc = &this; 238 240 239 241 #if !defined(__CFA_NO_STATISTICS__) … … 242 244 #endif 243 245 246 idle{}; 247 248 __cfadbg_print_safe(runtime_core, "Kernel : Starting core %p\n", &this); 249 250 this.stack = __create_pthread( &this.kernel_thread, __invoke_processor, (void *)&this ); 244 251 __atomic_fetch_add( &cltr->nprocessors, 1u, __ATOMIC_SEQ_CST ); 245 252 246 id = doregister((__processor_id_t*)&this);247 248 // Lock the RWlock so no-one pushes/pops while we are changing the queue249 uint_fast32_t last_size = ready_mutate_lock();250 251 // Adjust the ready queue size252 ready_queue_grow( cltr );253 254 // Unlock the RWlock255 ready_mutate_unlock( last_size );256 257 253 __cfadbg_print_safe(runtime_core, "Kernel : core %p created\n", &this); 258 }259 260 // Not a ctor, it just preps the destruction but should not destroy members261 void deinit(processor & this) {262 // Lock the RWlock so no-one pushes/pops while we are changing the queue263 uint_fast32_t last_size = ready_mutate_lock();264 265 // Adjust the ready queue size266 ready_queue_shrink( this.cltr );267 268 // Make sure we aren't on the idle queue269 unsafe_remove( this.cltr->idles, &this );270 271 // Unlock the RWlock272 ready_mutate_unlock( last_size );273 274 // Finally we don't need the read_lock any more275 unregister((__processor_id_t*)&this);276 }277 278 void ?{}(processor & this, const char name[], cluster & _cltr) {279 ( this.idle ){};280 ( this.terminated ){ 0 };281 ( this.runner ){};282 init( this, name, _cltr );283 284 __cfadbg_print_safe(runtime_core, "Kernel : Starting core %p\n", &this);285 286 this.stack = __create_pthread( &this.kernel_thread, __invoke_processor, (void *)&this );287 288 254 } 289 255 … … 303 269 304 270 free( this.stack ); 305 306 deinit( this );307 271 308 272 __atomic_fetch_sub( &cltr->nprocessors, 1u, __ATOMIC_SEQ_CST ); … … 354 318 355 319 __cfadbg_print_safe(runtime_core, "Kernel : core %p starting\n", this); 356 #if !defined(__CFA_NO_STATISTICS__) 357 if( this->print_halts ) { 358 __cfaabi_bits_print_safe( STDOUT_FILENO, "Processor : %d - %s (%p)\n", this->id, this->name, (void*)this); 359 } 360 #endif 320 321 // register the processor unless it's the main thread which is handled in the boot sequence 322 if(this != mainProcessor) { 323 this->id = doregister((__processor_id_t*)this); 324 #if !defined(__CFA_NO_STATISTICS__) 325 if( this->print_halts ) { 326 __cfaabi_bits_print_safe( STDOUT_FILENO, "Processor : %d - %s (%p)\n", this->id, this->name, (void*)this); 327 } 328 #endif 329 330 // Lock the RWlock so no-one pushes/pops while we are changing the queue 331 uint_fast32_t last_size = ready_mutate_lock(); 332 333 // Adjust the ready queue size 334 ready_queue_grow( this->cltr ); 335 336 // Unlock the RWlock 337 ready_mutate_unlock( last_size ); 338 } 361 339 362 340 { … … 397 375 V( this->terminated ); 398 376 399 if(this == mainProcessor) { 377 // unregister the processor unless it's the main thread which is handled in the boot sequence 378 if(this != mainProcessor) { 379 // Lock the RWlock so no-one pushes/pops while we are changing the queue 380 uint_fast32_t last_size = ready_mutate_lock(); 381 382 // Adjust the ready queue size 383 ready_queue_shrink( this->cltr ); 384 385 // Make sure we aren't on the idle queue 386 #if !defined(__CFA_NO_STATISTICS__) 387 bool removed = 388 #endif 389 unsafe_remove( this->cltr->idles, this ); 390 391 #if !defined(__CFA_NO_STATISTICS__) 392 if(removed) __tls_stats()->ready.sleep.exits++; 393 #endif 394 395 // Unlock the RWlock 396 ready_mutate_unlock( last_size ); 397 398 // Finally we don't need the read_lock any more 399 unregister((__processor_id_t*)this); 400 } 401 else { 400 402 // HACK : the coroutine context switch expects this_thread to be set 401 403 // and it make sense for it to be set in all other cases except here … … 857 859 858 860 void ?{}(processor & this) with( this ) { 859 ( this.idle ){}; 860 ( this.terminated ){ 0 }; 861 ( this.runner ){}; 862 init( this, "Main Processor", *mainCluster ); 861 name = "Main Processor"; 862 cltr = mainCluster; 863 terminated{ 0 }; 864 do_terminate = false; 865 preemption_alarm = 0p; 866 pending_preemption = false; 863 867 kernel_thread = pthread_self(); 868 id = -1u; 869 870 #if !defined(__CFA_NO_STATISTICS__) 871 print_stats = false; 872 print_halts = false; 873 #endif 864 874 865 875 runner{ &this }; 866 876 __cfadbg_print_safe(runtime_core, "Kernel : constructed main processor context %p\n", &runner); 877 878 __atomic_fetch_add( &cltr->nprocessors, 1u, __ATOMIC_SEQ_CST ); 867 879 } 868 880 … … 871 883 mainProcessor = (processor *)&storage_mainProcessor; 872 884 (*mainProcessor){}; 885 886 mainProcessor->id = doregister( (__processor_id_t*)mainProcessor); 873 887 874 888 //initialize the global state variables … … 930 944 kernel_stop_preemption(); 931 945 946 unregister((__processor_id_t*)mainProcessor); 947 932 948 // Destroy the main processor and its context in reverse order of construction 933 949 // These were manually constructed so we need manually destroy them 934 950 void ^?{}(processor & this) with( this ){ 935 deinit( this );936 937 951 /* paranoid */ verify( this.do_terminate == true ); 938 952 __atomic_fetch_sub( &cltr->nprocessors, 1u, __ATOMIC_SEQ_CST ); -
libcfa/src/concurrency/ready_queue.cfa
r04b73b6 rf0c3120 186 186 //======================================================================= 187 187 void ?{}(__ready_queue_t & this) with (this) { 188 lanes.data = 0p; 189 lanes.count = 0; 188 189 lanes.data = alloc(4); 190 for( i; 4 ) { 191 (lanes.data[i]){}; 192 } 193 lanes.count = 4; 194 snzi{ log2( lanes.count / 8 ) }; 190 195 } 191 196 192 197 void ^?{}(__ready_queue_t & this) with (this) { 193 verify( 0== lanes.count );198 verify( 4 == lanes.count ); 194 199 verify( !query( snzi ) ); 200 201 ^(snzi){}; 202 203 for( i; 4 ) { 204 ^(lanes.data[i]){}; 205 } 195 206 free(lanes.data); 196 207 } … … 484 495 } 485 496 486 #warning remove when alloc is fixed487 forall( dtype T | sized(T) )488 static inline T * correct_alloc( T ptr[], size_t dim ) {489 if( dim == 0 ) {490 free(ptr);491 return 0p;492 }493 T * temp = alloc( dim );494 if(ptr) {495 memcpy( temp, ptr, dim * sizeof(T));496 free(ptr);497 }498 return temp;499 }500 501 497 // Grow the ready queue 502 498 void ready_queue_grow (struct cluster * cltr) { … … 517 513 518 514 // Allocate new array (uses realloc and memcpies the data) 519 lanes.data = correct_alloc(lanes.data, ncount);515 lanes.data = alloc(lanes.data, ncount); 520 516 521 517 // Fix the moved data … … 562 558 size_t ocount = lanes.count; 563 559 // Check that we have some space left 564 if(ocount < 4) abort("Program attempted to destroy more Ready Queues than were created");560 if(ocount < 8) abort("Program attempted to destroy more Ready Queues than were created"); 565 561 566 562 // reduce the actual count so push doesn't use the old queues … … 604 600 605 601 // Allocate new array (uses realloc and memcpies the data) 606 lanes.data = correct_alloc(lanes.data, lanes.count);602 lanes.data = alloc(lanes.data, lanes.count); 607 603 608 604 // Fix the moved data -
libcfa/src/concurrency/snzi.hfa
r04b73b6 rf0c3120 120 120 //-------------------------------------------------- 121 121 // SNZI object 122 void ?{}( __snzi_t & this ) {123 this.mask = 0;124 this.root = 0;125 this.nodes = 0p;126 }127 128 122 void ?{}( __snzi_t & this, unsigned depth ) with( this ) { 129 123 mask = (1 << depth) - 1; -
libcfa/src/concurrency/stats.cfa
r04b73b6 rf0c3120 24 24 stats->ready.sleep.exits = 0; 25 25 26 #if defined( CFA_HAVE_LINUX_IO_URING_H)26 #if defined(HAVE_LINUX_IO_URING_H) 27 27 stats->io.submit_q.submit_avg.rdy = 0; 28 28 stats->io.submit_q.submit_avg.csm = 0; … … 59 59 __atomic_fetch_add( &cltr->ready.sleep.exits , proc->ready.sleep.exits , __ATOMIC_SEQ_CST ); 60 60 61 #if defined( CFA_HAVE_LINUX_IO_URING_H)61 #if defined(HAVE_LINUX_IO_URING_H) 62 62 __atomic_fetch_add( &cltr->io.submit_q.submit_avg.rdy , proc->io.submit_q.submit_avg.rdy , __ATOMIC_SEQ_CST ); 63 63 __atomic_fetch_add( &cltr->io.submit_q.submit_avg.csm , proc->io.submit_q.submit_avg.csm , __ATOMIC_SEQ_CST ); … … 121 121 } 122 122 123 #if defined( CFA_HAVE_LINUX_IO_URING_H)123 #if defined(HAVE_LINUX_IO_URING_H) 124 124 if( flags & CFA_STATS_IO ) { 125 125 double avgrdy = ((double)io.submit_q.submit_avg.rdy) / io.submit_q.submit_avg.cnt; -
libcfa/src/concurrency/stats.hfa
r04b73b6 rf0c3120 11 11 enum { 12 12 CFA_STATS_READY_Q = 0x01, 13 #if defined( CFA_HAVE_LINUX_IO_URING_H)13 #if defined(HAVE_LINUX_IO_URING_H) 14 14 CFA_STATS_IO = 0x02, 15 15 #endif … … 64 64 }; 65 65 66 #if defined( CFA_HAVE_LINUX_IO_URING_H)66 #if defined(HAVE_LINUX_IO_URING_H) 67 67 struct __attribute__((aligned(64))) __stats_io_t{ 68 68 struct { … … 99 99 struct __attribute__((aligned(128))) __stats_t { 100 100 __stats_readQ_t ready; 101 #if defined( CFA_HAVE_LINUX_IO_URING_H)101 #if defined(HAVE_LINUX_IO_URING_H) 102 102 __stats_io_t io; 103 103 #endif -
libcfa/src/heap.cfa
r04b73b6 rf0c3120 10 10 // Created On : Tue Dec 19 21:58:35 2017 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Mon Jul 20 23:00:32202013 // Update Count : 80 812 // Last Modified On : Sat Jun 13 22:42:15 2020 13 // Update Count : 805 14 14 // 15 15 … … 901 901 if ( oalign == 0 && size <= odsize && odsize <= size * 2 ) { // allow 50% wasted storage for smaller size 902 902 header->kind.real.blockSize &= -2; // no alignment and turn off 0 fill 903 if ( size != odsize ) header->kind.real.size = size; // reset allocation size904 903 return oaddr; 905 904 } // if … … 930 929 931 930 size_t odsize = dataStorage( bsize, oaddr, header ); // data storage available in bucket 932 if ( size <= odsize && odsize <= size * 2 ) { // allow up to 50% wasted storage in smaller size 933 if ( size != odsize ) header->kind.real.size = size; // reset allocation size 931 if ( size <= odsize && odsize <= size * 2 ) { // allow up to 50% wasted storage in smaller size 932 // Do not know size of original allocation => cannot do 0 fill for any additional space because do not know 933 // where to start filling, i.e., do not overwrite existing values in space. 934 934 return oaddr; 935 935 } // if … … 1098 1098 // Returns original total allocation size (not bucket size) => array size is dimension * sizeif(T). 1099 1099 size_t malloc_size( void * addr ) { 1100 if ( unlikely( addr == 0p ) ) return 0; // null allocation has zero size1100 if ( unlikely( addr == 0p ) ) return false; // null allocation is not zero fill 1101 1101 HeapManager.Storage.Header * header = headerAddr( addr ); 1102 1102 if ( (header->kind.fake.alignment & 1) == 1 ) { // fake header ? … … 1108 1108 // Set allocation size and return previous size. 1109 1109 size_t $malloc_size_set( void * addr, size_t size ) { 1110 if ( unlikely( addr == 0p ) ) return 0; // null allocation has 0 size1110 if ( unlikely( addr == 0p ) ) return false; // null allocation is not zero fill 1111 1111 HeapManager.Storage.Header * header = headerAddr( addr ); 1112 1112 if ( (header->kind.fake.alignment & 1) == 1 ) { // fake header ? … … 1227 1227 if ( size <= odsize && odsize <= size * 2 ) { // allow 50% wasted storage for smaller size 1228 1228 header->kind.real.blockSize &= -2; // turn off 0 fill 1229 if ( size != odsize ) header->kind.real.size = size; // reset allocation size1230 1229 return oaddr; 1231 1230 } // if -
libcfa/src/heap.hfa
r04b73b6 rf0c3120 10 10 // Created On : Tue May 26 11:23:55 2020 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Mon Ju l 20 18:52:31202013 // Update Count : 1 112 // Last Modified On : Mon Jun 1 21:19:00 2020 13 // Update Count : 10 14 14 // 15 15 … … 35 35 void * resize( void * oaddr, size_t size ); 36 36 void * amemalign( size_t align, size_t dim, size_t elemSize ); 37 void * cmemalign( size_t align, size_t dim, size_t elemSize );37 void * cmemalign( size_t align, size_t noOfElems, size_t elemSize ); 38 38 size_t malloc_alignment( void * addr ); 39 39 bool malloc_zero_fill( void * addr ); -
libcfa/src/iostream.cfa
r04b73b6 rf0c3120 10 10 // Created On : Wed May 27 17:56:53 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Mon Jul 20 15:00:37202013 // Update Count : 11 2412 // Last Modified On : Thu Jul 16 07:43:31 2020 13 // Update Count : 1102 14 14 // 15 15 … … 167 167 #define P10_UINT64 10_000_000_000_000_000_000_ULL // 19 zeroes 168 168 169 static inline void base10_128( ostype & os, unsigned int128 val ) { 170 #if defined(__GNUC__) && __GNUC_PREREQ(7,0) // gcc version >= 7 169 static void base10_128( ostype & os, unsigned int128 val ) { 171 170 if ( val > P10_UINT64 ) { 172 #else173 if ( (uint64_t)(val >> 64) != 0 || (uint64_t)val > P10_UINT64 ) { // patch gcc 5 & 6 -O3 bug174 #endif // __GNUC_PREREQ(7,0)175 171 base10_128( os, val / P10_UINT64 ); // recursive 176 172 fmt( os, "%.19lu", (uint64_t)(val % P10_UINT64) ); … … 180 176 } // base10_128 181 177 182 static inlinevoid base10_128( ostype & os, int128 val ) {178 static void base10_128( ostype & os, int128 val ) { 183 179 if ( val < 0 ) { 184 180 fmt( os, "-" ); // leading negative sign -
libcfa/src/stdlib.cfa
r04b73b6 rf0c3120 9 9 // Author : Peter A. Buhr 10 10 // Created On : Thu Jan 28 17:10:29 2016 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Sun Jul 19 15:05:28202013 // Update Count : 50 111 // Last Modified By : Andrew Beach 12 // Last Modified On : Tue Jun 2 16:46:00 2020 13 // Update Count : 500 14 14 // 15 15 … … 25 25 26 26 //--------------------------------------- 27 28 forall( dtype T | sized(T) ) { 29 T * alloc_set( T ptr[], size_t dim, char fill ) { // realloc array with fill 30 size_t olen = malloc_usable_size( ptr ); // current allocation 31 void * nptr = (void *)realloc( (void *)ptr, dim * sizeof(T) ); // C realloc 32 size_t nlen = malloc_usable_size( nptr ); // new allocation 33 if ( nlen > olen ) { // larger ? 34 memset( (char *)nptr + olen, (int)fill, nlen - olen ); // initialize added storage 35 } // if 36 return (T *)nptr; 37 } // alloc_set 38 39 T * alloc_set( T ptr[], size_t dim, T fill ) { // realloc array with fill 40 size_t olen = malloc_usable_size( ptr ); // current allocation 41 void * nptr = (void *)realloc( (void *)ptr, dim * sizeof(T) ); // C realloc 42 size_t nlen = malloc_usable_size( nptr ); // new allocation 43 if ( nlen > olen ) { // larger ? 44 for ( i; malloc_size( ptr ) / sizeof(T) ~ dim ) { 45 memcpy( &ptr[i], &fill, sizeof(T) ); // initialize with fill value 46 } // for 47 } // if 48 return (T *)nptr; 49 } // alloc_align_set 50 51 T * alloc_align_set( T ptr[], size_t align, char fill ) { // aligned realloc with fill 52 size_t olen = malloc_usable_size( ptr ); // current allocation 53 void * nptr = (void *)realloc( (void *)ptr, align, sizeof(T) ); // CFA realloc 54 // char * nptr = alloc_align( ptr, align ); 55 size_t nlen = malloc_usable_size( nptr ); // new allocation 56 if ( nlen > olen ) { // larger ? 57 memset( (char *)nptr + olen, (int)fill, nlen - olen ); // initialize added storage 58 } // if 59 return (T *)nptr; 60 } // alloc_align_set 61 62 T * alloc_align_set( T ptr[], size_t align, size_t dim, T fill ) { // aligned realloc with fill 63 size_t olen = malloc_usable_size( ptr ); // current allocation 64 void * nptr = (void *)realloc( (void *)ptr, align, sizeof(T) ); // CFA realloc 65 // char * nptr = alloc_align( ptr, align ); 66 size_t nlen = malloc_usable_size( nptr ); // new allocation 67 if ( nlen > olen ) { // larger ? 68 for ( i; dim ) { memcpy( &ptr[i], &fill, sizeof(T) ); } // initialize with fill value 69 } // if 70 return (T *)nptr; 71 } // alloc_align_set 72 } // distribution 27 73 28 74 // allocation/deallocation and constructor/destructor, non-array types -
libcfa/src/stdlib.hfa
r04b73b6 rf0c3120 9 9 // Author : Peter A. Buhr 10 10 // Created On : Thu Jan 28 17:12:35 2016 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Tue Ju l 21 07:58:05202013 // Update Count : 4 7511 // Last Modified By : Andrew Beach 12 // Last Modified On : Tue Jun 2 16:47:00 2020 13 // Update Count : 451 14 14 // 15 15 … … 39 39 //--------------------------------------- 40 40 41 // Macro because of returns42 #define $VAR_ALLOC( allocation, alignment ) \43 if ( _Alignof(T) <= libAlign() ) return (T *)(void *)allocation( (size_t)sizeof(T) ); /* C allocation */ \44 else return (T *)alignment( _Alignof(T), sizeof(T) )45 46 #define $ARRAY_ALLOC( allocation, alignment, dim ) \47 if ( _Alignof(T) <= libAlign() ) return (T *)(void *)allocation( dim, (size_t)sizeof(T) ); /* C allocation */ \48 else return (T *)alignment( _Alignof(T), dim, sizeof(T) )49 50 #define $RE_SPECIALS( ptr, size, allocation, alignment ) \51 if ( unlikely( size == 0 ) || unlikely( ptr == 0p ) ) { \52 if ( unlikely( size == 0 ) ) free( ptr ); \53 $VAR_ALLOC( malloc, memalign ); \54 } /* if */55 56 41 static inline forall( dtype T | sized(T) ) { 57 42 // Cforall safe equivalents, i.e., implicit size specification 58 43 59 44 T * malloc( void ) { 60 $VAR_ALLOC( malloc, memalign ); 45 if ( _Alignof(T) <= libAlign() ) return (T *)(void *)malloc( (size_t)sizeof(T) ); // C malloc 46 else return (T *)memalign( _Alignof(T), sizeof(T) ); 61 47 } // malloc 62 48 63 49 T * aalloc( size_t dim ) { 64 $ARRAY_ALLOC( aalloc, amemalign, dim ); 50 if ( _Alignof(T) <= libAlign() ) return (T *)(void *)aalloc( dim, (size_t)sizeof(T) ); // CFA aalloc 51 else return (T *)amemalign( _Alignof(T), dim, sizeof(T) ); 65 52 } // aalloc 66 53 67 54 T * calloc( size_t dim ) { 68 $ARRAY_ALLOC( calloc, cmemalign, dim ); 55 if ( _Alignof(T) <= libAlign() )return (T *)(void *)calloc( dim, sizeof(T) ); // C calloc 56 else return (T *)cmemalign( _Alignof(T), dim, sizeof(T) ); 69 57 } // calloc 70 58 71 T * resize( T * ptr, size_t size ) { // CFA resize, eliminate return-type cast 72 $RE_SPECIALS( ptr, size, malloc, memalign ); 73 return (T *)(void *)resize( (void *)ptr, size ); // CFA resize 59 T * resize( T * ptr, size_t size ) { // CFA realloc, eliminate return-type cast 60 return (T *)(void *)resize( (void *)ptr, size ); // C realloc 74 61 } // resize 75 62 76 63 T * realloc( T * ptr, size_t size ) { // CFA realloc, eliminate return-type cast 77 $RE_SPECIALS( ptr, size, malloc, memalign );78 64 return (T *)(void *)realloc( (void *)ptr, size ); // C realloc 79 65 } // realloc … … 132 118 133 119 T * alloc( T ptr[], size_t dim, bool copy = true ) { 134 if ( copy ) { 135 return realloc( ptr, dim * sizeof(T) ); // CFArealloc120 if ( copy ) { // realloc 121 return (T *)(void *)realloc( (void *)ptr, dim * sizeof(T) ); // C realloc 136 122 } else { 137 return resize( ptr, dim * sizeof(T) ); // CFAresize123 return resize( ptr, dim * sizeof(T) ); // resize 138 124 } // if 139 125 } // alloc … … 160 146 return (T *)memcpy( (T *)alloc( dim ), fill, dim * sizeof(T) ); // initialize with fill value 161 147 } // alloc 162 163 T * alloc_set( T ptr[], size_t dim, char fill ) { // realloc array with fill 164 size_t osize = malloc_size( ptr ); // current allocation 165 size_t nsize = dim * sizeof(T); // new allocation 166 T * nptr = realloc( ptr, nsize ); // CFA realloc 167 if ( nsize > osize ) { // larger ? 168 memset( (char *)nptr + osize, (int)fill, nsize - osize ); // initialize added storage 169 } // if 170 return (T *)nptr; 171 } // alloc_set 172 173 T * alloc_set( T ptr[], size_t dim, T & fill ) { // realloc array with fill 174 size_t odim = malloc_size( ptr ) / sizeof(T); // current dimension 175 size_t nsize = dim * sizeof(T); // new allocation 176 size_t ndim = nsize / sizeof(T); // new dimension 177 T * nptr = realloc( ptr, nsize ); // CFA realloc 178 if ( ndim > odim ) { // larger ? 179 for ( i; odim ~ ndim ) { 180 memcpy( &nptr[i], &fill, sizeof(T) ); // initialize with fill value 181 } // for 182 } // if 183 return (T *)nptr; 184 } // alloc_align_set 148 } // distribution 149 150 forall( dtype T | sized(T) ) { 151 T * alloc_set( T ptr[], size_t dim, char fill ); // realloc array with fill 152 T * alloc_set( T ptr[], size_t dim, T fill ); // realloc array with fill 185 153 } // distribution 186 154 … … 228 196 return (T *)memcpy( (T *)alloc_align( align, dim ), fill, dim * sizeof(T) ); 229 197 } // alloc_align 230 231 T * alloc_align_set( T ptr[], size_t align, size_t dim, char fill ) { 232 size_t osize = malloc_size( ptr ); // current allocation 233 size_t nsize = dim * sizeof(T); // new allocation 234 T * nptr = realloc( ptr, align, nsize ); // CFA realloc 235 if ( nsize > osize ) { // larger ? 236 memset( (char *)nptr + osize, (int)fill, nsize - osize ); // initialize added storage 237 } // if 238 return (T *)nptr; 239 } // alloc_align_set 240 241 T * alloc_align_set( T ptr[], size_t align, size_t dim, T & fill ) { 242 size_t odim = malloc_size( ptr ) / sizeof(T); // current dimension 243 size_t nsize = dim * sizeof(T); // new allocation 244 size_t ndim = nsize / sizeof(T); // new dimension 245 T * nptr = realloc( ptr, align, nsize ); // CFA realloc 246 if ( ndim > odim ) { // larger ? 247 for ( i; odim ~ ndim ) { 248 memcpy( &nptr[i], &fill, sizeof(T) ); // initialize with fill value 249 } // for 250 } // if 251 return (T *)nptr; 252 } // alloc_align_set 198 } // distribution 199 200 forall( dtype T | sized(T) ) { 201 T * alloc_align_set( T ptr[], size_t align, char fill ); // aligned realloc with fill 202 T * alloc_align_set( T ptr[], size_t align, T fill ); // aligned realloc with fill 203 T * alloc_align_set( T ptr[], size_t align, size_t dim, char fill ); // aligned realloc array with fill 204 T * alloc_align_set( T ptr[], size_t align, size_t dim, T fill ); // aligned realloc array with fill 253 205 } // distribution 254 206 -
src/Common/PassVisitor.proto.h
r04b73b6 rf0c3120 38 38 }; 39 39 40 std::stack< cleanup_t , std::vector< cleanup_t >> cleanups;40 std::stack< cleanup_t > cleanups; 41 41 }; 42 42 -
src/Virtual/ExpandCasts.cc
r04b73b6 rf0c3120 10 10 // Created On : Mon Jul 24 13:59:00 2017 11 11 // Last Modified By : Andrew Beach 12 // Last Modified On : Tue Jul 22 10:04:00 202013 // Update Count : 312 // Last Modified On : Tue May 26 14:37:00 2020 13 // Update Count : 2 14 14 // 15 15 … … 24 24 #include "Common/PassVisitor.h" // for PassVisitor 25 25 #include "Common/SemanticError.h" // for SemanticError 26 #include "SymTab/Mangler.h" // for mangleType27 26 #include "SynTree/Declaration.h" // for ObjectDecl, StructDecl, FunctionDecl 28 27 #include "SynTree/Expression.h" // for VirtualCastExpr, CastExpr, Address... … … 33 32 namespace Virtual { 34 33 35 // Indented until the new ast code gets added.36 37 /// Maps virtual table types the instance for that type.38 class VirtualTableMap final {39 std::unordered_map<std::string, ObjectDecl *> vtable_instances;40 public:41 ObjectDecl * insert( ObjectDecl * vtableDecl ) {42 std::string const & mangledName = SymTab::Mangler::mangleType( vtableDecl->type );43 ObjectDecl *& value = vtable_instances[ mangledName ];44 if ( value ) {45 if ( vtableDecl->storageClasses.is_extern ) {46 return nullptr;47 } else if ( ! value->storageClasses.is_extern ) {48 return value;49 }50 }51 value = vtableDecl;52 return nullptr;53 }54 55 ObjectDecl * lookup( const Type * vtableType ) {56 std::string const & mangledName = SymTab::Mangler::mangleType( vtableType );57 const auto it = vtable_instances.find( mangledName );58 return ( vtable_instances.end() == it ) ? nullptr : it->second;59 }60 };61 62 34 /* Currently virtual depends on the rather brittle name matching between 63 35 * a (strict/explicate) virtual type, its vtable type and the vtable … … 66 38 * and use that information to create better error messages. 67 39 */ 68 69 namespace {70 40 71 41 std::string get_vtable_name( std::string const & name ) { … … 85 55 } 86 56 57 bool is_vtable_name( std::string const & name ) { 58 return (name.substr( name.size() - 7 ) == "_vtable" ); 59 } 60 87 61 bool is_vtable_inst_name( std::string const & name ) { 88 62 return 17 < name.size() && … … 90 64 } 91 65 92 } // namespace93 94 66 class VirtualCastCore { 95 VirtualTableMapvtable_instances;96 FunctionDecl *vcast_decl;97 StructDecl *pvt_decl;67 std::map<std::string, ObjectDecl *> vtable_instances; 68 FunctionDecl *vcast_decl; 69 StructDecl *pvt_decl; 98 70 99 71 Type * pointer_to_pvt(int level_of_indirection) { … … 135 107 void VirtualCastCore::premutate( ObjectDecl * objectDecl ) { 136 108 if ( is_vtable_inst_name( objectDecl->get_name() ) ) { 137 if ( ObjectDecl * existing = vtable_instances.insert( objectDecl ) ) { 138 std::string msg = "Repeated instance of virtual table, original found at: "; 139 msg += existing->location.filename; 140 msg += ":" + toString( existing->location.first_line ); 141 SemanticError( objectDecl->location, msg ); 142 } 109 vtable_instances[objectDecl->get_name()] = objectDecl; 143 110 } 144 111 } 145 112 146 namespace { 147 148 /// Better error locations for generated casts. 149 CodeLocation castLocation( const VirtualCastExpr * castExpr ) { 113 // Better error locations for generated casts. 114 static CodeLocation castLocation( VirtualCastExpr * castExpr ) { 150 115 if ( castExpr->location.isSet() ) { 151 116 return castExpr->location; … … 159 124 } 160 125 161 [[noreturn]] void castError( const VirtualCastExpr * castExpr, std::string const & message ) {162 SemanticError( castLocation( castExpr ), message );163 }164 165 /// Get the virtual table type used in a virtual cast.166 Type * getVirtualTableType( const VirtualCastExpr * castExpr ) {167 const Type * objectType;168 if ( auto target = dynamic_cast<const PointerType *>( castExpr->result ) ) {169 objectType = target->base;170 } else if ( auto target = dynamic_cast<const ReferenceType *>( castExpr->result ) ) {171 objectType = target->base;172 } else {173 castError( castExpr, "Virtual cast type must be a pointer or reference type." );174 }175 assert( objectType );176 177 const StructInstType * structType = dynamic_cast<const StructInstType *>( objectType );178 if ( nullptr == structType ) {179 castError( castExpr, "Virtual cast type must refer to a structure type." );180 }181 const StructDecl * structDecl = structType->baseStruct;182 assert( structDecl );183 184 const ObjectDecl * fieldDecl = nullptr;185 if ( 0 < structDecl->members.size() ) {186 const Declaration * memberDecl = structDecl->members.front();187 assert( memberDecl );188 fieldDecl = dynamic_cast<const ObjectDecl *>( memberDecl );189 if ( fieldDecl && fieldDecl->name != "virtual_table" ) {190 fieldDecl = nullptr;191 }192 }193 if ( nullptr == fieldDecl ) {194 castError( castExpr, "Virtual cast type must have a leading virtual_table field." );195 }196 const PointerType * fieldType = dynamic_cast<const PointerType *>( fieldDecl->type );197 if ( nullptr == fieldType ) {198 castError( castExpr, "Virtual cast type virtual_table field is not a pointer." );199 }200 assert( fieldType->base );201 auto virtualStructType = dynamic_cast<const StructInstType *>( fieldType->base );202 assert( virtualStructType );203 204 // Here is the type, but if it is polymorphic it will have lost information.205 // (Always a clone so that it may always be deleted.)206 StructInstType * virtualType = virtualStructType->clone();207 if ( ! structType->parameters.empty() ) {208 deleteAll( virtualType->parameters );209 virtualType->parameters.clear();210 cloneAll( structType->parameters, virtualType->parameters );211 }212 return virtualType;213 }214 215 } // namespace216 217 126 Expression * VirtualCastCore::postmutate( VirtualCastExpr * castExpr ) { 218 assertf( castExpr-> result, "Virtual Cast target not found before expansion." );127 assertf( castExpr->get_result(), "Virtual Cast target not found before expansion." ); 219 128 220 129 assert( vcast_decl ); 221 130 assert( pvt_decl ); 222 131 223 const Type * vtable_type = getVirtualTableType( castExpr ); 224 ObjectDecl * table = vtable_instances.lookup( vtable_type ); 225 if ( nullptr == table ) { 132 // Get the base type of the pointer/reference. 133 Type * base; 134 Type * result_type = castExpr->result; 135 if ( PointerType * target = dynamic_cast<PointerType *>( result_type ) ) { 136 base = target->base; 137 } else if ( ReferenceType * target = dynamic_cast<ReferenceType *>( result_type ) ) { 138 base = target->base; 139 } else { 226 140 SemanticError( castLocation( castExpr ), 227 " Could not find virtual table instance." );141 "Virtual cast type must be a pointer or reference type." ); 228 142 } 143 144 StructInstType * target_struct = dynamic_cast<StructInstType *>( base ); 145 if ( nullptr == target_struct ) { 146 SemanticError( castLocation( castExpr ), 147 "Virtual cast type must refer to a structure type." ); 148 } 149 StructDecl * target_decl = target_struct->get_baseStruct(); 150 151 std::map<std::string, ObjectDecl *>::iterator found = 152 vtable_instances.find( get_vtable_inst_name( target_decl->get_name() ) ); 153 if ( vtable_instances.end() == found ) { 154 SemanticError( castLocation( castExpr ), 155 "Virtual cast type does not have a virtual table instance." ); 156 } 157 ObjectDecl * table = found->second; 229 158 230 159 Expression * result = new CastExpr( … … 245 174 castExpr->set_result( nullptr ); 246 175 delete castExpr; 247 delete vtable_type;248 176 return result; 249 177 } -
tests/.expect/alloc.txt
r04b73b6 rf0c3120 30 30 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 31 31 CFA realloc array alloc, fill 32 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0x dededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede32 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0x1010101 0x1010101 0x1010101 0x1010101 0x1010101 0x1010101 0x1010101 0x1010101 0x1010101 0x1010101 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 33 33 CFA realloc array alloc, fill 34 34 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 35 35 CFA realloc array alloc, fill 36 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0x dededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede36 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0x1010101 0x1010101 0x1010101 0x1010101 0x1010101 0x1010101 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 37 37 38 38 C memalign 42 42.5
Note:
See TracChangeset
for help on using the changeset viewer.