Changes in / [08f3ad3:31a6f38]
- Files:
-
- 1 added
- 9 deleted
- 23 edited
-
Jenkinsfile (modified) (2 diffs)
-
libcfa/configure.ac (modified) (4 diffs)
-
libcfa/prelude/defines.hfa.in (modified) (3 diffs)
-
libcfa/src/Makefile.am (modified) (2 diffs)
-
libcfa/src/bits/locks.hfa (modified) (1 diff)
-
libcfa/src/concurrency/io.cfa (modified) (1 diff)
-
libcfa/src/concurrency/io/call.cfa.in (deleted)
-
libcfa/src/concurrency/io/types.hfa (modified) (3 diffs)
-
libcfa/src/concurrency/iofwd.hfa (modified) (2 diffs)
-
libcfa/src/concurrency/kernel.hfa (modified) (2 diffs)
-
libcfa/src/concurrency/monitor.cfa (modified) (8 diffs)
-
libcfa/src/concurrency/monitor.hfa (modified) (1 diff)
-
libcfa/src/concurrency/thread.hfa (modified) (1 diff)
-
src/AST/Pass.hpp (modified) (2 diffs)
-
src/AST/Pass.impl.hpp (modified) (3 diffs)
-
src/AST/Pass.proto.hpp (modified) (1 diff)
-
src/Common/Stats/ResolveTime.cc (deleted)
-
src/Common/Stats/ResolveTime.h (deleted)
-
src/Common/Stats/Stats.cc (modified) (2 diffs)
-
src/Common/module.mk (modified) (1 diff)
-
src/Concurrency/Keywords.cc (modified) (1 diff)
-
src/ResolvExpr/Resolver.cc (modified) (2 diffs)
-
src/SymTab/Validate.cc (modified) (2 diffs)
-
tests/.expect/smart-pointers.txt (added)
-
tests/Makefile.am (modified) (5 diffs)
-
tests/concurrent/.expect/join.txt (deleted)
-
tests/concurrent/.expect/joinerror.sed (deleted)
-
tests/concurrent/join.cfa (deleted)
-
tests/concurrent/joinerror.cfa (deleted)
-
tests/linking/.expect/linkerror.txt (deleted)
-
tests/linking/linkerror.cfa (deleted)
-
tests/pybin/tools.py (modified) (1 diff)
-
tests/test.py (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
Jenkinsfile
r08f3ad3 r31a6f38 102 102 103 103 echo GitLogMessage() 104 105 // This is a complete hack but it solves problems with automake thinking it needs to regenerate makefiles 106 // We fudged automake/missing to handle that but automake stills bakes prints inside the makefiles 107 // and these cause more problems. 108 sh 'find . -name Makefile.in -exec touch {} +' 104 109 } 105 110 } … … 460 465 description: 'Which compiler to use', \ 461 466 name: 'Compiler', \ 462 choices: 'gcc-9\ngcc-8\ngcc-7\ngcc-6\ngcc-5\ngcc-4.9\nclang', \467 choices: 'gcc-9\ngcc-8\ngcc-7\ngcc-6\ngcc-5\ngcc-4.9\nclang', \ 463 468 defaultValue: 'gcc-8', \ 464 469 ], \ -
libcfa/configure.ac
r08f3ad3 r31a6f38 166 166 AH_TEMPLATE([CFA_HAVE_IORING_OP_PROVIDE_BUFFERS],[Defined if io_uring support is present when compiling libcfathread and supports the operation IORING_OP_PROVIDE_BUFFERS.]) 167 167 AH_TEMPLATE([CFA_HAVE_IORING_OP_REMOVE_BUFFER],[Defined if io_uring support is present when compiling libcfathread and supports the operation IORING_OP_REMOVE_BUFFER.]) 168 AH_TEMPLATE([CFA_HAVE_IORING_OP_TEE],[Defined if io_uring support is present when compiling libcfathread and supports the operation IORING_OP_TEE.])169 168 AH_TEMPLATE([CFA_HAVE_IOSQE_FIXED_FILE],[Defined if io_uring support is present when compiling libcfathread and supports the flag FIXED_FILE.]) 170 169 AH_TEMPLATE([CFA_HAVE_IOSQE_IO_DRAIN],[Defined if io_uring support is present when compiling libcfathread and supports the flag IO_DRAIN.]) … … 174 173 AH_TEMPLATE([CFA_HAVE_SPLICE_F_FD_IN_FIXED],[Defined if io_uring support is present when compiling libcfathread and supports the flag SPLICE_F_FD_IN_FIXED.]) 175 174 AH_TEMPLATE([CFA_HAVE_IORING_SETUP_ATTACH_WQ],[Defined if io_uring support is present when compiling libcfathread and supports the flag IORING_SETUP_ATTACH_WQ.]) 176 AH_TEMPLATE([CFA_HAVE_PREADV2],[Defined if preadv2 support is present when compiling libcfathread.]) 177 AH_TEMPLATE([CFA_HAVE_PWRITEV2],[Defined if pwritev2 support is present when compiling libcfathread.]) 178 AH_TEMPLATE([CFA_HAVE_PWRITEV2],[Defined if pwritev2 support is present when compiling libcfathread.]) 179 AH_TEMPLATE([CFA_HAVE_STATX],[Defined if statx support is present when compiling libcfathread.]) 180 AH_TEMPLATE([CFA_HAVE_OPENAT2],[Defined if openat2 support is present when compiling libcfathread.]) 175 AH_TEMPLATE([HAVE_PREADV2],[Defined if preadv2 support is present when compiling libcfathread.]) 176 AH_TEMPLATE([HAVE_PWRITEV2],[Defined if pwritev2 support is present when compiling libcfathread.]) 181 177 AH_TEMPLATE([__CFA_NO_STATISTICS__],[Defined if libcfathread was compiled without support for statistics.]) 182 178 183 define(ioring_ops, [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 ,IORING_OP_TEE])179 define(ioring_ops, [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]) 184 180 define(ioring_flags, [IOSQE_FIXED_FILE,IOSQE_IO_DRAIN,IOSQE_ASYNC,IOSQE_IO_LINK,IOSQE_IO_HARDLINK,SPLICE_F_FD_IN_FIXED,IORING_SETUP_ATTACH_WQ]) 185 181 … … 226 222 ]) 227 223 ]) 228 AC_CHECK_FUNC([preadv2], [AC_DEFINE([CFA_HAVE_PREADV2])]) 229 AC_CHECK_FUNC([pwritev2], [AC_DEFINE([CFA_HAVE_PWRITEV2])]) 224 AC_CHECK_FUNCS([preadv2 pwritev2]) 230 225 231 226 AC_CONFIG_FILES([ … … 234 229 prelude/Makefile 235 230 ]) 236 AC_CONFIG_FILES([src/concurrency/io/call.cfa], [python3 ${srcdir}/src/concurrency/io/call.cfa.in > src/concurrency/io/call.cfa])237 231 238 232 AC_CONFIG_HEADERS(prelude/defines.hfa) -
libcfa/prelude/defines.hfa.in
r08f3ad3 r31a6f38 117 117 118 118 /* Defined if io_uring support is present when compiling libcfathread and 119 supports the operation IORING_OP_TEE. */120 #undef CFA_HAVE_IORING_OP_TEE121 122 /* Defined if io_uring support is present when compiling libcfathread and123 119 supports the operation IORING_OP_TIMEOUT. */ 124 120 #undef CFA_HAVE_IORING_OP_TIMEOUT … … 167 163 #undef CFA_HAVE_LINUX_IO_URING_H 168 164 169 /* Defined if openat2 support is present when compiling libcfathread. */170 #undef CFA_HAVE_OPENAT2171 172 /* Defined if preadv2 support is present when compiling libcfathread. */173 #undef CFA_HAVE_PREADV2174 175 /* Defined if pwritev2 support is present when compiling libcfathread. */176 #undef CFA_HAVE_PWRITEV2177 178 165 /* Defined if io_uring support is present when compiling libcfathread and 179 166 supports the flag SPLICE_F_FD_IN_FIXED. */ 180 167 #undef CFA_HAVE_SPLICE_F_FD_IN_FIXED 181 168 182 /* Defined if statx support is present when compiling libcfathread. */183 #undef CFA_HAVE_STATX184 185 169 /* Location of include files. */ 186 170 #undef CFA_INCDIR … … 204 188 #undef HAVE_MEMORY_H 205 189 190 /* Define to 1 if you have the `preadv2' function. */ 191 #undef HAVE_PREADV2 192 193 /* Define to 1 if you have the `pwritev2' function. */ 194 #undef HAVE_PWRITEV2 195 206 196 /* Define to 1 if you have the <stdint.h> header file. */ 207 197 #undef HAVE_STDINT_H -
libcfa/src/Makefile.am
r08f3ad3 r31a6f38 62 62 iterator.hfa \ 63 63 limits.hfa \ 64 memory.hfa \65 64 parseargs.hfa \ 66 65 rational.hfa \ … … 108 107 concurrency/io/setup.cfa \ 109 108 concurrency/io/types.hfa \ 110 concurrency/io /call.cfa \109 concurrency/iocall.cfa \ 111 110 concurrency/iofwd.hfa \ 112 111 concurrency/kernel_private.hfa \ -
libcfa/src/bits/locks.hfa
r08f3ad3 r31a6f38 357 357 struct oneshot * expected = this.ptr; 358 358 // was this abandoned? 359 #if defined(__GNUC__) && __GNUC__ >= 7 360 #pragma GCC diagnostic push 361 #pragma GCC diagnostic ignored "-Wfree-nonheap-object" 362 #endif 363 if( expected == 3p ) { free( &this ); return false; } 364 #if defined(__GNUC__) && __GNUC__ >= 7 365 #pragma GCC diagnostic pop 366 #endif 359 if( expected == 3p ) { free( &this ); return false; } 367 360 368 361 /* paranoid */ verify( expected != 1p ); // Future is already fulfilled, should not happen -
libcfa/src/concurrency/io.cfa
r08f3ad3 r31a6f38 159 159 160 160 static inline void process(struct io_uring_cqe & cqe ) { 161 struct io_future_t * future = (struct io_future_t *)(uintptr_t)cqe.user_data; 162 __cfadbg_print_safe( io, "Kernel I/O : Syscall completed : cqe %p, result %d for %p\n", future, cqe.res, data->thrd ); 163 164 fulfil( *future, cqe.res ); 161 struct __io_user_data_t * data = (struct __io_user_data_t *)(uintptr_t)cqe.user_data; 162 __cfadbg_print_safe( io, "Kernel I/O : Syscall completed : cqe %p, result %d for %p\n", data, cqe.res, data->thrd ); 163 164 data->result = cqe.res; 165 post( data->sem ); 165 166 } 166 167 -
libcfa/src/concurrency/io/types.hfa
r08f3ad3 r31a6f38 16 16 #pragma once 17 17 18 extern "C" { 19 #include <linux/types.h> 20 } 18 #if defined(CFA_HAVE_LINUX_IO_URING_H) 19 extern "C" { 20 #include <linux/types.h> 21 } 21 22 22 #include "bits/locks.hfa"23 #include "bits/locks.hfa" 23 24 24 #if defined(CFA_HAVE_LINUX_IO_URING_H)25 25 #define LEADER_LOCK 26 26 struct __leaderlock_t { … … 101 101 }; 102 102 103 104 //----------------------------------------------------------------------- 105 // IO user data 106 struct __io_user_data_t { 107 __s32 result; 108 oneshot sem; 109 }; 110 103 111 //----------------------------------------------------------------------- 104 112 // Misc … … 135 143 void __ioctx_prepare_block($io_ctx_thread & ctx, struct epoll_event & ev); 136 144 #endif 137 138 //-----------------------------------------------------------------------139 // IO user data140 struct io_future_t {141 future_t self;142 __s32 result;143 };144 145 static inline {146 bool fulfil( io_future_t & this, __s32 result ) {147 this.result = result;148 return fulfil(this.self);149 }150 151 // Wait for the future to be fulfilled152 bool wait( io_future_t & this ) {153 return wait(this.self);154 }155 } -
libcfa/src/concurrency/iofwd.hfa
r08f3ad3 r31a6f38 40 40 41 41 struct cluster; 42 struct io_future_t;43 42 struct io_context; 44 43 struct io_cancellation; … … 49 48 struct statx; 50 49 51 //---------- 52 // synchronous calls 53 #if defined(CFA_HAVE_PREADV2) 54 extern ssize_t cfa_preadv2(int fd, const struct iovec *iov, int iovcnt, off_t offset, int flags, int submit_flags, Duration timeout, io_cancellation * cancellation, io_context * context); 55 #endif 56 #if defined(CFA_HAVE_PWRITEV2) 57 extern ssize_t cfa_pwritev2(int fd, const struct iovec *iov, int iovcnt, off_t offset, int flags, int submit_flags, Duration timeout, io_cancellation * cancellation, io_context * context); 58 #endif 59 extern int cfa_fsync(int fd, int submit_flags, Duration timeout, io_cancellation * cancellation, io_context * context); 60 extern int cfa_epoll_ctl(int epfd, int op, int fd, struct epoll_event *event, int submit_flags, Duration timeout, io_cancellation * cancellation, io_context * context); 61 extern int cfa_sync_file_range(int fd, off64_t offset, off64_t nbytes, unsigned int flags, int submit_flags, Duration timeout, io_cancellation * cancellation, io_context * context); 62 extern ssize_t cfa_sendmsg(int sockfd, const struct msghdr *msg, int flags, int submit_flags, Duration timeout, io_cancellation * cancellation, io_context * context); 63 extern ssize_t cfa_recvmsg(int sockfd, struct msghdr *msg, int flags, int submit_flags, Duration timeout, io_cancellation * cancellation, io_context * context); 64 extern ssize_t cfa_send(int sockfd, const void *buf, size_t len, int flags, int submit_flags, Duration timeout, io_cancellation * cancellation, io_context * context); 65 extern ssize_t cfa_recv(int sockfd, void *buf, size_t len, int flags, int submit_flags, Duration timeout, io_cancellation * cancellation, io_context * context); 66 extern int cfa_accept4(int sockfd, struct sockaddr *addr, socklen_t *addrlen, int flags, int submit_flags, Duration timeout, io_cancellation * cancellation, io_context * context); 67 extern int cfa_connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen, int submit_flags, Duration timeout, io_cancellation * cancellation, io_context * context); 68 extern int cfa_fallocate(int fd, int mode, off_t offset, off_t len, int submit_flags, Duration timeout, io_cancellation * cancellation, io_context * context); 69 extern int cfa_posix_fadvise(int fd, off_t offset, off_t len, int advice, int submit_flags, Duration timeout, io_cancellation * cancellation, io_context * context); 70 extern int cfa_madvise(void *addr, size_t length, int advice, int submit_flags, Duration timeout, io_cancellation * cancellation, io_context * context); 71 extern int cfa_openat(int dirfd, const char *pathname, int flags, mode_t mode, int submit_flags, Duration timeout, io_cancellation * cancellation, io_context * context); 72 #if defined(CFA_HAVE_OPENAT2) 73 extern int cfa_openat2(int dirfd, const char *pathname, struct open_how * how, size_t size, int submit_flags, Duration timeout, io_cancellation * cancellation, io_context * context); 74 #endif 75 extern int cfa_close(int fd, int submit_flags, Duration timeout, io_cancellation * cancellation, io_context * context); 76 #if defined(CFA_HAVE_STATX) 77 extern int cfa_statx(int dirfd, const char *pathname, int flags, unsigned int mask, struct statx *statxbuf, int submit_flags, Duration timeout, io_cancellation * cancellation, io_context * context); 78 #endif 79 extern ssize_t cfa_read(int fd, void * buf, size_t count, int submit_flags, Duration timeout, io_cancellation * cancellation, io_context * context); 80 extern ssize_t cfa_write(int fd, void * buf, size_t count, int submit_flags, Duration timeout, io_cancellation * cancellation, io_context * context); 81 extern 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 submit_flags, Duration timeout, io_cancellation * cancellation, io_context * context); 82 extern ssize_t cfa_tee(int fd_in, int fd_out, size_t len, unsigned int flags, int submit_flags, Duration timeout, io_cancellation * cancellation, io_context * context); 83 84 //---------- 85 // asynchronous calls 86 #if defined(CFA_HAVE_PREADV2) 87 extern void async_preadv2(io_future_t & future, int fd, const struct iovec *iov, int iovcnt, off_t offset, int flags, int submit_flags, io_cancellation * cancellation, io_context * context); 88 #endif 89 #if defined(CFA_HAVE_PWRITEV2) 90 extern void async_pwritev2(io_future_t & future, int fd, const struct iovec *iov, int iovcnt, off_t offset, int flags, int submit_flags, io_cancellation * cancellation, io_context * context); 91 #endif 92 extern void async_fsync(io_future_t & future, int fd, int submit_flags, io_cancellation * cancellation, io_context * context); 93 extern void async_epoll_ctl(io_future_t & future, int epfd, int op, int fd, struct epoll_event *event, int submit_flags, io_cancellation * cancellation, io_context * context); 94 extern void async_sync_file_range(io_future_t & future, int fd, off64_t offset, off64_t nbytes, unsigned int flags, int submit_flags, io_cancellation * cancellation, io_context * context); 95 extern void async_sendmsg(io_future_t & future, int sockfd, const struct msghdr *msg, int flags, int submit_flags, io_cancellation * cancellation, io_context * context); 96 extern void async_recvmsg(io_future_t & future, int sockfd, struct msghdr *msg, int flags, int submit_flags, io_cancellation * cancellation, io_context * context); 97 extern void async_send(io_future_t & future, int sockfd, const void *buf, size_t len, int flags, int submit_flags, io_cancellation * cancellation, io_context * context); 98 extern void async_recv(io_future_t & future, int sockfd, void *buf, size_t len, int flags, int submit_flags, io_cancellation * cancellation, io_context * context); 99 extern void async_accept4(io_future_t & future, int sockfd, struct sockaddr *addr, socklen_t *addrlen, int flags, int submit_flags, io_cancellation * cancellation, io_context * context); 100 extern void async_connect(io_future_t & future, int sockfd, const struct sockaddr *addr, socklen_t addrlen, int submit_flags, io_cancellation * cancellation, io_context * context); 101 extern void async_fallocate(io_future_t & future, int fd, int mode, off_t offset, off_t len, int submit_flags, io_cancellation * cancellation, io_context * context); 102 extern void async_posix_fadvise(io_future_t & future, int fd, off_t offset, off_t len, int advice, int submit_flags, io_cancellation * cancellation, io_context * context); 103 extern void async_madvise(io_future_t & future, void *addr, size_t length, int advice, int submit_flags, io_cancellation * cancellation, io_context * context); 104 extern void async_openat(io_future_t & future, int dirfd, const char *pathname, int flags, mode_t mode, int submit_flags, io_cancellation * cancellation, io_context * context); 105 #if defined(CFA_HAVE_OPENAT2) 106 extern void async_openat2(io_future_t & future, int dirfd, const char *pathname, struct open_how * how, size_t size, int submit_flags, io_cancellation * cancellation, io_context * context); 107 #endif 108 extern void async_close(io_future_t & future, int fd, int submit_flags, io_cancellation * cancellation, io_context * context); 109 #if defined(CFA_HAVE_STATX) 110 extern void async_statx(io_future_t & future, int dirfd, const char *pathname, int flags, unsigned int mask, struct statx *statxbuf, int submit_flags, io_cancellation * cancellation, io_context * context); 111 #endif 112 void async_read(io_future_t & future, int fd, void * buf, size_t count, int submit_flags, io_cancellation * cancellation, io_context * context); 113 extern void async_write(io_future_t & future, int fd, void * buf, size_t count, int submit_flags, io_cancellation * cancellation, io_context * context); 114 extern void async_splice(io_future_t & future, int fd_in, loff_t *off_in, int fd_out, loff_t *off_out, size_t len, unsigned int flags, int submit_flags, io_cancellation * cancellation, io_context * context); 115 extern void async_tee(io_future_t & future, int fd_in, int fd_out, size_t len, unsigned int flags, int submit_flags, io_cancellation * cancellation, io_context * context); 116 50 extern ssize_t cfa_preadv2(int fd, const struct iovec *iov, int iovcnt, off_t offset, int flags, int submit_flags = 0, Duration timeout = -1`s, io_cancellation * cancellation = 0p, io_context * context = 0p); 51 extern ssize_t cfa_pwritev2(int fd, const struct iovec *iov, int iovcnt, off_t offset, int flags, int submit_flags = 0, Duration timeout = -1`s, io_cancellation * cancellation = 0p, io_context * context = 0p); 52 extern int cfa_fsync(int fd, int submit_flags = 0, Duration timeout = -1`s, io_cancellation * cancellation = 0p, io_context * context = 0p); 53 extern int cfa_sync_file_range(int fd, int64_t offset, int64_t nbytes, unsigned int flags, int submit_flags = 0, Duration timeout = -1`s, io_cancellation * cancellation = 0p, io_context * context = 0p); 54 extern ssize_t cfa_sendmsg(int sockfd, const struct msghdr *msg, int flags, int submit_flags = 0, Duration timeout = -1`s, io_cancellation * cancellation = 0p, io_context * context = 0p); 55 extern ssize_t cfa_recvmsg(int sockfd, struct msghdr *msg, int flags, int submit_flags = 0, Duration timeout = -1`s, io_cancellation * cancellation = 0p, io_context * context = 0p); 56 extern ssize_t cfa_send(int sockfd, const void *buf, size_t len, int flags, int submit_flags = 0, Duration timeout = -1`s, io_cancellation * cancellation = 0p, io_context * context = 0p); 57 extern ssize_t cfa_recv(int sockfd, void *buf, size_t len, int flags, int submit_flags = 0, Duration timeout = -1`s, io_cancellation * cancellation = 0p, io_context * context = 0p); 58 extern int cfa_accept4(int sockfd, struct sockaddr *addr, socklen_t *addrlen, int flags, int submit_flags = 0, Duration timeout = -1`s, io_cancellation * cancellation = 0p, io_context * context = 0p); 59 extern int cfa_connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen, int submit_flags = 0, Duration timeout = -1`s, io_cancellation * cancellation = 0p, io_context * context = 0p); 60 extern int cfa_fallocate(int fd, int mode, uint64_t offset, uint64_t len, int submit_flags = 0, Duration timeout = -1`s, io_cancellation * cancellation = 0p, io_context * context = 0p); 61 extern int cfa_fadvise(int fd, uint64_t offset, uint64_t len, int advice, int submit_flags = 0, Duration timeout = -1`s, io_cancellation * cancellation = 0p, io_context * context = 0p); 62 extern int cfa_madvise(void *addr, size_t length, int advice, int submit_flags = 0, Duration timeout = -1`s, io_cancellation * cancellation = 0p, io_context * context = 0p); 63 extern int cfa_openat(int dirfd, const char *pathname, int flags, mode_t mode, int submit_flags = 0, Duration timeout = -1`s, io_cancellation * cancellation = 0p, io_context * context = 0p); 64 extern int cfa_close(int fd, int submit_flags = 0, Duration timeout = -1`s, io_cancellation * cancellation = 0p, io_context * context = 0p); 65 extern int cfa_statx(int dirfd, const char *pathname, int flags, unsigned int mask, struct statx *statxbuf, int submit_flags = 0, Duration timeout = -1`s, io_cancellation * cancellation = 0p, io_context * context = 0p); 66 extern ssize_t cfa_read(int fd, void *buf, size_t count, int submit_flags = 0, Duration timeout = -1`s, io_cancellation * cancellation = 0p, io_context * context = 0p); 67 extern ssize_t cfa_write(int fd, void *buf, size_t count, int submit_flags = 0, Duration timeout = -1`s, io_cancellation * cancellation = 0p, io_context * context = 0p); 68 extern 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 submit_flags = 0, Duration timeout = -1`s, io_cancellation * cancellation = 0p, io_context * context = 0p); 69 extern ssize_t cfa_tee(int fd_in, int fd_out, size_t len, unsigned int flags, int submit_flags = 0, Duration timeout = -1`s, io_cancellation * cancellation = 0p, io_context * context = 0p); 117 70 118 71 //----------------------------------------------------------------------------- -
libcfa/src/concurrency/kernel.hfa
r08f3ad3 r31a6f38 23 23 24 24 extern "C" { 25 #include <bits/pthreadtypes.h> 26 #include <linux/types.h> 25 #include <bits/pthreadtypes.h> 27 26 } 28 27 … … 158 157 159 158 struct io_cancellation { 160 __u64target;159 uint32_t target; 161 160 }; 162 161 -
libcfa/src/concurrency/monitor.cfa
r08f3ad3 r31a6f38 89 89 __cfaabi_dbg_print_safe( "Kernel : %10p Entering mon %p (%p)\n", thrd, this, this->owner); 90 90 91 if( unlikely(0 != (0x1 & (uintptr_t)this->owner)) ) { 92 abort( "Attempt by thread \"%.256s\" (%p) to access joined monitor %p.", thrd->self_cor.name, thrd, this ); 93 } 94 else if( !this->owner ) { 91 if( !this->owner ) { 95 92 // No one has the monitor, just take it 96 93 __set_owner( this, thrd ); … … 140 137 } 141 138 142 static void __dtor_enter( $monitor * this, fptr_t func , bool join) {139 static void __dtor_enter( $monitor * this, fptr_t func ) { 143 140 // Lock the monitor spinlock 144 141 lock( this->lock __cfaabi_dbg_ctx2 ); … … 160 157 return; 161 158 } 162 else if( this->owner == thrd && !join) {159 else if( this->owner == thrd) { 163 160 // We already have the monitor... but where about to destroy it so the nesting will fail 164 161 // Abort! 165 162 abort( "Attempt to destroy monitor %p by thread \"%.256s\" (%p) in nested mutex.", this, thrd->self_cor.name, thrd ); 166 }167 // SKULLDUGGERY: join will act as a dtor so it would normally trigger to above check168 // to avoid that it sets the owner to the special value thrd | 1p before exiting169 else if( this->owner == ($thread*)(1 | (uintptr_t)thrd) ) {170 // restore the owner and just return171 __cfaabi_dbg_print_safe( "Kernel : Destroying free mon %p\n", this);172 173 // No one has the monitor, just take it174 this->owner = thrd;175 176 verifyf( kernelTLS.this_thread == this->owner, "Expected owner to be %p, got %p (r: %i, m: %p)", kernelTLS.this_thread, this->owner, this->recursion, this );177 178 unlock( this->lock );179 return;180 163 } 181 164 … … 268 251 269 252 // Leave single monitor for the last time 270 void __dtor_leave( $monitor * this , bool join) {253 void __dtor_leave( $monitor * this ) { 271 254 __cfaabi_dbg_debug_do( 272 255 if( TL_GET( this_thread ) != this->owner ) { 273 256 abort( "Destroyed monitor %p has inconsistent owner, expected %p got %p.\n", this, TL_GET( this_thread ), this->owner); 274 257 } 275 if( this->recursion != 1 && !join) {258 if( this->recursion != 1 ) { 276 259 abort( "Destroyed monitor %p has %d outstanding nested calls.\n", this, this->recursion - 1); 277 260 } 278 261 ) 279 280 this->owner = ($thread*)(1 | (uintptr_t)this->owner);281 262 } 282 263 … … 326 307 } 327 308 328 // Join a thread329 forall( dtype T | is_thread(T) )330 T & join( T & this ) {331 $monitor * m = get_monitor(this);332 void (*dtor)(T& mutex this) = ^?{};333 monitor_dtor_guard_t __guard = { &m, (fptr_t)dtor, true };334 {335 return this;336 }337 }338 339 309 // Enter multiple monitor 340 310 // relies on the monitor array being sorted … … 396 366 // Ctor for monitor guard 397 367 // Sorts monitors before entering 398 void ?{}( monitor_dtor_guard_t & this, $monitor * m [], fptr_t func , bool join) {368 void ?{}( monitor_dtor_guard_t & this, $monitor * m [], fptr_t func ) { 399 369 // optimization 400 370 $thread * thrd = TL_GET( this_thread ); … … 406 376 this.prev = thrd->monitors; 407 377 408 // Save whether we are in a join or not409 this.join = join;410 411 378 // Update thread context (needed for conditions) 412 379 (thrd->monitors){m, 1, func}; 413 380 414 __dtor_enter( this.m, func , join);381 __dtor_enter( this.m, func ); 415 382 } 416 383 … … 418 385 void ^?{}( monitor_dtor_guard_t & this ) { 419 386 // Leave the monitors in order 420 __dtor_leave( this.m , this.join);387 __dtor_leave( this.m ); 421 388 422 389 // Restore thread context -
libcfa/src/concurrency/monitor.hfa
r08f3ad3 r31a6f38 53 53 $monitor * m; 54 54 __monitor_group_t prev; 55 bool join;56 55 }; 57 56 58 void ?{}( monitor_dtor_guard_t & this, $monitor ** m, void (*func)() , bool join);57 void ?{}( monitor_dtor_guard_t & this, $monitor ** m, void (*func)() ); 59 58 void ^?{}( monitor_dtor_guard_t & this ); 60 59 -
libcfa/src/concurrency/thread.hfa
r08f3ad3 r31a6f38 106 106 void sleep( Duration duration ); 107 107 108 //----------109 // join110 forall( dtype T | is_thread(T) )111 T & join( T & this );112 113 108 // Local Variables: // 114 109 // mode: c // -
src/AST/Pass.hpp
r08f3ad3 r31a6f38 50 50 // | PureVisitor - makes the visitor pure, it never modifies nodes in place and always 51 51 // clones nodes it needs to make changes to 52 // | With ConstTypeSubstitution - provides polymorphic const TypeSubstitution * typeSubsfor the52 // | WithTypeSubstitution - provides polymorphic const TypeSubstitution * env for the 53 53 // current expression 54 54 // | WithStmtsToAdd - provides the ability to insert statements before or after the current … … 294 294 //------------------------------------------------------------------------------------------------- 295 295 296 /// Keep track of the polymorphic const TypeSubstitution * env for the current expression 297 296 298 /// If used the visitor will always clone nodes. 297 299 struct PureVisitor {}; 298 300 299 /// Keep track of the polymorphic const TypeSubstitution * typeSubs for the current expression.300 301 struct WithConstTypeSubstitution { 301 const TypeSubstitution * typeSubs= nullptr;302 const TypeSubstitution * env = nullptr; 302 303 }; 303 304 -
src/AST/Pass.impl.hpp
r08f3ad3 r31a6f38 154 154 __pedantic_pass_assert( expr ); 155 155 156 const ast::TypeSubstitution ** typeSubs_ptr = __pass::typeSubs( core, 0);157 if ( typeSubs_ptr && expr->env ) {158 * typeSubs_ptr = expr->env;156 const ast::TypeSubstitution ** env_ptr = __pass::env( core, 0); 157 if ( env_ptr && expr->env ) { 158 *env_ptr = expr->env; 159 159 } 160 160 … … 177 177 178 178 // These may be modified by subnode but most be restored once we exit this statemnet. 179 ValueGuardPtr< const ast::TypeSubstitution * > __old_env ( __pass:: typeSubs( core, 0) );179 ValueGuardPtr< const ast::TypeSubstitution * > __old_env ( __pass::env( core, 0) ); 180 180 ValueGuardPtr< typename std::remove_pointer< decltype(stmts_before) >::type > __old_decls_before( stmts_before ); 181 181 ValueGuardPtr< typename std::remove_pointer< decltype(stmts_after ) >::type > __old_decls_after ( stmts_after ); … … 1488 1488 1489 1489 // These may be modified by subnode but most be restored once we exit this statemnet. 1490 ValueGuardPtr< const ast::TypeSubstitution * > __old_env( __pass:: typeSubs( core, 0) );1490 ValueGuardPtr< const ast::TypeSubstitution * > __old_env( __pass::env( core, 0) ); 1491 1491 ValueGuardPtr< typename std::remove_pointer< decltype(stmts_before) >::type > __old_decls_before( stmts_before ); 1492 1492 ValueGuardPtr< typename std::remove_pointer< decltype(stmts_after ) >::type > __old_decls_after ( stmts_after ); -
src/AST/Pass.proto.hpp
r08f3ad3 r31a6f38 236 236 237 237 // List of fields and their expected types 238 FIELD_PTR( typeSubs, const ast::TypeSubstitution * )238 FIELD_PTR( env, const ast::TypeSubstitution * ) 239 239 FIELD_PTR( stmtsToAddBefore, std::list< ast::ptr< ast::Stmt > > ) 240 240 FIELD_PTR( stmtsToAddAfter , std::list< ast::ptr< ast::Stmt > > ) -
src/Common/Stats/Stats.cc
r08f3ad3 r31a6f38 35 35 } 36 36 37 namespace ResolveTime {38 bool enabled = false;39 }40 41 37 struct { 42 38 const char * const opt; … … 47 43 { "heap" , Heap::enabled }, 48 44 { "time" , Time::enabled }, 49 { "resolve" , ResolveTime::enabled },50 45 }; 51 46 -
src/Common/module.mk
r08f3ad3 r31a6f38 40 40 Common/Stats/Heap.cc \ 41 41 Common/Stats/Heap.h \ 42 Common/Stats/ResolveTime.cc \43 Common/Stats/ResolveTime.h \44 42 Common/Stats/Stats.cc \ 45 43 Common/Stats/Time.cc \ -
src/Concurrency/Keywords.cc
r08f3ad3 r31a6f38 931 931 { 932 932 new SingleInit( new AddressExpr( new VariableExpr( monitors ) ) ), 933 new SingleInit( new CastExpr( new VariableExpr( func ), generic_func->clone(), false ) ), 934 new SingleInit( new ConstantExpr( Constant::from_bool( false ) ) ) 933 new SingleInit( new CastExpr( new VariableExpr( func ), generic_func->clone(), false ) ) 935 934 }, 936 935 noDesignators, -
src/ResolvExpr/Resolver.cc
r08f3ad3 r31a6f38 38 38 #include "Common/PassVisitor.h" // for PassVisitor 39 39 #include "Common/SemanticError.h" // for SemanticError 40 #include "Common/Stats/ResolveTime.h" // for ResolveTime::start(), ResolveTime::stop()41 40 #include "Common/utility.h" // for ValueGuard, group_iterate 42 41 #include "InitTweak/GenInit.h" … … 1170 1169 const ast::Expr * untyped, const ast::SymbolTable & symtab 1171 1170 ) { 1172 Stats::ResolveTime::start( untyped ); 1173 auto res = findKindExpression( untyped, symtab ); 1174 Stats::ResolveTime::stop(); 1175 return res; 1171 return findKindExpression( untyped, symtab ); 1176 1172 } 1177 1173 } // anonymous namespace -
src/SymTab/Validate.cc
r08f3ad3 r31a6f38 960 960 } 961 961 962 static bool isNonParameterAttribute( Attribute * attr ) {963 static const std::vector<std::string> bad_names = {964 "aligned", "__aligned__",965 };966 for ( auto name : bad_names ) {967 if ( name == attr->name ) {968 return true;969 }970 }971 return false;972 }973 974 962 Type * ReplaceTypedef::postmutate( TypeInstType * typeInst ) { 975 963 // instances of typedef types will come here. If it is an instance … … 980 968 ret->location = typeInst->location; 981 969 ret->get_qualifiers() |= typeInst->get_qualifiers(); 982 // GCC ignores certain attributes if they arrive by typedef, this mimics that. 983 if ( inFunctionType ) { 984 ret->attributes.remove_if( isNonParameterAttribute ); 985 } 986 ret->attributes.splice( ret->attributes.end(), typeInst->attributes ); 970 // attributes are not carried over from typedef to function parameters/return values 971 if ( ! inFunctionType ) { 972 ret->attributes.splice( ret->attributes.end(), typeInst->attributes ); 973 } else { 974 deleteAll( ret->attributes ); 975 ret->attributes.clear(); 976 } 987 977 // place instance parameters on the typedef'd type 988 978 if ( ! typeInst->parameters.empty() ) { -
tests/Makefile.am
r08f3ad3 r31a6f38 38 38 # since automake doesn't have support for CFA we have to 39 39 AM_CFLAGS = $(if $(test), 2> $(test), ) \ 40 -fdebug-prefix-map=$(abspath ${abs_srcdir})= \41 -fdebug-prefix-map=/tmp= \42 40 -g \ 43 41 -Wall \ … … 60 58 # adjusted CC but without the actual distcc call 61 59 CFACCLOCAL = $(if $(DISTCC_CFA_PATH),$(DISTCC_CFA_PATH) ${ARCH_FLAGS},$(TARGET_CFA) ${DEBUG_FLAGS} ${ARCH_FLAGS}) 62 CFACCLINK = $(CFACCLOCAL) $(if $(test), 2> $(test), ) $($(shell echo "${@}_FLAGSLD" | sed 's/-\|\//_/g'))63 60 64 61 PRETTY_PATH=mkdir -p $(dir $(abspath ${@})) && cd ${srcdir} && … … 113 110 % : %.cfa $(CFACCBIN) 114 111 $(CFACOMPILETEST) -c -o $(abspath ${@}).o 115 $(CFACCLINK) ${@}.o -o $(abspath ${@}) 116 rm $(abspath ${@}).o 112 $(CFACCLOCAL) $($(shell echo "${@}_FLAGSLD" | sed 's/-\|\//_/g')) $(abspath ${@}).o -o $(abspath ${@}) 117 113 118 114 # implicit rule for c++ test … … 141 137 # CUSTOM TARGET 142 138 #------------------------------------------------------------------------------ 143 # tests that just validate syntax144 expression : expression.cfa $(CFACCBIN)145 $(CFACOMPILETEST) -c -fsyntax-only 2> $(abspath ${@})146 147 139 # expected failures 148 140 # use custom target since they require a custom define and custom dependencies … … 178 170 $(CFACCLOCAL) $($(shell echo "${@}_FLAGSLD" | sed 's/-\|\//_/g')) $(abspath ${@}).o -o $(abspath ${@}) 179 171 180 # Linking tests181 # Meta tests to make sure we see linking errors (can't compile with -O2 since it may multiply number of calls)182 linking/linkerror : linking/linkerror.cfa $(CFACCBIN)183 $(CFACOMPILETEST) -O0 -c -o $(abspath ${@}).o184 $(CFACCLINK) -O0 ${@}.o -o $(abspath ${@})185 rm $(abspath ${@}).o186 187 172 #------------------------------------------------------------------------------ 188 173 # Other targets -
tests/pybin/tools.py
r08f3ad3 r31a6f38 120 120 return None 121 121 122 file = open(file, mode , encoding="latin-1") # use latin-1 so all chars mean something.122 file = open(file, mode) 123 123 exitstack.push(file) 124 124 return file -
tests/test.py
r08f3ad3 r31a6f38 207 207 else: 208 208 if os.stat(out_file).st_size < 1048576: 209 with open (out_file, "r" , encoding='latin-1') as myfile: # use latin-1 so all chars mean something.209 with open (out_file, "r") as myfile: 210 210 error = myfile.read() 211 211 else:
Note:
See TracChangeset
for help on using the changeset viewer.