Changes in / [c00ddfe:255b294]


Ignore:
Files:
6 added
1 deleted
23 edited

Legend:

Unmodified
Added
Removed
  • Jenkins/FullBuild

    rc00ddfe r255b294  
    11#!groovy
    22
     3//===========================================================================================================
     4// Main loop of the compilation
     5//===========================================================================================================
     6
     7node ('master') {
     8        def err = null
     9
     10        try {
     11                //Prevent the build from exceeding 30 minutes
     12                timeout(60) {
     13
     14                        //Wrap build to add timestamp to command line
     15                        wrap([$class: 'TimestamperBuildWrapper']) {
     16
     17                                stage 'Build'
     18
     19                                        results = [null, null]
     20
     21                                        parallel (
     22                                                gcc_6_x64: { trigger_build( 'gcc-6',   'x64' ) },
     23                                                gcc_6_x86: { trigger_build( 'gcc-6',   'x86' ) },
     24                                                gcc_5_x64: { trigger_build( 'gcc-5',   'x64' ) },
     25                                                gcc_5_x86: { trigger_build( 'gcc-5',   'x86' ) },
     26                                                gcc_4_x64: { trigger_build( 'gcc-4.9', 'x64' ) },
     27                                                gcc_4_x86: { trigger_build( 'gcc-4.9', 'x86' ) },
     28                                                clang_x64: { trigger_build( 'clang',   'x64' ) },
     29                                                clang_x86: { trigger_build( 'clang',   'x86' ) },
     30                                        )
     31
     32                                //Push latest changes to do-lang repo
     33                                push_build()
     34                        }
     35                }
     36        }
     37
     38        //If an exception is caught we need to change the status and remember to
     39        //attach the build log to the email
     40        catch (Exception caughtError) {
     41                echo('error caught')
     42
     43                //rethrow error later
     44                err = caughtError
     45
     46                //Store the result of the build log
     47                currentBuild.result = 'FAILURE'
     48
     49                //Send email to notify the failure
     50                promote_failure_email()
     51        }
     52
     53        finally {
     54                //Must re-throw exception to propagate error
     55                if (err) {
     56                        throw err
     57                }
     58        }
     59}
    360//===========================================================================================================
    461// Main compilation routines
    562//===========================================================================================================
    663
    7 def trigger_build(String arch) {
     64def trigger_build(String cc, String arch) {
    865        def result = build job: 'Cforall/master',               \
    966                parameters: [                                           \
     67                        [$class: 'StringParameterValue',                \
     68                          name: 'pCompiler',                            \
     69                          value: cc],                                   \
     70                        [$class: 'StringParameterValue',                \
     71                          name: 'pArchitecture',                        \
     72                          value: arch],                                 \
    1073                        [$class: 'BooleanParameterValue',               \
    11                           name: 'isFullBuild',                          \
     74                          name: 'pRunAllTests',                         \
    1275                          value: true],                                         \
    13                         [$class: 'StringParameterValue',                \
    14                           name: 'buildArchitecture',                    \
    15                           value: arch]                                  \
     76                        [$class: 'BooleanParameterValue',               \
     77                          name: 'pRunBenchmark',                        \
     78                          value: true],                                         \
     79                        [$class: 'BooleanParameterValue',               \
     80                          name: 'pBuildDocumentation',          \
     81                          value: true],                                         \
     82                        [$class: 'BooleanParameterValue',               \
     83                          name: 'pPublish',                             \
     84                          value: true],                                         \
     85                        [$class: 'BooleanParameterValue',               \
     86                          name: 'pSilent',                              \
     87                          value: true],                                         \
    1688                ],                                                              \
    1789                propagate: false
     
    69141
    70142//===========================================================================================================
    71 // Main loop of the compilation
    72 //===========================================================================================================
    73 
    74 node ('master') {
    75         def err = null
    76 
    77         try {
    78                 //Prevent the build from exceeding 30 minutes
    79                 timeout(60) {
    80 
    81                         //Wrap build to add timestamp to command line
    82                         wrap([$class: 'TimestamperBuildWrapper']) {
    83 
    84                                 stage 'Build'
    85 
    86                                         results = [null, null]
    87 
    88                                         parallel (
    89                                                 x64: {
    90                                                         trigger_build('64-bit')
    91                                                 },
    92                                                 x32: {
    93                                                         trigger_build('32-bit')
    94                                                 }
    95                                         )
    96 
    97                                 //Push latest changes to do-lang repo
    98                                 push_build()
    99                         }
    100                 }
    101         }
    102 
    103         //If an exception is caught we need to change the status and remember to
    104         //attach the build log to the email
    105         catch (Exception caughtError) {
    106                 echo('error caught')
    107 
    108                 //rethrow error later
    109                 err = caughtError
    110 
    111                 //Store the result of the build log
    112                 currentBuild.result = 'FAILURE'
    113 
    114                 //Send email to notify the failure
    115                 promote_failure_email()
    116         }
    117 
    118         finally {
    119                 //Must re-throw exception to propagate error
    120                 if (err) {
    121                         throw err
    122                 }
    123         }
    124 }
    125 //===========================================================================================================
    126143//Routine responsible of sending the email notification once the build is completed
    127144//===========================================================================================================
  • Jenkinsfile

    rc00ddfe r255b294  
    22
    33//===========================================================================================================
    4 // Main compilation routines
    5 //===========================================================================================================
    6 //Compilation script is done here but environnement set-up and error handling is done in main loop
    7 def cfa_build(boolean full_build, String flags) {
    8         build_stage 'Checkout'
    9                 def install_dir = pwd tmp: true
    10                 //checkout the source code and clean the repo
    11                 checkout scm
    12 
    13                 //Clean all temporary files to make sure no artifacts of the previous build remain
    14                 sh 'git clean -fdqx'
    15 
    16                 //Reset the git repo so no local changes persist
    17                 sh 'git reset --hard'
    18 
    19         build_stage 'Build'
    20 
    21                 //Configure the conpilation (Output is not relevant)
    22                 //Use the current directory as the installation target so nothing
    23                 //escapes the sandbox
    24                 //Also specify the compiler by hand
    25                 sh "./configure CXX=${currentCC.cpp_cc} ${flags} --with-backend-compiler=${currentCC.cfa_backend_cc} --prefix=${install_dir} --enable-silent-rules --quiet"
    26 
    27                 //Compile the project
    28                 sh 'make -j 8 --no-print-directory V=0 install'
    29 
    30         build_stage 'Test'
    31 
    32                 //Run the tests from the tests directory
    33                 if (full_build) {
    34                         sh 'make -C src/tests all-tests debug=yes'
    35                         sh 'make -C src/tests all-tests debug=no'
    36                 }
    37                 else {
    38                         sh 'make -C src/tests'
    39                 }
    40 
    41         build_stage 'Cleanup'
    42 
    43                 //do a maintainer-clean to make sure we need to remake from scratch
    44                 sh 'make maintainer-clean > /dev/null'
    45 }
    46 
    47 def make_doc() {
    48         def err = null
    49 
    50         try {
    51                 sh 'make clean > /dev/null'
    52                 sh 'make > /dev/null 2>&1'
    53         }
    54 
    55         catch (Exception caughtError) {
    56                 //rethrow error later
    57                 err = caughtError
    58 
    59                 sh 'cat *.log'
    60         }
    61 
    62         finally {
    63                 /* Must re-throw exception to propagate error */
    64                 if (err) {
    65                         throw err
    66                 }
    67         }
    68 }
    69 
    70 def doc_build() {
    71         stage 'Documentation'
    72 
    73                 status_prefix = 'Documentation'
    74 
    75                 dir ('doc/user') {
    76                         make_doc()
    77                 }
    78 
    79                 dir ('doc/refrat') {
    80                         make_doc()
    81                 }
    82 }
    83 
    84 def benchmark() {
    85         stage 'Benchmark'
    86 
    87                 status_prefix = 'Documentation'
    88 
    89                 // //We can't just write to a file outside our repo
    90                 // //Copy the file locally using ssh
    91                 // sh 'scp plg2.cs.uwaterloo.ca:/u/cforall/public_html/perf-history/concurrency.csv bench.csv'
    92 
    93                 // //Then append to the local file
    94                 // sh 'make -C src/benchmark csv-data >> bench.csv'
    95 
    96                 // //Then publish the file again
    97                 // sh 'scp bench.csv plg2.cs.uwaterloo.ca:/u/cforall/public_html/perf-history/concurrency.csv'         
    98 }
    99 
    100 //===========================================================================================================
    101 // Helper classes/variables/routines to make the status and stage name easier to use
    102 //===========================================================================================================
    103 //Description of a compiler (Must be serializable since pipelines are persistent)
    104 class CC_Desc implements Serializable {
    105         public String cc_name
    106         public String cpp_cc
    107         public String cfa_backend_cc
    108 
    109         CC_Desc(String cc_name, String cpp_cc, String cfa_backend_cc) {
    110                 this.cc_name = cc_name
    111                 this.cpp_cc = cpp_cc
    112                 this.cfa_backend_cc = cfa_backend_cc
    113         }
    114 }
    115 
    116 //Global Variables defining the compiler and at which point in the build we are
    117 // These variables are used but can't be declared before hand because of wierd scripting rules
    118 // @Field String currentCC
    119 // @Field String status_prefix
    120 
    121 //Wrapper to sync stage name and status name
    122 def build_stage(String name) {
    123         def stage_name = "${currentCC.cc_name} ${name}".trim()
    124         stage stage_name
    125 
    126                 status_prefix = stage_name
    127 }
    128 
    129 //Helper routine to collect information about the git history
    130 def collect_git_info() {
    131 
    132         //create the temporary output directory in case it doesn't already exist
    133         def out_dir = pwd tmp: true
    134         sh "mkdir -p ${out_dir}"
    135 
    136         //parse git logs to find what changed
    137         gitRefName = env.BRANCH_NAME
    138         dir("../${gitRefName}@script") {
    139                 sh "git reflog > ${out_dir}/GIT_COMMIT"
    140         }
    141         git_reflog = readFile("${out_dir}/GIT_COMMIT")
    142         gitRefOldValue = (git_reflog =~ /moving from (.+) to (.+)/)[0][1]
    143         gitRefNewValue = (git_reflog =~ /moving from (.+) to (.+)/)[0][2]
    144 }
    145 
    146 //===========================================================================================================
    1474// Main loop of the compilation
    1485//===========================================================================================================
    1496node ('master'){
    1507
    151         boolean bIsFullBuild
     8        boolean bIsSandbox = env.BRANCH_NAME == "jenkins-sandbox"
    1529        def err = null
    15310        def log_needed = false
     11
     12        stage_name              = ''
     13
     14        compiler                = null
     15        architecture    = ''
     16       
     17        do_alltests             = false
     18        do_benchmark    = false
     19        do_doc          = false
     20        do_publish              = false
     21        do_sendemail    = true
     22
    15423        currentBuild.result = "SUCCESS"
    155         status_prefix = ''
    15624
    15725        try {
    158                 //Prevent the build from exceeding 30 minutes
    159                 timeout(60) {
    160 
    161                         //Wrap build to add timestamp to command line
    162                         wrap([$class: 'TimestamperBuildWrapper']) {
    163 
    164                                 collect_git_info()
    165 
    166                                 properties ([                                                                   \
    167                                         [$class: 'ParametersDefinitionProperty',                                \
    168                                                 parameterDefinitions: [                                         \
    169                                                 [$class: 'BooleanParameterDefinition',                          \
    170                                                   defaultValue: false,                                          \
    171                                                   description: 'If true, the build will be promoted to the do-lang git repository (on successful builds only)', \
    172                                                   name: 'isFullBuild'                                   \
    173                                                 ],                                                              \
    174                                                 [$class: 'ChoiceParameterDefinition',                           \
    175                                                   choices: '64-bit\n32-bit',                                    \
    176                                                   defaultValue: '64-bit',                                       \
    177                                                   description: 'The architecture to use for compilation',       \
    178                                                   name: 'buildArchitecture'                                     \
    179                                                 ]]                                                              \
    180                                         ]])
    181 
    182                                 bIsSandbox = env.BRANCH_NAME == "jenkins-sandbox"
    183                                 bIsFullBuild = isFullBuild == 'true'
    184                                 architectureFlag = ''
    185                                 if (buildArchitecture == '64-bit') {
    186                                         architectureFlag = '--host=x86_64 CXXFLAGS="-m64" CFAFLAGS="-m64"'
    187                                 } else if (buildArchitecture == '32-bit'){
    188                                         architectureFlag = '--host=i386 CXXFLAGS="-m32" CFAFLAGS="-m32"'
    189                                 } else {
    190                                         architectureFlag = 'ERROR'
    191                                 }
    192 
    193                                 echo "FULL BUILD = ${isFullBuild}\nArchitecture = ${buildArchitecture} (flag ${architectureFlag})"
    194 
    195                                 //Compile using gcc-4.9
    196                                 currentCC = new CC_Desc('gcc-4.9', 'g++-4.9', 'gcc-4.9')
    197                                 cfa_build(bIsFullBuild, architectureFlag)
    198 
    199                                 //Compile latex documentation
    200                                 doc_build()
    201 
    202                                 //Run benchmark and save result
     26                //Wrap build to add timestamp to command line
     27                wrap([$class: 'TimestamperBuildWrapper']) {
     28
     29                        //Prevent the build from exceeding 60 minutes
     30                        timeout(60) {
     31
     32                                notify_server()
     33
     34                                prepare_build()
     35
     36                                checkout()
     37
     38                                build()
     39
     40                                test()
     41
    20342                                benchmark()
    20443
    205                                 if( bIsFullBuild ) {
    206                                         //Compile using gcc-5
    207                                         currentCC = new CC_Desc('gcc-5', 'g++-5', 'gcc-5')
    208                                         cfa_build(true, architectureFlag)
    209 
    210                                         //Compile using gcc-4.9
    211                                         currentCC = new CC_Desc('gcc-6', 'g++-6', 'gcc-6')
    212                                         cfa_build(true, architectureFlag)
    213                                 }
     44                                clean()
     45
     46                                build_doc()
     47
     48                                publish()
     49
     50                                notify_server()
    21451                        }
    21552                }
     
    22663
    22764                //Store the result of the build log
    228                 currentBuild.result = "${status_prefix} FAILURE".trim()
     65                currentBuild.result = "${stage_name} FAILURE".trim()
    22966        }
    23067
    23168        finally {
    232                 echo 'Build Completed'
    233 
    23469                //Send email with final results if this is not a full build
    235                 if( !bIsFullBuild && !bIsSandbox ) {
     70                if( do_sendemail && !bIsSandbox ) {
    23671                        echo 'Notifying users of result'
    23772                        email(currentBuild.result, log_needed)
    23873                }
     74
     75                echo 'Build Completed'
    23976
    24077                /* Must re-throw exception to propagate error */
     
    24380                }
    24481        }
     82}
     83
     84//===========================================================================================================
     85// Helper classes/variables/routines
     86//===========================================================================================================
     87//Helper routine to collect information about the git history
     88def collect_git_info() {
     89
     90        //create the temporary output directory in case it doesn't already exist
     91        def out_dir = pwd tmp: true
     92        sh "mkdir -p ${out_dir}"
     93
     94        //parse git logs to find what changed
     95        gitRefName = env.BRANCH_NAME
     96        dir("../${gitRefName}@script") {
     97                sh "git reflog > ${out_dir}/GIT_COMMIT"
     98        }
     99        git_reflog = readFile("${out_dir}/GIT_COMMIT")
     100        gitRefOldValue = (git_reflog =~ /moving from (.+) to (.+)/)[0][1]
     101        gitRefNewValue = (git_reflog =~ /moving from (.+) to (.+)/)[0][2]
     102}
     103
     104def prepare_build() {
     105        properties ([                                                                                                   \
     106                [$class: 'ParametersDefinitionProperty',                                                                \
     107                        parameterDefinitions: [                                                                         \
     108                                [$class: 'ChoiceParameterDefinition',                                           \
     109                                        description: 'Which compiler to use',                                   \
     110                                        name: 'pCompiler',                                                              \
     111                                        choices: 'gcc-6\ngcc-5\ngcc-4.9\nclang',                                        \
     112                                        defaultValue: 'gcc-6',                                                          \
     113                                ],                                                                                              \
     114                                [$class: 'ChoiceParameterDefinition',                                           \
     115                                        description: 'The target architecture',                                 \
     116                                        name: 'pArchitecture',                                                          \
     117                                        choices: 'x64\nx86',                                                            \
     118                                        defaultValue: 'x64',                                                            \
     119                                ],                                                                                              \
     120                                [$class: 'BooleanParameterDefinition',                                                  \
     121                                        description: 'If false, only the quick test suite is ran',              \
     122                                        name: 'pRunAllTests',                                                           \
     123                                        defaultValue: false,                                                            \
     124                                ],                                                                                              \
     125                                [$class: 'BooleanParameterDefinition',                                                  \
     126                                        description: 'If true, jenkins also runs benchmarks',           \
     127                                        name: 'pRunBenchmark',                                                          \
     128                                        defaultValue: true,                                                             \
     129                                ],                                                                                              \
     130                                [$class: 'BooleanParameterDefinition',                                                  \
     131                                        description: 'If true, jenkins also builds documentation',              \
     132                                        name: 'pBuildDocumentation',                                                            \
     133                                        defaultValue: true,                                                             \
     134                                ],                                                                                              \
     135                                [$class: 'BooleanParameterDefinition',                                                  \
     136                                        description: 'If true, jenkins also publishes results',                 \
     137                                        name: 'pPublish',                                                               \
     138                                        defaultValue: true,                                                             \
     139                                ],                                                                                              \
     140                                [$class: 'BooleanParameterDefinition',                                                  \
     141                                        description: 'If true, jenkins will not send emails',           \
     142                                        name: 'pSilent',                                                \
     143                                        defaultValue: false,                                                            \
     144                                ],                                                                                              \
     145                        ],
     146                ]])
     147
     148        compiler                = compiler_from_params( pCompiler )
     149        architecture    = architecture_from_params( pArchitecture )
     150
     151        do_alltests             = (pRunAllTests == 'true')
     152        do_benchmark    = (pRunBenchmark == 'true')
     153        do_doc          = (pBuildDocumentation == 'true')
     154        do_publish              = (pPublish == 'true')
     155        do_sendemail    = ! (pSilent == 'true')
     156
     157        echo """Compiler                : ${compiler.cc_name} (${compiler.cpp_cc}/${compiler.cfa_cc})
     158Architecture            : ${architecture}
     159Run All Tests           : ${ pRunAllTests.toString() }
     160Run Benchmark           : ${ pRunBenchmark.toString() }
     161Build Documentation     : ${ pBuildDocumentation.toString() }
     162Publish         : ${ pPublish.toString() }
     163Silent                  : ${ pSilent.toString() }
     164"""
     165
     166        collect_git_info()
     167}
     168
     169def build_stage(String name) {
     170        stage_name = name
     171        stage name
     172}
     173
     174def notify_server() {
     175        sh 'curl --silent -X POST http://plg2:8082/jenkins/notify > /dev/null'
     176        return
     177}
     178
     179def make_doc() {
     180        def err = null
     181        try {
     182                sh 'make clean > /dev/null'
     183                sh 'make > /dev/null 2>&1'
     184        }
     185        catch (Exception caughtError) {
     186                err = caughtError //rethrow error later
     187                sh 'cat *.log'
     188        }
     189        finally {
     190                if (err) throw err // Must re-throw exception to propagate error
     191        }
     192}
     193
     194//Description of a compiler (Must be serializable since pipelines are persistent)
     195class CC_Desc implements Serializable {
     196        public String cc_name
     197        public String cpp_cc
     198        public String cfa_cc
     199
     200        CC_Desc(String cc_name, String cpp_cc, String cfa_cc) {
     201                this.cc_name = cc_name
     202                this.cpp_cc = cpp_cc
     203                this.cfa_cc = cfa_cc
     204        }
     205}
     206
     207def compiler_from_params(cc) {
     208        switch( cc ) {
     209                case 'gcc-6':
     210                        return new CC_Desc('gcc-6', 'g++-6', 'gcc-6')
     211                break
     212                case 'gcc-5':
     213                        return new CC_Desc('gcc-5', 'g++-5', 'gcc-5')
     214                break
     215                case 'gcc-4.9':
     216                        return new CC_Desc('gcc-4.9', 'g++-4.9', 'gcc-4.9')
     217                break
     218                case 'clang':
     219                        return new CC_Desc('clang', 'clang++', 'gcc-6')
     220                break
     221                default :
     222                        error "Unhandled compiler : ${cc}"
     223        }
     224}
     225
     226def architecture_from_params( arch ) {
     227        switch( arch ) {
     228                case 'x64':
     229                        return '--host=x86_64 CXXFLAGS="-m64" CFAFLAGS="-m64"'
     230                break
     231                case 'x86':
     232                        return '--host=i386   CXXFLAGS="-m32" CFAFLAGS="-m32"'
     233                break
     234                default :
     235                        error "Unhandled architecture : ${arch}"
     236        }
     237}
     238
     239//===========================================================================================================
     240// Main compilation routines
     241//===========================================================================================================
     242//Compilation script is done here but environnement set-up and error handling is done in main loop
     243def checkout() {
     244        build_stage'Checkout'
     245                //checkout the source code and clean the repo
     246                checkout scm
     247
     248                //Clean all temporary files to make sure no artifacts of the previous build remain
     249                sh 'git clean -fdqx'
     250
     251                //Reset the git repo so no local changes persist
     252                sh 'git reset --hard'
     253}
     254
     255def build() {
     256        build_stage'Build'
     257       
     258                def install_dir = pwd tmp: true
     259               
     260                //Configure the conpilation (Output is not relevant)
     261                //Use the current directory as the installation target so nothing
     262                //escapes the sandbox
     263                //Also specify the compiler by hand
     264                sh "./configure CXX=${compiler.cpp_cc} ${architecture} --with-backend-compiler=${compiler.cfa_cc} --prefix=${install_dir} --enable-silent-rules --quiet"
     265
     266                //Compile the project
     267                sh 'make -j 8 --no-print-directory V=0 install'
     268}
     269
     270def test() {
     271        build_stage'Test'
     272
     273                //Run the tests from the tests directory
     274                if ( do_alltests ) {
     275                        sh 'make -C src/tests all-tests debug=yes'
     276                        sh 'make -C src/tests all-tests debug=no'
     277                }
     278                else {
     279                        sh 'make -C src/tests'
     280                }
     281}
     282
     283def benchmark() {
     284        build_stage'Benchmark'
     285
     286                if( !do_benchmark ) return
     287
     288                //Write the commit id to Benchmark
     289                writeFile  file: 'bench.csv', text:'data=' + gitRefNewValue + ','
     290 
     291                //Append bench results
     292                sh 'make -C src/benchmark --no-print-directory csv-data >> bench.csv'
     293}
     294
     295def clean() {
     296        build_stage'Cleanup'
     297
     298                //do a maintainer-clean to make sure we need to remake from scratch
     299                sh 'make maintainer-clean > /dev/null'
     300}
     301
     302def build_doc() {
     303        build_stage'Documentation'
     304
     305                if( !do_doc ) return
     306
     307                dir ('doc/user') {
     308                        make_doc()
     309                }
     310
     311                dir ('doc/refrat') {
     312                        make_doc()
     313                }
     314}
     315
     316def publish() {
     317        build_stage'Publish'
     318
     319                if( !do_publish ) return
     320
     321                //Then publish the results
     322                sh 'curl --silent --data @bench.csv http://plg2:8082/jenkins/publish > /dev/null'
    245323}
    246324
  • src/CodeTools/DeclStats.cc

    rc00ddfe r255b294  
    6262                        std::map<unsigned, unsigned> p_basic;  ///< Count of decls with each percentage of basic type elements
    6363                        std::map<unsigned, unsigned> p_poly;   ///< Count of decls with each percentage of polymorphic elements
     64                        VectorMap<unsigned> n_types;           ///< Count of decls with each number of distinct types in the pack
    6465
    6566                        ArgPackStats& operator+= (const ArgPackStats& o) {
     
    6970                                sum(p_basic, o.p_basic);
    7071                                sum(p_poly, o.p_poly);
     72                                sum(n_types, o.n_types);
    7173                               
    7274                                return *this;
     
    121123                /// Update arg pack stats based on a declaration list
    122124                void analyze( Stats& stats, ArgPackStats& pstats, std::list<DeclarationWithType*>& decls ) {
     125                        std::unordered_set<std::string> types;
    123126                        unsigned n = 0;
    124127                        unsigned n_basic = 0;
    125128                        unsigned n_poly = 0;
    126129                        for ( auto decl : decls ) {
    127                                 n += decl->get_type()->size();
    128                                 if ( BasicType* bt = dynamic_cast<BasicType*>( decl->get_type() ) ) {
     130                                Type* dt = decl->get_type();
     131
     132                                n += dt->size();
     133                               
     134                                std::stringstream ss;
     135                                dt->print( ss );
     136                                types.insert( ss.str() );
     137
     138                                if ( dynamic_cast<BasicType*>( dt ) ) {
    129139                                        ++n_basic;
    130                                         std::stringstream ss;
    131                                         bt->print( ss );
    132140                                        ++stats.basic_type_names[ ss.str() ];
    133                                 } else if ( GenPoly::hasPolyBase( decl->get_type() ) ) {
     141                                } else if ( GenPoly::hasPolyBase( dt ) ) {
    134142                                        ++n_poly;
    135143                                } else {
    136                                         std::stringstream ss;
    137                                         decl->get_type()->print( ss );
    138144                                        ++stats.compound_type_names[ ss.str() ];
    139145                                }
     
    146152                                ++pstats.p_poly[ n_poly*100/n ];
    147153                        }
     154                        ++pstats.n_types.at( types.size() );
    148155                }
    149156               
     
    267274                        printAllMap("%_basic_" + name, [&extract](const Stats& stats) { return extract(stats).p_basic; });
    268275                        printAllMap("%_poly_" + name, [&extract](const Stats& stats) { return extract(stats).p_poly; });
     276                        printAllMap("n_distinct_types_" + name, [&extract](const Stats& stats) { return extract(stats).n_types; });
    269277                }
    270278               
  • src/Parser/DeclarationNode.cc

    rc00ddfe r255b294  
    1010// Created On       : Sat May 16 12:34:05 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Feb 16 13:06:50 2017
    13 // Update Count     : 753
     12// Last Modified On : Thu Feb 23 15:45:02 2017
     13// Update Count     : 759
    1414//
    1515
     
    174174        } // if
    175175
    176         if ( body ) {
    177                 newnode->type->function.hasBody = true;
    178         } // if
    179 
    180176        if ( ret ) {
    181177                newnode->type->base = ret->type;
     
    259255} // DeclarationNode::newAggregate
    260256
    261 DeclarationNode * DeclarationNode::newEnum( string * name, DeclarationNode * constants ) {
     257DeclarationNode * DeclarationNode::newEnum( string * name, DeclarationNode * constants, bool body ) {
    262258        DeclarationNode * newnode = new DeclarationNode;
    263259        newnode->type = new TypeData( TypeData::Enum );
     
    268264        } // if
    269265        newnode->type->enumeration.constants = constants;
     266        newnode->type->enumeration.body = body;
    270267        return newnode;
    271268} // DeclarationNode::newEnum
     
    698695        assert( ! type->function.body );
    699696        type->function.body = body;
    700         type->function.hasBody = true;
    701697        return this;
    702698}
     
    10401036        switch ( type->kind ) {
    10411037          case TypeData::Enum: {
    1042                   EnumDecl * typedecl = buildEnum( type, attributes );
    1043                   return new EnumInstType( buildQualifiers( type ), typedecl );
     1038                  if ( type->enumeration.body ) {
     1039                          EnumDecl * typedecl = buildEnum( type, attributes );
     1040                          return new EnumInstType( buildQualifiers( type ), typedecl );
     1041                  } else {
     1042                          return new EnumInstType( buildQualifiers( type ), *type->enumeration.name );
     1043                  }
    10441044          }
    10451045          case TypeData::Aggregate: {
    1046                   AggregateDecl * typedecl = buildAggregate( type, attributes );
    10471046                  ReferenceToType * ret;
    1048                   switch ( type->aggregate.kind ) {
    1049                         case DeclarationNode::Struct:
    1050                           ret = new StructInstType( buildQualifiers( type ), (StructDecl *)typedecl );
    1051                           break;
    1052                         case DeclarationNode::Union:
    1053                           ret = new UnionInstType( buildQualifiers( type ), (UnionDecl *)typedecl );
    1054                           break;
    1055                         case DeclarationNode::Trait:
    1056                           assert( false );
    1057                           //ret = new TraitInstType( buildQualifiers( type ), (TraitDecl *)typedecl );
    1058                           break;
    1059                         default:
    1060                           assert( false );
    1061                   } // switch
     1047                  if ( type->aggregate.body ) {
     1048                          AggregateDecl * typedecl = buildAggregate( type, attributes );
     1049                          switch ( type->aggregate.kind ) {
     1050                                case DeclarationNode::Struct:
     1051                                  ret = new StructInstType( buildQualifiers( type ), (StructDecl *)typedecl );
     1052                                  break;
     1053                                case DeclarationNode::Union:
     1054                                  ret = new UnionInstType( buildQualifiers( type ), (UnionDecl *)typedecl );
     1055                                  break;
     1056                                case DeclarationNode::Trait:
     1057                                  assert( false );
     1058                                  //ret = new TraitInstType( buildQualifiers( type ), (TraitDecl *)typedecl );
     1059                                  break;
     1060                                default:
     1061                                  assert( false );
     1062                          } // switch
     1063                  } else {
     1064                          switch ( type->aggregate.kind ) {
     1065                                case DeclarationNode::Struct:
     1066                                  ret = new StructInstType( buildQualifiers( type ), *type->aggregate.name );
     1067                                  break;
     1068                                case DeclarationNode::Union:
     1069                                  ret = new UnionInstType( buildQualifiers( type ), *type->aggregate.name );
     1070                                  break;
     1071                                case DeclarationNode::Trait:
     1072                                  assert( false );
     1073                                  //ret = new TraitInstType( buildQualifiers( type ), (TraitDecl *)typedecl );
     1074                                  break;
     1075                                default:
     1076                                  assert( false );
     1077                          } // switch
     1078                  } // if
    10621079                  buildList( type->aggregate.actuals, ret->get_parameters() );
    10631080                  return ret;
  • src/Parser/ParseNode.h

    rc00ddfe r255b294  
    1010// Created On       : Sat May 16 13:28:16 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Feb 16 13:15:55 2017
    13 // Update Count     : 661
     12// Last Modified On : Thu Feb 23 15:22:10 2017
     13// Update Count     : 662
    1414//
    1515
     
    238238        static DeclarationNode * newFromTypedef( std::string * );
    239239        static DeclarationNode * newAggregate( Aggregate kind, const std::string * name, ExpressionNode * actuals, DeclarationNode * fields, bool body );
    240         static DeclarationNode * newEnum( std::string * name, DeclarationNode * constants );
     240        static DeclarationNode * newEnum( std::string * name, DeclarationNode * constants, bool body );
    241241        static DeclarationNode * newEnumConstant( std::string * name, ExpressionNode * constant );
    242242        static DeclarationNode * newName( std::string * );
  • src/Parser/TypeData.cc

    rc00ddfe r255b294  
    1010// Created On       : Sat May 16 15:12:51 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sun Feb 19 09:49:33 2017
    13 // Update Count     : 467
     12// Last Modified On : Thu Feb 23 16:26:39 2017
     13// Update Count     : 477
    1414//
    1515
     
    4848                function.oldDeclList = nullptr;
    4949                function.body = nullptr;
    50                 function.hasBody = false;
    5150                function.newStyle = false;
    5251                break;
     
    6867                enumeration.name = nullptr;
    6968                enumeration.constants = nullptr;
     69                enumeration.body = false;
    7070                break;
    7171          case Symbolic:
     
    182182                newtype->function.oldDeclList = maybeClone( function.oldDeclList );
    183183                newtype->function.body = maybeClone( function.body );
    184                 newtype->function.hasBody = function.hasBody;
    185184                newtype->function.newStyle = function.newStyle;
    186185                break;
     
    200199                newtype->enumeration.name = enumeration.name ? new string( *enumeration.name ) : nullptr;
    201200                newtype->enumeration.constants = maybeClone( enumeration.constants );
     201                newtype->enumeration.body = enumeration.body;
    202202                break;
    203203          case Symbolic:
     
    293293                } // if
    294294                os << endl;
    295                 if ( function.hasBody ) {
     295                if ( function.body ) {
    296296                        os << string( indent + 2, ' ' ) << "with body " << endl;
    297                 } // if
    298                 if ( function.body ) {
    299297                        function.body->printList( os, indent + 2 );
    300298                } // if
     
    335333                        os << "with constants" << endl;
    336334                        enumeration.constants->printList( os, indent + 2 );
     335                } // if
     336                if ( enumeration.body ) {
     337                        os << string( indent + 2, ' ' ) << " with body " << endl;
    337338                } // if
    338339                break;
     
    696697                } // if
    697698        } // for
     699        ret->set_body( td->enumeration.body );
    698700        return ret;
    699701} // buildEnum
     
    724726Declaration * buildDecl( const TypeData * td, const string &name, DeclarationNode::StorageClass sc, Expression * bitfieldWidth, bool isInline, bool isNoreturn, LinkageSpec::Spec linkage, ConstantExpr *asmName, Initializer * init, std::list< Attribute * > attributes ) {
    725727        if ( td->kind == TypeData::Function ) {
    726                 if ( td->function.idList ) {
    727                         buildKRFunction( td->function );
     728                if ( td->function.idList ) {                                    // KR function ?
     729                        buildKRFunction( td->function );                        // transform into C11 function
    728730                } // if
    729731
    730732                FunctionDecl * decl;
    731                 if ( td->function.hasBody ) {
    732                         if ( td->function.body ) {
    733                                 Statement * stmt = td->function.body->build();
    734                                 CompoundStmt * body = dynamic_cast< CompoundStmt* >( stmt );
    735                                 assert( body );
    736                                 decl = new FunctionDecl( name, sc, linkage, buildFunction( td ), body, isInline, isNoreturn, attributes );
    737                         } else {
    738                                 // list< Label > ls;
    739                                 decl = new FunctionDecl( name, sc, linkage, buildFunction( td ), new CompoundStmt( list< Label >() ), isInline, isNoreturn, attributes );
    740                         } // if
    741                 } else {
    742                         decl = new FunctionDecl( name, sc, linkage, buildFunction( td ), nullptr, isInline, isNoreturn, attributes );
    743                 } // if
     733                Statement * stmt = maybeBuild<Statement>( td->function.body );
     734                CompoundStmt * body = dynamic_cast< CompoundStmt* >( stmt );
     735                decl = new FunctionDecl( name, sc, linkage, buildFunction( td ), body, isInline, isNoreturn, attributes );
    744736                return decl->set_asmName( asmName );
    745737        } else if ( td->kind == TypeData::Aggregate ) {
     
    816808
    817809        for ( DeclarationNode * param = function.idList; param != nullptr; param = dynamic_cast< DeclarationNode* >( param->get_next() ) ) {
    818                 if ( ! param->type ) {                                                  // generate type int for empty parameters
     810                if ( ! param->type ) {                                                  // generate type int for empty parameter type
    819811                        param->type = new TypeData( TypeData::Basic );
    820812                        param->type->basictype = DeclarationNode::Int;
  • src/Parser/TypeData.h

    rc00ddfe r255b294  
    1010// Created On       : Sat May 16 15:18:36 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Feb 16 14:30:05 2017
    13 // Update Count     : 153
     12// Last Modified On : Thu Feb 23 15:16:18 2017
     13// Update Count     : 155
    1414//
    1515
     
    4949                const std::string * name;
    5050                DeclarationNode * constants;
     51                bool body;
    5152        };
    5253
     
    5657                mutable DeclarationNode * oldDeclList;
    5758                StatementNode * body;
    58                 bool hasBody;
    5959                bool newStyle;
    6060        };
  • src/Parser/parser.cc

    rc00ddfe r255b294  
    72927292/* Line 1806 of yacc.c  */
    72937293#line 1651 "parser.yy"
    7294     { (yyval.decl) = DeclarationNode::newEnum( nullptr, (yyvsp[(4) - (6)].decl) )->addQualifiers( (yyvsp[(2) - (6)].decl) ); }
     7294    { (yyval.decl) = DeclarationNode::newEnum( nullptr, (yyvsp[(4) - (6)].decl), true )->addQualifiers( (yyvsp[(2) - (6)].decl) ); }
    72957295    break;
    72967296
     
    73017301    {
    73027302                        typedefTable.makeTypedef( *(yyvsp[(3) - (3)].tok) );
    7303                         (yyval.decl) = DeclarationNode::newEnum( (yyvsp[(3) - (3)].tok), 0 )->addQualifiers( (yyvsp[(2) - (3)].decl) );
     7303                        (yyval.decl) = DeclarationNode::newEnum( (yyvsp[(3) - (3)].tok), 0, false )->addQualifiers( (yyvsp[(2) - (3)].decl) );
    73047304                }
    73057305    break;
     
    73167316/* Line 1806 of yacc.c  */
    73177317#line 1660 "parser.yy"
    7318     { (yyval.decl) = DeclarationNode::newEnum( (yyvsp[(3) - (8)].tok), (yyvsp[(6) - (8)].decl) )->addQualifiers( (yyvsp[(2) - (8)].decl) ); }
     7318    { (yyval.decl) = DeclarationNode::newEnum( (yyvsp[(3) - (8)].tok), (yyvsp[(6) - (8)].decl), true )->addQualifiers( (yyvsp[(2) - (8)].decl) ); }
    73197319    break;
    73207320
  • src/Parser/parser.yy

    rc00ddfe r255b294  
    1010// Created On       : Sat Sep  1 20:22:55 2001
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Feb 16 15:56:33 2017
    13 // Update Count     : 2186
     12// Last Modified On : Thu Feb 23 15:23:49 2017
     13// Update Count     : 2187
    1414//
    1515
     
    16491649enum_type:
    16501650        ENUM attribute_list_opt '{' enumerator_list comma_opt '}'
    1651                 { $$ = DeclarationNode::newEnum( nullptr, $4 )->addQualifiers( $2 ); }
     1651                { $$ = DeclarationNode::newEnum( nullptr, $4, true )->addQualifiers( $2 ); }
    16521652        | ENUM attribute_list_opt no_attr_identifier_or_type_name
    16531653                {
    16541654                        typedefTable.makeTypedef( *$3 );
    1655                         $$ = DeclarationNode::newEnum( $3, 0 )->addQualifiers( $2 );
     1655                        $$ = DeclarationNode::newEnum( $3, 0, false )->addQualifiers( $2 );
    16561656                }
    16571657        | ENUM attribute_list_opt no_attr_identifier_or_type_name
    16581658                { typedefTable.makeTypedef( *$3 ); }
    16591659          '{' enumerator_list comma_opt '}'
    1660                 { $$ = DeclarationNode::newEnum( $3, $6 )->addQualifiers( $2 ); }
     1660                { $$ = DeclarationNode::newEnum( $3, $6, true )->addQualifiers( $2 ); }
    16611661        ;
    16621662
  • src/benchmark/Makefile.am

    rc00ddfe r255b294  
    2424bench :
    2525        @for ccflags in "-debug" "-nodebug"; do \
    26                 echo ${CC} ${AM_CFLAGS} ${CFLAGS} $${ccflags} -lrt bench.c;\
     26                echo ${CC} ${AM_CFLAGS} ${CFLAGS} ${ccflags} @CFA_FLAGS@ -lrt bench.c;\
    2727                ${CC} ${AM_CFLAGS} ${CFLAGS} $${ccflags} -lrt bench.c;\
    2828                ./a.out ; \
     
    3131
    3232ctxswitch-coroutine:
    33         ${CC} ${AM_CFLAGS} ${CFLAGS} $${ccflags} -nodebug -lrt -DN=10000000 CorCtxSwitch.c
     33        ${CC} ${AM_CFLAGS} ${CFLAGS} ${ccflags} @CFA_FLAGS@ -nodebug -lrt -DN=10000000 CorCtxSwitch.c
    3434        @for number in 1 2 3 4 5 6 7 8 9 10; do \
    3535                ./a.out ; \
     
    3838
    3939ctxswitch-thread:
    40         ${CC} ${AM_CFLAGS} ${CFLAGS} $${ccflags} -nodebug -lrt -DN=10000000 ThrdCtxSwitch.c
     40        ${CC} ${AM_CFLAGS} ${CFLAGS} ${ccflags} @CFA_FLAGS@ -nodebug -lrt -DN=10000000 ThrdCtxSwitch.c
    4141        @for number in 1 2 3 4 5 6 7 8 9 10; do \
    4242                ./a.out ; \
     
    4545
    4646csv-data:
    47         @${CC} ${AM_CFLAGS} ${CFLAGS} $${ccflags} -nodebug -lrt -quiet -DN=10000000 csv-data.c
     47        @${CC} ${AM_CFLAGS} ${CFLAGS} ${ccflags} @CFA_FLAGS@ -nodebug -lrt -quiet -DN=10000000 csv-data.c
    4848        @./a.out
    4949        @rm -f ./a.out
  • src/benchmark/Makefile.in

    rc00ddfe r255b294  
    471471bench :
    472472        @for ccflags in "-debug" "-nodebug"; do \
    473                 echo ${CC} ${AM_CFLAGS} ${CFLAGS} $${ccflags} -lrt bench.c;\
     473                echo ${CC} ${AM_CFLAGS} ${CFLAGS} ${ccflags} @CFA_FLAGS@ -lrt bench.c;\
    474474                ${CC} ${AM_CFLAGS} ${CFLAGS} $${ccflags} -lrt bench.c;\
    475475                ./a.out ; \
     
    478478
    479479ctxswitch-coroutine:
    480         ${CC} ${AM_CFLAGS} ${CFLAGS} $${ccflags} -nodebug -lrt -DN=10000000 CorCtxSwitch.c
     480        ${CC} ${AM_CFLAGS} ${CFLAGS} ${ccflags} @CFA_FLAGS@ -nodebug -lrt -DN=10000000 CorCtxSwitch.c
    481481        @for number in 1 2 3 4 5 6 7 8 9 10; do \
    482482                ./a.out ; \
     
    485485
    486486ctxswitch-thread:
    487         ${CC} ${AM_CFLAGS} ${CFLAGS} $${ccflags} -nodebug -lrt -DN=10000000 ThrdCtxSwitch.c
     487        ${CC} ${AM_CFLAGS} ${CFLAGS} ${ccflags} @CFA_FLAGS@ -nodebug -lrt -DN=10000000 ThrdCtxSwitch.c
    488488        @for number in 1 2 3 4 5 6 7 8 9 10; do \
    489489                ./a.out ; \
     
    492492
    493493csv-data:
    494         @${CC} ${AM_CFLAGS} ${CFLAGS} $${ccflags} -nodebug -lrt -quiet -DN=10000000 csv-data.c
     494        @${CC} ${AM_CFLAGS} ${CFLAGS} ${ccflags} @CFA_FLAGS@ -nodebug -lrt -quiet -DN=10000000 csv-data.c
    495495        @./a.out
    496496        @rm -f ./a.out
  • src/benchmark/csv-data.c

    rc00ddfe r255b294  
    33#include <threads>
    44
     5extern "C" {
    56#include <unistd.h>                                     // sysconf
    67#include <sys/times.h>                                  // times
    78#include <time.h>
     9}
    810
    911inline unsigned long long int Time() {
     
    8486int main()
    8587{
    86         sout | time(NULL) | "," | measure_coroutine() | "," | measure_thread() | endl;
     88        sout | time(NULL) | ',' | measure_coroutine() | ',' | measure_thread() | endl;
    8789}
  • src/examples/multicore.c

    rc00ddfe r255b294  
    1919                processor p;
    2020                {
    21                         scoped(MyThread) f1;
    22                         scoped(MyThread) f2;
    23                         scoped(MyThread) f3;
    24                         scoped(MyThread) f4;
     21                        scoped(MyThread) f[4];
    2522                }
    2623        }
  • src/libcfa/Makefile.am

    rc00ddfe r255b294  
    4444# not all platforms support concurrency, add option do disable it
    4545if BUILD_CONCURRENCY
    46 headers += containers/vector concurrency/coroutines concurrency/threads concurrency/kernel
     46headers += containers/vector concurrency/coroutines concurrency/threads concurrency/kernel concurrency/monitor
    4747endif
    4848
  • src/libcfa/Makefile.in

    rc00ddfe r255b294  
    4343
    4444# not all platforms support concurrency, add option do disable it
    45 @BUILD_CONCURRENCY_TRUE@am__append_3 = containers/vector concurrency/coroutines concurrency/threads concurrency/kernel
     45@BUILD_CONCURRENCY_TRUE@am__append_3 = containers/vector concurrency/coroutines concurrency/threads concurrency/kernel concurrency/monitor
    4646
    4747# not all platforms support concurrency, add option do disable it
     
    101101        containers/vector.c concurrency/coroutines.c \
    102102        concurrency/threads.c concurrency/kernel.c \
    103         concurrency/CtxSwitch-@MACHINE_TYPE@.S concurrency/invoke.c
     103        concurrency/monitor.c concurrency/CtxSwitch-@MACHINE_TYPE@.S \
     104        concurrency/invoke.c
    104105am__dirstamp = $(am__leading_dot)dirstamp
    105106@BUILD_CONCURRENCY_TRUE@am__objects_1 = containers/libcfa_d_a-vector.$(OBJEXT) \
    106107@BUILD_CONCURRENCY_TRUE@        concurrency/libcfa_d_a-coroutines.$(OBJEXT) \
    107108@BUILD_CONCURRENCY_TRUE@        concurrency/libcfa_d_a-threads.$(OBJEXT) \
    108 @BUILD_CONCURRENCY_TRUE@        concurrency/libcfa_d_a-kernel.$(OBJEXT)
     109@BUILD_CONCURRENCY_TRUE@        concurrency/libcfa_d_a-kernel.$(OBJEXT) \
     110@BUILD_CONCURRENCY_TRUE@        concurrency/libcfa_d_a-monitor.$(OBJEXT)
    109111am__objects_2 = libcfa_d_a-limits.$(OBJEXT) \
    110112        libcfa_d_a-stdlib.$(OBJEXT) libcfa_d_a-math.$(OBJEXT) \
     
    124126        containers/vector.c concurrency/coroutines.c \
    125127        concurrency/threads.c concurrency/kernel.c \
    126         concurrency/CtxSwitch-@MACHINE_TYPE@.S concurrency/invoke.c
     128        concurrency/monitor.c concurrency/CtxSwitch-@MACHINE_TYPE@.S \
     129        concurrency/invoke.c
    127130@BUILD_CONCURRENCY_TRUE@am__objects_5 =  \
    128131@BUILD_CONCURRENCY_TRUE@        containers/libcfa_a-vector.$(OBJEXT) \
    129132@BUILD_CONCURRENCY_TRUE@        concurrency/libcfa_a-coroutines.$(OBJEXT) \
    130133@BUILD_CONCURRENCY_TRUE@        concurrency/libcfa_a-threads.$(OBJEXT) \
    131 @BUILD_CONCURRENCY_TRUE@        concurrency/libcfa_a-kernel.$(OBJEXT)
     134@BUILD_CONCURRENCY_TRUE@        concurrency/libcfa_a-kernel.$(OBJEXT) \
     135@BUILD_CONCURRENCY_TRUE@        concurrency/libcfa_a-monitor.$(OBJEXT)
    132136am__objects_6 = libcfa_a-limits.$(OBJEXT) libcfa_a-stdlib.$(OBJEXT) \
    133137        libcfa_a-math.$(OBJEXT) libcfa_a-iostream.$(OBJEXT) \
     
    172176        fstream iterator rational assert containers/vector \
    173177        concurrency/coroutines concurrency/threads concurrency/kernel \
    174         ${shell echo stdhdr/*} concurrency/invoke.h
     178        concurrency/monitor ${shell echo stdhdr/*} \
     179        concurrency/invoke.h
    175180HEADERS = $(nobase_cfa_include_HEADERS)
    176181ETAGS = etags
     
    398403concurrency/libcfa_d_a-kernel.$(OBJEXT): concurrency/$(am__dirstamp) \
    399404        concurrency/$(DEPDIR)/$(am__dirstamp)
     405concurrency/libcfa_d_a-monitor.$(OBJEXT): concurrency/$(am__dirstamp) \
     406        concurrency/$(DEPDIR)/$(am__dirstamp)
    400407concurrency/CtxSwitch-@MACHINE_TYPE@.$(OBJEXT):  \
    401408        concurrency/$(am__dirstamp) \
     
    416423concurrency/libcfa_a-kernel.$(OBJEXT): concurrency/$(am__dirstamp) \
    417424        concurrency/$(DEPDIR)/$(am__dirstamp)
     425concurrency/libcfa_a-monitor.$(OBJEXT): concurrency/$(am__dirstamp) \
     426        concurrency/$(DEPDIR)/$(am__dirstamp)
    418427concurrency/libcfa_a-invoke.$(OBJEXT): concurrency/$(am__dirstamp) \
    419428        concurrency/$(DEPDIR)/$(am__dirstamp)
     
    429438        -rm -f concurrency/libcfa_a-invoke.$(OBJEXT)
    430439        -rm -f concurrency/libcfa_a-kernel.$(OBJEXT)
     440        -rm -f concurrency/libcfa_a-monitor.$(OBJEXT)
    431441        -rm -f concurrency/libcfa_a-threads.$(OBJEXT)
    432442        -rm -f concurrency/libcfa_d_a-coroutines.$(OBJEXT)
    433443        -rm -f concurrency/libcfa_d_a-invoke.$(OBJEXT)
    434444        -rm -f concurrency/libcfa_d_a-kernel.$(OBJEXT)
     445        -rm -f concurrency/libcfa_d_a-monitor.$(OBJEXT)
    435446        -rm -f concurrency/libcfa_d_a-threads.$(OBJEXT)
    436447        -rm -f containers/libcfa_a-vector.$(OBJEXT)
     
    462473@AMDEP_TRUE@@am__include@ @am__quote@concurrency/$(DEPDIR)/libcfa_a-invoke.Po@am__quote@
    463474@AMDEP_TRUE@@am__include@ @am__quote@concurrency/$(DEPDIR)/libcfa_a-kernel.Po@am__quote@
     475@AMDEP_TRUE@@am__include@ @am__quote@concurrency/$(DEPDIR)/libcfa_a-monitor.Po@am__quote@
    464476@AMDEP_TRUE@@am__include@ @am__quote@concurrency/$(DEPDIR)/libcfa_a-threads.Po@am__quote@
    465477@AMDEP_TRUE@@am__include@ @am__quote@concurrency/$(DEPDIR)/libcfa_d_a-coroutines.Po@am__quote@
    466478@AMDEP_TRUE@@am__include@ @am__quote@concurrency/$(DEPDIR)/libcfa_d_a-invoke.Po@am__quote@
    467479@AMDEP_TRUE@@am__include@ @am__quote@concurrency/$(DEPDIR)/libcfa_d_a-kernel.Po@am__quote@
     480@AMDEP_TRUE@@am__include@ @am__quote@concurrency/$(DEPDIR)/libcfa_d_a-monitor.Po@am__quote@
    468481@AMDEP_TRUE@@am__include@ @am__quote@concurrency/$(DEPDIR)/libcfa_d_a-threads.Po@am__quote@
    469482@AMDEP_TRUE@@am__include@ @am__quote@containers/$(DEPDIR)/libcfa_a-vector.Po@am__quote@
     
    677690@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o concurrency/libcfa_d_a-kernel.obj `if test -f 'concurrency/kernel.c'; then $(CYGPATH_W) 'concurrency/kernel.c'; else $(CYGPATH_W) '$(srcdir)/concurrency/kernel.c'; fi`
    678691
     692concurrency/libcfa_d_a-monitor.o: concurrency/monitor.c
     693@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT concurrency/libcfa_d_a-monitor.o -MD -MP -MF concurrency/$(DEPDIR)/libcfa_d_a-monitor.Tpo -c -o concurrency/libcfa_d_a-monitor.o `test -f 'concurrency/monitor.c' || echo '$(srcdir)/'`concurrency/monitor.c
     694@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) concurrency/$(DEPDIR)/libcfa_d_a-monitor.Tpo concurrency/$(DEPDIR)/libcfa_d_a-monitor.Po
     695@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='concurrency/monitor.c' object='concurrency/libcfa_d_a-monitor.o' libtool=no @AMDEPBACKSLASH@
     696@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     697@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o concurrency/libcfa_d_a-monitor.o `test -f 'concurrency/monitor.c' || echo '$(srcdir)/'`concurrency/monitor.c
     698
     699concurrency/libcfa_d_a-monitor.obj: concurrency/monitor.c
     700@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT concurrency/libcfa_d_a-monitor.obj -MD -MP -MF concurrency/$(DEPDIR)/libcfa_d_a-monitor.Tpo -c -o concurrency/libcfa_d_a-monitor.obj `if test -f 'concurrency/monitor.c'; then $(CYGPATH_W) 'concurrency/monitor.c'; else $(CYGPATH_W) '$(srcdir)/concurrency/monitor.c'; fi`
     701@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) concurrency/$(DEPDIR)/libcfa_d_a-monitor.Tpo concurrency/$(DEPDIR)/libcfa_d_a-monitor.Po
     702@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='concurrency/monitor.c' object='concurrency/libcfa_d_a-monitor.obj' libtool=no @AMDEPBACKSLASH@
     703@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     704@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o concurrency/libcfa_d_a-monitor.obj `if test -f 'concurrency/monitor.c'; then $(CYGPATH_W) 'concurrency/monitor.c'; else $(CYGPATH_W) '$(srcdir)/concurrency/monitor.c'; fi`
     705
    679706concurrency/libcfa_d_a-invoke.obj: concurrency/invoke.c
    680707@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT concurrency/libcfa_d_a-invoke.obj -MD -MP -MF concurrency/$(DEPDIR)/libcfa_d_a-invoke.Tpo -c -o concurrency/libcfa_d_a-invoke.obj `if test -f 'concurrency/invoke.c'; then $(CYGPATH_W) 'concurrency/invoke.c'; else $(CYGPATH_W) '$(srcdir)/concurrency/invoke.c'; fi`
     
    858885@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    859886@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o concurrency/libcfa_a-kernel.obj `if test -f 'concurrency/kernel.c'; then $(CYGPATH_W) 'concurrency/kernel.c'; else $(CYGPATH_W) '$(srcdir)/concurrency/kernel.c'; fi`
     887
     888concurrency/libcfa_a-monitor.o: concurrency/monitor.c
     889@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT concurrency/libcfa_a-monitor.o -MD -MP -MF concurrency/$(DEPDIR)/libcfa_a-monitor.Tpo -c -o concurrency/libcfa_a-monitor.o `test -f 'concurrency/monitor.c' || echo '$(srcdir)/'`concurrency/monitor.c
     890@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) concurrency/$(DEPDIR)/libcfa_a-monitor.Tpo concurrency/$(DEPDIR)/libcfa_a-monitor.Po
     891@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='concurrency/monitor.c' object='concurrency/libcfa_a-monitor.o' libtool=no @AMDEPBACKSLASH@
     892@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     893@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o concurrency/libcfa_a-monitor.o `test -f 'concurrency/monitor.c' || echo '$(srcdir)/'`concurrency/monitor.c
     894
     895concurrency/libcfa_a-monitor.obj: concurrency/monitor.c
     896@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT concurrency/libcfa_a-monitor.obj -MD -MP -MF concurrency/$(DEPDIR)/libcfa_a-monitor.Tpo -c -o concurrency/libcfa_a-monitor.obj `if test -f 'concurrency/monitor.c'; then $(CYGPATH_W) 'concurrency/monitor.c'; else $(CYGPATH_W) '$(srcdir)/concurrency/monitor.c'; fi`
     897@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) concurrency/$(DEPDIR)/libcfa_a-monitor.Tpo concurrency/$(DEPDIR)/libcfa_a-monitor.Po
     898@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='concurrency/monitor.c' object='concurrency/libcfa_a-monitor.obj' libtool=no @AMDEPBACKSLASH@
     899@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     900@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o concurrency/libcfa_a-monitor.obj `if test -f 'concurrency/monitor.c'; then $(CYGPATH_W) 'concurrency/monitor.c'; else $(CYGPATH_W) '$(srcdir)/concurrency/monitor.c'; fi`
    860901
    861902concurrency/libcfa_a-invoke.obj: concurrency/invoke.c
  • src/libcfa/concurrency/kernel.c

    rc00ddfe r255b294  
    456456
    457457void append( simple_thread_list * this, thread * t ) {
    458         assert( t->next == NULL );
     458        assert(this->tail != NULL);
    459459        *this->tail = t;
    460460        this->tail = &t->next;
     
    470470                head->next = NULL;
    471471        }       
    472        
    473472        return head;
    474473}
  • src/libcfa/concurrency/threads

    rc00ddfe r255b294  
    99//
    1010// Author           : Thierry Delisle
    11 // Created On       : Tue Jan 17 12:27:26 2016
     11// Created On       : Tue Jan 17 12:27:26 2017
    1212// Last Modified By : Thierry Delisle
    1313// Last Modified On : --
  • src/libcfa/concurrency/threads.c

    rc00ddfe r255b294  
    99//
    1010// Author           : Thierry Delisle
    11 // Created On       : Tue Jan 17 12:27:26 2016
     11// Created On       : Tue Jan 17 12:27:26 2017
    1212// Last Modified By : Thierry Delisle
    1313// Last Modified On : --
  • src/libcfa/stdlib

    rc00ddfe r255b294  
    1010// Created On       : Thu Jan 28 17:12:35 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Jul  6 14:28:55 2016
    13 // Update Count     : 99
     12// Last Modified On : Thu Feb 23 14:11:47 2017
     13// Update Count     : 100
    1414//
    1515
     
    5050forall( dtype T, ttype Params | sized(T) | { void ?{}(T *, Params); } ) T * new( Params p );
    5151forall( dtype T | { void ^?{}(T *); } ) void delete( T * ptr );
    52 
     52forall( dtype T, ttype Params | { void ^?{}(T *); void delete(Params); } ) void delete( T * ptr, Params rest );
    5353
    5454//---------------------------------------
  • src/libcfa/stdlib.c

    rc00ddfe r255b294  
    1010// Created On       : Thu Jan 28 17:10:29 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Jul  6 14:28:57 2016
    13 // Update Count     : 169
     12// Last Modified On : Thu Feb 23 14:11:29 2017
     13// Update Count     : 170
    1414//
    1515
     
    9191}
    9292
     93forall( dtype T, ttype Params | { void ^?{}(T *); void delete(Params); } )
     94void delete( T * ptr, Params rest ) {
     95        if ( ptr ) {
     96                ^ptr{};
     97                free( ptr );
     98        }
     99        delete( rest );
     100}
     101
    93102//---------------------------------------
    94103
  • src/prelude/prelude.cf

    rc00ddfe r255b294  
    5858long double _Complex    ?--( long double _Complex * ),          ?--( volatile long double _Complex * );
    5959
    60 forall( otype T ) T *                    ?++(                T ** );
    61 forall( otype T ) const T *              ?++( const          T ** );
    62 forall( otype T ) volatile T *           ?++(       volatile T ** );
    63 forall( otype T ) const volatile T *     ?++( const volatile T ** );
    64 forall( otype T ) T *                    ?--(                T ** );
    65 forall( otype T ) const T *              ?--( const          T ** );
    66 forall( otype T ) volatile T *           ?--(       volatile T ** );
    67 forall( otype T ) const volatile T *     ?--( const volatile T ** );
    68 
    69 forall( otype T ) lvalue T               ?[?](                T *,          ptrdiff_t );
    70 forall( otype T ) const lvalue T         ?[?]( const          T *,          ptrdiff_t );
    71 forall( otype T ) volatile lvalue T      ?[?](       volatile T *,          ptrdiff_t );
    72 forall( otype T ) const volatile lvalue T ?[?]( const volatile T *,         ptrdiff_t );
    73 forall( otype T ) lvalue T               ?[?](          ptrdiff_t,                T * );
    74 forall( otype T ) const lvalue T         ?[?](          ptrdiff_t, const          T * );
    75 forall( otype T ) volatile lvalue T      ?[?](          ptrdiff_t,       volatile T * );
    76 forall( otype T ) const volatile lvalue T ?[?](         ptrdiff_t, const volatile T * );
     60forall( dtype T | sized(T) ) T *                         ?++(                T ** );
     61forall( dtype T | sized(T) ) const T *           ?++( const          T ** );
     62forall( dtype T | sized(T) ) volatile T *                ?++(       volatile T ** );
     63forall( dtype T | sized(T) ) const volatile T *  ?++( const volatile T ** );
     64forall( dtype T | sized(T) ) T *                         ?--(                T ** );
     65forall( dtype T | sized(T) ) const T *           ?--( const          T ** );
     66forall( dtype T | sized(T) ) volatile T *                ?--(       volatile T ** );
     67forall( dtype T | sized(T) ) const volatile T *  ?--( const volatile T ** );
     68
     69forall( dtype T | sized(T) ) lvalue T            ?[?](                T *,          ptrdiff_t );
     70forall( dtype T | sized(T) ) const lvalue T      ?[?]( const          T *,          ptrdiff_t );
     71forall( dtype T | sized(T) ) volatile lvalue T   ?[?](       volatile T *,          ptrdiff_t );
     72forall( dtype T | sized(T) ) const volatile lvalue T ?[?]( const volatile T *,      ptrdiff_t );
     73forall( dtype T | sized(T) ) lvalue T            ?[?](          ptrdiff_t,                T * );
     74forall( dtype T | sized(T) ) const lvalue T      ?[?](          ptrdiff_t, const          T * );
     75forall( dtype T | sized(T) ) volatile lvalue T   ?[?](          ptrdiff_t,       volatile T * );
     76forall( dtype T | sized(T) ) const volatile lvalue T ?[?](              ptrdiff_t, const volatile T * );
    7777
    7878// ------------------------------------------------------------
     
    9696long double _Complex    ++?( long double _Complex * ),          --?( long double _Complex * );
    9797
    98 forall( otype T ) T *                    ++?(                T ** );
    99 forall( otype T ) const T *              ++?( const          T ** );
    100 forall( otype T ) volatile T *           ++?(       volatile T ** );
    101 forall( otype T ) const volatile T *     ++?( const volatile T ** );
    102 forall( otype T ) T *                    --?(                T ** );
    103 forall( otype T ) const T *              --?( const          T ** );
    104 forall( otype T ) volatile T *           --?(       volatile T ** );
    105 forall( otype T ) const volatile T *     --?( const volatile T ** );
     98forall( dtype T | sized(T) ) T *                         ++?(                T ** );
     99forall( dtype T | sized(T) ) const T *           ++?( const          T ** );
     100forall( dtype T | sized(T) ) volatile T *                ++?(       volatile T ** );
     101forall( dtype T | sized(T) ) const volatile T *  ++?( const volatile T ** );
     102forall( dtype T | sized(T) ) T *                         --?(                T ** );
     103forall( dtype T | sized(T) ) const T *           --?( const          T ** );
     104forall( dtype T | sized(T) ) volatile T *                --?(       volatile T ** );
     105forall( dtype T | sized(T) ) const volatile T *  --?( const volatile T ** );
    106106
    107107forall( dtype T | sized(T) ) lvalue T            *?(                 T * );
     
    178178long double _Complex    ?+?( long double _Complex, long double _Complex ),      ?-?( long double _Complex, long double _Complex );
    179179
    180 forall( otype T ) T *                   ?+?(                T *,          ptrdiff_t );
    181 forall( otype T ) T *                   ?+?(          ptrdiff_t,                T * );
    182 forall( otype T ) const T *             ?+?( const          T *,          ptrdiff_t );
    183 forall( otype T ) const T *             ?+?(          ptrdiff_t, const          T * );
    184 forall( otype T ) volatile T *          ?+?(       volatile T *,          ptrdiff_t );
    185 forall( otype T ) volatile T *          ?+?(          ptrdiff_t,       volatile T * );
    186 forall( otype T ) const volatile T *    ?+?( const volatile T *,          ptrdiff_t );
    187 forall( otype T ) const volatile T *    ?+?(          ptrdiff_t, const volatile T * );
    188 forall( otype T ) T *                   ?-?(                T *,          ptrdiff_t );
    189 forall( otype T ) const T *             ?-?( const          T *,          ptrdiff_t );
    190 forall( otype T ) volatile T *          ?-?(       volatile T *,          ptrdiff_t );
    191 forall( otype T ) const volatile T *    ?-?( const volatile T *,          ptrdiff_t );
    192 forall( otype T ) ptrdiff_t             ?-?( const volatile T *, const volatile T * );
     180forall( dtype T | sized(T) ) T *                        ?+?(                T *,          ptrdiff_t );
     181forall( dtype T | sized(T) ) T *                        ?+?(          ptrdiff_t,                T * );
     182forall( dtype T | sized(T) ) const T *          ?+?( const          T *,          ptrdiff_t );
     183forall( dtype T | sized(T) ) const T *          ?+?(          ptrdiff_t, const          T * );
     184forall( dtype T | sized(T) ) volatile T *               ?+?(       volatile T *,          ptrdiff_t );
     185forall( dtype T | sized(T) ) volatile T *               ?+?(          ptrdiff_t,       volatile T * );
     186forall( dtype T | sized(T) ) const volatile T * ?+?( const volatile T *,          ptrdiff_t );
     187forall( dtype T | sized(T) ) const volatile T * ?+?(          ptrdiff_t, const volatile T * );
     188forall( dtype T | sized(T) ) T *                        ?-?(                T *,          ptrdiff_t );
     189forall( dtype T | sized(T) ) const T *          ?-?( const          T *,          ptrdiff_t );
     190forall( dtype T | sized(T) ) volatile T *               ?-?(       volatile T *,          ptrdiff_t );
     191forall( dtype T | sized(T) ) const volatile T * ?-?( const volatile T *,          ptrdiff_t );
     192forall( dtype T | sized(T) ) ptrdiff_t          ?-?( const volatile T *, const volatile T * );
    193193
    194194// ------------------------------------------------------------
     
    428428forall( ftype FT ) FT *                 ?=?( FT * volatile *, forall( ftype FT2 ) FT2 * );
    429429
    430 forall( otype T ) T *                   ?+=?(                T *          *, ptrdiff_t );
    431 forall( otype T ) T *                   ?+=?(                T * volatile *, ptrdiff_t );
    432 forall( otype T ) const T *             ?+=?( const          T *          *, ptrdiff_t );
    433 forall( otype T ) const T *             ?+=?( const          T * volatile *, ptrdiff_t );
    434 forall( otype T ) volatile T *          ?+=?(       volatile T *          *, ptrdiff_t );
    435 forall( otype T ) volatile T *          ?+=?(       volatile T * volatile *, ptrdiff_t );
    436 forall( otype T ) const volatile T *    ?+=?( const volatile T *          *, ptrdiff_t );
    437 forall( otype T ) const volatile T *    ?+=?( const volatile T * volatile *, ptrdiff_t );
    438 forall( otype T ) T *                   ?-=?(                T *          *, ptrdiff_t );
    439 forall( otype T ) T *                   ?-=?(                T * volatile *, ptrdiff_t );
    440 forall( otype T ) const T *             ?-=?( const          T *          *, ptrdiff_t );
    441 forall( otype T ) const T *             ?-=?( const          T * volatile *, ptrdiff_t );
    442 forall( otype T ) volatile T *          ?-=?(       volatile T *          *, ptrdiff_t );
    443 forall( otype T ) volatile T *          ?-=?(       volatile T * volatile *, ptrdiff_t );
    444 forall( otype T ) const volatile T *    ?-=?( const volatile T *          *, ptrdiff_t );
    445 forall( otype T ) const volatile T *    ?-=?( const volatile T * volatile *, ptrdiff_t );
     430forall( dtype T | sized(T) ) T *                        ?+=?(                T *          *, ptrdiff_t );
     431forall( dtype T | sized(T) ) T *                        ?+=?(                T * volatile *, ptrdiff_t );
     432forall( dtype T | sized(T) ) const T *          ?+=?( const          T *          *, ptrdiff_t );
     433forall( dtype T | sized(T) ) const T *          ?+=?( const          T * volatile *, ptrdiff_t );
     434forall( dtype T | sized(T) ) volatile T *               ?+=?(       volatile T *          *, ptrdiff_t );
     435forall( dtype T | sized(T) ) volatile T *               ?+=?(       volatile T * volatile *, ptrdiff_t );
     436forall( dtype T | sized(T) ) const volatile T * ?+=?( const volatile T *          *, ptrdiff_t );
     437forall( dtype T | sized(T) ) const volatile T * ?+=?( const volatile T * volatile *, ptrdiff_t );
     438forall( dtype T | sized(T) ) T *                        ?-=?(                T *          *, ptrdiff_t );
     439forall( dtype T | sized(T) ) T *                        ?-=?(                T * volatile *, ptrdiff_t );
     440forall( dtype T | sized(T) ) const T *          ?-=?( const          T *          *, ptrdiff_t );
     441forall( dtype T | sized(T) ) const T *          ?-=?( const          T * volatile *, ptrdiff_t );
     442forall( dtype T | sized(T) ) volatile T *               ?-=?(       volatile T *          *, ptrdiff_t );
     443forall( dtype T | sized(T) ) volatile T *               ?-=?(       volatile T * volatile *, ptrdiff_t );
     444forall( dtype T | sized(T) ) const volatile T * ?-=?( const volatile T *          *, ptrdiff_t );
     445forall( dtype T | sized(T) ) const volatile T * ?-=?( const volatile T * volatile *, ptrdiff_t );
    446446
    447447_Bool                   ?=?( _Bool *, _Bool ),                                  ?=?( volatile _Bool *, _Bool );
  • src/tests/.expect/abs.txt

    rc00ddfe r255b294  
    1 char                    ¿       abs A
     1char                    -65     abs 65
    22signed int              -65     abs 65
    33signed long int         -65     abs 65
  • src/tests/abs.c

    rc00ddfe r255b294  
    1010// Created On       : Thu Jan 28 18:26:16 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Mar  2 15:07:26 2016
    13 // Update Count     : 51
     12// Last Modified On : Wed Feb 22 22:31:03 2017
     13// Update Count     : 52
    1414//
    1515
     
    1818
    1919int main( void ) {
    20         char ch = -65;
     20        signed char ch = -65;
    2121        sout | "char\t\t\t"                                     | ch     | "\tabs " | abs( ch ) | endl;
    2222        sout | "signed int\t\t"                         | -65    | "\tabs" | abs( -65 ) | endl;
Note: See TracChangeset for help on using the changeset viewer.