Changes in / [08f3ad3:31a6f38]


Ignore:
Files:
1 added
9 deleted
23 edited

Legend:

Unmodified
Added
Removed
  • Jenkinsfile

    r08f3ad3 r31a6f38  
    102102
    103103                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 {} +'
    104109        }
    105110}
     
    460465                                        description: 'Which compiler to use',                                   \
    461466                                        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',                                   \
    463468                                        defaultValue: 'gcc-8',                                                          \
    464469                                ],                                                                                              \
  • libcfa/configure.ac

    r08f3ad3 r31a6f38  
    166166AH_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.])
    167167AH_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.])
    169168AH_TEMPLATE([CFA_HAVE_IOSQE_FIXED_FILE],[Defined if io_uring support is present when compiling libcfathread and supports the flag FIXED_FILE.])
    170169AH_TEMPLATE([CFA_HAVE_IOSQE_IO_DRAIN],[Defined if io_uring support is present when compiling libcfathread and supports the flag IO_DRAIN.])
     
    174173AH_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.])
    175174AH_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.])
     175AH_TEMPLATE([HAVE_PREADV2],[Defined if preadv2 support is present when compiling libcfathread.])
     176AH_TEMPLATE([HAVE_PWRITEV2],[Defined if pwritev2 support is present when compiling libcfathread.])
    181177AH_TEMPLATE([__CFA_NO_STATISTICS__],[Defined if libcfathread was compiled without support for statistics.])
    182178
    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])
     179define(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])
    184180define(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])
    185181
     
    226222        ])
    227223])
    228 AC_CHECK_FUNC([preadv2], [AC_DEFINE([CFA_HAVE_PREADV2])])
    229 AC_CHECK_FUNC([pwritev2], [AC_DEFINE([CFA_HAVE_PWRITEV2])])
     224AC_CHECK_FUNCS([preadv2 pwritev2])
    230225
    231226AC_CONFIG_FILES([
     
    234229        prelude/Makefile
    235230        ])
    236 AC_CONFIG_FILES([src/concurrency/io/call.cfa], [python3 ${srcdir}/src/concurrency/io/call.cfa.in > src/concurrency/io/call.cfa])
    237231
    238232AC_CONFIG_HEADERS(prelude/defines.hfa)
  • libcfa/prelude/defines.hfa.in

    r08f3ad3 r31a6f38  
    117117
    118118/* Defined if io_uring support is present when compiling libcfathread and
    119    supports the operation IORING_OP_TEE. */
    120 #undef CFA_HAVE_IORING_OP_TEE
    121 
    122 /* Defined if io_uring support is present when compiling libcfathread and
    123119   supports the operation IORING_OP_TIMEOUT. */
    124120#undef CFA_HAVE_IORING_OP_TIMEOUT
     
    167163#undef CFA_HAVE_LINUX_IO_URING_H
    168164
    169 /* Defined if openat2 support is present when compiling libcfathread. */
    170 #undef CFA_HAVE_OPENAT2
    171 
    172 /* Defined if preadv2 support is present when compiling libcfathread. */
    173 #undef CFA_HAVE_PREADV2
    174 
    175 /* Defined if pwritev2 support is present when compiling libcfathread. */
    176 #undef CFA_HAVE_PWRITEV2
    177 
    178165/* Defined if io_uring support is present when compiling libcfathread and
    179166   supports the flag SPLICE_F_FD_IN_FIXED. */
    180167#undef CFA_HAVE_SPLICE_F_FD_IN_FIXED
    181168
    182 /* Defined if statx support is present when compiling libcfathread. */
    183 #undef CFA_HAVE_STATX
    184 
    185169/* Location of include files. */
    186170#undef CFA_INCDIR
     
    204188#undef HAVE_MEMORY_H
    205189
     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
    206196/* Define to 1 if you have the <stdint.h> header file. */
    207197#undef HAVE_STDINT_H
  • libcfa/src/Makefile.am

    r08f3ad3 r31a6f38  
    6262        iterator.hfa \
    6363        limits.hfa \
    64         memory.hfa \
    6564        parseargs.hfa \
    6665        rational.hfa \
     
    108107        concurrency/io/setup.cfa \
    109108        concurrency/io/types.hfa \
    110         concurrency/io/call.cfa \
     109        concurrency/iocall.cfa \
    111110        concurrency/iofwd.hfa \
    112111        concurrency/kernel_private.hfa \
  • libcfa/src/bits/locks.hfa

    r08f3ad3 r31a6f38  
    357357                                struct oneshot * expected = this.ptr;
    358358                                // 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; }
    367360
    368361                                /* paranoid */ verify( expected != 1p ); // Future is already fulfilled, should not happen
  • libcfa/src/concurrency/io.cfa

    r08f3ad3 r31a6f38  
    159159
    160160        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 );
    165166        }
    166167
  • libcfa/src/concurrency/io/types.hfa

    r08f3ad3 r31a6f38  
    1616#pragma once
    1717
    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        }
    2122
    22 #include "bits/locks.hfa"
     23      #include "bits/locks.hfa"
    2324
    24 #if defined(CFA_HAVE_LINUX_IO_URING_H)
    2525        #define LEADER_LOCK
    2626        struct __leaderlock_t {
     
    101101        };
    102102
     103
     104        //-----------------------------------------------------------------------
     105        // IO user data
     106        struct __io_user_data_t {
     107                __s32 result;
     108                oneshot sem;
     109        };
     110
    103111        //-----------------------------------------------------------------------
    104112        // Misc
     
    135143        void __ioctx_prepare_block($io_ctx_thread & ctx, struct epoll_event & ev);
    136144#endif
    137 
    138 //-----------------------------------------------------------------------
    139 // IO user data
    140 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 fulfilled
    152         bool wait( io_future_t & this ) {
    153                 return wait(this.self);
    154         }
    155 }
  • libcfa/src/concurrency/iofwd.hfa

    r08f3ad3 r31a6f38  
    4040
    4141struct cluster;
    42 struct io_future_t;
    4342struct io_context;
    4443struct io_cancellation;
     
    4948struct statx;
    5049
    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 
     50extern 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);
     51extern 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);
     52extern int cfa_fsync(int fd, int submit_flags = 0, Duration timeout = -1`s, io_cancellation * cancellation = 0p, io_context * context = 0p);
     53extern 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);
     54extern 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);
     55extern 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);
     56extern 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);
     57extern 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);
     58extern 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);
     59extern 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);
     60extern 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);
     61extern 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);
     62extern 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);
     63extern 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);
     64extern int cfa_close(int fd, int submit_flags = 0, Duration timeout = -1`s, io_cancellation * cancellation = 0p, io_context * context = 0p);
     65extern 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);
     66extern 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);
     67extern 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);
     68extern 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);
     69extern 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);
    11770
    11871//-----------------------------------------------------------------------------
  • libcfa/src/concurrency/kernel.hfa

    r08f3ad3 r31a6f38  
    2323
    2424extern "C" {
    25         #include <bits/pthreadtypes.h>
    26         #include <linux/types.h>
     25#include <bits/pthreadtypes.h>
    2726}
    2827
     
    158157
    159158struct io_cancellation {
    160         __u64 target;
     159        uint32_t target;
    161160};
    162161
  • libcfa/src/concurrency/monitor.cfa

    r08f3ad3 r31a6f38  
    8989        __cfaabi_dbg_print_safe( "Kernel : %10p Entering mon %p (%p)\n", thrd, this, this->owner);
    9090
    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 ) {
    9592                // No one has the monitor, just take it
    9693                __set_owner( this, thrd );
     
    140137}
    141138
    142 static void __dtor_enter( $monitor * this, fptr_t func, bool join ) {
     139static void __dtor_enter( $monitor * this, fptr_t func ) {
    143140        // Lock the monitor spinlock
    144141        lock( this->lock __cfaabi_dbg_ctx2 );
     
    160157                return;
    161158        }
    162         else if( this->owner == thrd && !join) {
     159        else if( this->owner == thrd) {
    163160                // We already have the monitor... but where about to destroy it so the nesting will fail
    164161                // Abort!
    165162                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 check
    168         // to avoid that it sets the owner to the special value thrd | 1p before exiting
    169         else if( this->owner == ($thread*)(1 | (uintptr_t)thrd) ) {
    170                 // restore the owner and just return
    171                 __cfaabi_dbg_print_safe( "Kernel : Destroying free mon %p\n", this);
    172 
    173                 // No one has the monitor, just take it
    174                 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;
    180163        }
    181164
     
    268251
    269252// Leave single monitor for the last time
    270 void __dtor_leave( $monitor * this, bool join ) {
     253void __dtor_leave( $monitor * this ) {
    271254        __cfaabi_dbg_debug_do(
    272255                if( TL_GET( this_thread ) != this->owner ) {
    273256                        abort( "Destroyed monitor %p has inconsistent owner, expected %p got %p.\n", this, TL_GET( this_thread ), this->owner);
    274257                }
    275                 if( this->recursion != 1  && !join ) {
     258                if( this->recursion != 1 ) {
    276259                        abort( "Destroyed monitor %p has %d outstanding nested calls.\n", this, this->recursion - 1);
    277260                }
    278261        )
    279 
    280         this->owner = ($thread*)(1 | (uintptr_t)this->owner);
    281262}
    282263
     
    326307}
    327308
    328 // Join a thread
    329 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 
    339309// Enter multiple monitor
    340310// relies on the monitor array being sorted
     
    396366// Ctor for monitor guard
    397367// Sorts monitors before entering
    398 void ?{}( monitor_dtor_guard_t & this, $monitor * m [], fptr_t func, bool join ) {
     368void ?{}( monitor_dtor_guard_t & this, $monitor * m [], fptr_t func ) {
    399369        // optimization
    400370        $thread * thrd = TL_GET( this_thread );
     
    406376        this.prev = thrd->monitors;
    407377
    408         // Save whether we are in a join or not
    409         this.join = join;
    410 
    411378        // Update thread context (needed for conditions)
    412379        (thrd->monitors){m, 1, func};
    413380
    414         __dtor_enter( this.m, func, join );
     381        __dtor_enter( this.m, func );
    415382}
    416383
     
    418385void ^?{}( monitor_dtor_guard_t & this ) {
    419386        // Leave the monitors in order
    420         __dtor_leave( this.m, this.join );
     387        __dtor_leave( this.m );
    421388
    422389        // Restore thread context
  • libcfa/src/concurrency/monitor.hfa

    r08f3ad3 r31a6f38  
    5353        $monitor *    m;
    5454        __monitor_group_t prev;
    55         bool join;
    5655};
    5756
    58 void ?{}( monitor_dtor_guard_t & this, $monitor ** m, void (*func)(), bool join );
     57void ?{}( monitor_dtor_guard_t & this, $monitor ** m, void (*func)() );
    5958void ^?{}( monitor_dtor_guard_t & this );
    6059
  • libcfa/src/concurrency/thread.hfa

    r08f3ad3 r31a6f38  
    106106void sleep( Duration duration );
    107107
    108 //----------
    109 // join
    110 forall( dtype T | is_thread(T) )
    111 T & join( T & this );
    112 
    113108// Local Variables: //
    114109// mode: c //
  • src/AST/Pass.hpp

    r08f3ad3 r31a6f38  
    5050// | PureVisitor           - makes the visitor pure, it never modifies nodes in place and always
    5151//                           clones nodes it needs to make changes to
    52 // | WithConstTypeSubstitution - provides polymorphic const TypeSubstitution * typeSubs for the
     52// | WithTypeSubstitution  - provides polymorphic const TypeSubstitution * env for the
    5353//                           current expression
    5454// | WithStmtsToAdd        - provides the ability to insert statements before or after the current
     
    294294//-------------------------------------------------------------------------------------------------
    295295
     296/// Keep track of the polymorphic const TypeSubstitution * env for the current expression
     297
    296298/// If used the visitor will always clone nodes.
    297299struct PureVisitor {};
    298300
    299 /// Keep track of the polymorphic const TypeSubstitution * typeSubs for the current expression.
    300301struct WithConstTypeSubstitution {
    301         const TypeSubstitution * typeSubs = nullptr;
     302        const TypeSubstitution * env = nullptr;
    302303};
    303304
  • src/AST/Pass.impl.hpp

    r08f3ad3 r31a6f38  
    154154                __pedantic_pass_assert( expr );
    155155
    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;
    159159                }
    160160
     
    177177
    178178                // 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) );
    180180                ValueGuardPtr< typename std::remove_pointer< decltype(stmts_before) >::type > __old_decls_before( stmts_before );
    181181                ValueGuardPtr< typename std::remove_pointer< decltype(stmts_after ) >::type > __old_decls_after ( stmts_after  );
     
    14881488
    14891489                // 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) );
    14911491                ValueGuardPtr< typename std::remove_pointer< decltype(stmts_before) >::type > __old_decls_before( stmts_before );
    14921492                ValueGuardPtr< typename std::remove_pointer< decltype(stmts_after ) >::type > __old_decls_after ( stmts_after  );
  • src/AST/Pass.proto.hpp

    r08f3ad3 r31a6f38  
    236236
    237237        // List of fields and their expected types
    238         FIELD_PTR( typeSubs, const ast::TypeSubstitution * )
     238        FIELD_PTR( env, const ast::TypeSubstitution * )
    239239        FIELD_PTR( stmtsToAddBefore, std::list< ast::ptr< ast::Stmt > > )
    240240        FIELD_PTR( stmtsToAddAfter , std::list< ast::ptr< ast::Stmt > > )
  • src/Common/Stats/Stats.cc

    r08f3ad3 r31a6f38  
    3535        }
    3636
    37         namespace ResolveTime {
    38                 bool enabled = false;
    39         }
    40 
    4137        struct {
    4238                const char * const opt;
     
    4743                { "heap"    , Heap::enabled },
    4844                { "time"    , Time::enabled },
    49                 { "resolve" , ResolveTime::enabled },
    5045        };
    5146
  • src/Common/module.mk

    r08f3ad3 r31a6f38  
    4040      Common/Stats/Heap.cc \
    4141      Common/Stats/Heap.h \
    42       Common/Stats/ResolveTime.cc \
    43       Common/Stats/ResolveTime.h \
    4442      Common/Stats/Stats.cc \
    4543      Common/Stats/Time.cc \
  • src/Concurrency/Keywords.cc

    r08f3ad3 r31a6f38  
    931931                                        {
    932932                                                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 ) )
    935934                                        },
    936935                                        noDesignators,
  • src/ResolvExpr/Resolver.cc

    r08f3ad3 r31a6f38  
    3838#include "Common/PassVisitor.h"          // for PassVisitor
    3939#include "Common/SemanticError.h"        // for SemanticError
    40 #include "Common/Stats/ResolveTime.h"    // for ResolveTime::start(), ResolveTime::stop()
    4140#include "Common/utility.h"              // for ValueGuard, group_iterate
    4241#include "InitTweak/GenInit.h"
     
    11701169                        const ast::Expr * untyped, const ast::SymbolTable & symtab
    11711170                ) {
    1172                         Stats::ResolveTime::start( untyped );
    1173                         auto res = findKindExpression( untyped, symtab );
    1174                         Stats::ResolveTime::stop();
    1175                         return res;
     1171                        return findKindExpression( untyped, symtab );
    11761172                }
    11771173        } // anonymous namespace
  • src/SymTab/Validate.cc

    r08f3ad3 r31a6f38  
    960960        }
    961961
    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 
    974962        Type * ReplaceTypedef::postmutate( TypeInstType * typeInst ) {
    975963                // instances of typedef types will come here. If it is an instance
     
    980968                        ret->location = typeInst->location;
    981969                        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                        }
    987977                        // place instance parameters on the typedef'd type
    988978                        if ( ! typeInst->parameters.empty() ) {
  • tests/Makefile.am

    r08f3ad3 r31a6f38  
    3838# since automake doesn't have support for CFA we have to
    3939AM_CFLAGS = $(if $(test), 2> $(test), ) \
    40         -fdebug-prefix-map=$(abspath ${abs_srcdir})= \
    41         -fdebug-prefix-map=/tmp= \
    4240        -g \
    4341        -Wall \
     
    6058# adjusted CC but without the actual distcc call
    6159CFACCLOCAL = $(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'))
    6360
    6461PRETTY_PATH=mkdir -p $(dir $(abspath ${@})) && cd ${srcdir} &&
     
    113110% : %.cfa $(CFACCBIN)
    114111        $(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 ${@})
    117113
    118114# implicit rule for c++ test
     
    141137# CUSTOM TARGET
    142138#------------------------------------------------------------------------------
    143 # tests that just validate syntax
    144 expression : expression.cfa $(CFACCBIN)
    145         $(CFACOMPILETEST) -c -fsyntax-only 2> $(abspath ${@})
    146 
    147139# expected failures
    148140# use custom target since they require a custom define and custom dependencies
     
    178170        $(CFACCLOCAL) $($(shell echo "${@}_FLAGSLD" | sed 's/-\|\//_/g')) $(abspath ${@}).o -o $(abspath ${@})
    179171
    180 # Linking tests
    181 # 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 ${@}).o
    184         $(CFACCLINK)  -O0 ${@}.o -o $(abspath ${@})
    185         rm $(abspath ${@}).o
    186 
    187172#------------------------------------------------------------------------------
    188173# Other targets
  • tests/pybin/tools.py

    r08f3ad3 r31a6f38  
    120120                return None
    121121
    122         file = open(file, mode, encoding="latin-1") # use latin-1 so all chars mean something.
     122        file = open(file, mode)
    123123        exitstack.push(file)
    124124        return file
  • tests/test.py

    r08f3ad3 r31a6f38  
    207207                else:
    208208                        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:
    210210                                        error = myfile.read()
    211211                        else:
Note: See TracChangeset for help on using the changeset viewer.