Changes in / [044ae62:3a513d89]


Ignore:
Files:
8 added
306 deleted
68 edited

Legend:

Unmodified
Added
Removed
  • Jenkins/FullBuild

    r044ae62 r3a513d89  
    2020                                        gcc_08_x86_new: { trigger_build( 'gcc-10',  'x86', false ) },
    2121                                        gcc_07_x86_new: { trigger_build( 'gcc-9',   'x86', false ) },
    22                                         gcc_11_x64_new: { trigger_build( 'gcc-11',  'x64', false ) },
    2322                                        gcc_10_x64_new: { trigger_build( 'gcc-10',  'x64', false ) },
    2423                                        gcc_09_x64_new: { trigger_build( 'gcc-9',   'x64', false ) },
    2524                                        gcc_08_x64_new: { trigger_build( 'gcc-8',   'x64', false ) },
    2625                                        gcc_07_x64_new: { trigger_build( 'gcc-7',   'x64', false ) },
    27                                         // gcc_06_x64_new: { trigger_build( 'gcc-6',   'x64', false ) },
     26                                        gcc_06_x64_new: { trigger_build( 'gcc-6',   'x64', false ) },
    2827                                        clang_x64_new:  { trigger_build( 'clang',   'x64', true  ) },
    2928                                )
     
    4241        }
    4342
    44         // If an exception is caught we need to change the status and remember to
    45         // attach the build log to the email
     43        //If an exception is caught we need to change the status and remember to
     44        //attach the build log to the email
    4645        catch (Exception caughtError) {
    4746                echo('error caught')
     
    7473        // Run the build
    7574        // Don't propagate, it doesn't play nice with our email setup
    76         def result = build job: 'Cforall/master',                       \
     75        def result = build job: 'Cforall/master',               \
    7776                parameters: [                                           \
    7877                        [$class: 'StringParameterValue',                \
     
    8483                        [$class: 'BooleanParameterValue',               \
    8584                          name: 'NewAST',                               \
    86                           value: true],                                 \
     85                          value: true],                                         \
    8786                        [$class: 'BooleanParameterValue',               \
    8887                          name: 'RunAllTests',                          \
    89                           value: true],                                 \
     88                          value: true],                                         \
    9089                        [$class: 'BooleanParameterValue',               \
    9190                          name: 'RunBenchmark',                         \
    92                           value: true],                                 \
     91                          value: true],                                         \
    9392                        [$class: 'BooleanParameterValue',               \
    94                           name: 'BuildDocumentation',                   \
     93                          name: 'BuildDocumentation',           \
    9594                          value: doc],                                  \
    9695                        [$class: 'BooleanParameterValue',               \
    9796                          name: 'Publish',                              \
    98                           value: true],                                 \
     97                          value: true],                                         \
    9998                        [$class: 'BooleanParameterValue',               \
    10099                          name: 'Silent',                               \
    101                           value: true],                                 \
    102                 ],                                                      \
     100                          value: true],                                         \
     101                ],                                                              \
    103102                propagate: false
    104103
     
    112111
    113112def trigger_dist(String commitId, String buildNum) {
    114         def result = build job: 'Cforall_Distribute_Ref',               \
     113        def result = build job: 'Cforall_Distribute_Ref',       \
    115114                parameters: [                                           \
    116115                        string(name: 'GitRef', value: commitId),        \
    117                         string(name: 'Build' , value: buildNum)         \
    118                 ],                                                      \
     116                        string(name: 'Build' , value: buildNum) \
     117                ],                                                              \
    119118                propagate: false
    120119
  • Jenkinsfile

    r044ae62 r3a513d89  
    155155                        dir (BuildDir) {
    156156                                //Run the tests from the tests directory
    157                                 sh """make ${jopt} --no-print-directory -C tests timeouts="--timeout=600 --global-timeout=14400" tests debug=yes archiveerrors=${BuildDir}/tests/crashes/full-debug"""
     157                                sh """make ${jopt} --no-print-directory -C tests timeouts="--timeout=600 --global-timeout=14400" all-tests debug=yes archiveerrors=${BuildDir}/tests/crashes/full-debug"""
    158158                        }
    159159                }
     
    162162                        dir (BuildDir) {
    163163                                //Run the tests from the tests directory
    164                                 sh """make ${jopt} --no-print-directory -C tests timeouts="--timeout=600 --global-timeout=14400" tests debug=no archiveerrors=${BuildDir}/tests/crashes/full-nodebug"""
     164                                sh """make ${jopt} --no-print-directory -C tests timeouts="--timeout=600 --global-timeout=14400" all-tests debug=no archiveerrors=${BuildDir}/tests/crashes/full-nodebug"""
    165165                        }
    166166                }
     
    305305                                this.Compiler = new CC_Desc('gcc-7', 'g++-7', 'gcc-7', '-flto=auto')
    306306                        break
    307                         // case 'gcc-6':
    308                         //      this.Compiler = new CC_Desc('gcc-6', 'g++-6', 'gcc-6', '-flto=auto')
    309                         // break
    310                         // case 'gcc-5':
    311                         //      this.Compiler = new CC_Desc('gcc-5', 'g++-5', 'gcc-5', '-flto=auto')
    312                         // break
    313                         // case 'gcc-4.9':
    314                         //      this.Compiler = new CC_Desc('gcc-4.9', 'g++-4.9', 'gcc-4.9', '-flto=auto')
    315                         // break
     307                        case 'gcc-6':
     308                                this.Compiler = new CC_Desc('gcc-6', 'g++-6', 'gcc-6', '-flto=auto')
     309                        break
     310                        case 'gcc-5':
     311                                this.Compiler = new CC_Desc('gcc-5', 'g++-5', 'gcc-5', '-flto=auto')
     312                        break
     313                        case 'gcc-4.9':
     314                                this.Compiler = new CC_Desc('gcc-4.9', 'g++-4.9', 'gcc-4.9', '-flto=auto')
     315                        break
    316316                        case 'clang':
    317317                                this.Compiler = new CC_Desc('clang', 'clang++-10', 'gcc-10', '-flto=thin -flto-jobs=0')
     
    359359def prepare_build() {
    360360        // prepare the properties
    361         properties ([                                                                           \
    362                 buildDiscarder(logRotator(                                                      \
    363                         artifactDaysToKeepStr: '',                                              \
    364                         artifactNumToKeepStr: '',                                               \
    365                         daysToKeepStr: '730',                                                   \
    366                         numToKeepStr: '1000'                                                    \
    367                 )),                                                                             \
    368                 [$class: 'ParametersDefinitionProperty',                                        \
    369                         parameterDefinitions: [                                                 \
    370                                 [$class: 'ChoiceParameterDefinition',                           \
    371                                         description: 'Which compiler to use',                   \
    372                                         name: 'Compiler',                                       \
    373                                         choices: 'gcc-11\ngcc-10\ngcc-9\ngcc-8\ngcc-7\nclang',  \
    374                                         defaultValue: 'gcc-9',                                  \
    375                                 ],                                                              \
    376                                 [$class: 'ChoiceParameterDefinition',                           \
    377                                         description: 'The target architecture',                 \
    378                                         name: 'Architecture',                                   \
    379                                         choices: 'x64\nx86',                                    \
    380                                         defaultValue: 'x64',                                    \
    381                                 ],                                                              \
    382                                 [$class: 'BooleanParameterDefinition',                          \
     361        properties ([                                                                                                   \
     362                buildDiscarder(logRotator(                                                                              \
     363                        artifactDaysToKeepStr: '',                                                                      \
     364                        artifactNumToKeepStr: '',                                                                       \
     365                        daysToKeepStr: '730',                                                                           \
     366                        numToKeepStr: '1000'                                                                            \
     367                )),                                                                                                             \
     368                [$class: 'ParametersDefinitionProperty',                                                                \
     369                        parameterDefinitions: [                                                                         \
     370                                [$class: 'ChoiceParameterDefinition',                                           \
     371                                        description: 'Which compiler to use',                                   \
     372                                        name: 'Compiler',                                                                       \
     373                                        choices: 'gcc-11\ngcc-10\ngcc-9\ngcc-8\ngcc-7\ngcc-6\ngcc-5\ngcc-4.9\nclang',   \
     374                                        defaultValue: 'gcc-8',                                                          \
     375                                ],                                                                                              \
     376                                [$class: 'ChoiceParameterDefinition',                                           \
     377                                        description: 'The target architecture',                                 \
     378                                        name: 'Architecture',                                                           \
     379                                        choices: 'x64\nx86',                                                            \
     380                                        defaultValue: 'x64',                                                            \
     381                                ],                                                                                              \
     382                                [$class: 'BooleanParameterDefinition',                                                  \
    383383                                        description: 'If false, the test suite is only ran in debug',   \
    384                                         name: 'RunAllTests',                                    \
    385                                         defaultValue: false,                                    \
    386                                 ],                                                              \
    387                                 [$class: 'BooleanParameterDefinition',                          \
    388                                         description: 'If true, jenkins also runs benchmarks',   \
    389                                         name: 'RunBenchmark',                                   \
    390                                         defaultValue: false,                                    \
    391                                 ],                                                              \
    392                                 [$class: 'BooleanParameterDefinition',                          \
    393                                         description: 'If true, jenkins also builds documentation', \
    394                                         name: 'BuildDocumentation',                             \
    395                                         defaultValue: true,                                     \
    396                                 ],                                                              \
    397                                 [$class: 'BooleanParameterDefinition',                          \
    398                                         description: 'If true, jenkins also publishes results', \
    399                                         name: 'Publish',                                        \
    400                                         defaultValue: false,                                    \
    401                                 ],                                                              \
    402                                 [$class: 'BooleanParameterDefinition',                          \
    403                                         description: 'If true, jenkins will not send emails',   \
    404                                         name: 'Silent',                                         \
    405                                         defaultValue: false,                                    \
    406                                 ],                                                              \
     384                                        name: 'RunAllTests',                                                            \
     385                                        defaultValue: false,                                                            \
     386                                ],                                                                                              \
     387                                [$class: 'BooleanParameterDefinition',                                                  \
     388                                        description: 'If true, jenkins also runs benchmarks',           \
     389                                        name: 'RunBenchmark',                                                           \
     390                                        defaultValue: false,                                                            \
     391                                ],                                                                                              \
     392                                [$class: 'BooleanParameterDefinition',                                                  \
     393                                        description: 'If true, jenkins also builds documentation',              \
     394                                        name: 'BuildDocumentation',                                                     \
     395                                        defaultValue: true,                                                             \
     396                                ],                                                                                              \
     397                                [$class: 'BooleanParameterDefinition',                                                  \
     398                                        description: 'If true, jenkins also publishes results',                 \
     399                                        name: 'Publish',                                                                        \
     400                                        defaultValue: false,                                                            \
     401                                ],                                                                                              \
     402                                [$class: 'BooleanParameterDefinition',                                                  \
     403                                        description: 'If true, jenkins will not send emails',           \
     404                                        name: 'Silent',                                                                         \
     405                                        defaultValue: false,                                                            \
     406                                ],                                                                                              \
    407407                        ],
    408408                ]])
    409                                         // choices: 'gcc-11\ngcc-10\ngcc-9\ngcc-8\ngcc-7\ngcc-6\ngcc-5\ngcc-4.9\nclang',
    410                                         // defaultValue: 'gcc-8',
    411409
    412410        // It's unfortunate but it looks like we need to checkout the entire repo just to get
  • Makefile.am

    r044ae62 r3a513d89  
    1111## Created On       : Sun May 31 22:14:18 2015
    1212## Last Modified By : Peter A. Buhr
    13 ## Last Modified On : Wed May 17 11:02:34 2023
    14 ## Update Count     : 56
     13## Last Modified On : Sat Feb  2 16:54:42 2019
     14## Update Count     : 21
    1515###############################################################################
    1616
     
    2424DIST_SUBDIRS = driver src . libcfa tests
    2525
    26 @LIBCFA_TARGET_MAKEFILES@ : Makefile ${srcdir}/libcfa/configure
    27         @${eval config_file = ${dir ${@}}config.data}
    28         @ls ${config_file} || (echo "Missing config.data, re-run configure script again" && false)
    29         @${eval config_data = ${shell cat ${config_file}}}
    30         @echo "Configuring libcfa (${abs_top_srcdir}/libcfa/configure) with '${config_data}' from ${shell pwd} / ${dir ${@}}"
    31         @cd ${dir ${@}} && ${abs_top_srcdir}/libcfa/configure ${config_data}
     26@LIBCFA_TARGET_MAKEFILES@ : Makefile $(srcdir)/libcfa/configure
     27        @$(eval config_file = $(dir $@)config.data)
     28        @ls $(config_file) || (echo "Missing config.data, re-run configure script again" && false)
     29        @$(eval config_data = $(shell cat $(config_file)))
     30        @echo "Configuring libcfa ($(abs_top_srcdir)/libcfa/configure) with '$(config_data)' from $(shell pwd) / $(dir $@)"
     31        @cd $(dir $@) && $(abs_top_srcdir)/libcfa/configure $(config_data)
    3232
    3333noinst_DATA = @LIBCFA_TARGET_MAKEFILES@
     
    3737EXTRA_DIST = LICENSE doc/man/cfa.1 libcfa/configure libcfa/Makefile.dist.am libcfa/Makefile.dist.in tools/build/distcc_hash tools/build/push2dist.sh
    3838
    39 debug ?= yes
    40 installed ?= no
    41 ARCH = ${if ${arch},"arch=${arch}"}
    42 arch_support = "x86/x64/arm"
     39debug=yes
     40check:
     41        $(MAKE) -C tests all-tests installed=no debug=${debug}
    4342
    44 # target "all" created by automake
     43installcheck:
     44        $(MAKE) -C tests all-tests installed=yes debug=${debug}
    4545
    46 check :
    47         ${MAKE} -C tests tests installed=${installed} debug=${debug} ${ARCH}
     46configure-libcfa: @LIBCFA_TARGET_MAKEFILES@
     47        @true
    4848
    49 tests : check # synonym
    50 
    51 installcheck :
    52         ${MAKE} -C tests tests installed=yes debug=${debug} ${ARCH}
    53 
    54 installtest : installcheck # synonym
    55 
    56 status : @LIBCFA_TARGET_MAKEFILES@
     49status: @LIBCFA_TARGET_MAKEFILES@
    5750        @echo -ne "translator\n\t"
    5851        @./config.status --config | sed "s/ /\n\t/g; s/\t'/\t/g; s/'\n/\n/g; s/^'//g; s/'$$//g"
    5952        @find libcfa -name config.status -printf "\n%h\n\t" -exec {} --config \; | sed "s/ /\n\t/g; s/\t'/\t/g; s/'\n/\n/g; s/^'//g; s/'$$//g"
    6053
    61 help :
    62         @echo "user targets:"
    63         @echo "    Compile compiler/runtime."
    64         @echo "    $$ make (null) / all"
    65         @echo ""
    66         @echo "    Compile compiler/runtime and run test suite."
    67         @echo "    $$ make check / tests [debug=yes/no] [installed=yes/no] [arch=${arch_support}]"
    68         @echo ""
    69         @echo "    Compile compiler/runtime, install, and run test suite on installed system."
    70         @echo "    $$ make installcheck / installtests [debug=yes/no] installed=yes [arch=${arch_support}]"
    71         @echo ""
    72         @echo "    Print configuration parameters and system build information."
    73         @echo "    $$ make status"
     54@LIBCFA_TARGET_DIRS@::
     55        $(MAKE) -C $@ $(MAKECMDGOALS)
    7456
    75 configure-libcfa : @LIBCFA_TARGET_MAKEFILES@
    76         @true
    77 
    78 @LIBCFA_TARGET_DIRS@ ::
    79         ${MAKE} -C ${@} ${MAKECMDGOALS}
    80 
    81 mostlyclean clean distclean maintainer-clean : @LIBCFA_TARGET_DIRS@
     57mostlyclean clean distclean maintainer-clean: @LIBCFA_TARGET_DIRS@
  • configure.ac

    r044ae62 r3a513d89  
    4747
    4848#==============================================================================
    49 # HACK to be able to use conditionals inside makefiles
     49# HACK to be able to use conditionnals inside makefiles
    5050DOifskipcompile='ifeq ($(skipcompile),yes)
    5151else'
  • doc/LaTeXmacros/lstlang.sty

    r044ae62 r3a513d89  
    88%% Created On       : Sat May 13 16:34:42 2017
    99%% Last Modified By : Peter A. Buhr
    10 %% Last Modified On : Tue May  2 08:52:35 2023
    11 %% Update Count     : 30
     10%% Last Modified On : Mon May 31 08:20:41 2021
     11%% Update Count     : 28
    1212%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    1313
     
    112112\lstdefinelanguage{CFA}[ANSI]{C}{
    113113        morekeywords={
    114                 _Alignas, _Alignof, __alignof, __alignof__, and, asm, __asm, __asm__, _Atomic, __attribute, __attribute__,
    115                 __auto_type, basetypeof, _Bool, catch, catchResume, choose, coerce, _Complex, __complex, __complex__, __const, __const__,
    116                 coroutine, _Decimal32, _Decimal64, _Decimal128, disable, enable, exception, __extension__, fallthrough, fallthru, finally, fixup,
    117                 __float80, float80, __float128, float128, _Float16, _Float32, _Float32x, _Float64, _Float64x, _Float128, _Float128x,
    118                 forall, fortran, generator, _Generic, _Imaginary, __imag, __imag__, inline, __inline, __inline__, int128, __int128, __int128_t,
    119                 __label__, monitor, mutex, _Noreturn, __builtin_offsetof, one_t, or, recover, report, restrict, __restrict, __restrict__,
    120                 __signed, __signed__, _Static_assert, suspend, thread, __thread, _Thread_local, throw, throwResume, timeout, trait, try,
    121                 typeof, __typeof, __typeof__, typeid, __uint128_t, __builtin_va_arg, __builtin_va_list, virtual, __volatile, __volatile__,
    122                 vtable, waitfor, waituntil, when, with, zero_t,
     114                _Alignas, _Alignof, __alignof, __alignof__, asm, __asm, __asm__, __attribute, __attribute__,
     115                auto, basetypeof, _Bool, catch, catchResume, choose, _Complex, __complex, __complex__, __const, __const__,
     116                coroutine, disable, dtype, enable, exception, __extension__, fallthrough, fallthru, finally, fixup,
     117                __float80, float80, __float128, float128, forall, ftype, generator, _Generic, _Imaginary, __imag, __imag__,
     118                inline, __inline, __inline__, __int128, int128, __label__, monitor, mutex, _Noreturn, one_t, or,
     119                otype, restrict, __restrict, __restrict__, recover, report, __signed, __signed__, _Static_assert, suspend,
     120                thread, __thread, _Thread_local, throw, throwResume, timeout, trait, try, ttype, typeof, __typeof, __typeof__,
     121                virtual, __volatile, __volatile__, waitfor, when, with, zero_t,
    123122    },
    124123        moredirectives={defined,include_next}%
  • doc/bibliography/pl.bib

    r044ae62 r3a513d89  
    198198}
    199199
    200 @inproceedings{Koster16,
    201     keywords    = {Actor Model, Concurrency},
    202     contributer = {pabuhr@plg},
    203     author      = {De Koster, Joeri and Van Cutsem, Tom and De Meuter, Wolfgang},
    204     title       = {43 Years of Actors: A Taxonomy of Actor Models and Their Key Properties},
    205     publisher   = {ACM},
    206     address     = {New York, NY, USA},
    207     organization= {Proceedings of the 6th International Workshop on Programming Based on Actors, Agents, and Decentralized Control},
    208     pages       = {31-40},
    209     numpages    = {10},
    210     year        = {2016},
    211     location    = {Amsterdam, Netherlands},
    212     series      = {AGERE 2016}
    213 }
    214 
    215200@misc{ActorBenchmarks,
    216     keywords    = {Actors, microbenchmarks, uC++. CAF, ProtoActor, AkkaC, AkkaT},
     201    keywords    = {Actors, microbenchmarks, uC++. CAF, AkkaC, AkkaT, ProtoActor},
    217202    contributer = {pabuhr@plg},
    218203    key         = {ActorBenchmarks},
     
    230215    publisher   = {MIT Press, Cambridge},
    231216    year        = 1986
    232 }
    233 
    234 @inproceedings{Srinivasan08,
    235     author      = {Srinivasan, Sriram and Mycroft, Alan},
    236     editor      = {Vitek, Jan},
    237     title       = {Kilim: Isolation-Typed Actors for Java},
    238     organization= {ECOOP 2008 -- Object-Oriented Programming},
    239     year        = {2008},
    240     publisher   = {Springer Berlin Heidelberg},
    241     address     = {Berlin, Heidelberg},
    242     pages       = {104--128},
    243 }
    244 
    245 @inproceedings{Haller07,
    246     author      = {Haller, Philipp and Odersky, Martin},
    247     editor      = {Murphy, Amy L. and Vitek, Jan},
    248     title       = {Actors That Unify Threads and Events},
    249     organization= {Coordination Models and Languages},
    250     year        = 2007,
    251     publisher   = {Springer Berlin Heidelberg},
    252     address     = {Berlin, Heidelberg},
    253     pages       = {171-190},
    254217}
    255218
     
    340303
    341304@article{Agrawal08,
    342     keywords    = {Adaptive scheduling, multiprocessing, processor allocation, randomized algorithm, space sharing, thread scheduling, two-level scheduling, work-stealing},
     305    keywords    = {Adaptive scheduling, adversary, instantaneous parallelism, job scheduling, multiprocessing, multiprogramming, parallel computation, parallelism feedback, processor allocation, randomized algorithm, space sharing, span, thread scheduling, trim analysis, two-level scheduling, work, work-stealing},
    343306    author      = {Agrawal, Kunal and Leiserson, Charles E. and He, Yuxiong and Hsu, Wen Jing},
    344307    title       = {Adaptive Work-stealing with Parallelism Feedback},
     
    472435    month       = sep,
    473436    year        = 2016,
    474     note        = {\url{http://doc.akka.io/docs/akka/2.4/AkkaScala.pdf}},
    475 }
    476 
    477 @misc{AkkaClassic,
    478     contributer = {pabuhr@plg},
    479     key         = {AkkaClassic},
    480     title       = {Akka Classic Actors},
    481     author      = {{Lightbend}},
    482     howpublished= {\url{https://doc.akka.io/docs/akka/current/index-classic.html}},
    483     year        = 2023,
     437    note        = {\href{http://doc.akka.io/docs/akka/2.4/AkkaScala.pdf}{http://\-doc.akka.io/\-docs/\-akka/\-2.4/\-AkkaScala.pdf}},
    484438}
    485439
     
    489443    title       = {Akka Futures},
    490444    author      = {{Lightbend}},
    491     howpublished= {\url{https://doc.akka.io/docs/akka/2.5/futures.html}},
    492     year        = 2022,
    493 }
    494 
    495 @misc{AkkaTyped,
    496     contributer = {pabuhr@plg},
    497     key         = {AkkaTyped},
    498     title       = {Akka Typed Actors},
    499     author      = {{Lightbend}},
    500     howpublished= {\url{https://doc.akka.io/docs/akka/2.5/typed-actors.html}},
     445    howpublished= {\href{https://doc.akka.io/docs/akka/2.5/futures.html}{https://\-doc.akka.io/\-docs/\-akka/\-2.5/\-futures.html}},
    501446    year        = 2022,
    502447}
     
    11731118@inproceedings{CAF,
    11741119    keywords    = {performance measurement, actor model, c++, message-oriented middleware, distributed debugging},
    1175     contributer = {pabuhr@plg},
    11761120    author      = {Charousset, Dominik and Hiesgen, Raphael and Schmidt, Thomas C.},
    1177     title       = {{CAF} -- the {C}++ Actor Framework for Scalable and Resource-Efficient Applications},
     1121    title       = {{CAF} - the {C}++ Actor Framework for Scalable and Resource-Efficient Applications},
    11781122    publisher   = {ACM},
    11791123    address     = {New York, NY, USA},
    11801124    organization= {Proceedings of the 4th International Workshop on Programming Based on Actors Agents \& Decentralized Control},
    11811125    pages       = {15-28},
    1182     numpages    = 14,
     1126    numpages    = {14},
    11831127    location    = {Portland, Oregon, USA},
    11841128    series      = {AGERE'14},
    1185     year        = 2014,
     1129    year        = {2014},
    11861130}
    11871131
     
    31583102    year        = 2016,
    31593103    note        = {\href{http://erlang.org/doc/pdf/otp-system-documentation.pdf}{http://\-erlang.org/\-doc/\-pdf/\-otp-system-documentation.pdf}},
    3160 }
    3161 
    3162 @misc{Soleimani16,
    3163     keywords    = {Erlang, scheduler, history},
    3164     contributer = {pabuhr@plg},
    3165     author      = {Hamidreza Soleimani},
    3166     title       = {Erlang Scheduler Details and Why It Matters},
    3167     month       = feb,
    3168     year        = 2016,
    3169     howpublished= {\url{https://hamidreza-s.github.io/erlang/scheduling/real-time/preemptive/migration/2016/02/09/erlang-scheduler-details.html}},
    31703104}
    31713105
     
    54025336}
    54035337
    5404 @article{Lombardo19,
    5405     contributer = {pabuhr@plg},
    5406     author      = {Lombardo, Gianfranco and Fornacciari, Paolo and Mordonini, Monica and Tomaiuolo, Michele and Poggi, Agostino},
    5407     title       = {A Multi-Agent Architecture for Data Analysis},
    5408     journal     = {Future Internet},
    5409     volume      = 11,
    5410     year        = 2019,
    5411     number      = 2,
    5412 }
    5413 
    54145338@article{multilisp,
    54155339    keywords    = {futures, scheme},
     
    66946618}
    66956619
    6696 @article{Varela01,
    6697     keywords    = {programming languages, SALSA, continuations, actors, java, internet, network computing, open systems, mobile computing},
    6698     contributer = {pabuhr@plg},
    6699     author      = {Varela, Carlos and Agha, Gul},
    6700     title       = {Programming Dynamically Reconfigurable Open Systems with SALSA},
    6701     issue_date  = {December 2001},
    6702     publisher   = {Association for Computing Machinery},
    6703     address     = {New York, NY, USA},
    6704     volume      = 36,
    6705     number      = 12,
    6706     journal     = {SIGPLAN Not.},
    6707     year        = 2001,
    6708     month       = dec,
    6709     pages       = {20-34},
    6710 }
    6711 
    67126620@book{PowerPC,
    67136621    key         = {PowerPC processor},
     
    67716679    title       = {Programming Languages -- {C}},
    67726680    organization= {International Standard ISO/IEC 9899:1999 (E)},
    6773     publisher   = {American National Standards Institute},
     6681    publisher   = {American National Standards Institute},
    67746682    address     = {www.ansi.org},
    67756683    year        = 1999,
     
    67826690    title       = {{C}{\kern-.1em\hbox{\large\texttt{+\kern-.25em+}}} Programming Language ISO/IEC 14882:1998},
    67836691    edition     = {1st},
    6784     organization= {International Standard Organization},
     6692    organization  = {International Standard Organization},
    67856693    address     = {Geneva, Switzerland},
    67866694    year        = 1998,
     
    70736981}
    70746982
    7075 @misc{protoactor,
    7076     contributer = {pabuhr@plg},
    7077     key         = {Protoactor},
    7078     author      = {{proto.actor}},
    7079     title       = {Asynkron AB},
    7080     year        = 2023,
    7081     howpublished= {\url{https://proto.actor}},
    7082 }
    7083 
    70846983@misc{Pthreads,
    70856984    keywords    = {pthreads, C concurrency},
     
    75597458    title       = {The Semantics of a Simple Language for Parallel Programming},
    75607459    author      = {Gilles Kahn},
    7561     organization= {IFIP Congress},
     7460    booktitle   = {IFIP Congress},
    75627461    year        = 1974,
    75637462}
     
    82748173
    82758174@article{SysVABI,
    8276     keywords    = {System V ABI},
    8277     contributer = {a3moss@uwaterloo.ca},
     8175    keywords    =  {System V ABI},
     8176    contributer =  {a3moss@uwaterloo.ca},
    82788177    title       = {System {V} application binary interface},
    82798178    author      = {Matz, Michael and Hubicka, Jan and Jaeger, Andreas and Mitchell, Mark},
     
    82818180    volume      = {99},
    82828181    year        = {2013}
    8283 }
    8284 
    8285 @article{Albert18,
    8286     keywords    = {actor-based concurrency, partial order reduction, systematic testing, synchronization, task independence},
    8287     contributer = {pabuhr@plg},
    8288     author      = {Albert, Elvira and Arenas, Puri and G\'{o}mez-Zamalloa, Miguel},
    8289     title       = {Systematic testing of actor systems},
    8290     journal     = {Software Testing, Verification and Reliability},
    8291     volume      = {28},
    8292     number      = {3},
    8293     pages       = {e1661},
    8294     year        = {2018}
    82958182}
    82968183
     
    83198206    journal     = jcss,
    83208207    year        = 1978,
    8321     volume      = 17,
    8322     pages       = {348-375},
     8208    volume      = 17, pages = {348-375}
    83238209}
    83248210
  • doc/theses/colby_parsons_MMAth/Makefile

    r044ae62 r3a513d89  
    1313## Define the text source files.
    1414
    15 SOURCES = ${addsuffix .tex, \
    16         text/intro \
    17         text/CFA_intro \
    18         text/actors \
    19         text/frontpgs \
    20         text/CFA_concurrency \
    21         thesis \
    22         text/mutex_stmt \
    23         text/channels \
    24         text/waituntil \
     15SOURCES = ${addsuffix .tex,     \
     16        text/CFA_intro                          \
     17        text/actors                                     \
     18        text/frontpgs                           \
     19        text/CFA_concurrency            \
     20        thesis                                          \
     21        text/mutex_stmt                         \
     22        text/channels                           \
    2523}
    2624
    27 FIGURES = ${addsuffix .pgf, \
    28         figures/pykeExecutor \
    29         figures/pykeCFAExecutor \
    30         figures/nasusExecutor \
    31         figures/nasusCFAExecutor \
    32         figures/pykeMatrix \
    33         figures/pykeCFAMatrix \
    34         figures/nasusMatrix \
    35         figures/nasusCFAMatrix \
    36         figures/pykeRepeat \
    37         figures/pykeCFARepeat \
    38         figures/nasusRepeat \
    39         figures/nasusCFARepeat \
    40         figures/pykeCFABalance-One \
    41         figures/nasusCFABalance-One\
    42         figures/pykeCFABalance-Multi \
    43         figures/nasusCFABalance-Multi \
    44         figures/pyke_Aggregate_Lock_2 \
    45         figures/pyke_Aggregate_Lock_4 \
    46         figures/pyke_Aggregate_Lock_8 \
    47         figures/nasus_Aggregate_Lock_2 \
    48         figures/nasus_Aggregate_Lock_4 \
    49         figures/nasus_Aggregate_Lock_8 \
     25FIGURES = ${addsuffix .pgf,             \
     26        figures/pykeExecutor                    \
     27        figures/pykeCFAExecutor                 \
     28        figures/nasusExecutor                   \
     29        figures/nasusCFAExecutor                \
     30        figures/pykeMatrix                              \
     31        figures/pykeCFAMatrix                   \
     32        figures/nasusMatrix                     \
     33        figures/nasusCFAMatrix                  \
     34        figures/pykeRepeat                              \
     35        figures/pykeCFARepeat                   \
     36        figures/nasusRepeat                     \
     37        figures/nasusCFARepeat                  \
     38        figures/pykeCFABalance-One              \
     39        figures/nasusCFABalance-One             \
     40        figures/pykeCFABalance-Multi    \
     41        figures/nasusCFABalance-Multi   \
     42        figures/pyke_Aggregate_Lock_2   \
     43        figures/pyke_Aggregate_Lock_4   \
     44        figures/pyke_Aggregate_Lock_8   \
     45        figures/nasus_Aggregate_Lock_2  \
     46        figures/nasus_Aggregate_Lock_4  \
     47        figures/nasus_Aggregate_Lock_8  \
    5048        figures/nasus_Channel_Contention \
    5149        figures/pyke_Channel_Contention \
    5250}
    5351
    54 DATA =  data/pykeSendStatic \
    55         data/pykeSendDynamic\
    56         data/pykeExecutorMem\
    57         data/nasusSendStatic\
    58         data/nasusSendDynamic\
    59         data/pykeExecutorMem\
     52DATA =  data/pykeSendStatic             \
     53                data/pykeSendDynamic    \
     54                data/pykeExecutorMem    \
     55                data/nasusSendStatic    \
     56                data/nasusSendDynamic   \
     57                data/pykeExecutorMem    \
    6058
    61 PICTURES = ${addsuffix .tikz, \
    62         diagrams/standard_actor \
    63         diagrams/inverted_actor \
    64         diagrams/gulp \
    65         diagrams/chain_swap \
    66         diagrams/M_to_one_swap \
    67         diagrams/acyclic_swap \
    68         diagrams/cyclic_swap \
     59PICTURES = ${addsuffix .tikz,   \
     60        diagrams/standard_actor         \
     61        diagrams/inverted_actor         \
     62        diagrams/gulp                           \
     63        diagrams/chain_swap             \
     64        diagrams/M_to_one_swap          \
     65        diagrams/acyclic_swap           \
     66        diagrams/cyclic_swap            \
    6967}
    7068
     
    107105        # Make index from *.aux entries and input index at end of document
    108106        makeglossaries -q -s ${Build}/${basename $@}.ist ${Build}/${basename $@}
     107        -version.sh
    109108        # Run again to finish citations
    110109        ${LaTeX} ${basename $@}.tex
     110       
    111111
    112112## Define the default recipes.
  • doc/theses/colby_parsons_MMAth/benchmarks/actors/data/nasus_CFA.txt

    r044ae62 r3a513d89  
    115
    221 2 4 8 16 24 32 48
    3 Longest-Victim No-Stealing Random
     3CFA-LV CFA-NS CFA-R
    44executor
    5 Longest-Victim:
     5CFA-LV:
    66proc    time (s)
    771       29.22
     
    454548      1.20
    464648      1.20
    47 No-Stealing:
     47CFA-NS:
    4848proc    time (s)
    49491       28.25
     
    878748      1.18
    888848      1.16
    89 Random:
     89CFA-R:
    9090proc    time (s)
    91911       28.58
     
    131131
    132132matrix
    133 Longest-Victim:
     133CFA-LV:
    134134proc    time (s)
    1351351       105.48
     
    17317348      2.75
    17417448      2.96
    175 No-Stealing:
     175CFA-NS:
    176176proc    time (s)
    1771771       106.01
     
    21521548      2.78
    21621648      2.92
    217 Random:
     217CFA-R:
    218218proc    time (s)
    2192191       105.91
     
    259259
    260260repeat
    261 Longest-Victim:
     261CFA-LV:
    262262proc    time (s)
    2632631       1.17
     
    30130148      13.73
    30230248      14.55
    303 No-Stealing:
     303CFA-NS:
    304304proc    time (s)
    3053051       1.15
     
    34334348      13.03
    34434448      12.83
    345 Random:
     345CFA-R:
    346346proc    time (s)
    3473471       1.15
     
    387387
    388388balance_one
    389 Longest-Victim:
     389CFA-LV:
    390390proc    time (s)
    3913911       20.06
     
    42942948      1.11
    43043048      1.12
    431 No-Stealing:
     431CFA-NS:
    432432proc    time (s)
    4334331       20.13
     
    47147148      19.95
    47247248      20.00
    473 Random:
     473CFA-R:
    474474proc    time (s)
    4754751       19.92
     
    515515
    516516balance_multi
    517 Longest-Victim:
     517CFA-LV:
    518518proc    time (s)
    5195191       8.17
     
    55755748      5.75
    55855848      5.68
    559 No-Stealing:
     559CFA-NS:
    560560proc    time (s)
    5615611       8.10
     
    59959948      9.28
    60060048      9.26
    601 Random:
     601CFA-R:
    602602proc    time (s)
    6036031       8.08
  • doc/theses/colby_parsons_MMAth/benchmarks/actors/data/pyke_CFA.txt

    r044ae62 r3a513d89  
    115
    221 2 4 8 16 24 32 48
    3 Longest-Victim No-Stealing Random
     3CFA-LV CFA-NS CFA-R
    44executor
    5 Longest-Victim:
     5CFA-LV:
    66proc    time (s)
    771       29.04
     
    454548      2.58
    464648      2.55
    47 No-Stealing:
     47CFA-NS:
    4848proc    time (s)
    49491       28.15
     
    878748      2.59
    888848      2.60
    89 Random:
     89CFA-R:
    9090proc    time (s)
    91911       29.06
     
    131131
    132132matrix
    133 Longest-Victim:
     133CFA-LV:
    134134proc    time (s)
    1351351       127.44
     
    17317348      6.83
    17417448      6.81
    175 No-Stealing:
     175CFA-NS:
    176176proc    time (s)
    1771771       127.64
     
    21521548      6.77
    21621648      6.74
    217 Random:
     217CFA-R:
    218218proc    time (s)
    2192191       127.26
     
    259259
    260260repeat
    261 Longest-Victim:
     261CFA-LV:
    262262proc    time (s)
    2632631       1.16
     
    30130148      19.75
    30230248      19.71
    303 No-Stealing:
     303CFA-NS:
    304304proc    time (s)
    3053051       1.18
     
    34334348      13.88
    34434448      13.71
    345 Random:
     345CFA-R:
    346346proc    time (s)
    3473471       1.18
     
    387387
    388388balance_one
    389 Longest-Victim:
     389CFA-LV:
    390390proc    time (s)
    3913911       19.46
     
    42942948      2.12
    43043048      2.17
    431 No-Stealing:
     431CFA-NS:
    432432proc    time (s)
    4334331       21.00
     
    47147148      47.50
    47247248      47.72
    473 Random:
     473CFA-R:
    474474proc    time (s)
    4754751       20.81
     
    515515
    516516balance_multi
    517 Longest-Victim:
     517CFA-LV:
    518518proc    time (s)
    5195191       7.94
     
    55755748      14.38
    55855848      14.50
    559 No-Stealing:
     559CFA-NS:
    560560proc    time (s)
    5615611       8.48
     
    59959948      21.50
    60060048      21.15
    601 Random:
     601CFA-R:
    602602proc    time (s)
    6036031       8.49
  • doc/theses/colby_parsons_MMAth/benchmarks/actors/plotData.py

    r044ae62 r3a513d89  
    22import sys
    33import time
    4 import itertools
    54import matplotlib.pyplot as plt
    65import matplotlib.ticker as ticks
     
    1817    'text.usetex': True,
    1918    'pgf.rcfonts': False,
    20     'font.size': 16
    2119})
    22 marker = itertools.cycle(('o', 's', 'D', 'x', 'p', '^', 'h', '*', 'v' ))
    2320
    2421readfile = open(sys.argv[1], "r")
     
    165162                    plt.xlabel("Cores")
    166163                    for idx, arr in enumerate(data):
    167                         plt.errorbar( procs, arr, [bars[idx][0], bars[idx][1]], capsize=2, marker=next(marker) )
     164                        plt.errorbar( procs, arr, [bars[idx][0], bars[idx][1]], capsize=2, marker='o' )
    168165                    if currBench == Bench.Executor or currBench == Bench.Matrix or currBench == Bench.Balance_One or currBench == Bench.Repeat:
    169166                        plt.yscale("log")
  • doc/theses/colby_parsons_MMAth/benchmarks/channels/plotData.py

    r044ae62 r3a513d89  
    22import sys
    33import time
    4 import itertools
    54import matplotlib.pyplot as plt
    65import matplotlib.ticker as ticks
     
    1817    'text.usetex': True,
    1918    'pgf.rcfonts': False,
    20     'font.size': 16
    2119})
    22 marker = itertools.cycle(('o', 's', 'D', 'x', 'p', '^', 'h', '*', 'v' ))
    2320
    2421readfile = open(sys.argv[1], "r")
     
    7370    if currBench == Bench.Unset:
    7471        if line == "contend:":
    75             name = "Channel Contention"
     72            name = "Contend"
    7673            currBench = Bench.Contend
    7774        elif line == "zero:":
     
    129126                plt.xlabel("Cores")
    130127                for idx, arr in enumerate(data):
    131                     plt.errorbar( procs, arr, [bars[idx][0], bars[idx][1]], capsize=2, marker=next(marker) )
     128                    plt.errorbar( procs, arr, [bars[idx][0], bars[idx][1]], capsize=2, marker='o' )
    132129               
    133130                plt.yscale("log")
  • doc/theses/colby_parsons_MMAth/benchmarks/mutex_stmt/plotData.py

    r044ae62 r3a513d89  
    22import sys
    33import time
    4 import itertools
    54import matplotlib.pyplot as plt
    65import matplotlib.ticker as ticks
     
    1817    'text.usetex': True,
    1918    'pgf.rcfonts': False,
    20     'font.size': 16
    2119})
    22 marker = itertools.cycle(('o', 's', 'D', 'x', 'p', '^', 'h', '*', 'v' ))
    2320
    2421readfile = open(sys.argv[1], "r")
     
    10299                plt.xlabel("Cores")
    103100                for idx, arr in enumerate(data):
    104                     plt.errorbar( procs, arr, [bars[idx][0], bars[idx][1]], capsize=2, marker=next(marker) )
     101                    plt.errorbar( procs, arr, [bars[idx][0], bars[idx][1]], capsize=2, marker='o' )
    105102                plt.yscale("log")
    106103                plt.xticks(procs)
  • doc/theses/colby_parsons_MMAth/benchmarks/mutex_stmt/run

    r044ae62 r3a513d89  
    9696
    9797# toggle benchmarks
    98 order=${false}
     98order=${true}
    9999rand=${true}
    100100baseline=${true}
  • doc/theses/colby_parsons_MMAth/code/swap_queues.cfa

    r044ae62 r3a513d89  
    1 // sequential equivalent swap
    2 void swap( uint victim_idx, uint my_idx  ) {
    3     // Step 0:
     1// this is a code stub and will not compile
     2
     3// tries to atomically swap two queues and returns 0p if the swap failed
     4// returns ptr to newly owned queue if swap succeeds
     5static inline work_queue * try_swap_queues( worker & this, unsigned int victim_idx, unsigned int my_idx ) with(this) {
    46    work_queue * my_queue = request_queues[my_idx];
    5     work_queue * vic_queue = request_queues[victim_idx];
    6     // Step 2:
    7     request_queues[my_idx] = 0p;
    8     // Step 3:
    9     request_queues[victim_idx] = my_queue;
    10     // Step 4:
    11     request_queues[my_idx] = vic_queue;
     7    work_queue * other_queue = request_queues[victim_idx];
     8
     9    // if either queue is 0p then they are in the process of being stolen
     10    if ( other_queue == 0p || my_queue == 0p ) return 0p;
     11
     12    // try to set our queue ptr to be 0p. If it fails someone moved our queue so return false
     13    if ( !__atomic_compare_exchange_n( &request_queues[my_idx], &my_queue, 0p, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST ) )
     14        return 0p;
     15
     16    // try to set other queue ptr to be our queue ptr. If it fails someone moved the other queue so fix up then return false
     17    if ( !__atomic_compare_exchange_n( &request_queues[victim_idx], &other_queue, my_queue, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST ) ) {
     18        /* paranoid */ verify( request_queues[my_idx] == 0p );
     19        request_queues[my_idx] = my_queue; // reset my queue ptr back to appropriate val
     20        return 0p;
     21    }
     22
     23    // we have successfully swapped and since our queue is 0p no one will touch it so write back new queue ptr non atomically
     24    request_queues[my_idx] = other_queue; // last write does not need to be atomic
     25    return other_queue;
    1226}
    1327
     
    2135
    2236bool try_swap_queues( worker & this, uint victim_idx, uint my_idx ) with(this) {
    23     // Step 0:
    24     // request_queues is the shared array of all sharded queues
    2537    work_queue * my_queue = request_queues[my_idx];
    2638    work_queue * vic_queue = request_queues[victim_idx];
    2739
    28     // Step 1:
    2940    // If either queue is 0p then they are in the process of being stolen
    3041    // 0p is CForAll's equivalent of C++'s nullptr
    31     if ( vic_queue == 0p ) return false;
     42    if ( vic_queue == 0p || my_queue == 0p ) return false;
    3243
    33     // Step 2:
    34     // Try to set thief's queue ptr to be 0p.
    35     // If this CAS fails someone stole thief's queue so return false
     44    // Try to set our queue ptr to be 0p.
     45    // If this CAS fails someone moved our queue so return false
    3646    if ( !CAS( &request_queues[my_idx], &my_queue, 0p ) )
    3747        return false;
    38    
    39     // Step 3:
    40     // Try to set victim queue ptr to be thief's queue ptr.
    41     // If it fails someone stole the other queue, so fix up then return false
     48
     49    // Try to set other queue ptr to be our queue ptr.
     50    // If it fails someone moved the other queue, so fix up then return false
    4251    if ( !CAS( &request_queues[victim_idx], &vic_queue, my_queue ) ) {
    4352        request_queues[my_idx] = my_queue; // reset queue ptr back to prev val
     
    4554    }
    4655
    47     // Step 4:
    4856    // Successfully swapped.
    49     // Thief's ptr is 0p so no one will touch it
    50     // Write back without CAS is safe
     57    // Our queue is 0p so no one will touch it so write back without CAS is safe
    5158    request_queues[my_idx] = vic_queue;
    5259    return true;
  • doc/theses/colby_parsons_MMAth/figures/nasus_Aggregate_Lock_2.pgf

    r044ae62 r3a513d89  
    7777\pgfsetstrokecolor{textcolor}%
    7878\pgfsetfillcolor{textcolor}%
    79 \pgftext[x=1.025455in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 2\)}%
     79\pgftext[x=1.025455in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 2\)}%
    8080\end{pgfscope}%
    8181\begin{pgfscope}%
     
    102102\pgfsetstrokecolor{textcolor}%
    103103\pgfsetfillcolor{textcolor}%
    104 \pgftext[x=1.326061in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 4\)}%
     104\pgftext[x=1.326061in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 4\)}%
    105105\end{pgfscope}%
    106106\begin{pgfscope}%
     
    127127\pgfsetstrokecolor{textcolor}%
    128128\pgfsetfillcolor{textcolor}%
    129 \pgftext[x=1.927273in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 8\)}%
     129\pgftext[x=1.927273in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 8\)}%
    130130\end{pgfscope}%
    131131\begin{pgfscope}%
     
    152152\pgfsetstrokecolor{textcolor}%
    153153\pgfsetfillcolor{textcolor}%
    154 \pgftext[x=3.129697in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 16\)}%
     154\pgftext[x=3.129697in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 16\)}%
    155155\end{pgfscope}%
    156156\begin{pgfscope}%
     
    177177\pgfsetstrokecolor{textcolor}%
    178178\pgfsetfillcolor{textcolor}%
    179 \pgftext[x=4.332121in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 24\)}%
     179\pgftext[x=4.332121in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 24\)}%
    180180\end{pgfscope}%
    181181\begin{pgfscope}%
     
    202202\pgfsetstrokecolor{textcolor}%
    203203\pgfsetfillcolor{textcolor}%
    204 \pgftext[x=5.534545in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 32\)}%
     204\pgftext[x=5.534545in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 32\)}%
    205205\end{pgfscope}%
    206206\begin{pgfscope}%
     
    208208\pgfsetstrokecolor{textcolor}%
    209209\pgfsetfillcolor{textcolor}%
    210 \pgftext[x=3.280000in,y=0.161874in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont Cores}%
     210\pgftext[x=3.280000in,y=0.251766in,,top]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont Cores}%
    211211\end{pgfscope}%
    212212\begin{pgfscope}%
     
    233233\pgfsetstrokecolor{textcolor}%
    234234\pgfsetfillcolor{textcolor}%
    235 \pgftext[x=0.399655in,y=1.057810in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 10^{5}\)}%
     235\pgftext[x=0.501581in,y=1.092918in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 10^{5}\)}%
    236236\end{pgfscope}%
    237237\begin{pgfscope}%
     
    258258\pgfsetstrokecolor{textcolor}%
    259259\pgfsetfillcolor{textcolor}%
    260 \pgftext[x=0.399655in,y=2.018954in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 10^{6}\)}%
     260\pgftext[x=0.501581in,y=2.054062in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 10^{6}\)}%
    261261\end{pgfscope}%
    262262\begin{pgfscope}%
     
    283283\pgfsetstrokecolor{textcolor}%
    284284\pgfsetfillcolor{textcolor}%
    285 \pgftext[x=0.399655in,y=2.980099in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 10^{7}\)}%
     285\pgftext[x=0.501581in,y=3.015207in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 10^{7}\)}%
    286286\end{pgfscope}%
    287287\begin{pgfscope}%
     
    308308\pgfsetstrokecolor{textcolor}%
    309309\pgfsetfillcolor{textcolor}%
    310 \pgftext[x=0.399655in,y=3.941243in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 10^{8}\)}%
     310\pgftext[x=0.501581in,y=3.976351in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 10^{8}\)}%
    311311\end{pgfscope}%
    312312\begin{pgfscope}%
     
    903903\pgfsetstrokecolor{textcolor}%
    904904\pgfsetfillcolor{textcolor}%
    905 \pgftext[x=0.344100in,y=2.376000in,,bottom,rotate=90.000000]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont Throughput (entries)}%
     905\pgftext[x=0.446026in,y=2.376000in,,bottom,rotate=90.000000]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont Throughput (entries)}%
    906906\end{pgfscope}%
    907907\begin{pgfscope}%
     
    14921492\end{pgfscope}%
    14931493\begin{pgfscope}%
    1494 \pgfsys@transformshift{3.129697in}{-3.129697in}%
     1494\pgfsys@transformshift{3.129697in}{0in}%
    14951495\pgfsys@useobject{currentmarker}{}%
    14961496\end{pgfscope}%
     
    16321632\pgfusepath{clip}%
    16331633\pgfsetbuttcap%
    1634 \pgfsetmiterjoin%
     1634\pgfsetroundjoin%
    16351635\definecolor{currentfill}{rgb}{1.000000,0.498039,0.054902}%
    16361636\pgfsetfillcolor{currentfill}%
    16371637\pgfsetlinewidth{1.003750pt}%
    16381638\definecolor{currentstroke}{rgb}{1.000000,0.498039,0.054902}%
    1639 \pgfsetstrokecolor{currentstroke}%
    1640 \pgfsetdash{}{0pt}%
    1641 \pgfsys@defobject{currentmarker}{\pgfqpoint{-0.041667in}{-0.041667in}}{\pgfqpoint{0.041667in}{0.041667in}}{%
    1642 \pgfpathmoveto{\pgfqpoint{-0.041667in}{-0.041667in}}%
    1643 \pgfpathlineto{\pgfqpoint{0.041667in}{-0.041667in}}%
    1644 \pgfpathlineto{\pgfqpoint{0.041667in}{0.041667in}}%
    1645 \pgfpathlineto{\pgfqpoint{-0.041667in}{0.041667in}}%
    1646 \pgfpathclose%
    1647 \pgfusepath{stroke,fill}%
    1648 }%
    1649 \begin{pgfscope}%
    1650 \pgfsys@transformshift{1.025455in}{3.944983in}%
    1651 \pgfsys@useobject{currentmarker}{}%
    1652 \end{pgfscope}%
    1653 \begin{pgfscope}%
    1654 \pgfsys@transformshift{1.326061in}{3.977510in}%
    1655 \pgfsys@useobject{currentmarker}{}%
    1656 \end{pgfscope}%
    1657 \begin{pgfscope}%
    1658 \pgfsys@transformshift{1.927273in}{3.512430in}%
    1659 \pgfsys@useobject{currentmarker}{}%
    1660 \end{pgfscope}%
    1661 \begin{pgfscope}%
    1662 \pgfsys@transformshift{3.129697in}{3.352962in}%
    1663 \pgfsys@useobject{currentmarker}{}%
    1664 \end{pgfscope}%
    1665 \begin{pgfscope}%
    1666 \pgfsys@transformshift{4.332121in}{3.334197in}%
    1667 \pgfsys@useobject{currentmarker}{}%
    1668 \end{pgfscope}%
    1669 \begin{pgfscope}%
    1670 \pgfsys@transformshift{5.534545in}{3.317793in}%
    1671 \pgfsys@useobject{currentmarker}{}%
    1672 \end{pgfscope}%
    1673 \end{pgfscope}%
    1674 \begin{pgfscope}%
    1675 \pgfpathrectangle{\pgfqpoint{0.800000in}{0.528000in}}{\pgfqpoint{4.960000in}{3.696000in}}%
    1676 \pgfusepath{clip}%
    1677 \pgfsetrectcap%
    1678 \pgfsetroundjoin%
    1679 \pgfsetlinewidth{1.505625pt}%
    1680 \definecolor{currentstroke}{rgb}{0.172549,0.627451,0.172549}%
    1681 \pgfsetstrokecolor{currentstroke}%
    1682 \pgfsetdash{}{0pt}%
    1683 \pgfpathmoveto{\pgfqpoint{1.025455in}{3.858276in}}%
    1684 \pgfpathlineto{\pgfqpoint{1.326061in}{3.706065in}}%
    1685 \pgfpathlineto{\pgfqpoint{1.927273in}{3.410611in}}%
    1686 \pgfpathlineto{\pgfqpoint{3.129697in}{3.314183in}}%
    1687 \pgfpathlineto{\pgfqpoint{4.332121in}{3.289120in}}%
    1688 \pgfpathlineto{\pgfqpoint{5.534545in}{3.271348in}}%
    1689 \pgfusepath{stroke}%
    1690 \end{pgfscope}%
    1691 \begin{pgfscope}%
    1692 \pgfpathrectangle{\pgfqpoint{0.800000in}{0.528000in}}{\pgfqpoint{4.960000in}{3.696000in}}%
    1693 \pgfusepath{clip}%
    1694 \pgfsetbuttcap%
    1695 \pgfsetmiterjoin%
    1696 \definecolor{currentfill}{rgb}{0.172549,0.627451,0.172549}%
    1697 \pgfsetfillcolor{currentfill}%
    1698 \pgfsetlinewidth{1.003750pt}%
    1699 \definecolor{currentstroke}{rgb}{0.172549,0.627451,0.172549}%
    1700 \pgfsetstrokecolor{currentstroke}%
    1701 \pgfsetdash{}{0pt}%
    1702 \pgfsys@defobject{currentmarker}{\pgfqpoint{-0.058926in}{-0.058926in}}{\pgfqpoint{0.058926in}{0.058926in}}{%
    1703 \pgfpathmoveto{\pgfqpoint{-0.000000in}{-0.058926in}}%
    1704 \pgfpathlineto{\pgfqpoint{0.058926in}{0.000000in}}%
    1705 \pgfpathlineto{\pgfqpoint{0.000000in}{0.058926in}}%
    1706 \pgfpathlineto{\pgfqpoint{-0.058926in}{0.000000in}}%
    1707 \pgfpathclose%
    1708 \pgfusepath{stroke,fill}%
    1709 }%
    1710 \begin{pgfscope}%
    1711 \pgfsys@transformshift{1.025455in}{3.858276in}%
    1712 \pgfsys@useobject{currentmarker}{}%
    1713 \end{pgfscope}%
    1714 \begin{pgfscope}%
    1715 \pgfsys@transformshift{1.326061in}{3.706065in}%
    1716 \pgfsys@useobject{currentmarker}{}%
    1717 \end{pgfscope}%
    1718 \begin{pgfscope}%
    1719 \pgfsys@transformshift{1.927273in}{3.410611in}%
    1720 \pgfsys@useobject{currentmarker}{}%
    1721 \end{pgfscope}%
    1722 \begin{pgfscope}%
    1723 \pgfsys@transformshift{3.129697in}{3.314183in}%
    1724 \pgfsys@useobject{currentmarker}{}%
    1725 \end{pgfscope}%
    1726 \begin{pgfscope}%
    1727 \pgfsys@transformshift{4.332121in}{3.289120in}%
    1728 \pgfsys@useobject{currentmarker}{}%
    1729 \end{pgfscope}%
    1730 \begin{pgfscope}%
    1731 \pgfsys@transformshift{5.534545in}{3.271348in}%
    1732 \pgfsys@useobject{currentmarker}{}%
    1733 \end{pgfscope}%
    1734 \end{pgfscope}%
    1735 \begin{pgfscope}%
    1736 \pgfpathrectangle{\pgfqpoint{0.800000in}{0.528000in}}{\pgfqpoint{4.960000in}{3.696000in}}%
    1737 \pgfusepath{clip}%
    1738 \pgfsetrectcap%
    1739 \pgfsetroundjoin%
    1740 \pgfsetlinewidth{1.505625pt}%
    1741 \definecolor{currentstroke}{rgb}{0.839216,0.152941,0.156863}%
    1742 \pgfsetstrokecolor{currentstroke}%
    1743 \pgfsetdash{}{0pt}%
    1744 \pgfpathmoveto{\pgfqpoint{1.025455in}{4.050730in}}%
    1745 \pgfpathlineto{\pgfqpoint{1.326061in}{2.770511in}}%
    1746 \pgfpathlineto{\pgfqpoint{1.927273in}{2.067529in}}%
    1747 \pgfpathlineto{\pgfqpoint{3.129697in}{0.864067in}}%
    1748 \pgfpathlineto{\pgfqpoint{4.332121in}{0.696000in}}%
    1749 \pgfpathlineto{\pgfqpoint{5.534545in}{1.325424in}}%
    1750 \pgfusepath{stroke}%
    1751 \end{pgfscope}%
    1752 \begin{pgfscope}%
    1753 \pgfpathrectangle{\pgfqpoint{0.800000in}{0.528000in}}{\pgfqpoint{4.960000in}{3.696000in}}%
    1754 \pgfusepath{clip}%
    1755 \pgfsetbuttcap%
    1756 \pgfsetroundjoin%
    1757 \definecolor{currentfill}{rgb}{0.839216,0.152941,0.156863}%
    1758 \pgfsetfillcolor{currentfill}%
    1759 \pgfsetlinewidth{1.003750pt}%
    1760 \definecolor{currentstroke}{rgb}{0.839216,0.152941,0.156863}%
    1761 \pgfsetstrokecolor{currentstroke}%
    1762 \pgfsetdash{}{0pt}%
    1763 \pgfsys@defobject{currentmarker}{\pgfqpoint{-0.041667in}{-0.041667in}}{\pgfqpoint{0.041667in}{0.041667in}}{%
    1764 \pgfpathmoveto{\pgfqpoint{-0.041667in}{-0.041667in}}%
    1765 \pgfpathlineto{\pgfqpoint{0.041667in}{0.041667in}}%
    1766 \pgfpathmoveto{\pgfqpoint{-0.041667in}{0.041667in}}%
    1767 \pgfpathlineto{\pgfqpoint{0.041667in}{-0.041667in}}%
    1768 \pgfusepath{stroke,fill}%
    1769 }%
    1770 \begin{pgfscope}%
    1771 \pgfsys@transformshift{1.025455in}{4.050730in}%
    1772 \pgfsys@useobject{currentmarker}{}%
    1773 \end{pgfscope}%
    1774 \begin{pgfscope}%
    1775 \pgfsys@transformshift{1.326061in}{2.770511in}%
    1776 \pgfsys@useobject{currentmarker}{}%
    1777 \end{pgfscope}%
    1778 \begin{pgfscope}%
    1779 \pgfsys@transformshift{1.927273in}{2.067529in}%
    1780 \pgfsys@useobject{currentmarker}{}%
    1781 \end{pgfscope}%
    1782 \begin{pgfscope}%
    1783 \pgfsys@transformshift{3.129697in}{0.864067in}%
    1784 \pgfsys@useobject{currentmarker}{}%
    1785 \end{pgfscope}%
    1786 \begin{pgfscope}%
    1787 \pgfsys@transformshift{4.332121in}{0.696000in}%
    1788 \pgfsys@useobject{currentmarker}{}%
    1789 \end{pgfscope}%
    1790 \begin{pgfscope}%
    1791 \pgfsys@transformshift{5.534545in}{1.325424in}%
    1792 \pgfsys@useobject{currentmarker}{}%
    1793 \end{pgfscope}%
    1794 \end{pgfscope}%
    1795 \begin{pgfscope}%
    1796 \pgfsetrectcap%
    1797 \pgfsetmiterjoin%
    1798 \pgfsetlinewidth{0.803000pt}%
    1799 \definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}%
    1800 \pgfsetstrokecolor{currentstroke}%
    1801 \pgfsetdash{}{0pt}%
    1802 \pgfpathmoveto{\pgfqpoint{0.800000in}{0.528000in}}%
    1803 \pgfpathlineto{\pgfqpoint{0.800000in}{4.224000in}}%
    1804 \pgfusepath{stroke}%
    1805 \end{pgfscope}%
    1806 \begin{pgfscope}%
    1807 \pgfsetrectcap%
    1808 \pgfsetmiterjoin%
    1809 \pgfsetlinewidth{0.803000pt}%
    1810 \definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}%
    1811 \pgfsetstrokecolor{currentstroke}%
    1812 \pgfsetdash{}{0pt}%
    1813 \pgfpathmoveto{\pgfqpoint{5.760000in}{0.528000in}}%
    1814 \pgfpathlineto{\pgfqpoint{5.760000in}{4.224000in}}%
    1815 \pgfusepath{stroke}%
    1816 \end{pgfscope}%
    1817 \begin{pgfscope}%
    1818 \pgfsetrectcap%
    1819 \pgfsetmiterjoin%
    1820 \pgfsetlinewidth{0.803000pt}%
    1821 \definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}%
    1822 \pgfsetstrokecolor{currentstroke}%
    1823 \pgfsetdash{}{0pt}%
    1824 \pgfpathmoveto{\pgfqpoint{0.800000in}{0.528000in}}%
    1825 \pgfpathlineto{\pgfqpoint{5.760000in}{0.528000in}}%
    1826 \pgfusepath{stroke}%
    1827 \end{pgfscope}%
    1828 \begin{pgfscope}%
    1829 \pgfsetrectcap%
    1830 \pgfsetmiterjoin%
    1831 \pgfsetlinewidth{0.803000pt}%
    1832 \definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}%
    1833 \pgfsetstrokecolor{currentstroke}%
    1834 \pgfsetdash{}{0pt}%
    1835 \pgfpathmoveto{\pgfqpoint{0.800000in}{4.224000in}}%
    1836 \pgfpathlineto{\pgfqpoint{5.760000in}{4.224000in}}%
    1837 \pgfusepath{stroke}%
    1838 \end{pgfscope}%
    1839 \begin{pgfscope}%
    1840 \definecolor{textcolor}{rgb}{0.000000,0.000000,0.000000}%
    1841 \pgfsetstrokecolor{textcolor}%
    1842 \pgfsetfillcolor{textcolor}%
    1843 \pgftext[x=3.280000in,y=4.307333in,,base]{\color{textcolor}\rmfamily\fontsize{19.200000}{23.040000}\selectfont Aggregate Lock Benchmark: 2 Locks}%
    1844 \end{pgfscope}%
    1845 \begin{pgfscope}%
    1846 \pgfsetbuttcap%
    1847 \pgfsetmiterjoin%
    1848 \definecolor{currentfill}{rgb}{1.000000,1.000000,1.000000}%
    1849 \pgfsetfillcolor{currentfill}%
    1850 \pgfsetfillopacity{0.800000}%
    1851 \pgfsetlinewidth{1.003750pt}%
    1852 \definecolor{currentstroke}{rgb}{0.800000,0.800000,0.800000}%
    1853 \pgfsetstrokecolor{currentstroke}%
    1854 \pgfsetstrokeopacity{0.800000}%
    1855 \pgfsetdash{}{0pt}%
    1856 \pgfpathmoveto{\pgfqpoint{3.602702in}{1.693747in}}%
    1857 \pgfpathlineto{\pgfqpoint{5.604444in}{1.693747in}}%
    1858 \pgfpathquadraticcurveto{\pgfqpoint{5.648889in}{1.693747in}}{\pgfqpoint{5.648889in}{1.738192in}}%
    1859 \pgfpathlineto{\pgfqpoint{5.648889in}{3.013808in}}%
    1860 \pgfpathquadraticcurveto{\pgfqpoint{5.648889in}{3.058253in}}{\pgfqpoint{5.604444in}{3.058253in}}%
    1861 \pgfpathlineto{\pgfqpoint{3.602702in}{3.058253in}}%
    1862 \pgfpathquadraticcurveto{\pgfqpoint{3.558257in}{3.058253in}}{\pgfqpoint{3.558257in}{3.013808in}}%
    1863 \pgfpathlineto{\pgfqpoint{3.558257in}{1.738192in}}%
    1864 \pgfpathquadraticcurveto{\pgfqpoint{3.558257in}{1.693747in}}{\pgfqpoint{3.602702in}{1.693747in}}%
    1865 \pgfpathclose%
    1866 \pgfusepath{stroke,fill}%
    1867 \end{pgfscope}%
    1868 \begin{pgfscope}%
    1869 \pgfsetbuttcap%
    1870 \pgfsetroundjoin%
    1871 \pgfsetlinewidth{1.505625pt}%
    1872 \definecolor{currentstroke}{rgb}{0.121569,0.466667,0.705882}%
    1873 \pgfsetstrokecolor{currentstroke}%
    1874 \pgfsetdash{}{0pt}%
    1875 \pgfpathmoveto{\pgfqpoint{3.869368in}{2.769364in}}%
    1876 \pgfpathlineto{\pgfqpoint{3.869368in}{2.991586in}}%
    1877 \pgfusepath{stroke}%
    1878 \end{pgfscope}%
    1879 \begin{pgfscope}%
    1880 \pgfsetbuttcap%
    1881 \pgfsetroundjoin%
    1882 \definecolor{currentfill}{rgb}{0.121569,0.466667,0.705882}%
    1883 \pgfsetfillcolor{currentfill}%
    1884 \pgfsetlinewidth{1.003750pt}%
    1885 \definecolor{currentstroke}{rgb}{0.121569,0.466667,0.705882}%
    1886 \pgfsetstrokecolor{currentstroke}%
    1887 \pgfsetdash{}{0pt}%
    1888 \pgfsys@defobject{currentmarker}{\pgfqpoint{-0.027778in}{-0.000000in}}{\pgfqpoint{0.027778in}{0.000000in}}{%
    1889 \pgfpathmoveto{\pgfqpoint{0.027778in}{-0.000000in}}%
    1890 \pgfpathlineto{\pgfqpoint{-0.027778in}{0.000000in}}%
    1891 \pgfusepath{stroke,fill}%
    1892 }%
    1893 \begin{pgfscope}%
    1894 \pgfsys@transformshift{3.869368in}{2.769364in}%
    1895 \pgfsys@useobject{currentmarker}{}%
    1896 \end{pgfscope}%
    1897 \end{pgfscope}%
    1898 \begin{pgfscope}%
    1899 \pgfsetbuttcap%
    1900 \pgfsetroundjoin%
    1901 \definecolor{currentfill}{rgb}{0.121569,0.466667,0.705882}%
    1902 \pgfsetfillcolor{currentfill}%
    1903 \pgfsetlinewidth{1.003750pt}%
    1904 \definecolor{currentstroke}{rgb}{0.121569,0.466667,0.705882}%
    1905 \pgfsetstrokecolor{currentstroke}%
    1906 \pgfsetdash{}{0pt}%
    1907 \pgfsys@defobject{currentmarker}{\pgfqpoint{-0.027778in}{-0.000000in}}{\pgfqpoint{0.027778in}{0.000000in}}{%
    1908 \pgfpathmoveto{\pgfqpoint{0.027778in}{-0.000000in}}%
    1909 \pgfpathlineto{\pgfqpoint{-0.027778in}{0.000000in}}%
    1910 \pgfusepath{stroke,fill}%
    1911 }%
    1912 \begin{pgfscope}%
    1913 \pgfsys@transformshift{3.869368in}{2.991586in}%
    1914 \pgfsys@useobject{currentmarker}{}%
    1915 \end{pgfscope}%
    1916 \end{pgfscope}%
    1917 \begin{pgfscope}%
    1918 \pgfsetrectcap%
    1919 \pgfsetroundjoin%
    1920 \pgfsetlinewidth{1.505625pt}%
    1921 \definecolor{currentstroke}{rgb}{0.121569,0.466667,0.705882}%
    1922 \pgfsetstrokecolor{currentstroke}%
    1923 \pgfsetdash{}{0pt}%
    1924 \pgfpathmoveto{\pgfqpoint{3.647146in}{2.880475in}}%
    1925 \pgfpathlineto{\pgfqpoint{4.091591in}{2.880475in}}%
    1926 \pgfusepath{stroke}%
    1927 \end{pgfscope}%
    1928 \begin{pgfscope}%
    1929 \pgfsetbuttcap%
    1930 \pgfsetroundjoin%
    1931 \definecolor{currentfill}{rgb}{0.121569,0.466667,0.705882}%
    1932 \pgfsetfillcolor{currentfill}%
    1933 \pgfsetlinewidth{1.003750pt}%
    1934 \definecolor{currentstroke}{rgb}{0.121569,0.466667,0.705882}%
    19351639\pgfsetstrokecolor{currentstroke}%
    19361640\pgfsetdash{}{0pt}%
     
    19491653}%
    19501654\begin{pgfscope}%
    1951 \pgfsys@transformshift{3.869368in}{2.880475in}%
    1952 \pgfsys@useobject{currentmarker}{}%
    1953 \end{pgfscope}%
     1655\pgfsys@transformshift{1.025455in}{3.944983in}%
     1656\pgfsys@useobject{currentmarker}{}%
     1657\end{pgfscope}%
     1658\begin{pgfscope}%
     1659\pgfsys@transformshift{1.326061in}{3.977510in}%
     1660\pgfsys@useobject{currentmarker}{}%
     1661\end{pgfscope}%
     1662\begin{pgfscope}%
     1663\pgfsys@transformshift{1.927273in}{3.512430in}%
     1664\pgfsys@useobject{currentmarker}{}%
     1665\end{pgfscope}%
     1666\begin{pgfscope}%
     1667\pgfsys@transformshift{3.129697in}{3.352962in}%
     1668\pgfsys@useobject{currentmarker}{}%
     1669\end{pgfscope}%
     1670\begin{pgfscope}%
     1671\pgfsys@transformshift{4.332121in}{3.334197in}%
     1672\pgfsys@useobject{currentmarker}{}%
     1673\end{pgfscope}%
     1674\begin{pgfscope}%
     1675\pgfsys@transformshift{5.534545in}{3.317793in}%
     1676\pgfsys@useobject{currentmarker}{}%
     1677\end{pgfscope}%
     1678\end{pgfscope}%
     1679\begin{pgfscope}%
     1680\pgfpathrectangle{\pgfqpoint{0.800000in}{0.528000in}}{\pgfqpoint{4.960000in}{3.696000in}}%
     1681\pgfusepath{clip}%
     1682\pgfsetrectcap%
     1683\pgfsetroundjoin%
     1684\pgfsetlinewidth{1.505625pt}%
     1685\definecolor{currentstroke}{rgb}{0.172549,0.627451,0.172549}%
     1686\pgfsetstrokecolor{currentstroke}%
     1687\pgfsetdash{}{0pt}%
     1688\pgfpathmoveto{\pgfqpoint{1.025455in}{3.858276in}}%
     1689\pgfpathlineto{\pgfqpoint{1.326061in}{3.706065in}}%
     1690\pgfpathlineto{\pgfqpoint{1.927273in}{3.410611in}}%
     1691\pgfpathlineto{\pgfqpoint{3.129697in}{3.314183in}}%
     1692\pgfpathlineto{\pgfqpoint{4.332121in}{3.289120in}}%
     1693\pgfpathlineto{\pgfqpoint{5.534545in}{3.271348in}}%
     1694\pgfusepath{stroke}%
     1695\end{pgfscope}%
     1696\begin{pgfscope}%
     1697\pgfpathrectangle{\pgfqpoint{0.800000in}{0.528000in}}{\pgfqpoint{4.960000in}{3.696000in}}%
     1698\pgfusepath{clip}%
     1699\pgfsetbuttcap%
     1700\pgfsetroundjoin%
     1701\definecolor{currentfill}{rgb}{0.172549,0.627451,0.172549}%
     1702\pgfsetfillcolor{currentfill}%
     1703\pgfsetlinewidth{1.003750pt}%
     1704\definecolor{currentstroke}{rgb}{0.172549,0.627451,0.172549}%
     1705\pgfsetstrokecolor{currentstroke}%
     1706\pgfsetdash{}{0pt}%
     1707\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.041667in}{-0.041667in}}{\pgfqpoint{0.041667in}{0.041667in}}{%
     1708\pgfpathmoveto{\pgfqpoint{0.000000in}{-0.041667in}}%
     1709\pgfpathcurveto{\pgfqpoint{0.011050in}{-0.041667in}}{\pgfqpoint{0.021649in}{-0.037276in}}{\pgfqpoint{0.029463in}{-0.029463in}}%
     1710\pgfpathcurveto{\pgfqpoint{0.037276in}{-0.021649in}}{\pgfqpoint{0.041667in}{-0.011050in}}{\pgfqpoint{0.041667in}{0.000000in}}%
     1711\pgfpathcurveto{\pgfqpoint{0.041667in}{0.011050in}}{\pgfqpoint{0.037276in}{0.021649in}}{\pgfqpoint{0.029463in}{0.029463in}}%
     1712\pgfpathcurveto{\pgfqpoint{0.021649in}{0.037276in}}{\pgfqpoint{0.011050in}{0.041667in}}{\pgfqpoint{0.000000in}{0.041667in}}%
     1713\pgfpathcurveto{\pgfqpoint{-0.011050in}{0.041667in}}{\pgfqpoint{-0.021649in}{0.037276in}}{\pgfqpoint{-0.029463in}{0.029463in}}%
     1714\pgfpathcurveto{\pgfqpoint{-0.037276in}{0.021649in}}{\pgfqpoint{-0.041667in}{0.011050in}}{\pgfqpoint{-0.041667in}{0.000000in}}%
     1715\pgfpathcurveto{\pgfqpoint{-0.041667in}{-0.011050in}}{\pgfqpoint{-0.037276in}{-0.021649in}}{\pgfqpoint{-0.029463in}{-0.029463in}}%
     1716\pgfpathcurveto{\pgfqpoint{-0.021649in}{-0.037276in}}{\pgfqpoint{-0.011050in}{-0.041667in}}{\pgfqpoint{0.000000in}{-0.041667in}}%
     1717\pgfpathclose%
     1718\pgfusepath{stroke,fill}%
     1719}%
     1720\begin{pgfscope}%
     1721\pgfsys@transformshift{1.025455in}{3.858276in}%
     1722\pgfsys@useobject{currentmarker}{}%
     1723\end{pgfscope}%
     1724\begin{pgfscope}%
     1725\pgfsys@transformshift{1.326061in}{3.706065in}%
     1726\pgfsys@useobject{currentmarker}{}%
     1727\end{pgfscope}%
     1728\begin{pgfscope}%
     1729\pgfsys@transformshift{1.927273in}{3.410611in}%
     1730\pgfsys@useobject{currentmarker}{}%
     1731\end{pgfscope}%
     1732\begin{pgfscope}%
     1733\pgfsys@transformshift{3.129697in}{3.314183in}%
     1734\pgfsys@useobject{currentmarker}{}%
     1735\end{pgfscope}%
     1736\begin{pgfscope}%
     1737\pgfsys@transformshift{4.332121in}{3.289120in}%
     1738\pgfsys@useobject{currentmarker}{}%
     1739\end{pgfscope}%
     1740\begin{pgfscope}%
     1741\pgfsys@transformshift{5.534545in}{3.271348in}%
     1742\pgfsys@useobject{currentmarker}{}%
     1743\end{pgfscope}%
     1744\end{pgfscope}%
     1745\begin{pgfscope}%
     1746\pgfpathrectangle{\pgfqpoint{0.800000in}{0.528000in}}{\pgfqpoint{4.960000in}{3.696000in}}%
     1747\pgfusepath{clip}%
     1748\pgfsetrectcap%
     1749\pgfsetroundjoin%
     1750\pgfsetlinewidth{1.505625pt}%
     1751\definecolor{currentstroke}{rgb}{0.839216,0.152941,0.156863}%
     1752\pgfsetstrokecolor{currentstroke}%
     1753\pgfsetdash{}{0pt}%
     1754\pgfpathmoveto{\pgfqpoint{1.025455in}{4.050730in}}%
     1755\pgfpathlineto{\pgfqpoint{1.326061in}{2.770511in}}%
     1756\pgfpathlineto{\pgfqpoint{1.927273in}{2.067529in}}%
     1757\pgfpathlineto{\pgfqpoint{3.129697in}{0.864067in}}%
     1758\pgfpathlineto{\pgfqpoint{4.332121in}{0.696000in}}%
     1759\pgfpathlineto{\pgfqpoint{5.534545in}{1.325424in}}%
     1760\pgfusepath{stroke}%
     1761\end{pgfscope}%
     1762\begin{pgfscope}%
     1763\pgfpathrectangle{\pgfqpoint{0.800000in}{0.528000in}}{\pgfqpoint{4.960000in}{3.696000in}}%
     1764\pgfusepath{clip}%
     1765\pgfsetbuttcap%
     1766\pgfsetroundjoin%
     1767\definecolor{currentfill}{rgb}{0.839216,0.152941,0.156863}%
     1768\pgfsetfillcolor{currentfill}%
     1769\pgfsetlinewidth{1.003750pt}%
     1770\definecolor{currentstroke}{rgb}{0.839216,0.152941,0.156863}%
     1771\pgfsetstrokecolor{currentstroke}%
     1772\pgfsetdash{}{0pt}%
     1773\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.041667in}{-0.041667in}}{\pgfqpoint{0.041667in}{0.041667in}}{%
     1774\pgfpathmoveto{\pgfqpoint{0.000000in}{-0.041667in}}%
     1775\pgfpathcurveto{\pgfqpoint{0.011050in}{-0.041667in}}{\pgfqpoint{0.021649in}{-0.037276in}}{\pgfqpoint{0.029463in}{-0.029463in}}%
     1776\pgfpathcurveto{\pgfqpoint{0.037276in}{-0.021649in}}{\pgfqpoint{0.041667in}{-0.011050in}}{\pgfqpoint{0.041667in}{0.000000in}}%
     1777\pgfpathcurveto{\pgfqpoint{0.041667in}{0.011050in}}{\pgfqpoint{0.037276in}{0.021649in}}{\pgfqpoint{0.029463in}{0.029463in}}%
     1778\pgfpathcurveto{\pgfqpoint{0.021649in}{0.037276in}}{\pgfqpoint{0.011050in}{0.041667in}}{\pgfqpoint{0.000000in}{0.041667in}}%
     1779\pgfpathcurveto{\pgfqpoint{-0.011050in}{0.041667in}}{\pgfqpoint{-0.021649in}{0.037276in}}{\pgfqpoint{-0.029463in}{0.029463in}}%
     1780\pgfpathcurveto{\pgfqpoint{-0.037276in}{0.021649in}}{\pgfqpoint{-0.041667in}{0.011050in}}{\pgfqpoint{-0.041667in}{0.000000in}}%
     1781\pgfpathcurveto{\pgfqpoint{-0.041667in}{-0.011050in}}{\pgfqpoint{-0.037276in}{-0.021649in}}{\pgfqpoint{-0.029463in}{-0.029463in}}%
     1782\pgfpathcurveto{\pgfqpoint{-0.021649in}{-0.037276in}}{\pgfqpoint{-0.011050in}{-0.041667in}}{\pgfqpoint{0.000000in}{-0.041667in}}%
     1783\pgfpathclose%
     1784\pgfusepath{stroke,fill}%
     1785}%
     1786\begin{pgfscope}%
     1787\pgfsys@transformshift{1.025455in}{4.050730in}%
     1788\pgfsys@useobject{currentmarker}{}%
     1789\end{pgfscope}%
     1790\begin{pgfscope}%
     1791\pgfsys@transformshift{1.326061in}{2.770511in}%
     1792\pgfsys@useobject{currentmarker}{}%
     1793\end{pgfscope}%
     1794\begin{pgfscope}%
     1795\pgfsys@transformshift{1.927273in}{2.067529in}%
     1796\pgfsys@useobject{currentmarker}{}%
     1797\end{pgfscope}%
     1798\begin{pgfscope}%
     1799\pgfsys@transformshift{3.129697in}{0.864067in}%
     1800\pgfsys@useobject{currentmarker}{}%
     1801\end{pgfscope}%
     1802\begin{pgfscope}%
     1803\pgfsys@transformshift{4.332121in}{0.696000in}%
     1804\pgfsys@useobject{currentmarker}{}%
     1805\end{pgfscope}%
     1806\begin{pgfscope}%
     1807\pgfsys@transformshift{5.534545in}{1.325424in}%
     1808\pgfsys@useobject{currentmarker}{}%
     1809\end{pgfscope}%
     1810\end{pgfscope}%
     1811\begin{pgfscope}%
     1812\pgfsetrectcap%
     1813\pgfsetmiterjoin%
     1814\pgfsetlinewidth{0.803000pt}%
     1815\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}%
     1816\pgfsetstrokecolor{currentstroke}%
     1817\pgfsetdash{}{0pt}%
     1818\pgfpathmoveto{\pgfqpoint{0.800000in}{0.528000in}}%
     1819\pgfpathlineto{\pgfqpoint{0.800000in}{4.224000in}}%
     1820\pgfusepath{stroke}%
     1821\end{pgfscope}%
     1822\begin{pgfscope}%
     1823\pgfsetrectcap%
     1824\pgfsetmiterjoin%
     1825\pgfsetlinewidth{0.803000pt}%
     1826\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}%
     1827\pgfsetstrokecolor{currentstroke}%
     1828\pgfsetdash{}{0pt}%
     1829\pgfpathmoveto{\pgfqpoint{5.760000in}{0.528000in}}%
     1830\pgfpathlineto{\pgfqpoint{5.760000in}{4.224000in}}%
     1831\pgfusepath{stroke}%
     1832\end{pgfscope}%
     1833\begin{pgfscope}%
     1834\pgfsetrectcap%
     1835\pgfsetmiterjoin%
     1836\pgfsetlinewidth{0.803000pt}%
     1837\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}%
     1838\pgfsetstrokecolor{currentstroke}%
     1839\pgfsetdash{}{0pt}%
     1840\pgfpathmoveto{\pgfqpoint{0.800000in}{0.528000in}}%
     1841\pgfpathlineto{\pgfqpoint{5.760000in}{0.528000in}}%
     1842\pgfusepath{stroke}%
     1843\end{pgfscope}%
     1844\begin{pgfscope}%
     1845\pgfsetrectcap%
     1846\pgfsetmiterjoin%
     1847\pgfsetlinewidth{0.803000pt}%
     1848\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}%
     1849\pgfsetstrokecolor{currentstroke}%
     1850\pgfsetdash{}{0pt}%
     1851\pgfpathmoveto{\pgfqpoint{0.800000in}{4.224000in}}%
     1852\pgfpathlineto{\pgfqpoint{5.760000in}{4.224000in}}%
     1853\pgfusepath{stroke}%
    19541854\end{pgfscope}%
    19551855\begin{pgfscope}%
     
    19571857\pgfsetstrokecolor{textcolor}%
    19581858\pgfsetfillcolor{textcolor}%
    1959 \pgftext[x=4.269368in,y=2.802697in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont CFA-baseline}%
    1960 \end{pgfscope}%
    1961 \begin{pgfscope}%
    1962 \pgfsetbuttcap%
    1963 \pgfsetroundjoin%
    1964 \pgfsetlinewidth{1.505625pt}%
    1965 \definecolor{currentstroke}{rgb}{1.000000,0.498039,0.054902}%
    1966 \pgfsetstrokecolor{currentstroke}%
    1967 \pgfsetdash{}{0pt}%
    1968 \pgfpathmoveto{\pgfqpoint{3.869368in}{2.444904in}}%
    1969 \pgfpathlineto{\pgfqpoint{3.869368in}{2.667126in}}%
    1970 \pgfusepath{stroke}%
    1971 \end{pgfscope}%
    1972 \begin{pgfscope}%
    1973 \pgfsetbuttcap%
    1974 \pgfsetroundjoin%
    1975 \definecolor{currentfill}{rgb}{1.000000,0.498039,0.054902}%
    1976 \pgfsetfillcolor{currentfill}%
    1977 \pgfsetlinewidth{1.003750pt}%
    1978 \definecolor{currentstroke}{rgb}{1.000000,0.498039,0.054902}%
     1859\pgftext[x=3.280000in,y=4.307333in,,base]{\color{textcolor}\rmfamily\fontsize{12.000000}{14.400000}\selectfont Aggregate Lock Benchmark: 2 Locks}%
     1860\end{pgfscope}%
     1861\begin{pgfscope}%
     1862\pgfsetbuttcap%
     1863\pgfsetmiterjoin%
     1864\definecolor{currentfill}{rgb}{1.000000,1.000000,1.000000}%
     1865\pgfsetfillcolor{currentfill}%
     1866\pgfsetfillopacity{0.800000}%
     1867\pgfsetlinewidth{1.003750pt}%
     1868\definecolor{currentstroke}{rgb}{0.800000,0.800000,0.800000}%
     1869\pgfsetstrokecolor{currentstroke}%
     1870\pgfsetstrokeopacity{0.800000}%
     1871\pgfsetdash{}{0pt}%
     1872\pgfpathmoveto{\pgfqpoint{4.403517in}{1.967821in}}%
     1873\pgfpathlineto{\pgfqpoint{5.662778in}{1.967821in}}%
     1874\pgfpathquadraticcurveto{\pgfqpoint{5.690556in}{1.967821in}}{\pgfqpoint{5.690556in}{1.995599in}}%
     1875\pgfpathlineto{\pgfqpoint{5.690556in}{2.756401in}}%
     1876\pgfpathquadraticcurveto{\pgfqpoint{5.690556in}{2.784179in}}{\pgfqpoint{5.662778in}{2.784179in}}%
     1877\pgfpathlineto{\pgfqpoint{4.403517in}{2.784179in}}%
     1878\pgfpathquadraticcurveto{\pgfqpoint{4.375739in}{2.784179in}}{\pgfqpoint{4.375739in}{2.756401in}}%
     1879\pgfpathlineto{\pgfqpoint{4.375739in}{1.995599in}}%
     1880\pgfpathquadraticcurveto{\pgfqpoint{4.375739in}{1.967821in}}{\pgfqpoint{4.403517in}{1.967821in}}%
     1881\pgfpathclose%
     1882\pgfusepath{stroke,fill}%
     1883\end{pgfscope}%
     1884\begin{pgfscope}%
     1885\pgfsetbuttcap%
     1886\pgfsetroundjoin%
     1887\pgfsetlinewidth{1.505625pt}%
     1888\definecolor{currentstroke}{rgb}{0.121569,0.466667,0.705882}%
     1889\pgfsetstrokecolor{currentstroke}%
     1890\pgfsetdash{}{0pt}%
     1891\pgfpathmoveto{\pgfqpoint{4.570184in}{2.610568in}}%
     1892\pgfpathlineto{\pgfqpoint{4.570184in}{2.749457in}}%
     1893\pgfusepath{stroke}%
     1894\end{pgfscope}%
     1895\begin{pgfscope}%
     1896\pgfsetbuttcap%
     1897\pgfsetroundjoin%
     1898\definecolor{currentfill}{rgb}{0.121569,0.466667,0.705882}%
     1899\pgfsetfillcolor{currentfill}%
     1900\pgfsetlinewidth{1.003750pt}%
     1901\definecolor{currentstroke}{rgb}{0.121569,0.466667,0.705882}%
    19791902\pgfsetstrokecolor{currentstroke}%
    19801903\pgfsetdash{}{0pt}%
     
    19851908}%
    19861909\begin{pgfscope}%
    1987 \pgfsys@transformshift{3.869368in}{2.444904in}%
    1988 \pgfsys@useobject{currentmarker}{}%
    1989 \end{pgfscope}%
    1990 \end{pgfscope}%
    1991 \begin{pgfscope}%
    1992 \pgfsetbuttcap%
    1993 \pgfsetroundjoin%
    1994 \definecolor{currentfill}{rgb}{1.000000,0.498039,0.054902}%
    1995 \pgfsetfillcolor{currentfill}%
    1996 \pgfsetlinewidth{1.003750pt}%
    1997 \definecolor{currentstroke}{rgb}{1.000000,0.498039,0.054902}%
     1910\pgfsys@transformshift{4.570184in}{2.610568in}%
     1911\pgfsys@useobject{currentmarker}{}%
     1912\end{pgfscope}%
     1913\end{pgfscope}%
     1914\begin{pgfscope}%
     1915\pgfsetbuttcap%
     1916\pgfsetroundjoin%
     1917\definecolor{currentfill}{rgb}{0.121569,0.466667,0.705882}%
     1918\pgfsetfillcolor{currentfill}%
     1919\pgfsetlinewidth{1.003750pt}%
     1920\definecolor{currentstroke}{rgb}{0.121569,0.466667,0.705882}%
    19981921\pgfsetstrokecolor{currentstroke}%
    19991922\pgfsetdash{}{0pt}%
     
    20041927}%
    20051928\begin{pgfscope}%
    2006 \pgfsys@transformshift{3.869368in}{2.667126in}%
     1929\pgfsys@transformshift{4.570184in}{2.749457in}%
    20071930\pgfsys@useobject{currentmarker}{}%
    20081931\end{pgfscope}%
     
    20121935\pgfsetroundjoin%
    20131936\pgfsetlinewidth{1.505625pt}%
    2014 \definecolor{currentstroke}{rgb}{1.000000,0.498039,0.054902}%
    2015 \pgfsetstrokecolor{currentstroke}%
    2016 \pgfsetdash{}{0pt}%
    2017 \pgfpathmoveto{\pgfqpoint{3.647146in}{2.556015in}}%
    2018 \pgfpathlineto{\pgfqpoint{4.091591in}{2.556015in}}%
    2019 \pgfusepath{stroke}%
    2020 \end{pgfscope}%
    2021 \begin{pgfscope}%
    2022 \pgfsetbuttcap%
    2023 \pgfsetmiterjoin%
    2024 \definecolor{currentfill}{rgb}{1.000000,0.498039,0.054902}%
    2025 \pgfsetfillcolor{currentfill}%
    2026 \pgfsetlinewidth{1.003750pt}%
    2027 \definecolor{currentstroke}{rgb}{1.000000,0.498039,0.054902}%
     1937\definecolor{currentstroke}{rgb}{0.121569,0.466667,0.705882}%
     1938\pgfsetstrokecolor{currentstroke}%
     1939\pgfsetdash{}{0pt}%
     1940\pgfpathmoveto{\pgfqpoint{4.431295in}{2.680012in}}%
     1941\pgfpathlineto{\pgfqpoint{4.709073in}{2.680012in}}%
     1942\pgfusepath{stroke}%
     1943\end{pgfscope}%
     1944\begin{pgfscope}%
     1945\pgfsetbuttcap%
     1946\pgfsetroundjoin%
     1947\definecolor{currentfill}{rgb}{0.121569,0.466667,0.705882}%
     1948\pgfsetfillcolor{currentfill}%
     1949\pgfsetlinewidth{1.003750pt}%
     1950\definecolor{currentstroke}{rgb}{0.121569,0.466667,0.705882}%
    20281951\pgfsetstrokecolor{currentstroke}%
    20291952\pgfsetdash{}{0pt}%
    20301953\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.041667in}{-0.041667in}}{\pgfqpoint{0.041667in}{0.041667in}}{%
    2031 \pgfpathmoveto{\pgfqpoint{-0.041667in}{-0.041667in}}%
    2032 \pgfpathlineto{\pgfqpoint{0.041667in}{-0.041667in}}%
    2033 \pgfpathlineto{\pgfqpoint{0.041667in}{0.041667in}}%
    2034 \pgfpathlineto{\pgfqpoint{-0.041667in}{0.041667in}}%
     1954\pgfpathmoveto{\pgfqpoint{0.000000in}{-0.041667in}}%
     1955\pgfpathcurveto{\pgfqpoint{0.011050in}{-0.041667in}}{\pgfqpoint{0.021649in}{-0.037276in}}{\pgfqpoint{0.029463in}{-0.029463in}}%
     1956\pgfpathcurveto{\pgfqpoint{0.037276in}{-0.021649in}}{\pgfqpoint{0.041667in}{-0.011050in}}{\pgfqpoint{0.041667in}{0.000000in}}%
     1957\pgfpathcurveto{\pgfqpoint{0.041667in}{0.011050in}}{\pgfqpoint{0.037276in}{0.021649in}}{\pgfqpoint{0.029463in}{0.029463in}}%
     1958\pgfpathcurveto{\pgfqpoint{0.021649in}{0.037276in}}{\pgfqpoint{0.011050in}{0.041667in}}{\pgfqpoint{0.000000in}{0.041667in}}%
     1959\pgfpathcurveto{\pgfqpoint{-0.011050in}{0.041667in}}{\pgfqpoint{-0.021649in}{0.037276in}}{\pgfqpoint{-0.029463in}{0.029463in}}%
     1960\pgfpathcurveto{\pgfqpoint{-0.037276in}{0.021649in}}{\pgfqpoint{-0.041667in}{0.011050in}}{\pgfqpoint{-0.041667in}{0.000000in}}%
     1961\pgfpathcurveto{\pgfqpoint{-0.041667in}{-0.011050in}}{\pgfqpoint{-0.037276in}{-0.021649in}}{\pgfqpoint{-0.029463in}{-0.029463in}}%
     1962\pgfpathcurveto{\pgfqpoint{-0.021649in}{-0.037276in}}{\pgfqpoint{-0.011050in}{-0.041667in}}{\pgfqpoint{0.000000in}{-0.041667in}}%
    20351963\pgfpathclose%
    20361964\pgfusepath{stroke,fill}%
    20371965}%
    20381966\begin{pgfscope}%
    2039 \pgfsys@transformshift{3.869368in}{2.556015in}%
     1967\pgfsys@transformshift{4.570184in}{2.680012in}%
    20401968\pgfsys@useobject{currentmarker}{}%
    20411969\end{pgfscope}%
     
    20451973\pgfsetstrokecolor{textcolor}%
    20461974\pgfsetfillcolor{textcolor}%
    2047 \pgftext[x=4.269368in,y=2.478238in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont CPP-baseline}%
    2048 \end{pgfscope}%
    2049 \begin{pgfscope}%
    2050 \pgfsetbuttcap%
    2051 \pgfsetroundjoin%
    2052 \pgfsetlinewidth{1.505625pt}%
    2053 \definecolor{currentstroke}{rgb}{0.172549,0.627451,0.172549}%
    2054 \pgfsetstrokecolor{currentstroke}%
    2055 \pgfsetdash{}{0pt}%
    2056 \pgfpathmoveto{\pgfqpoint{3.869368in}{2.120444in}}%
    2057 \pgfpathlineto{\pgfqpoint{3.869368in}{2.342667in}}%
    2058 \pgfusepath{stroke}%
    2059 \end{pgfscope}%
    2060 \begin{pgfscope}%
    2061 \pgfsetbuttcap%
    2062 \pgfsetroundjoin%
    2063 \definecolor{currentfill}{rgb}{0.172549,0.627451,0.172549}%
    2064 \pgfsetfillcolor{currentfill}%
    2065 \pgfsetlinewidth{1.003750pt}%
    2066 \definecolor{currentstroke}{rgb}{0.172549,0.627451,0.172549}%
     1975\pgftext[x=4.820184in,y=2.631401in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont CFA-baseline}%
     1976\end{pgfscope}%
     1977\begin{pgfscope}%
     1978\pgfsetbuttcap%
     1979\pgfsetroundjoin%
     1980\pgfsetlinewidth{1.505625pt}%
     1981\definecolor{currentstroke}{rgb}{1.000000,0.498039,0.054902}%
     1982\pgfsetstrokecolor{currentstroke}%
     1983\pgfsetdash{}{0pt}%
     1984\pgfpathmoveto{\pgfqpoint{4.570184in}{2.416895in}}%
     1985\pgfpathlineto{\pgfqpoint{4.570184in}{2.555784in}}%
     1986\pgfusepath{stroke}%
     1987\end{pgfscope}%
     1988\begin{pgfscope}%
     1989\pgfsetbuttcap%
     1990\pgfsetroundjoin%
     1991\definecolor{currentfill}{rgb}{1.000000,0.498039,0.054902}%
     1992\pgfsetfillcolor{currentfill}%
     1993\pgfsetlinewidth{1.003750pt}%
     1994\definecolor{currentstroke}{rgb}{1.000000,0.498039,0.054902}%
    20671995\pgfsetstrokecolor{currentstroke}%
    20681996\pgfsetdash{}{0pt}%
     
    20732001}%
    20742002\begin{pgfscope}%
    2075 \pgfsys@transformshift{3.869368in}{2.120444in}%
    2076 \pgfsys@useobject{currentmarker}{}%
    2077 \end{pgfscope}%
    2078 \end{pgfscope}%
    2079 \begin{pgfscope}%
    2080 \pgfsetbuttcap%
    2081 \pgfsetroundjoin%
    2082 \definecolor{currentfill}{rgb}{0.172549,0.627451,0.172549}%
    2083 \pgfsetfillcolor{currentfill}%
    2084 \pgfsetlinewidth{1.003750pt}%
    2085 \definecolor{currentstroke}{rgb}{0.172549,0.627451,0.172549}%
     2003\pgfsys@transformshift{4.570184in}{2.416895in}%
     2004\pgfsys@useobject{currentmarker}{}%
     2005\end{pgfscope}%
     2006\end{pgfscope}%
     2007\begin{pgfscope}%
     2008\pgfsetbuttcap%
     2009\pgfsetroundjoin%
     2010\definecolor{currentfill}{rgb}{1.000000,0.498039,0.054902}%
     2011\pgfsetfillcolor{currentfill}%
     2012\pgfsetlinewidth{1.003750pt}%
     2013\definecolor{currentstroke}{rgb}{1.000000,0.498039,0.054902}%
    20862014\pgfsetstrokecolor{currentstroke}%
    20872015\pgfsetdash{}{0pt}%
     
    20922020}%
    20932021\begin{pgfscope}%
    2094 \pgfsys@transformshift{3.869368in}{2.342667in}%
     2022\pgfsys@transformshift{4.570184in}{2.555784in}%
    20952023\pgfsys@useobject{currentmarker}{}%
    20962024\end{pgfscope}%
     
    21002028\pgfsetroundjoin%
    21012029\pgfsetlinewidth{1.505625pt}%
    2102 \definecolor{currentstroke}{rgb}{0.172549,0.627451,0.172549}%
    2103 \pgfsetstrokecolor{currentstroke}%
    2104 \pgfsetdash{}{0pt}%
    2105 \pgfpathmoveto{\pgfqpoint{3.647146in}{2.231556in}}%
    2106 \pgfpathlineto{\pgfqpoint{4.091591in}{2.231556in}}%
    2107 \pgfusepath{stroke}%
    2108 \end{pgfscope}%
    2109 \begin{pgfscope}%
    2110 \pgfsetbuttcap%
    2111 \pgfsetmiterjoin%
    2112 \definecolor{currentfill}{rgb}{0.172549,0.627451,0.172549}%
    2113 \pgfsetfillcolor{currentfill}%
    2114 \pgfsetlinewidth{1.003750pt}%
    2115 \definecolor{currentstroke}{rgb}{0.172549,0.627451,0.172549}%
    2116 \pgfsetstrokecolor{currentstroke}%
    2117 \pgfsetdash{}{0pt}%
    2118 \pgfsys@defobject{currentmarker}{\pgfqpoint{-0.058926in}{-0.058926in}}{\pgfqpoint{0.058926in}{0.058926in}}{%
    2119 \pgfpathmoveto{\pgfqpoint{-0.000000in}{-0.058926in}}%
    2120 \pgfpathlineto{\pgfqpoint{0.058926in}{0.000000in}}%
    2121 \pgfpathlineto{\pgfqpoint{0.000000in}{0.058926in}}%
    2122 \pgfpathlineto{\pgfqpoint{-0.058926in}{0.000000in}}%
     2030\definecolor{currentstroke}{rgb}{1.000000,0.498039,0.054902}%
     2031\pgfsetstrokecolor{currentstroke}%
     2032\pgfsetdash{}{0pt}%
     2033\pgfpathmoveto{\pgfqpoint{4.431295in}{2.486339in}}%
     2034\pgfpathlineto{\pgfqpoint{4.709073in}{2.486339in}}%
     2035\pgfusepath{stroke}%
     2036\end{pgfscope}%
     2037\begin{pgfscope}%
     2038\pgfsetbuttcap%
     2039\pgfsetroundjoin%
     2040\definecolor{currentfill}{rgb}{1.000000,0.498039,0.054902}%
     2041\pgfsetfillcolor{currentfill}%
     2042\pgfsetlinewidth{1.003750pt}%
     2043\definecolor{currentstroke}{rgb}{1.000000,0.498039,0.054902}%
     2044\pgfsetstrokecolor{currentstroke}%
     2045\pgfsetdash{}{0pt}%
     2046\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.041667in}{-0.041667in}}{\pgfqpoint{0.041667in}{0.041667in}}{%
     2047\pgfpathmoveto{\pgfqpoint{0.000000in}{-0.041667in}}%
     2048\pgfpathcurveto{\pgfqpoint{0.011050in}{-0.041667in}}{\pgfqpoint{0.021649in}{-0.037276in}}{\pgfqpoint{0.029463in}{-0.029463in}}%
     2049\pgfpathcurveto{\pgfqpoint{0.037276in}{-0.021649in}}{\pgfqpoint{0.041667in}{-0.011050in}}{\pgfqpoint{0.041667in}{0.000000in}}%
     2050\pgfpathcurveto{\pgfqpoint{0.041667in}{0.011050in}}{\pgfqpoint{0.037276in}{0.021649in}}{\pgfqpoint{0.029463in}{0.029463in}}%
     2051\pgfpathcurveto{\pgfqpoint{0.021649in}{0.037276in}}{\pgfqpoint{0.011050in}{0.041667in}}{\pgfqpoint{0.000000in}{0.041667in}}%
     2052\pgfpathcurveto{\pgfqpoint{-0.011050in}{0.041667in}}{\pgfqpoint{-0.021649in}{0.037276in}}{\pgfqpoint{-0.029463in}{0.029463in}}%
     2053\pgfpathcurveto{\pgfqpoint{-0.037276in}{0.021649in}}{\pgfqpoint{-0.041667in}{0.011050in}}{\pgfqpoint{-0.041667in}{0.000000in}}%
     2054\pgfpathcurveto{\pgfqpoint{-0.041667in}{-0.011050in}}{\pgfqpoint{-0.037276in}{-0.021649in}}{\pgfqpoint{-0.029463in}{-0.029463in}}%
     2055\pgfpathcurveto{\pgfqpoint{-0.021649in}{-0.037276in}}{\pgfqpoint{-0.011050in}{-0.041667in}}{\pgfqpoint{0.000000in}{-0.041667in}}%
    21232056\pgfpathclose%
    21242057\pgfusepath{stroke,fill}%
    21252058}%
    21262059\begin{pgfscope}%
    2127 \pgfsys@transformshift{3.869368in}{2.231556in}%
     2060\pgfsys@transformshift{4.570184in}{2.486339in}%
    21282061\pgfsys@useobject{currentmarker}{}%
    21292062\end{pgfscope}%
     
    21332066\pgfsetstrokecolor{textcolor}%
    21342067\pgfsetfillcolor{textcolor}%
    2135 \pgftext[x=4.269368in,y=2.153778in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont CFA-rand}%
    2136 \end{pgfscope}%
    2137 \begin{pgfscope}%
    2138 \pgfsetbuttcap%
    2139 \pgfsetroundjoin%
    2140 \pgfsetlinewidth{1.505625pt}%
    2141 \definecolor{currentstroke}{rgb}{0.839216,0.152941,0.156863}%
    2142 \pgfsetstrokecolor{currentstroke}%
    2143 \pgfsetdash{}{0pt}%
    2144 \pgfpathmoveto{\pgfqpoint{3.869368in}{1.795985in}}%
    2145 \pgfpathlineto{\pgfqpoint{3.869368in}{2.018207in}}%
    2146 \pgfusepath{stroke}%
    2147 \end{pgfscope}%
    2148 \begin{pgfscope}%
    2149 \pgfsetbuttcap%
    2150 \pgfsetroundjoin%
    2151 \definecolor{currentfill}{rgb}{0.839216,0.152941,0.156863}%
    2152 \pgfsetfillcolor{currentfill}%
    2153 \pgfsetlinewidth{1.003750pt}%
    2154 \definecolor{currentstroke}{rgb}{0.839216,0.152941,0.156863}%
     2068\pgftext[x=4.820184in,y=2.437728in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont CPP-baseline}%
     2069\end{pgfscope}%
     2070\begin{pgfscope}%
     2071\pgfsetbuttcap%
     2072\pgfsetroundjoin%
     2073\pgfsetlinewidth{1.505625pt}%
     2074\definecolor{currentstroke}{rgb}{0.172549,0.627451,0.172549}%
     2075\pgfsetstrokecolor{currentstroke}%
     2076\pgfsetdash{}{0pt}%
     2077\pgfpathmoveto{\pgfqpoint{4.570184in}{2.223222in}}%
     2078\pgfpathlineto{\pgfqpoint{4.570184in}{2.362111in}}%
     2079\pgfusepath{stroke}%
     2080\end{pgfscope}%
     2081\begin{pgfscope}%
     2082\pgfsetbuttcap%
     2083\pgfsetroundjoin%
     2084\definecolor{currentfill}{rgb}{0.172549,0.627451,0.172549}%
     2085\pgfsetfillcolor{currentfill}%
     2086\pgfsetlinewidth{1.003750pt}%
     2087\definecolor{currentstroke}{rgb}{0.172549,0.627451,0.172549}%
    21552088\pgfsetstrokecolor{currentstroke}%
    21562089\pgfsetdash{}{0pt}%
     
    21612094}%
    21622095\begin{pgfscope}%
    2163 \pgfsys@transformshift{3.869368in}{1.795985in}%
    2164 \pgfsys@useobject{currentmarker}{}%
    2165 \end{pgfscope}%
    2166 \end{pgfscope}%
    2167 \begin{pgfscope}%
    2168 \pgfsetbuttcap%
    2169 \pgfsetroundjoin%
    2170 \definecolor{currentfill}{rgb}{0.839216,0.152941,0.156863}%
    2171 \pgfsetfillcolor{currentfill}%
    2172 \pgfsetlinewidth{1.003750pt}%
    2173 \definecolor{currentstroke}{rgb}{0.839216,0.152941,0.156863}%
     2096\pgfsys@transformshift{4.570184in}{2.223222in}%
     2097\pgfsys@useobject{currentmarker}{}%
     2098\end{pgfscope}%
     2099\end{pgfscope}%
     2100\begin{pgfscope}%
     2101\pgfsetbuttcap%
     2102\pgfsetroundjoin%
     2103\definecolor{currentfill}{rgb}{0.172549,0.627451,0.172549}%
     2104\pgfsetfillcolor{currentfill}%
     2105\pgfsetlinewidth{1.003750pt}%
     2106\definecolor{currentstroke}{rgb}{0.172549,0.627451,0.172549}%
    21742107\pgfsetstrokecolor{currentstroke}%
    21752108\pgfsetdash{}{0pt}%
     
    21802113}%
    21812114\begin{pgfscope}%
    2182 \pgfsys@transformshift{3.869368in}{2.018207in}%
     2115\pgfsys@transformshift{4.570184in}{2.362111in}%
    21832116\pgfsys@useobject{currentmarker}{}%
    21842117\end{pgfscope}%
     
    21882121\pgfsetroundjoin%
    21892122\pgfsetlinewidth{1.505625pt}%
    2190 \definecolor{currentstroke}{rgb}{0.839216,0.152941,0.156863}%
    2191 \pgfsetstrokecolor{currentstroke}%
    2192 \pgfsetdash{}{0pt}%
    2193 \pgfpathmoveto{\pgfqpoint{3.647146in}{1.907096in}}%
    2194 \pgfpathlineto{\pgfqpoint{4.091591in}{1.907096in}}%
    2195 \pgfusepath{stroke}%
    2196 \end{pgfscope}%
    2197 \begin{pgfscope}%
    2198 \pgfsetbuttcap%
    2199 \pgfsetroundjoin%
    2200 \definecolor{currentfill}{rgb}{0.839216,0.152941,0.156863}%
    2201 \pgfsetfillcolor{currentfill}%
    2202 \pgfsetlinewidth{1.003750pt}%
    2203 \definecolor{currentstroke}{rgb}{0.839216,0.152941,0.156863}%
     2123\definecolor{currentstroke}{rgb}{0.172549,0.627451,0.172549}%
     2124\pgfsetstrokecolor{currentstroke}%
     2125\pgfsetdash{}{0pt}%
     2126\pgfpathmoveto{\pgfqpoint{4.431295in}{2.292667in}}%
     2127\pgfpathlineto{\pgfqpoint{4.709073in}{2.292667in}}%
     2128\pgfusepath{stroke}%
     2129\end{pgfscope}%
     2130\begin{pgfscope}%
     2131\pgfsetbuttcap%
     2132\pgfsetroundjoin%
     2133\definecolor{currentfill}{rgb}{0.172549,0.627451,0.172549}%
     2134\pgfsetfillcolor{currentfill}%
     2135\pgfsetlinewidth{1.003750pt}%
     2136\definecolor{currentstroke}{rgb}{0.172549,0.627451,0.172549}%
    22042137\pgfsetstrokecolor{currentstroke}%
    22052138\pgfsetdash{}{0pt}%
    22062139\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.041667in}{-0.041667in}}{\pgfqpoint{0.041667in}{0.041667in}}{%
    2207 \pgfpathmoveto{\pgfqpoint{-0.041667in}{-0.041667in}}%
    2208 \pgfpathlineto{\pgfqpoint{0.041667in}{0.041667in}}%
    2209 \pgfpathmoveto{\pgfqpoint{-0.041667in}{0.041667in}}%
    2210 \pgfpathlineto{\pgfqpoint{0.041667in}{-0.041667in}}%
    2211 \pgfusepath{stroke,fill}%
    2212 }%
    2213 \begin{pgfscope}%
    2214 \pgfsys@transformshift{3.869368in}{1.907096in}%
     2140\pgfpathmoveto{\pgfqpoint{0.000000in}{-0.041667in}}%
     2141\pgfpathcurveto{\pgfqpoint{0.011050in}{-0.041667in}}{\pgfqpoint{0.021649in}{-0.037276in}}{\pgfqpoint{0.029463in}{-0.029463in}}%
     2142\pgfpathcurveto{\pgfqpoint{0.037276in}{-0.021649in}}{\pgfqpoint{0.041667in}{-0.011050in}}{\pgfqpoint{0.041667in}{0.000000in}}%
     2143\pgfpathcurveto{\pgfqpoint{0.041667in}{0.011050in}}{\pgfqpoint{0.037276in}{0.021649in}}{\pgfqpoint{0.029463in}{0.029463in}}%
     2144\pgfpathcurveto{\pgfqpoint{0.021649in}{0.037276in}}{\pgfqpoint{0.011050in}{0.041667in}}{\pgfqpoint{0.000000in}{0.041667in}}%
     2145\pgfpathcurveto{\pgfqpoint{-0.011050in}{0.041667in}}{\pgfqpoint{-0.021649in}{0.037276in}}{\pgfqpoint{-0.029463in}{0.029463in}}%
     2146\pgfpathcurveto{\pgfqpoint{-0.037276in}{0.021649in}}{\pgfqpoint{-0.041667in}{0.011050in}}{\pgfqpoint{-0.041667in}{0.000000in}}%
     2147\pgfpathcurveto{\pgfqpoint{-0.041667in}{-0.011050in}}{\pgfqpoint{-0.037276in}{-0.021649in}}{\pgfqpoint{-0.029463in}{-0.029463in}}%
     2148\pgfpathcurveto{\pgfqpoint{-0.021649in}{-0.037276in}}{\pgfqpoint{-0.011050in}{-0.041667in}}{\pgfqpoint{0.000000in}{-0.041667in}}%
     2149\pgfpathclose%
     2150\pgfusepath{stroke,fill}%
     2151}%
     2152\begin{pgfscope}%
     2153\pgfsys@transformshift{4.570184in}{2.292667in}%
    22152154\pgfsys@useobject{currentmarker}{}%
    22162155\end{pgfscope}%
     
    22202159\pgfsetstrokecolor{textcolor}%
    22212160\pgfsetfillcolor{textcolor}%
    2222 \pgftext[x=4.269368in,y=1.829318in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont CPP-rand}%
     2161\pgftext[x=4.820184in,y=2.244056in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont CFA-rand}%
     2162\end{pgfscope}%
     2163\begin{pgfscope}%
     2164\pgfsetbuttcap%
     2165\pgfsetroundjoin%
     2166\pgfsetlinewidth{1.505625pt}%
     2167\definecolor{currentstroke}{rgb}{0.839216,0.152941,0.156863}%
     2168\pgfsetstrokecolor{currentstroke}%
     2169\pgfsetdash{}{0pt}%
     2170\pgfpathmoveto{\pgfqpoint{4.570184in}{2.029549in}}%
     2171\pgfpathlineto{\pgfqpoint{4.570184in}{2.168438in}}%
     2172\pgfusepath{stroke}%
     2173\end{pgfscope}%
     2174\begin{pgfscope}%
     2175\pgfsetbuttcap%
     2176\pgfsetroundjoin%
     2177\definecolor{currentfill}{rgb}{0.839216,0.152941,0.156863}%
     2178\pgfsetfillcolor{currentfill}%
     2179\pgfsetlinewidth{1.003750pt}%
     2180\definecolor{currentstroke}{rgb}{0.839216,0.152941,0.156863}%
     2181\pgfsetstrokecolor{currentstroke}%
     2182\pgfsetdash{}{0pt}%
     2183\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.027778in}{-0.000000in}}{\pgfqpoint{0.027778in}{0.000000in}}{%
     2184\pgfpathmoveto{\pgfqpoint{0.027778in}{-0.000000in}}%
     2185\pgfpathlineto{\pgfqpoint{-0.027778in}{0.000000in}}%
     2186\pgfusepath{stroke,fill}%
     2187}%
     2188\begin{pgfscope}%
     2189\pgfsys@transformshift{4.570184in}{2.029549in}%
     2190\pgfsys@useobject{currentmarker}{}%
     2191\end{pgfscope}%
     2192\end{pgfscope}%
     2193\begin{pgfscope}%
     2194\pgfsetbuttcap%
     2195\pgfsetroundjoin%
     2196\definecolor{currentfill}{rgb}{0.839216,0.152941,0.156863}%
     2197\pgfsetfillcolor{currentfill}%
     2198\pgfsetlinewidth{1.003750pt}%
     2199\definecolor{currentstroke}{rgb}{0.839216,0.152941,0.156863}%
     2200\pgfsetstrokecolor{currentstroke}%
     2201\pgfsetdash{}{0pt}%
     2202\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.027778in}{-0.000000in}}{\pgfqpoint{0.027778in}{0.000000in}}{%
     2203\pgfpathmoveto{\pgfqpoint{0.027778in}{-0.000000in}}%
     2204\pgfpathlineto{\pgfqpoint{-0.027778in}{0.000000in}}%
     2205\pgfusepath{stroke,fill}%
     2206}%
     2207\begin{pgfscope}%
     2208\pgfsys@transformshift{4.570184in}{2.168438in}%
     2209\pgfsys@useobject{currentmarker}{}%
     2210\end{pgfscope}%
     2211\end{pgfscope}%
     2212\begin{pgfscope}%
     2213\pgfsetrectcap%
     2214\pgfsetroundjoin%
     2215\pgfsetlinewidth{1.505625pt}%
     2216\definecolor{currentstroke}{rgb}{0.839216,0.152941,0.156863}%
     2217\pgfsetstrokecolor{currentstroke}%
     2218\pgfsetdash{}{0pt}%
     2219\pgfpathmoveto{\pgfqpoint{4.431295in}{2.098994in}}%
     2220\pgfpathlineto{\pgfqpoint{4.709073in}{2.098994in}}%
     2221\pgfusepath{stroke}%
     2222\end{pgfscope}%
     2223\begin{pgfscope}%
     2224\pgfsetbuttcap%
     2225\pgfsetroundjoin%
     2226\definecolor{currentfill}{rgb}{0.839216,0.152941,0.156863}%
     2227\pgfsetfillcolor{currentfill}%
     2228\pgfsetlinewidth{1.003750pt}%
     2229\definecolor{currentstroke}{rgb}{0.839216,0.152941,0.156863}%
     2230\pgfsetstrokecolor{currentstroke}%
     2231\pgfsetdash{}{0pt}%
     2232\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.041667in}{-0.041667in}}{\pgfqpoint{0.041667in}{0.041667in}}{%
     2233\pgfpathmoveto{\pgfqpoint{0.000000in}{-0.041667in}}%
     2234\pgfpathcurveto{\pgfqpoint{0.011050in}{-0.041667in}}{\pgfqpoint{0.021649in}{-0.037276in}}{\pgfqpoint{0.029463in}{-0.029463in}}%
     2235\pgfpathcurveto{\pgfqpoint{0.037276in}{-0.021649in}}{\pgfqpoint{0.041667in}{-0.011050in}}{\pgfqpoint{0.041667in}{0.000000in}}%
     2236\pgfpathcurveto{\pgfqpoint{0.041667in}{0.011050in}}{\pgfqpoint{0.037276in}{0.021649in}}{\pgfqpoint{0.029463in}{0.029463in}}%
     2237\pgfpathcurveto{\pgfqpoint{0.021649in}{0.037276in}}{\pgfqpoint{0.011050in}{0.041667in}}{\pgfqpoint{0.000000in}{0.041667in}}%
     2238\pgfpathcurveto{\pgfqpoint{-0.011050in}{0.041667in}}{\pgfqpoint{-0.021649in}{0.037276in}}{\pgfqpoint{-0.029463in}{0.029463in}}%
     2239\pgfpathcurveto{\pgfqpoint{-0.037276in}{0.021649in}}{\pgfqpoint{-0.041667in}{0.011050in}}{\pgfqpoint{-0.041667in}{0.000000in}}%
     2240\pgfpathcurveto{\pgfqpoint{-0.041667in}{-0.011050in}}{\pgfqpoint{-0.037276in}{-0.021649in}}{\pgfqpoint{-0.029463in}{-0.029463in}}%
     2241\pgfpathcurveto{\pgfqpoint{-0.021649in}{-0.037276in}}{\pgfqpoint{-0.011050in}{-0.041667in}}{\pgfqpoint{0.000000in}{-0.041667in}}%
     2242\pgfpathclose%
     2243\pgfusepath{stroke,fill}%
     2244}%
     2245\begin{pgfscope}%
     2246\pgfsys@transformshift{4.570184in}{2.098994in}%
     2247\pgfsys@useobject{currentmarker}{}%
     2248\end{pgfscope}%
     2249\end{pgfscope}%
     2250\begin{pgfscope}%
     2251\definecolor{textcolor}{rgb}{0.000000,0.000000,0.000000}%
     2252\pgfsetstrokecolor{textcolor}%
     2253\pgfsetfillcolor{textcolor}%
     2254\pgftext[x=4.820184in,y=2.050383in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont CPP-rand}%
    22232255\end{pgfscope}%
    22242256\end{pgfpicture}%
  • doc/theses/colby_parsons_MMAth/figures/nasus_Aggregate_Lock_4.pgf

    r044ae62 r3a513d89  
    7777\pgfsetstrokecolor{textcolor}%
    7878\pgfsetfillcolor{textcolor}%
    79 \pgftext[x=1.025455in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 2\)}%
     79\pgftext[x=1.025455in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 2\)}%
    8080\end{pgfscope}%
    8181\begin{pgfscope}%
     
    102102\pgfsetstrokecolor{textcolor}%
    103103\pgfsetfillcolor{textcolor}%
    104 \pgftext[x=1.326061in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 4\)}%
     104\pgftext[x=1.326061in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 4\)}%
    105105\end{pgfscope}%
    106106\begin{pgfscope}%
     
    127127\pgfsetstrokecolor{textcolor}%
    128128\pgfsetfillcolor{textcolor}%
    129 \pgftext[x=1.927273in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 8\)}%
     129\pgftext[x=1.927273in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 8\)}%
    130130\end{pgfscope}%
    131131\begin{pgfscope}%
     
    152152\pgfsetstrokecolor{textcolor}%
    153153\pgfsetfillcolor{textcolor}%
    154 \pgftext[x=3.129697in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 16\)}%
     154\pgftext[x=3.129697in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 16\)}%
    155155\end{pgfscope}%
    156156\begin{pgfscope}%
     
    177177\pgfsetstrokecolor{textcolor}%
    178178\pgfsetfillcolor{textcolor}%
    179 \pgftext[x=4.332121in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 24\)}%
     179\pgftext[x=4.332121in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 24\)}%
    180180\end{pgfscope}%
    181181\begin{pgfscope}%
     
    202202\pgfsetstrokecolor{textcolor}%
    203203\pgfsetfillcolor{textcolor}%
    204 \pgftext[x=5.534545in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 32\)}%
     204\pgftext[x=5.534545in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 32\)}%
    205205\end{pgfscope}%
    206206\begin{pgfscope}%
     
    208208\pgfsetstrokecolor{textcolor}%
    209209\pgfsetfillcolor{textcolor}%
    210 \pgftext[x=3.280000in,y=0.161874in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont Cores}%
     210\pgftext[x=3.280000in,y=0.251766in,,top]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont Cores}%
    211211\end{pgfscope}%
    212212\begin{pgfscope}%
     
    233233\pgfsetstrokecolor{textcolor}%
    234234\pgfsetfillcolor{textcolor}%
    235 \pgftext[x=0.399655in,y=0.697537in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 10^{3}\)}%
     235\pgftext[x=0.501581in,y=0.732645in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 10^{3}\)}%
    236236\end{pgfscope}%
    237237\begin{pgfscope}%
     
    258258\pgfsetstrokecolor{textcolor}%
    259259\pgfsetfillcolor{textcolor}%
    260 \pgftext[x=0.399655in,y=1.392266in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 10^{4}\)}%
     260\pgftext[x=0.501581in,y=1.427374in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 10^{4}\)}%
    261261\end{pgfscope}%
    262262\begin{pgfscope}%
     
    283283\pgfsetstrokecolor{textcolor}%
    284284\pgfsetfillcolor{textcolor}%
    285 \pgftext[x=0.399655in,y=2.086994in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 10^{5}\)}%
     285\pgftext[x=0.501581in,y=2.122103in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 10^{5}\)}%
    286286\end{pgfscope}%
    287287\begin{pgfscope}%
     
    308308\pgfsetstrokecolor{textcolor}%
    309309\pgfsetfillcolor{textcolor}%
    310 \pgftext[x=0.399655in,y=2.781723in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 10^{6}\)}%
     310\pgftext[x=0.501581in,y=2.816831in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 10^{6}\)}%
    311311\end{pgfscope}%
    312312\begin{pgfscope}%
     
    333333\pgfsetstrokecolor{textcolor}%
    334334\pgfsetfillcolor{textcolor}%
    335 \pgftext[x=0.399655in,y=3.476452in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 10^{7}\)}%
     335\pgftext[x=0.501581in,y=3.511560in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 10^{7}\)}%
    336336\end{pgfscope}%
    337337\begin{pgfscope}%
     
    11941194\pgfsetstrokecolor{textcolor}%
    11951195\pgfsetfillcolor{textcolor}%
    1196 \pgftext[x=0.344100in,y=2.376000in,,bottom,rotate=90.000000]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont Throughput (entries)}%
     1196\pgftext[x=0.446026in,y=2.376000in,,bottom,rotate=90.000000]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont Throughput (entries)}%
    11971197\end{pgfscope}%
    11981198\begin{pgfscope}%
     
    18571857\pgfusepath{clip}%
    18581858\pgfsetbuttcap%
    1859 \pgfsetmiterjoin%
     1859\pgfsetroundjoin%
    18601860\definecolor{currentfill}{rgb}{0.121569,0.466667,0.705882}%
    18611861\pgfsetfillcolor{currentfill}%
     
    18641864\pgfsetstrokecolor{currentstroke}%
    18651865\pgfsetdash{}{0pt}%
    1866 \pgfsys@defobject{currentmarker}{\pgfqpoint{-0.039627in}{-0.033709in}}{\pgfqpoint{0.039627in}{0.041667in}}{%
    1867 \pgfpathmoveto{\pgfqpoint{0.000000in}{0.041667in}}%
    1868 \pgfpathlineto{\pgfqpoint{-0.039627in}{0.012876in}}%
    1869 \pgfpathlineto{\pgfqpoint{-0.024491in}{-0.033709in}}%
    1870 \pgfpathlineto{\pgfqpoint{0.024491in}{-0.033709in}}%
    1871 \pgfpathlineto{\pgfqpoint{0.039627in}{0.012876in}}%
     1866\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.041667in}{-0.041667in}}{\pgfqpoint{0.041667in}{0.041667in}}{%
     1867\pgfpathmoveto{\pgfqpoint{0.000000in}{-0.041667in}}%
     1868\pgfpathcurveto{\pgfqpoint{0.011050in}{-0.041667in}}{\pgfqpoint{0.021649in}{-0.037276in}}{\pgfqpoint{0.029463in}{-0.029463in}}%
     1869\pgfpathcurveto{\pgfqpoint{0.037276in}{-0.021649in}}{\pgfqpoint{0.041667in}{-0.011050in}}{\pgfqpoint{0.041667in}{0.000000in}}%
     1870\pgfpathcurveto{\pgfqpoint{0.041667in}{0.011050in}}{\pgfqpoint{0.037276in}{0.021649in}}{\pgfqpoint{0.029463in}{0.029463in}}%
     1871\pgfpathcurveto{\pgfqpoint{0.021649in}{0.037276in}}{\pgfqpoint{0.011050in}{0.041667in}}{\pgfqpoint{0.000000in}{0.041667in}}%
     1872\pgfpathcurveto{\pgfqpoint{-0.011050in}{0.041667in}}{\pgfqpoint{-0.021649in}{0.037276in}}{\pgfqpoint{-0.029463in}{0.029463in}}%
     1873\pgfpathcurveto{\pgfqpoint{-0.037276in}{0.021649in}}{\pgfqpoint{-0.041667in}{0.011050in}}{\pgfqpoint{-0.041667in}{0.000000in}}%
     1874\pgfpathcurveto{\pgfqpoint{-0.041667in}{-0.011050in}}{\pgfqpoint{-0.037276in}{-0.021649in}}{\pgfqpoint{-0.029463in}{-0.029463in}}%
     1875\pgfpathcurveto{\pgfqpoint{-0.021649in}{-0.037276in}}{\pgfqpoint{-0.011050in}{-0.041667in}}{\pgfqpoint{0.000000in}{-0.041667in}}%
    18721876\pgfpathclose%
    18731877\pgfusepath{stroke,fill}%
     
    19191923\pgfusepath{clip}%
    19201924\pgfsetbuttcap%
    1921 \pgfsetmiterjoin%
     1925\pgfsetroundjoin%
    19221926\definecolor{currentfill}{rgb}{1.000000,0.498039,0.054902}%
    19231927\pgfsetfillcolor{currentfill}%
     
    19271931\pgfsetdash{}{0pt}%
    19281932\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.041667in}{-0.041667in}}{\pgfqpoint{0.041667in}{0.041667in}}{%
    1929 \pgfpathmoveto{\pgfqpoint{0.000000in}{0.041667in}}%
    1930 \pgfpathlineto{\pgfqpoint{-0.041667in}{-0.041667in}}%
    1931 \pgfpathlineto{\pgfqpoint{0.041667in}{-0.041667in}}%
     1933\pgfpathmoveto{\pgfqpoint{0.000000in}{-0.041667in}}%
     1934\pgfpathcurveto{\pgfqpoint{0.011050in}{-0.041667in}}{\pgfqpoint{0.021649in}{-0.037276in}}{\pgfqpoint{0.029463in}{-0.029463in}}%
     1935\pgfpathcurveto{\pgfqpoint{0.037276in}{-0.021649in}}{\pgfqpoint{0.041667in}{-0.011050in}}{\pgfqpoint{0.041667in}{0.000000in}}%
     1936\pgfpathcurveto{\pgfqpoint{0.041667in}{0.011050in}}{\pgfqpoint{0.037276in}{0.021649in}}{\pgfqpoint{0.029463in}{0.029463in}}%
     1937\pgfpathcurveto{\pgfqpoint{0.021649in}{0.037276in}}{\pgfqpoint{0.011050in}{0.041667in}}{\pgfqpoint{0.000000in}{0.041667in}}%
     1938\pgfpathcurveto{\pgfqpoint{-0.011050in}{0.041667in}}{\pgfqpoint{-0.021649in}{0.037276in}}{\pgfqpoint{-0.029463in}{0.029463in}}%
     1939\pgfpathcurveto{\pgfqpoint{-0.037276in}{0.021649in}}{\pgfqpoint{-0.041667in}{0.011050in}}{\pgfqpoint{-0.041667in}{0.000000in}}%
     1940\pgfpathcurveto{\pgfqpoint{-0.041667in}{-0.011050in}}{\pgfqpoint{-0.037276in}{-0.021649in}}{\pgfqpoint{-0.029463in}{-0.029463in}}%
     1941\pgfpathcurveto{\pgfqpoint{-0.021649in}{-0.037276in}}{\pgfqpoint{-0.011050in}{-0.041667in}}{\pgfqpoint{0.000000in}{-0.041667in}}%
    19321942\pgfpathclose%
    19331943\pgfusepath{stroke,fill}%
     
    19791989\pgfusepath{clip}%
    19801990\pgfsetbuttcap%
    1981 \pgfsetmiterjoin%
     1991\pgfsetroundjoin%
    19821992\definecolor{currentfill}{rgb}{0.172549,0.627451,0.172549}%
    19831993\pgfsetfillcolor{currentfill}%
     
    19861996\pgfsetstrokecolor{currentstroke}%
    19871997\pgfsetdash{}{0pt}%
    1988 \pgfsys@defobject{currentmarker}{\pgfqpoint{-0.036084in}{-0.041667in}}{\pgfqpoint{0.036084in}{0.041667in}}{%
    1989 \pgfpathmoveto{\pgfqpoint{0.000000in}{0.041667in}}%
    1990 \pgfpathlineto{\pgfqpoint{-0.036084in}{0.020833in}}%
    1991 \pgfpathlineto{\pgfqpoint{-0.036084in}{-0.020833in}}%
    1992 \pgfpathlineto{\pgfqpoint{-0.000000in}{-0.041667in}}%
    1993 \pgfpathlineto{\pgfqpoint{0.036084in}{-0.020833in}}%
    1994 \pgfpathlineto{\pgfqpoint{0.036084in}{0.020833in}}%
     1998\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.041667in}{-0.041667in}}{\pgfqpoint{0.041667in}{0.041667in}}{%
     1999\pgfpathmoveto{\pgfqpoint{0.000000in}{-0.041667in}}%
     2000\pgfpathcurveto{\pgfqpoint{0.011050in}{-0.041667in}}{\pgfqpoint{0.021649in}{-0.037276in}}{\pgfqpoint{0.029463in}{-0.029463in}}%
     2001\pgfpathcurveto{\pgfqpoint{0.037276in}{-0.021649in}}{\pgfqpoint{0.041667in}{-0.011050in}}{\pgfqpoint{0.041667in}{0.000000in}}%
     2002\pgfpathcurveto{\pgfqpoint{0.041667in}{0.011050in}}{\pgfqpoint{0.037276in}{0.021649in}}{\pgfqpoint{0.029463in}{0.029463in}}%
     2003\pgfpathcurveto{\pgfqpoint{0.021649in}{0.037276in}}{\pgfqpoint{0.011050in}{0.041667in}}{\pgfqpoint{0.000000in}{0.041667in}}%
     2004\pgfpathcurveto{\pgfqpoint{-0.011050in}{0.041667in}}{\pgfqpoint{-0.021649in}{0.037276in}}{\pgfqpoint{-0.029463in}{0.029463in}}%
     2005\pgfpathcurveto{\pgfqpoint{-0.037276in}{0.021649in}}{\pgfqpoint{-0.041667in}{0.011050in}}{\pgfqpoint{-0.041667in}{0.000000in}}%
     2006\pgfpathcurveto{\pgfqpoint{-0.041667in}{-0.011050in}}{\pgfqpoint{-0.037276in}{-0.021649in}}{\pgfqpoint{-0.029463in}{-0.029463in}}%
     2007\pgfpathcurveto{\pgfqpoint{-0.021649in}{-0.037276in}}{\pgfqpoint{-0.011050in}{-0.041667in}}{\pgfqpoint{0.000000in}{-0.041667in}}%
    19952008\pgfpathclose%
    19962009\pgfusepath{stroke,fill}%
     
    20422055\pgfusepath{clip}%
    20432056\pgfsetbuttcap%
    2044 \pgfsetbeveljoin%
     2057\pgfsetroundjoin%
    20452058\definecolor{currentfill}{rgb}{0.839216,0.152941,0.156863}%
    20462059\pgfsetfillcolor{currentfill}%
     
    20492062\pgfsetstrokecolor{currentstroke}%
    20502063\pgfsetdash{}{0pt}%
    2051 \pgfsys@defobject{currentmarker}{\pgfqpoint{-0.039627in}{-0.033709in}}{\pgfqpoint{0.039627in}{0.041667in}}{%
    2052 \pgfpathmoveto{\pgfqpoint{0.000000in}{0.041667in}}%
    2053 \pgfpathlineto{\pgfqpoint{-0.009355in}{0.012876in}}%
    2054 \pgfpathlineto{\pgfqpoint{-0.039627in}{0.012876in}}%
    2055 \pgfpathlineto{\pgfqpoint{-0.015136in}{-0.004918in}}%
    2056 \pgfpathlineto{\pgfqpoint{-0.024491in}{-0.033709in}}%
    2057 \pgfpathlineto{\pgfqpoint{-0.000000in}{-0.015915in}}%
    2058 \pgfpathlineto{\pgfqpoint{0.024491in}{-0.033709in}}%
    2059 \pgfpathlineto{\pgfqpoint{0.015136in}{-0.004918in}}%
    2060 \pgfpathlineto{\pgfqpoint{0.039627in}{0.012876in}}%
    2061 \pgfpathlineto{\pgfqpoint{0.009355in}{0.012876in}}%
     2064\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.041667in}{-0.041667in}}{\pgfqpoint{0.041667in}{0.041667in}}{%
     2065\pgfpathmoveto{\pgfqpoint{0.000000in}{-0.041667in}}%
     2066\pgfpathcurveto{\pgfqpoint{0.011050in}{-0.041667in}}{\pgfqpoint{0.021649in}{-0.037276in}}{\pgfqpoint{0.029463in}{-0.029463in}}%
     2067\pgfpathcurveto{\pgfqpoint{0.037276in}{-0.021649in}}{\pgfqpoint{0.041667in}{-0.011050in}}{\pgfqpoint{0.041667in}{0.000000in}}%
     2068\pgfpathcurveto{\pgfqpoint{0.041667in}{0.011050in}}{\pgfqpoint{0.037276in}{0.021649in}}{\pgfqpoint{0.029463in}{0.029463in}}%
     2069\pgfpathcurveto{\pgfqpoint{0.021649in}{0.037276in}}{\pgfqpoint{0.011050in}{0.041667in}}{\pgfqpoint{0.000000in}{0.041667in}}%
     2070\pgfpathcurveto{\pgfqpoint{-0.011050in}{0.041667in}}{\pgfqpoint{-0.021649in}{0.037276in}}{\pgfqpoint{-0.029463in}{0.029463in}}%
     2071\pgfpathcurveto{\pgfqpoint{-0.037276in}{0.021649in}}{\pgfqpoint{-0.041667in}{0.011050in}}{\pgfqpoint{-0.041667in}{0.000000in}}%
     2072\pgfpathcurveto{\pgfqpoint{-0.041667in}{-0.011050in}}{\pgfqpoint{-0.037276in}{-0.021649in}}{\pgfqpoint{-0.029463in}{-0.029463in}}%
     2073\pgfpathcurveto{\pgfqpoint{-0.021649in}{-0.037276in}}{\pgfqpoint{-0.011050in}{-0.041667in}}{\pgfqpoint{0.000000in}{-0.041667in}}%
    20622074\pgfpathclose%
    20632075\pgfusepath{stroke,fill}%
     
    21362148\pgfsetstrokecolor{textcolor}%
    21372149\pgfsetfillcolor{textcolor}%
    2138 \pgftext[x=3.280000in,y=4.307333in,,base]{\color{textcolor}\rmfamily\fontsize{19.200000}{23.040000}\selectfont Aggregate Lock Benchmark: 4 Locks}%
     2150\pgftext[x=3.280000in,y=4.307333in,,base]{\color{textcolor}\rmfamily\fontsize{12.000000}{14.400000}\selectfont Aggregate Lock Benchmark: 4 Locks}%
    21392151\end{pgfscope}%
    21402152\begin{pgfscope}%
     
    21492161\pgfsetstrokeopacity{0.800000}%
    21502162\pgfsetdash{}{0pt}%
    2151 \pgfpathmoveto{\pgfqpoint{3.602702in}{1.693747in}}%
    2152 \pgfpathlineto{\pgfqpoint{5.604444in}{1.693747in}}%
    2153 \pgfpathquadraticcurveto{\pgfqpoint{5.648889in}{1.693747in}}{\pgfqpoint{5.648889in}{1.738192in}}%
    2154 \pgfpathlineto{\pgfqpoint{5.648889in}{3.013808in}}%
    2155 \pgfpathquadraticcurveto{\pgfqpoint{5.648889in}{3.058253in}}{\pgfqpoint{5.604444in}{3.058253in}}%
    2156 \pgfpathlineto{\pgfqpoint{3.602702in}{3.058253in}}%
    2157 \pgfpathquadraticcurveto{\pgfqpoint{3.558257in}{3.058253in}}{\pgfqpoint{3.558257in}{3.013808in}}%
    2158 \pgfpathlineto{\pgfqpoint{3.558257in}{1.738192in}}%
    2159 \pgfpathquadraticcurveto{\pgfqpoint{3.558257in}{1.693747in}}{\pgfqpoint{3.602702in}{1.693747in}}%
     2163\pgfpathmoveto{\pgfqpoint{0.897222in}{0.597444in}}%
     2164\pgfpathlineto{\pgfqpoint{2.156483in}{0.597444in}}%
     2165\pgfpathquadraticcurveto{\pgfqpoint{2.184261in}{0.597444in}}{\pgfqpoint{2.184261in}{0.625222in}}%
     2166\pgfpathlineto{\pgfqpoint{2.184261in}{1.386024in}}%
     2167\pgfpathquadraticcurveto{\pgfqpoint{2.184261in}{1.413802in}}{\pgfqpoint{2.156483in}{1.413802in}}%
     2168\pgfpathlineto{\pgfqpoint{0.897222in}{1.413802in}}%
     2169\pgfpathquadraticcurveto{\pgfqpoint{0.869444in}{1.413802in}}{\pgfqpoint{0.869444in}{1.386024in}}%
     2170\pgfpathlineto{\pgfqpoint{0.869444in}{0.625222in}}%
     2171\pgfpathquadraticcurveto{\pgfqpoint{0.869444in}{0.597444in}}{\pgfqpoint{0.897222in}{0.597444in}}%
    21602172\pgfpathclose%
    21612173\pgfusepath{stroke,fill}%
     
    21682180\pgfsetstrokecolor{currentstroke}%
    21692181\pgfsetdash{}{0pt}%
    2170 \pgfpathmoveto{\pgfqpoint{3.869368in}{2.769364in}}%
    2171 \pgfpathlineto{\pgfqpoint{3.869368in}{2.991586in}}%
     2182\pgfpathmoveto{\pgfqpoint{1.063889in}{1.240191in}}%
     2183\pgfpathlineto{\pgfqpoint{1.063889in}{1.379080in}}%
    21722184\pgfusepath{stroke}%
    21732185\end{pgfscope}%
     
    21872199}%
    21882200\begin{pgfscope}%
    2189 \pgfsys@transformshift{3.869368in}{2.769364in}%
     2201\pgfsys@transformshift{1.063889in}{1.240191in}%
    21902202\pgfsys@useobject{currentmarker}{}%
    21912203\end{pgfscope}%
     
    22062218}%
    22072219\begin{pgfscope}%
    2208 \pgfsys@transformshift{3.869368in}{2.991586in}%
     2220\pgfsys@transformshift{1.063889in}{1.379080in}%
    22092221\pgfsys@useobject{currentmarker}{}%
    22102222\end{pgfscope}%
     
    22172229\pgfsetstrokecolor{currentstroke}%
    22182230\pgfsetdash{}{0pt}%
    2219 \pgfpathmoveto{\pgfqpoint{3.647146in}{2.880475in}}%
    2220 \pgfpathlineto{\pgfqpoint{4.091591in}{2.880475in}}%
    2221 \pgfusepath{stroke}%
    2222 \end{pgfscope}%
    2223 \begin{pgfscope}%
    2224 \pgfsetbuttcap%
    2225 \pgfsetmiterjoin%
     2231\pgfpathmoveto{\pgfqpoint{0.925000in}{1.309636in}}%
     2232\pgfpathlineto{\pgfqpoint{1.202778in}{1.309636in}}%
     2233\pgfusepath{stroke}%
     2234\end{pgfscope}%
     2235\begin{pgfscope}%
     2236\pgfsetbuttcap%
     2237\pgfsetroundjoin%
    22262238\definecolor{currentfill}{rgb}{0.121569,0.466667,0.705882}%
    22272239\pgfsetfillcolor{currentfill}%
     
    22302242\pgfsetstrokecolor{currentstroke}%
    22312243\pgfsetdash{}{0pt}%
    2232 \pgfsys@defobject{currentmarker}{\pgfqpoint{-0.039627in}{-0.033709in}}{\pgfqpoint{0.039627in}{0.041667in}}{%
    2233 \pgfpathmoveto{\pgfqpoint{0.000000in}{0.041667in}}%
    2234 \pgfpathlineto{\pgfqpoint{-0.039627in}{0.012876in}}%
    2235 \pgfpathlineto{\pgfqpoint{-0.024491in}{-0.033709in}}%
    2236 \pgfpathlineto{\pgfqpoint{0.024491in}{-0.033709in}}%
    2237 \pgfpathlineto{\pgfqpoint{0.039627in}{0.012876in}}%
     2244\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.041667in}{-0.041667in}}{\pgfqpoint{0.041667in}{0.041667in}}{%
     2245\pgfpathmoveto{\pgfqpoint{0.000000in}{-0.041667in}}%
     2246\pgfpathcurveto{\pgfqpoint{0.011050in}{-0.041667in}}{\pgfqpoint{0.021649in}{-0.037276in}}{\pgfqpoint{0.029463in}{-0.029463in}}%
     2247\pgfpathcurveto{\pgfqpoint{0.037276in}{-0.021649in}}{\pgfqpoint{0.041667in}{-0.011050in}}{\pgfqpoint{0.041667in}{0.000000in}}%
     2248\pgfpathcurveto{\pgfqpoint{0.041667in}{0.011050in}}{\pgfqpoint{0.037276in}{0.021649in}}{\pgfqpoint{0.029463in}{0.029463in}}%
     2249\pgfpathcurveto{\pgfqpoint{0.021649in}{0.037276in}}{\pgfqpoint{0.011050in}{0.041667in}}{\pgfqpoint{0.000000in}{0.041667in}}%
     2250\pgfpathcurveto{\pgfqpoint{-0.011050in}{0.041667in}}{\pgfqpoint{-0.021649in}{0.037276in}}{\pgfqpoint{-0.029463in}{0.029463in}}%
     2251\pgfpathcurveto{\pgfqpoint{-0.037276in}{0.021649in}}{\pgfqpoint{-0.041667in}{0.011050in}}{\pgfqpoint{-0.041667in}{0.000000in}}%
     2252\pgfpathcurveto{\pgfqpoint{-0.041667in}{-0.011050in}}{\pgfqpoint{-0.037276in}{-0.021649in}}{\pgfqpoint{-0.029463in}{-0.029463in}}%
     2253\pgfpathcurveto{\pgfqpoint{-0.021649in}{-0.037276in}}{\pgfqpoint{-0.011050in}{-0.041667in}}{\pgfqpoint{0.000000in}{-0.041667in}}%
    22382254\pgfpathclose%
    22392255\pgfusepath{stroke,fill}%
    22402256}%
    22412257\begin{pgfscope}%
    2242 \pgfsys@transformshift{3.869368in}{2.880475in}%
     2258\pgfsys@transformshift{1.063889in}{1.309636in}%
    22432259\pgfsys@useobject{currentmarker}{}%
    22442260\end{pgfscope}%
     
    22482264\pgfsetstrokecolor{textcolor}%
    22492265\pgfsetfillcolor{textcolor}%
    2250 \pgftext[x=4.269368in,y=2.802697in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont CFA-baseline}%
     2266\pgftext[x=1.313889in,y=1.261024in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont CFA-baseline}%
    22512267\end{pgfscope}%
    22522268\begin{pgfscope}%
     
    22572273\pgfsetstrokecolor{currentstroke}%
    22582274\pgfsetdash{}{0pt}%
    2259 \pgfpathmoveto{\pgfqpoint{3.869368in}{2.444904in}}%
    2260 \pgfpathlineto{\pgfqpoint{3.869368in}{2.667126in}}%
     2275\pgfpathmoveto{\pgfqpoint{1.063889in}{1.046518in}}%
     2276\pgfpathlineto{\pgfqpoint{1.063889in}{1.185407in}}%
    22612277\pgfusepath{stroke}%
    22622278\end{pgfscope}%
     
    22762292}%
    22772293\begin{pgfscope}%
    2278 \pgfsys@transformshift{3.869368in}{2.444904in}%
     2294\pgfsys@transformshift{1.063889in}{1.046518in}%
    22792295\pgfsys@useobject{currentmarker}{}%
    22802296\end{pgfscope}%
     
    22952311}%
    22962312\begin{pgfscope}%
    2297 \pgfsys@transformshift{3.869368in}{2.667126in}%
     2313\pgfsys@transformshift{1.063889in}{1.185407in}%
    22982314\pgfsys@useobject{currentmarker}{}%
    22992315\end{pgfscope}%
     
    23062322\pgfsetstrokecolor{currentstroke}%
    23072323\pgfsetdash{}{0pt}%
    2308 \pgfpathmoveto{\pgfqpoint{3.647146in}{2.556015in}}%
    2309 \pgfpathlineto{\pgfqpoint{4.091591in}{2.556015in}}%
    2310 \pgfusepath{stroke}%
    2311 \end{pgfscope}%
    2312 \begin{pgfscope}%
    2313 \pgfsetbuttcap%
    2314 \pgfsetmiterjoin%
     2324\pgfpathmoveto{\pgfqpoint{0.925000in}{1.115963in}}%
     2325\pgfpathlineto{\pgfqpoint{1.202778in}{1.115963in}}%
     2326\pgfusepath{stroke}%
     2327\end{pgfscope}%
     2328\begin{pgfscope}%
     2329\pgfsetbuttcap%
     2330\pgfsetroundjoin%
    23152331\definecolor{currentfill}{rgb}{1.000000,0.498039,0.054902}%
    23162332\pgfsetfillcolor{currentfill}%
     
    23202336\pgfsetdash{}{0pt}%
    23212337\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.041667in}{-0.041667in}}{\pgfqpoint{0.041667in}{0.041667in}}{%
    2322 \pgfpathmoveto{\pgfqpoint{0.000000in}{0.041667in}}%
    2323 \pgfpathlineto{\pgfqpoint{-0.041667in}{-0.041667in}}%
    2324 \pgfpathlineto{\pgfqpoint{0.041667in}{-0.041667in}}%
     2338\pgfpathmoveto{\pgfqpoint{0.000000in}{-0.041667in}}%
     2339\pgfpathcurveto{\pgfqpoint{0.011050in}{-0.041667in}}{\pgfqpoint{0.021649in}{-0.037276in}}{\pgfqpoint{0.029463in}{-0.029463in}}%
     2340\pgfpathcurveto{\pgfqpoint{0.037276in}{-0.021649in}}{\pgfqpoint{0.041667in}{-0.011050in}}{\pgfqpoint{0.041667in}{0.000000in}}%
     2341\pgfpathcurveto{\pgfqpoint{0.041667in}{0.011050in}}{\pgfqpoint{0.037276in}{0.021649in}}{\pgfqpoint{0.029463in}{0.029463in}}%
     2342\pgfpathcurveto{\pgfqpoint{0.021649in}{0.037276in}}{\pgfqpoint{0.011050in}{0.041667in}}{\pgfqpoint{0.000000in}{0.041667in}}%
     2343\pgfpathcurveto{\pgfqpoint{-0.011050in}{0.041667in}}{\pgfqpoint{-0.021649in}{0.037276in}}{\pgfqpoint{-0.029463in}{0.029463in}}%
     2344\pgfpathcurveto{\pgfqpoint{-0.037276in}{0.021649in}}{\pgfqpoint{-0.041667in}{0.011050in}}{\pgfqpoint{-0.041667in}{0.000000in}}%
     2345\pgfpathcurveto{\pgfqpoint{-0.041667in}{-0.011050in}}{\pgfqpoint{-0.037276in}{-0.021649in}}{\pgfqpoint{-0.029463in}{-0.029463in}}%
     2346\pgfpathcurveto{\pgfqpoint{-0.021649in}{-0.037276in}}{\pgfqpoint{-0.011050in}{-0.041667in}}{\pgfqpoint{0.000000in}{-0.041667in}}%
    23252347\pgfpathclose%
    23262348\pgfusepath{stroke,fill}%
    23272349}%
    23282350\begin{pgfscope}%
    2329 \pgfsys@transformshift{3.869368in}{2.556015in}%
     2351\pgfsys@transformshift{1.063889in}{1.115963in}%
    23302352\pgfsys@useobject{currentmarker}{}%
    23312353\end{pgfscope}%
     
    23352357\pgfsetstrokecolor{textcolor}%
    23362358\pgfsetfillcolor{textcolor}%
    2337 \pgftext[x=4.269368in,y=2.478238in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont CPP-baseline}%
     2359\pgftext[x=1.313889in,y=1.067352in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont CPP-baseline}%
    23382360\end{pgfscope}%
    23392361\begin{pgfscope}%
     
    23442366\pgfsetstrokecolor{currentstroke}%
    23452367\pgfsetdash{}{0pt}%
    2346 \pgfpathmoveto{\pgfqpoint{3.869368in}{2.120444in}}%
    2347 \pgfpathlineto{\pgfqpoint{3.869368in}{2.342667in}}%
     2368\pgfpathmoveto{\pgfqpoint{1.063889in}{0.852846in}}%
     2369\pgfpathlineto{\pgfqpoint{1.063889in}{0.991734in}}%
    23482370\pgfusepath{stroke}%
    23492371\end{pgfscope}%
     
    23632385}%
    23642386\begin{pgfscope}%
    2365 \pgfsys@transformshift{3.869368in}{2.120444in}%
     2387\pgfsys@transformshift{1.063889in}{0.852846in}%
    23662388\pgfsys@useobject{currentmarker}{}%
    23672389\end{pgfscope}%
     
    23822404}%
    23832405\begin{pgfscope}%
    2384 \pgfsys@transformshift{3.869368in}{2.342667in}%
     2406\pgfsys@transformshift{1.063889in}{0.991734in}%
    23852407\pgfsys@useobject{currentmarker}{}%
    23862408\end{pgfscope}%
     
    23932415\pgfsetstrokecolor{currentstroke}%
    23942416\pgfsetdash{}{0pt}%
    2395 \pgfpathmoveto{\pgfqpoint{3.647146in}{2.231556in}}%
    2396 \pgfpathlineto{\pgfqpoint{4.091591in}{2.231556in}}%
    2397 \pgfusepath{stroke}%
    2398 \end{pgfscope}%
    2399 \begin{pgfscope}%
    2400 \pgfsetbuttcap%
    2401 \pgfsetmiterjoin%
     2417\pgfpathmoveto{\pgfqpoint{0.925000in}{0.922290in}}%
     2418\pgfpathlineto{\pgfqpoint{1.202778in}{0.922290in}}%
     2419\pgfusepath{stroke}%
     2420\end{pgfscope}%
     2421\begin{pgfscope}%
     2422\pgfsetbuttcap%
     2423\pgfsetroundjoin%
    24022424\definecolor{currentfill}{rgb}{0.172549,0.627451,0.172549}%
    24032425\pgfsetfillcolor{currentfill}%
     
    24062428\pgfsetstrokecolor{currentstroke}%
    24072429\pgfsetdash{}{0pt}%
    2408 \pgfsys@defobject{currentmarker}{\pgfqpoint{-0.036084in}{-0.041667in}}{\pgfqpoint{0.036084in}{0.041667in}}{%
    2409 \pgfpathmoveto{\pgfqpoint{0.000000in}{0.041667in}}%
    2410 \pgfpathlineto{\pgfqpoint{-0.036084in}{0.020833in}}%
    2411 \pgfpathlineto{\pgfqpoint{-0.036084in}{-0.020833in}}%
    2412 \pgfpathlineto{\pgfqpoint{-0.000000in}{-0.041667in}}%
    2413 \pgfpathlineto{\pgfqpoint{0.036084in}{-0.020833in}}%
    2414 \pgfpathlineto{\pgfqpoint{0.036084in}{0.020833in}}%
     2430\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.041667in}{-0.041667in}}{\pgfqpoint{0.041667in}{0.041667in}}{%
     2431\pgfpathmoveto{\pgfqpoint{0.000000in}{-0.041667in}}%
     2432\pgfpathcurveto{\pgfqpoint{0.011050in}{-0.041667in}}{\pgfqpoint{0.021649in}{-0.037276in}}{\pgfqpoint{0.029463in}{-0.029463in}}%
     2433\pgfpathcurveto{\pgfqpoint{0.037276in}{-0.021649in}}{\pgfqpoint{0.041667in}{-0.011050in}}{\pgfqpoint{0.041667in}{0.000000in}}%
     2434\pgfpathcurveto{\pgfqpoint{0.041667in}{0.011050in}}{\pgfqpoint{0.037276in}{0.021649in}}{\pgfqpoint{0.029463in}{0.029463in}}%
     2435\pgfpathcurveto{\pgfqpoint{0.021649in}{0.037276in}}{\pgfqpoint{0.011050in}{0.041667in}}{\pgfqpoint{0.000000in}{0.041667in}}%
     2436\pgfpathcurveto{\pgfqpoint{-0.011050in}{0.041667in}}{\pgfqpoint{-0.021649in}{0.037276in}}{\pgfqpoint{-0.029463in}{0.029463in}}%
     2437\pgfpathcurveto{\pgfqpoint{-0.037276in}{0.021649in}}{\pgfqpoint{-0.041667in}{0.011050in}}{\pgfqpoint{-0.041667in}{0.000000in}}%
     2438\pgfpathcurveto{\pgfqpoint{-0.041667in}{-0.011050in}}{\pgfqpoint{-0.037276in}{-0.021649in}}{\pgfqpoint{-0.029463in}{-0.029463in}}%
     2439\pgfpathcurveto{\pgfqpoint{-0.021649in}{-0.037276in}}{\pgfqpoint{-0.011050in}{-0.041667in}}{\pgfqpoint{0.000000in}{-0.041667in}}%
    24152440\pgfpathclose%
    24162441\pgfusepath{stroke,fill}%
    24172442}%
    24182443\begin{pgfscope}%
    2419 \pgfsys@transformshift{3.869368in}{2.231556in}%
     2444\pgfsys@transformshift{1.063889in}{0.922290in}%
    24202445\pgfsys@useobject{currentmarker}{}%
    24212446\end{pgfscope}%
     
    24252450\pgfsetstrokecolor{textcolor}%
    24262451\pgfsetfillcolor{textcolor}%
    2427 \pgftext[x=4.269368in,y=2.153778in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont CFA-rand}%
     2452\pgftext[x=1.313889in,y=0.873679in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont CFA-rand}%
    24282453\end{pgfscope}%
    24292454\begin{pgfscope}%
     
    24342459\pgfsetstrokecolor{currentstroke}%
    24352460\pgfsetdash{}{0pt}%
    2436 \pgfpathmoveto{\pgfqpoint{3.869368in}{1.795985in}}%
    2437 \pgfpathlineto{\pgfqpoint{3.869368in}{2.018207in}}%
     2461\pgfpathmoveto{\pgfqpoint{1.063889in}{0.659173in}}%
     2462\pgfpathlineto{\pgfqpoint{1.063889in}{0.798062in}}%
    24382463\pgfusepath{stroke}%
    24392464\end{pgfscope}%
     
    24532478}%
    24542479\begin{pgfscope}%
    2455 \pgfsys@transformshift{3.869368in}{1.795985in}%
     2480\pgfsys@transformshift{1.063889in}{0.659173in}%
    24562481\pgfsys@useobject{currentmarker}{}%
    24572482\end{pgfscope}%
     
    24722497}%
    24732498\begin{pgfscope}%
    2474 \pgfsys@transformshift{3.869368in}{2.018207in}%
     2499\pgfsys@transformshift{1.063889in}{0.798062in}%
    24752500\pgfsys@useobject{currentmarker}{}%
    24762501\end{pgfscope}%
     
    24832508\pgfsetstrokecolor{currentstroke}%
    24842509\pgfsetdash{}{0pt}%
    2485 \pgfpathmoveto{\pgfqpoint{3.647146in}{1.907096in}}%
    2486 \pgfpathlineto{\pgfqpoint{4.091591in}{1.907096in}}%
    2487 \pgfusepath{stroke}%
    2488 \end{pgfscope}%
    2489 \begin{pgfscope}%
    2490 \pgfsetbuttcap%
    2491 \pgfsetbeveljoin%
     2510\pgfpathmoveto{\pgfqpoint{0.925000in}{0.728617in}}%
     2511\pgfpathlineto{\pgfqpoint{1.202778in}{0.728617in}}%
     2512\pgfusepath{stroke}%
     2513\end{pgfscope}%
     2514\begin{pgfscope}%
     2515\pgfsetbuttcap%
     2516\pgfsetroundjoin%
    24922517\definecolor{currentfill}{rgb}{0.839216,0.152941,0.156863}%
    24932518\pgfsetfillcolor{currentfill}%
     
    24962521\pgfsetstrokecolor{currentstroke}%
    24972522\pgfsetdash{}{0pt}%
    2498 \pgfsys@defobject{currentmarker}{\pgfqpoint{-0.039627in}{-0.033709in}}{\pgfqpoint{0.039627in}{0.041667in}}{%
    2499 \pgfpathmoveto{\pgfqpoint{0.000000in}{0.041667in}}%
    2500 \pgfpathlineto{\pgfqpoint{-0.009355in}{0.012876in}}%
    2501 \pgfpathlineto{\pgfqpoint{-0.039627in}{0.012876in}}%
    2502 \pgfpathlineto{\pgfqpoint{-0.015136in}{-0.004918in}}%
    2503 \pgfpathlineto{\pgfqpoint{-0.024491in}{-0.033709in}}%
    2504 \pgfpathlineto{\pgfqpoint{-0.000000in}{-0.015915in}}%
    2505 \pgfpathlineto{\pgfqpoint{0.024491in}{-0.033709in}}%
    2506 \pgfpathlineto{\pgfqpoint{0.015136in}{-0.004918in}}%
    2507 \pgfpathlineto{\pgfqpoint{0.039627in}{0.012876in}}%
    2508 \pgfpathlineto{\pgfqpoint{0.009355in}{0.012876in}}%
     2523\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.041667in}{-0.041667in}}{\pgfqpoint{0.041667in}{0.041667in}}{%
     2524\pgfpathmoveto{\pgfqpoint{0.000000in}{-0.041667in}}%
     2525\pgfpathcurveto{\pgfqpoint{0.011050in}{-0.041667in}}{\pgfqpoint{0.021649in}{-0.037276in}}{\pgfqpoint{0.029463in}{-0.029463in}}%
     2526\pgfpathcurveto{\pgfqpoint{0.037276in}{-0.021649in}}{\pgfqpoint{0.041667in}{-0.011050in}}{\pgfqpoint{0.041667in}{0.000000in}}%
     2527\pgfpathcurveto{\pgfqpoint{0.041667in}{0.011050in}}{\pgfqpoint{0.037276in}{0.021649in}}{\pgfqpoint{0.029463in}{0.029463in}}%
     2528\pgfpathcurveto{\pgfqpoint{0.021649in}{0.037276in}}{\pgfqpoint{0.011050in}{0.041667in}}{\pgfqpoint{0.000000in}{0.041667in}}%
     2529\pgfpathcurveto{\pgfqpoint{-0.011050in}{0.041667in}}{\pgfqpoint{-0.021649in}{0.037276in}}{\pgfqpoint{-0.029463in}{0.029463in}}%
     2530\pgfpathcurveto{\pgfqpoint{-0.037276in}{0.021649in}}{\pgfqpoint{-0.041667in}{0.011050in}}{\pgfqpoint{-0.041667in}{0.000000in}}%
     2531\pgfpathcurveto{\pgfqpoint{-0.041667in}{-0.011050in}}{\pgfqpoint{-0.037276in}{-0.021649in}}{\pgfqpoint{-0.029463in}{-0.029463in}}%
     2532\pgfpathcurveto{\pgfqpoint{-0.021649in}{-0.037276in}}{\pgfqpoint{-0.011050in}{-0.041667in}}{\pgfqpoint{0.000000in}{-0.041667in}}%
    25092533\pgfpathclose%
    25102534\pgfusepath{stroke,fill}%
    25112535}%
    25122536\begin{pgfscope}%
    2513 \pgfsys@transformshift{3.869368in}{1.907096in}%
     2537\pgfsys@transformshift{1.063889in}{0.728617in}%
    25142538\pgfsys@useobject{currentmarker}{}%
    25152539\end{pgfscope}%
     
    25192543\pgfsetstrokecolor{textcolor}%
    25202544\pgfsetfillcolor{textcolor}%
    2521 \pgftext[x=4.269368in,y=1.829318in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont CPP-rand}%
     2545\pgftext[x=1.313889in,y=0.680006in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont CPP-rand}%
    25222546\end{pgfscope}%
    25232547\end{pgfpicture}%
  • doc/theses/colby_parsons_MMAth/figures/nasus_Aggregate_Lock_8.pgf

    r044ae62 r3a513d89  
    7777\pgfsetstrokecolor{textcolor}%
    7878\pgfsetfillcolor{textcolor}%
    79 \pgftext[x=1.025455in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 2\)}%
     79\pgftext[x=1.025455in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 2\)}%
    8080\end{pgfscope}%
    8181\begin{pgfscope}%
     
    102102\pgfsetstrokecolor{textcolor}%
    103103\pgfsetfillcolor{textcolor}%
    104 \pgftext[x=1.326061in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 4\)}%
     104\pgftext[x=1.326061in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 4\)}%
    105105\end{pgfscope}%
    106106\begin{pgfscope}%
     
    127127\pgfsetstrokecolor{textcolor}%
    128128\pgfsetfillcolor{textcolor}%
    129 \pgftext[x=1.927273in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 8\)}%
     129\pgftext[x=1.927273in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 8\)}%
    130130\end{pgfscope}%
    131131\begin{pgfscope}%
     
    152152\pgfsetstrokecolor{textcolor}%
    153153\pgfsetfillcolor{textcolor}%
    154 \pgftext[x=3.129697in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 16\)}%
     154\pgftext[x=3.129697in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 16\)}%
    155155\end{pgfscope}%
    156156\begin{pgfscope}%
     
    177177\pgfsetstrokecolor{textcolor}%
    178178\pgfsetfillcolor{textcolor}%
    179 \pgftext[x=4.332121in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 24\)}%
     179\pgftext[x=4.332121in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 24\)}%
    180180\end{pgfscope}%
    181181\begin{pgfscope}%
     
    202202\pgfsetstrokecolor{textcolor}%
    203203\pgfsetfillcolor{textcolor}%
    204 \pgftext[x=5.534545in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 32\)}%
     204\pgftext[x=5.534545in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 32\)}%
    205205\end{pgfscope}%
    206206\begin{pgfscope}%
     
    208208\pgfsetstrokecolor{textcolor}%
    209209\pgfsetfillcolor{textcolor}%
    210 \pgftext[x=3.280000in,y=0.161874in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont Cores}%
     210\pgftext[x=3.280000in,y=0.251766in,,top]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont Cores}%
    211211\end{pgfscope}%
    212212\begin{pgfscope}%
     
    233233\pgfsetstrokecolor{textcolor}%
    234234\pgfsetfillcolor{textcolor}%
    235 \pgftext[x=0.399655in,y=0.700496in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 10^{3}\)}%
     235\pgftext[x=0.501581in,y=0.735604in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 10^{3}\)}%
    236236\end{pgfscope}%
    237237\begin{pgfscope}%
     
    258258\pgfsetstrokecolor{textcolor}%
    259259\pgfsetfillcolor{textcolor}%
    260 \pgftext[x=0.399655in,y=1.343761in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 10^{4}\)}%
     260\pgftext[x=0.501581in,y=1.378869in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 10^{4}\)}%
    261261\end{pgfscope}%
    262262\begin{pgfscope}%
     
    283283\pgfsetstrokecolor{textcolor}%
    284284\pgfsetfillcolor{textcolor}%
    285 \pgftext[x=0.399655in,y=1.987026in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 10^{5}\)}%
     285\pgftext[x=0.501581in,y=2.022134in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 10^{5}\)}%
    286286\end{pgfscope}%
    287287\begin{pgfscope}%
     
    308308\pgfsetstrokecolor{textcolor}%
    309309\pgfsetfillcolor{textcolor}%
    310 \pgftext[x=0.399655in,y=2.630291in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 10^{6}\)}%
     310\pgftext[x=0.501581in,y=2.665399in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 10^{6}\)}%
    311311\end{pgfscope}%
    312312\begin{pgfscope}%
     
    333333\pgfsetstrokecolor{textcolor}%
    334334\pgfsetfillcolor{textcolor}%
    335 \pgftext[x=0.399655in,y=3.273555in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 10^{7}\)}%
     335\pgftext[x=0.501581in,y=3.308663in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 10^{7}\)}%
    336336\end{pgfscope}%
    337337\begin{pgfscope}%
     
    358358\pgfsetstrokecolor{textcolor}%
    359359\pgfsetfillcolor{textcolor}%
    360 \pgftext[x=0.399655in,y=3.916820in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 10^{8}\)}%
     360\pgftext[x=0.501581in,y=3.951928in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 10^{8}\)}%
    361361\end{pgfscope}%
    362362\begin{pgfscope}%
     
    12381238\pgfsetstrokecolor{textcolor}%
    12391239\pgfsetfillcolor{textcolor}%
    1240 \pgftext[x=0.344100in,y=2.376000in,,bottom,rotate=90.000000]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont Throughput (entries)}%
     1240\pgftext[x=0.446026in,y=2.376000in,,bottom,rotate=90.000000]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont Throughput (entries)}%
    12411241\end{pgfscope}%
    12421242\begin{pgfscope}%
     
    19011901\pgfusepath{clip}%
    19021902\pgfsetbuttcap%
    1903 \pgfsetmiterjoin%
     1903\pgfsetroundjoin%
    19041904\definecolor{currentfill}{rgb}{0.121569,0.466667,0.705882}%
    19051905\pgfsetfillcolor{currentfill}%
    19061906\pgfsetlinewidth{1.003750pt}%
    19071907\definecolor{currentstroke}{rgb}{0.121569,0.466667,0.705882}%
    1908 \pgfsetstrokecolor{currentstroke}%
    1909 \pgfsetdash{}{0pt}%
    1910 \pgfsys@defobject{currentmarker}{\pgfqpoint{-0.041667in}{-0.041667in}}{\pgfqpoint{0.041667in}{0.041667in}}{%
    1911 \pgfpathmoveto{\pgfqpoint{-0.000000in}{-0.041667in}}%
    1912 \pgfpathlineto{\pgfqpoint{0.041667in}{0.041667in}}%
    1913 \pgfpathlineto{\pgfqpoint{-0.041667in}{0.041667in}}%
    1914 \pgfpathclose%
    1915 \pgfusepath{stroke,fill}%
    1916 }%
    1917 \begin{pgfscope}%
    1918 \pgfsys@transformshift{1.025455in}{3.772496in}%
    1919 \pgfsys@useobject{currentmarker}{}%
    1920 \end{pgfscope}%
    1921 \begin{pgfscope}%
    1922 \pgfsys@transformshift{1.326061in}{3.656800in}%
    1923 \pgfsys@useobject{currentmarker}{}%
    1924 \end{pgfscope}%
    1925 \begin{pgfscope}%
    1926 \pgfsys@transformshift{1.927273in}{3.464610in}%
    1927 \pgfsys@useobject{currentmarker}{}%
    1928 \end{pgfscope}%
    1929 \begin{pgfscope}%
    1930 \pgfsys@transformshift{3.129697in}{3.364807in}%
    1931 \pgfsys@useobject{currentmarker}{}%
    1932 \end{pgfscope}%
    1933 \begin{pgfscope}%
    1934 \pgfsys@transformshift{4.332121in}{3.378536in}%
    1935 \pgfsys@useobject{currentmarker}{}%
    1936 \end{pgfscope}%
    1937 \begin{pgfscope}%
    1938 \pgfsys@transformshift{5.534545in}{3.364296in}%
    1939 \pgfsys@useobject{currentmarker}{}%
    1940 \end{pgfscope}%
    1941 \end{pgfscope}%
    1942 \begin{pgfscope}%
    1943 \pgfpathrectangle{\pgfqpoint{0.800000in}{0.528000in}}{\pgfqpoint{4.960000in}{3.696000in}}%
    1944 \pgfusepath{clip}%
    1945 \pgfsetrectcap%
    1946 \pgfsetroundjoin%
    1947 \pgfsetlinewidth{1.505625pt}%
    1948 \definecolor{currentstroke}{rgb}{1.000000,0.498039,0.054902}%
    1949 \pgfsetstrokecolor{currentstroke}%
    1950 \pgfsetdash{}{0pt}%
    1951 \pgfpathmoveto{\pgfqpoint{1.025455in}{4.055876in}}%
    1952 \pgfpathlineto{\pgfqpoint{1.326061in}{3.957809in}}%
    1953 \pgfpathlineto{\pgfqpoint{1.927273in}{3.719959in}}%
    1954 \pgfpathlineto{\pgfqpoint{3.129697in}{3.604550in}}%
    1955 \pgfpathlineto{\pgfqpoint{4.332121in}{3.597915in}}%
    1956 \pgfpathlineto{\pgfqpoint{5.534545in}{3.583182in}}%
    1957 \pgfusepath{stroke}%
    1958 \end{pgfscope}%
    1959 \begin{pgfscope}%
    1960 \pgfpathrectangle{\pgfqpoint{0.800000in}{0.528000in}}{\pgfqpoint{4.960000in}{3.696000in}}%
    1961 \pgfusepath{clip}%
    1962 \pgfsetbuttcap%
    1963 \pgfsetroundjoin%
    1964 \definecolor{currentfill}{rgb}{1.000000,0.498039,0.054902}%
    1965 \pgfsetfillcolor{currentfill}%
    1966 \pgfsetlinewidth{1.003750pt}%
    1967 \definecolor{currentstroke}{rgb}{1.000000,0.498039,0.054902}%
    19681908\pgfsetstrokecolor{currentstroke}%
    19691909\pgfsetdash{}{0pt}%
     
    19821922}%
    19831923\begin{pgfscope}%
    1984 \pgfsys@transformshift{1.025455in}{4.055876in}%
    1985 \pgfsys@useobject{currentmarker}{}%
    1986 \end{pgfscope}%
    1987 \begin{pgfscope}%
    1988 \pgfsys@transformshift{1.326061in}{3.957809in}%
    1989 \pgfsys@useobject{currentmarker}{}%
    1990 \end{pgfscope}%
    1991 \begin{pgfscope}%
    1992 \pgfsys@transformshift{1.927273in}{3.719959in}%
    1993 \pgfsys@useobject{currentmarker}{}%
    1994 \end{pgfscope}%
    1995 \begin{pgfscope}%
    1996 \pgfsys@transformshift{3.129697in}{3.604550in}%
    1997 \pgfsys@useobject{currentmarker}{}%
    1998 \end{pgfscope}%
    1999 \begin{pgfscope}%
    2000 \pgfsys@transformshift{4.332121in}{3.597915in}%
    2001 \pgfsys@useobject{currentmarker}{}%
    2002 \end{pgfscope}%
    2003 \begin{pgfscope}%
    2004 \pgfsys@transformshift{5.534545in}{3.583182in}%
     1924\pgfsys@transformshift{1.025455in}{3.772496in}%
     1925\pgfsys@useobject{currentmarker}{}%
     1926\end{pgfscope}%
     1927\begin{pgfscope}%
     1928\pgfsys@transformshift{1.326061in}{3.656800in}%
     1929\pgfsys@useobject{currentmarker}{}%
     1930\end{pgfscope}%
     1931\begin{pgfscope}%
     1932\pgfsys@transformshift{1.927273in}{3.464610in}%
     1933\pgfsys@useobject{currentmarker}{}%
     1934\end{pgfscope}%
     1935\begin{pgfscope}%
     1936\pgfsys@transformshift{3.129697in}{3.364807in}%
     1937\pgfsys@useobject{currentmarker}{}%
     1938\end{pgfscope}%
     1939\begin{pgfscope}%
     1940\pgfsys@transformshift{4.332121in}{3.378536in}%
     1941\pgfsys@useobject{currentmarker}{}%
     1942\end{pgfscope}%
     1943\begin{pgfscope}%
     1944\pgfsys@transformshift{5.534545in}{3.364296in}%
    20051945\pgfsys@useobject{currentmarker}{}%
    20061946\end{pgfscope}%
     
    20121952\pgfsetroundjoin%
    20131953\pgfsetlinewidth{1.505625pt}%
    2014 \definecolor{currentstroke}{rgb}{0.172549,0.627451,0.172549}%
    2015 \pgfsetstrokecolor{currentstroke}%
    2016 \pgfsetdash{}{0pt}%
    2017 \pgfpathmoveto{\pgfqpoint{1.025455in}{3.973113in}}%
    2018 \pgfpathlineto{\pgfqpoint{1.326061in}{3.935736in}}%
    2019 \pgfpathlineto{\pgfqpoint{1.927273in}{3.735517in}}%
    2020 \pgfpathlineto{\pgfqpoint{3.129697in}{3.665369in}}%
    2021 \pgfpathlineto{\pgfqpoint{4.332121in}{3.655510in}}%
    2022 \pgfpathlineto{\pgfqpoint{5.534545in}{3.646498in}}%
    2023 \pgfusepath{stroke}%
    2024 \end{pgfscope}%
    2025 \begin{pgfscope}%
    2026 \pgfpathrectangle{\pgfqpoint{0.800000in}{0.528000in}}{\pgfqpoint{4.960000in}{3.696000in}}%
    2027 \pgfusepath{clip}%
    2028 \pgfsetbuttcap%
    2029 \pgfsetmiterjoin%
    2030 \definecolor{currentfill}{rgb}{0.172549,0.627451,0.172549}%
    2031 \pgfsetfillcolor{currentfill}%
    2032 \pgfsetlinewidth{1.003750pt}%
    2033 \definecolor{currentstroke}{rgb}{0.172549,0.627451,0.172549}%
    2034 \pgfsetstrokecolor{currentstroke}%
    2035 \pgfsetdash{}{0pt}%
    2036 \pgfsys@defobject{currentmarker}{\pgfqpoint{-0.041667in}{-0.041667in}}{\pgfqpoint{0.041667in}{0.041667in}}{%
    2037 \pgfpathmoveto{\pgfqpoint{-0.041667in}{-0.041667in}}%
    2038 \pgfpathlineto{\pgfqpoint{0.041667in}{-0.041667in}}%
    2039 \pgfpathlineto{\pgfqpoint{0.041667in}{0.041667in}}%
    2040 \pgfpathlineto{\pgfqpoint{-0.041667in}{0.041667in}}%
    2041 \pgfpathclose%
    2042 \pgfusepath{stroke,fill}%
    2043 }%
    2044 \begin{pgfscope}%
    2045 \pgfsys@transformshift{1.025455in}{3.973113in}%
    2046 \pgfsys@useobject{currentmarker}{}%
    2047 \end{pgfscope}%
    2048 \begin{pgfscope}%
    2049 \pgfsys@transformshift{1.326061in}{3.935736in}%
    2050 \pgfsys@useobject{currentmarker}{}%
    2051 \end{pgfscope}%
    2052 \begin{pgfscope}%
    2053 \pgfsys@transformshift{1.927273in}{3.735517in}%
    2054 \pgfsys@useobject{currentmarker}{}%
    2055 \end{pgfscope}%
    2056 \begin{pgfscope}%
    2057 \pgfsys@transformshift{3.129697in}{3.665369in}%
    2058 \pgfsys@useobject{currentmarker}{}%
    2059 \end{pgfscope}%
    2060 \begin{pgfscope}%
    2061 \pgfsys@transformshift{4.332121in}{3.655510in}%
    2062 \pgfsys@useobject{currentmarker}{}%
    2063 \end{pgfscope}%
    2064 \begin{pgfscope}%
    2065 \pgfsys@transformshift{5.534545in}{3.646498in}%
    2066 \pgfsys@useobject{currentmarker}{}%
    2067 \end{pgfscope}%
    2068 \end{pgfscope}%
    2069 \begin{pgfscope}%
    2070 \pgfpathrectangle{\pgfqpoint{0.800000in}{0.528000in}}{\pgfqpoint{4.960000in}{3.696000in}}%
    2071 \pgfusepath{clip}%
    2072 \pgfsetrectcap%
    2073 \pgfsetroundjoin%
    2074 \pgfsetlinewidth{1.505625pt}%
    2075 \definecolor{currentstroke}{rgb}{0.839216,0.152941,0.156863}%
    2076 \pgfsetstrokecolor{currentstroke}%
    2077 \pgfsetdash{}{0pt}%
    2078 \pgfpathmoveto{\pgfqpoint{1.025455in}{2.771065in}}%
    2079 \pgfpathlineto{\pgfqpoint{1.326061in}{1.232613in}}%
    2080 \pgfpathlineto{\pgfqpoint{1.927273in}{1.221115in}}%
    2081 \pgfpathlineto{\pgfqpoint{3.129697in}{0.810456in}}%
    2082 \pgfpathlineto{\pgfqpoint{4.332121in}{0.758096in}}%
    2083 \pgfpathlineto{\pgfqpoint{5.534545in}{0.796927in}}%
    2084 \pgfusepath{stroke}%
    2085 \end{pgfscope}%
    2086 \begin{pgfscope}%
    2087 \pgfpathrectangle{\pgfqpoint{0.800000in}{0.528000in}}{\pgfqpoint{4.960000in}{3.696000in}}%
    2088 \pgfusepath{clip}%
    2089 \pgfsetbuttcap%
    2090 \pgfsetmiterjoin%
    2091 \definecolor{currentfill}{rgb}{0.839216,0.152941,0.156863}%
    2092 \pgfsetfillcolor{currentfill}%
    2093 \pgfsetlinewidth{1.003750pt}%
    2094 \definecolor{currentstroke}{rgb}{0.839216,0.152941,0.156863}%
    2095 \pgfsetstrokecolor{currentstroke}%
    2096 \pgfsetdash{}{0pt}%
    2097 \pgfsys@defobject{currentmarker}{\pgfqpoint{-0.058926in}{-0.058926in}}{\pgfqpoint{0.058926in}{0.058926in}}{%
    2098 \pgfpathmoveto{\pgfqpoint{-0.000000in}{-0.058926in}}%
    2099 \pgfpathlineto{\pgfqpoint{0.058926in}{0.000000in}}%
    2100 \pgfpathlineto{\pgfqpoint{0.000000in}{0.058926in}}%
    2101 \pgfpathlineto{\pgfqpoint{-0.058926in}{0.000000in}}%
    2102 \pgfpathclose%
    2103 \pgfusepath{stroke,fill}%
    2104 }%
    2105 \begin{pgfscope}%
    2106 \pgfsys@transformshift{1.025455in}{2.771065in}%
    2107 \pgfsys@useobject{currentmarker}{}%
    2108 \end{pgfscope}%
    2109 \begin{pgfscope}%
    2110 \pgfsys@transformshift{1.326061in}{1.232613in}%
    2111 \pgfsys@useobject{currentmarker}{}%
    2112 \end{pgfscope}%
    2113 \begin{pgfscope}%
    2114 \pgfsys@transformshift{1.927273in}{1.221115in}%
    2115 \pgfsys@useobject{currentmarker}{}%
    2116 \end{pgfscope}%
    2117 \begin{pgfscope}%
    2118 \pgfsys@transformshift{3.129697in}{0.810456in}%
    2119 \pgfsys@useobject{currentmarker}{}%
    2120 \end{pgfscope}%
    2121 \begin{pgfscope}%
    2122 \pgfsys@transformshift{4.332121in}{0.758096in}%
    2123 \pgfsys@useobject{currentmarker}{}%
    2124 \end{pgfscope}%
    2125 \begin{pgfscope}%
    2126 \pgfsys@transformshift{5.534545in}{0.796927in}%
    2127 \pgfsys@useobject{currentmarker}{}%
    2128 \end{pgfscope}%
    2129 \end{pgfscope}%
    2130 \begin{pgfscope}%
    2131 \pgfsetrectcap%
    2132 \pgfsetmiterjoin%
    2133 \pgfsetlinewidth{0.803000pt}%
    2134 \definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}%
    2135 \pgfsetstrokecolor{currentstroke}%
    2136 \pgfsetdash{}{0pt}%
    2137 \pgfpathmoveto{\pgfqpoint{0.800000in}{0.528000in}}%
    2138 \pgfpathlineto{\pgfqpoint{0.800000in}{4.224000in}}%
    2139 \pgfusepath{stroke}%
    2140 \end{pgfscope}%
    2141 \begin{pgfscope}%
    2142 \pgfsetrectcap%
    2143 \pgfsetmiterjoin%
    2144 \pgfsetlinewidth{0.803000pt}%
    2145 \definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}%
    2146 \pgfsetstrokecolor{currentstroke}%
    2147 \pgfsetdash{}{0pt}%
    2148 \pgfpathmoveto{\pgfqpoint{5.760000in}{0.528000in}}%
    2149 \pgfpathlineto{\pgfqpoint{5.760000in}{4.224000in}}%
    2150 \pgfusepath{stroke}%
    2151 \end{pgfscope}%
    2152 \begin{pgfscope}%
    2153 \pgfsetrectcap%
    2154 \pgfsetmiterjoin%
    2155 \pgfsetlinewidth{0.803000pt}%
    2156 \definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}%
    2157 \pgfsetstrokecolor{currentstroke}%
    2158 \pgfsetdash{}{0pt}%
    2159 \pgfpathmoveto{\pgfqpoint{0.800000in}{0.528000in}}%
    2160 \pgfpathlineto{\pgfqpoint{5.760000in}{0.528000in}}%
    2161 \pgfusepath{stroke}%
    2162 \end{pgfscope}%
    2163 \begin{pgfscope}%
    2164 \pgfsetrectcap%
    2165 \pgfsetmiterjoin%
    2166 \pgfsetlinewidth{0.803000pt}%
    2167 \definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}%
    2168 \pgfsetstrokecolor{currentstroke}%
    2169 \pgfsetdash{}{0pt}%
    2170 \pgfpathmoveto{\pgfqpoint{0.800000in}{4.224000in}}%
    2171 \pgfpathlineto{\pgfqpoint{5.760000in}{4.224000in}}%
    2172 \pgfusepath{stroke}%
    2173 \end{pgfscope}%
    2174 \begin{pgfscope}%
    2175 \definecolor{textcolor}{rgb}{0.000000,0.000000,0.000000}%
    2176 \pgfsetstrokecolor{textcolor}%
    2177 \pgfsetfillcolor{textcolor}%
    2178 \pgftext[x=3.280000in,y=4.307333in,,base]{\color{textcolor}\rmfamily\fontsize{19.200000}{23.040000}\selectfont Aggregate Lock Benchmark: 8 Locks}%
    2179 \end{pgfscope}%
    2180 \begin{pgfscope}%
    2181 \pgfsetbuttcap%
    2182 \pgfsetmiterjoin%
    2183 \definecolor{currentfill}{rgb}{1.000000,1.000000,1.000000}%
    2184 \pgfsetfillcolor{currentfill}%
    2185 \pgfsetfillopacity{0.800000}%
    2186 \pgfsetlinewidth{1.003750pt}%
    2187 \definecolor{currentstroke}{rgb}{0.800000,0.800000,0.800000}%
    2188 \pgfsetstrokecolor{currentstroke}%
    2189 \pgfsetstrokeopacity{0.800000}%
    2190 \pgfsetdash{}{0pt}%
    2191 \pgfpathmoveto{\pgfqpoint{3.602702in}{1.693747in}}%
    2192 \pgfpathlineto{\pgfqpoint{5.604444in}{1.693747in}}%
    2193 \pgfpathquadraticcurveto{\pgfqpoint{5.648889in}{1.693747in}}{\pgfqpoint{5.648889in}{1.738192in}}%
    2194 \pgfpathlineto{\pgfqpoint{5.648889in}{3.013808in}}%
    2195 \pgfpathquadraticcurveto{\pgfqpoint{5.648889in}{3.058253in}}{\pgfqpoint{5.604444in}{3.058253in}}%
    2196 \pgfpathlineto{\pgfqpoint{3.602702in}{3.058253in}}%
    2197 \pgfpathquadraticcurveto{\pgfqpoint{3.558257in}{3.058253in}}{\pgfqpoint{3.558257in}{3.013808in}}%
    2198 \pgfpathlineto{\pgfqpoint{3.558257in}{1.738192in}}%
    2199 \pgfpathquadraticcurveto{\pgfqpoint{3.558257in}{1.693747in}}{\pgfqpoint{3.602702in}{1.693747in}}%
    2200 \pgfpathclose%
    2201 \pgfusepath{stroke,fill}%
    2202 \end{pgfscope}%
    2203 \begin{pgfscope}%
    2204 \pgfsetbuttcap%
    2205 \pgfsetroundjoin%
    2206 \pgfsetlinewidth{1.505625pt}%
    2207 \definecolor{currentstroke}{rgb}{0.121569,0.466667,0.705882}%
    2208 \pgfsetstrokecolor{currentstroke}%
    2209 \pgfsetdash{}{0pt}%
    2210 \pgfpathmoveto{\pgfqpoint{3.869368in}{2.769364in}}%
    2211 \pgfpathlineto{\pgfqpoint{3.869368in}{2.991586in}}%
    2212 \pgfusepath{stroke}%
    2213 \end{pgfscope}%
    2214 \begin{pgfscope}%
    2215 \pgfsetbuttcap%
    2216 \pgfsetroundjoin%
    2217 \definecolor{currentfill}{rgb}{0.121569,0.466667,0.705882}%
    2218 \pgfsetfillcolor{currentfill}%
    2219 \pgfsetlinewidth{1.003750pt}%
    2220 \definecolor{currentstroke}{rgb}{0.121569,0.466667,0.705882}%
    2221 \pgfsetstrokecolor{currentstroke}%
    2222 \pgfsetdash{}{0pt}%
    2223 \pgfsys@defobject{currentmarker}{\pgfqpoint{-0.027778in}{-0.000000in}}{\pgfqpoint{0.027778in}{0.000000in}}{%
    2224 \pgfpathmoveto{\pgfqpoint{0.027778in}{-0.000000in}}%
    2225 \pgfpathlineto{\pgfqpoint{-0.027778in}{0.000000in}}%
    2226 \pgfusepath{stroke,fill}%
    2227 }%
    2228 \begin{pgfscope}%
    2229 \pgfsys@transformshift{3.869368in}{2.769364in}%
    2230 \pgfsys@useobject{currentmarker}{}%
    2231 \end{pgfscope}%
    2232 \end{pgfscope}%
    2233 \begin{pgfscope}%
    2234 \pgfsetbuttcap%
    2235 \pgfsetroundjoin%
    2236 \definecolor{currentfill}{rgb}{0.121569,0.466667,0.705882}%
    2237 \pgfsetfillcolor{currentfill}%
    2238 \pgfsetlinewidth{1.003750pt}%
    2239 \definecolor{currentstroke}{rgb}{0.121569,0.466667,0.705882}%
    2240 \pgfsetstrokecolor{currentstroke}%
    2241 \pgfsetdash{}{0pt}%
    2242 \pgfsys@defobject{currentmarker}{\pgfqpoint{-0.027778in}{-0.000000in}}{\pgfqpoint{0.027778in}{0.000000in}}{%
    2243 \pgfpathmoveto{\pgfqpoint{0.027778in}{-0.000000in}}%
    2244 \pgfpathlineto{\pgfqpoint{-0.027778in}{0.000000in}}%
    2245 \pgfusepath{stroke,fill}%
    2246 }%
    2247 \begin{pgfscope}%
    2248 \pgfsys@transformshift{3.869368in}{2.991586in}%
    2249 \pgfsys@useobject{currentmarker}{}%
    2250 \end{pgfscope}%
    2251 \end{pgfscope}%
    2252 \begin{pgfscope}%
    2253 \pgfsetrectcap%
    2254 \pgfsetroundjoin%
    2255 \pgfsetlinewidth{1.505625pt}%
    2256 \definecolor{currentstroke}{rgb}{0.121569,0.466667,0.705882}%
    2257 \pgfsetstrokecolor{currentstroke}%
    2258 \pgfsetdash{}{0pt}%
    2259 \pgfpathmoveto{\pgfqpoint{3.647146in}{2.880475in}}%
    2260 \pgfpathlineto{\pgfqpoint{4.091591in}{2.880475in}}%
    2261 \pgfusepath{stroke}%
    2262 \end{pgfscope}%
    2263 \begin{pgfscope}%
    2264 \pgfsetbuttcap%
    2265 \pgfsetmiterjoin%
    2266 \definecolor{currentfill}{rgb}{0.121569,0.466667,0.705882}%
    2267 \pgfsetfillcolor{currentfill}%
    2268 \pgfsetlinewidth{1.003750pt}%
    2269 \definecolor{currentstroke}{rgb}{0.121569,0.466667,0.705882}%
    2270 \pgfsetstrokecolor{currentstroke}%
    2271 \pgfsetdash{}{0pt}%
    2272 \pgfsys@defobject{currentmarker}{\pgfqpoint{-0.041667in}{-0.041667in}}{\pgfqpoint{0.041667in}{0.041667in}}{%
    2273 \pgfpathmoveto{\pgfqpoint{-0.000000in}{-0.041667in}}%
    2274 \pgfpathlineto{\pgfqpoint{0.041667in}{0.041667in}}%
    2275 \pgfpathlineto{\pgfqpoint{-0.041667in}{0.041667in}}%
    2276 \pgfpathclose%
    2277 \pgfusepath{stroke,fill}%
    2278 }%
    2279 \begin{pgfscope}%
    2280 \pgfsys@transformshift{3.869368in}{2.880475in}%
    2281 \pgfsys@useobject{currentmarker}{}%
    2282 \end{pgfscope}%
    2283 \end{pgfscope}%
    2284 \begin{pgfscope}%
    2285 \definecolor{textcolor}{rgb}{0.000000,0.000000,0.000000}%
    2286 \pgfsetstrokecolor{textcolor}%
    2287 \pgfsetfillcolor{textcolor}%
    2288 \pgftext[x=4.269368in,y=2.802697in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont CFA-baseline}%
    2289 \end{pgfscope}%
    2290 \begin{pgfscope}%
    2291 \pgfsetbuttcap%
    2292 \pgfsetroundjoin%
    2293 \pgfsetlinewidth{1.505625pt}%
    22941954\definecolor{currentstroke}{rgb}{1.000000,0.498039,0.054902}%
    22951955\pgfsetstrokecolor{currentstroke}%
    22961956\pgfsetdash{}{0pt}%
    2297 \pgfpathmoveto{\pgfqpoint{3.869368in}{2.444904in}}%
    2298 \pgfpathlineto{\pgfqpoint{3.869368in}{2.667126in}}%
    2299 \pgfusepath{stroke}%
    2300 \end{pgfscope}%
    2301 \begin{pgfscope}%
    2302 \pgfsetbuttcap%
    2303 \pgfsetroundjoin%
    2304 \definecolor{currentfill}{rgb}{1.000000,0.498039,0.054902}%
    2305 \pgfsetfillcolor{currentfill}%
    2306 \pgfsetlinewidth{1.003750pt}%
    2307 \definecolor{currentstroke}{rgb}{1.000000,0.498039,0.054902}%
    2308 \pgfsetstrokecolor{currentstroke}%
    2309 \pgfsetdash{}{0pt}%
    2310 \pgfsys@defobject{currentmarker}{\pgfqpoint{-0.027778in}{-0.000000in}}{\pgfqpoint{0.027778in}{0.000000in}}{%
    2311 \pgfpathmoveto{\pgfqpoint{0.027778in}{-0.000000in}}%
    2312 \pgfpathlineto{\pgfqpoint{-0.027778in}{0.000000in}}%
    2313 \pgfusepath{stroke,fill}%
    2314 }%
    2315 \begin{pgfscope}%
    2316 \pgfsys@transformshift{3.869368in}{2.444904in}%
    2317 \pgfsys@useobject{currentmarker}{}%
    2318 \end{pgfscope}%
    2319 \end{pgfscope}%
    2320 \begin{pgfscope}%
    2321 \pgfsetbuttcap%
    2322 \pgfsetroundjoin%
    2323 \definecolor{currentfill}{rgb}{1.000000,0.498039,0.054902}%
    2324 \pgfsetfillcolor{currentfill}%
    2325 \pgfsetlinewidth{1.003750pt}%
    2326 \definecolor{currentstroke}{rgb}{1.000000,0.498039,0.054902}%
    2327 \pgfsetstrokecolor{currentstroke}%
    2328 \pgfsetdash{}{0pt}%
    2329 \pgfsys@defobject{currentmarker}{\pgfqpoint{-0.027778in}{-0.000000in}}{\pgfqpoint{0.027778in}{0.000000in}}{%
    2330 \pgfpathmoveto{\pgfqpoint{0.027778in}{-0.000000in}}%
    2331 \pgfpathlineto{\pgfqpoint{-0.027778in}{0.000000in}}%
    2332 \pgfusepath{stroke,fill}%
    2333 }%
    2334 \begin{pgfscope}%
    2335 \pgfsys@transformshift{3.869368in}{2.667126in}%
    2336 \pgfsys@useobject{currentmarker}{}%
    2337 \end{pgfscope}%
    2338 \end{pgfscope}%
    2339 \begin{pgfscope}%
    2340 \pgfsetrectcap%
    2341 \pgfsetroundjoin%
    2342 \pgfsetlinewidth{1.505625pt}%
    2343 \definecolor{currentstroke}{rgb}{1.000000,0.498039,0.054902}%
    2344 \pgfsetstrokecolor{currentstroke}%
    2345 \pgfsetdash{}{0pt}%
    2346 \pgfpathmoveto{\pgfqpoint{3.647146in}{2.556015in}}%
    2347 \pgfpathlineto{\pgfqpoint{4.091591in}{2.556015in}}%
    2348 \pgfusepath{stroke}%
    2349 \end{pgfscope}%
    2350 \begin{pgfscope}%
     1957\pgfpathmoveto{\pgfqpoint{1.025455in}{4.055876in}}%
     1958\pgfpathlineto{\pgfqpoint{1.326061in}{3.957809in}}%
     1959\pgfpathlineto{\pgfqpoint{1.927273in}{3.719959in}}%
     1960\pgfpathlineto{\pgfqpoint{3.129697in}{3.604550in}}%
     1961\pgfpathlineto{\pgfqpoint{4.332121in}{3.597915in}}%
     1962\pgfpathlineto{\pgfqpoint{5.534545in}{3.583182in}}%
     1963\pgfusepath{stroke}%
     1964\end{pgfscope}%
     1965\begin{pgfscope}%
     1966\pgfpathrectangle{\pgfqpoint{0.800000in}{0.528000in}}{\pgfqpoint{4.960000in}{3.696000in}}%
     1967\pgfusepath{clip}%
    23511968\pgfsetbuttcap%
    23521969\pgfsetroundjoin%
     
    23711988}%
    23721989\begin{pgfscope}%
    2373 \pgfsys@transformshift{3.869368in}{2.556015in}%
    2374 \pgfsys@useobject{currentmarker}{}%
    2375 \end{pgfscope}%
     1990\pgfsys@transformshift{1.025455in}{4.055876in}%
     1991\pgfsys@useobject{currentmarker}{}%
     1992\end{pgfscope}%
     1993\begin{pgfscope}%
     1994\pgfsys@transformshift{1.326061in}{3.957809in}%
     1995\pgfsys@useobject{currentmarker}{}%
     1996\end{pgfscope}%
     1997\begin{pgfscope}%
     1998\pgfsys@transformshift{1.927273in}{3.719959in}%
     1999\pgfsys@useobject{currentmarker}{}%
     2000\end{pgfscope}%
     2001\begin{pgfscope}%
     2002\pgfsys@transformshift{3.129697in}{3.604550in}%
     2003\pgfsys@useobject{currentmarker}{}%
     2004\end{pgfscope}%
     2005\begin{pgfscope}%
     2006\pgfsys@transformshift{4.332121in}{3.597915in}%
     2007\pgfsys@useobject{currentmarker}{}%
     2008\end{pgfscope}%
     2009\begin{pgfscope}%
     2010\pgfsys@transformshift{5.534545in}{3.583182in}%
     2011\pgfsys@useobject{currentmarker}{}%
     2012\end{pgfscope}%
     2013\end{pgfscope}%
     2014\begin{pgfscope}%
     2015\pgfpathrectangle{\pgfqpoint{0.800000in}{0.528000in}}{\pgfqpoint{4.960000in}{3.696000in}}%
     2016\pgfusepath{clip}%
     2017\pgfsetrectcap%
     2018\pgfsetroundjoin%
     2019\pgfsetlinewidth{1.505625pt}%
     2020\definecolor{currentstroke}{rgb}{0.172549,0.627451,0.172549}%
     2021\pgfsetstrokecolor{currentstroke}%
     2022\pgfsetdash{}{0pt}%
     2023\pgfpathmoveto{\pgfqpoint{1.025455in}{3.973113in}}%
     2024\pgfpathlineto{\pgfqpoint{1.326061in}{3.935736in}}%
     2025\pgfpathlineto{\pgfqpoint{1.927273in}{3.735517in}}%
     2026\pgfpathlineto{\pgfqpoint{3.129697in}{3.665369in}}%
     2027\pgfpathlineto{\pgfqpoint{4.332121in}{3.655510in}}%
     2028\pgfpathlineto{\pgfqpoint{5.534545in}{3.646498in}}%
     2029\pgfusepath{stroke}%
     2030\end{pgfscope}%
     2031\begin{pgfscope}%
     2032\pgfpathrectangle{\pgfqpoint{0.800000in}{0.528000in}}{\pgfqpoint{4.960000in}{3.696000in}}%
     2033\pgfusepath{clip}%
     2034\pgfsetbuttcap%
     2035\pgfsetroundjoin%
     2036\definecolor{currentfill}{rgb}{0.172549,0.627451,0.172549}%
     2037\pgfsetfillcolor{currentfill}%
     2038\pgfsetlinewidth{1.003750pt}%
     2039\definecolor{currentstroke}{rgb}{0.172549,0.627451,0.172549}%
     2040\pgfsetstrokecolor{currentstroke}%
     2041\pgfsetdash{}{0pt}%
     2042\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.041667in}{-0.041667in}}{\pgfqpoint{0.041667in}{0.041667in}}{%
     2043\pgfpathmoveto{\pgfqpoint{0.000000in}{-0.041667in}}%
     2044\pgfpathcurveto{\pgfqpoint{0.011050in}{-0.041667in}}{\pgfqpoint{0.021649in}{-0.037276in}}{\pgfqpoint{0.029463in}{-0.029463in}}%
     2045\pgfpathcurveto{\pgfqpoint{0.037276in}{-0.021649in}}{\pgfqpoint{0.041667in}{-0.011050in}}{\pgfqpoint{0.041667in}{0.000000in}}%
     2046\pgfpathcurveto{\pgfqpoint{0.041667in}{0.011050in}}{\pgfqpoint{0.037276in}{0.021649in}}{\pgfqpoint{0.029463in}{0.029463in}}%
     2047\pgfpathcurveto{\pgfqpoint{0.021649in}{0.037276in}}{\pgfqpoint{0.011050in}{0.041667in}}{\pgfqpoint{0.000000in}{0.041667in}}%
     2048\pgfpathcurveto{\pgfqpoint{-0.011050in}{0.041667in}}{\pgfqpoint{-0.021649in}{0.037276in}}{\pgfqpoint{-0.029463in}{0.029463in}}%
     2049\pgfpathcurveto{\pgfqpoint{-0.037276in}{0.021649in}}{\pgfqpoint{-0.041667in}{0.011050in}}{\pgfqpoint{-0.041667in}{0.000000in}}%
     2050\pgfpathcurveto{\pgfqpoint{-0.041667in}{-0.011050in}}{\pgfqpoint{-0.037276in}{-0.021649in}}{\pgfqpoint{-0.029463in}{-0.029463in}}%
     2051\pgfpathcurveto{\pgfqpoint{-0.021649in}{-0.037276in}}{\pgfqpoint{-0.011050in}{-0.041667in}}{\pgfqpoint{0.000000in}{-0.041667in}}%
     2052\pgfpathclose%
     2053\pgfusepath{stroke,fill}%
     2054}%
     2055\begin{pgfscope}%
     2056\pgfsys@transformshift{1.025455in}{3.973113in}%
     2057\pgfsys@useobject{currentmarker}{}%
     2058\end{pgfscope}%
     2059\begin{pgfscope}%
     2060\pgfsys@transformshift{1.326061in}{3.935736in}%
     2061\pgfsys@useobject{currentmarker}{}%
     2062\end{pgfscope}%
     2063\begin{pgfscope}%
     2064\pgfsys@transformshift{1.927273in}{3.735517in}%
     2065\pgfsys@useobject{currentmarker}{}%
     2066\end{pgfscope}%
     2067\begin{pgfscope}%
     2068\pgfsys@transformshift{3.129697in}{3.665369in}%
     2069\pgfsys@useobject{currentmarker}{}%
     2070\end{pgfscope}%
     2071\begin{pgfscope}%
     2072\pgfsys@transformshift{4.332121in}{3.655510in}%
     2073\pgfsys@useobject{currentmarker}{}%
     2074\end{pgfscope}%
     2075\begin{pgfscope}%
     2076\pgfsys@transformshift{5.534545in}{3.646498in}%
     2077\pgfsys@useobject{currentmarker}{}%
     2078\end{pgfscope}%
     2079\end{pgfscope}%
     2080\begin{pgfscope}%
     2081\pgfpathrectangle{\pgfqpoint{0.800000in}{0.528000in}}{\pgfqpoint{4.960000in}{3.696000in}}%
     2082\pgfusepath{clip}%
     2083\pgfsetrectcap%
     2084\pgfsetroundjoin%
     2085\pgfsetlinewidth{1.505625pt}%
     2086\definecolor{currentstroke}{rgb}{0.839216,0.152941,0.156863}%
     2087\pgfsetstrokecolor{currentstroke}%
     2088\pgfsetdash{}{0pt}%
     2089\pgfpathmoveto{\pgfqpoint{1.025455in}{2.771065in}}%
     2090\pgfpathlineto{\pgfqpoint{1.326061in}{1.232613in}}%
     2091\pgfpathlineto{\pgfqpoint{1.927273in}{1.221115in}}%
     2092\pgfpathlineto{\pgfqpoint{3.129697in}{0.810456in}}%
     2093\pgfpathlineto{\pgfqpoint{4.332121in}{0.758096in}}%
     2094\pgfpathlineto{\pgfqpoint{5.534545in}{0.796927in}}%
     2095\pgfusepath{stroke}%
     2096\end{pgfscope}%
     2097\begin{pgfscope}%
     2098\pgfpathrectangle{\pgfqpoint{0.800000in}{0.528000in}}{\pgfqpoint{4.960000in}{3.696000in}}%
     2099\pgfusepath{clip}%
     2100\pgfsetbuttcap%
     2101\pgfsetroundjoin%
     2102\definecolor{currentfill}{rgb}{0.839216,0.152941,0.156863}%
     2103\pgfsetfillcolor{currentfill}%
     2104\pgfsetlinewidth{1.003750pt}%
     2105\definecolor{currentstroke}{rgb}{0.839216,0.152941,0.156863}%
     2106\pgfsetstrokecolor{currentstroke}%
     2107\pgfsetdash{}{0pt}%
     2108\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.041667in}{-0.041667in}}{\pgfqpoint{0.041667in}{0.041667in}}{%
     2109\pgfpathmoveto{\pgfqpoint{0.000000in}{-0.041667in}}%
     2110\pgfpathcurveto{\pgfqpoint{0.011050in}{-0.041667in}}{\pgfqpoint{0.021649in}{-0.037276in}}{\pgfqpoint{0.029463in}{-0.029463in}}%
     2111\pgfpathcurveto{\pgfqpoint{0.037276in}{-0.021649in}}{\pgfqpoint{0.041667in}{-0.011050in}}{\pgfqpoint{0.041667in}{0.000000in}}%
     2112\pgfpathcurveto{\pgfqpoint{0.041667in}{0.011050in}}{\pgfqpoint{0.037276in}{0.021649in}}{\pgfqpoint{0.029463in}{0.029463in}}%
     2113\pgfpathcurveto{\pgfqpoint{0.021649in}{0.037276in}}{\pgfqpoint{0.011050in}{0.041667in}}{\pgfqpoint{0.000000in}{0.041667in}}%
     2114\pgfpathcurveto{\pgfqpoint{-0.011050in}{0.041667in}}{\pgfqpoint{-0.021649in}{0.037276in}}{\pgfqpoint{-0.029463in}{0.029463in}}%
     2115\pgfpathcurveto{\pgfqpoint{-0.037276in}{0.021649in}}{\pgfqpoint{-0.041667in}{0.011050in}}{\pgfqpoint{-0.041667in}{0.000000in}}%
     2116\pgfpathcurveto{\pgfqpoint{-0.041667in}{-0.011050in}}{\pgfqpoint{-0.037276in}{-0.021649in}}{\pgfqpoint{-0.029463in}{-0.029463in}}%
     2117\pgfpathcurveto{\pgfqpoint{-0.021649in}{-0.037276in}}{\pgfqpoint{-0.011050in}{-0.041667in}}{\pgfqpoint{0.000000in}{-0.041667in}}%
     2118\pgfpathclose%
     2119\pgfusepath{stroke,fill}%
     2120}%
     2121\begin{pgfscope}%
     2122\pgfsys@transformshift{1.025455in}{2.771065in}%
     2123\pgfsys@useobject{currentmarker}{}%
     2124\end{pgfscope}%
     2125\begin{pgfscope}%
     2126\pgfsys@transformshift{1.326061in}{1.232613in}%
     2127\pgfsys@useobject{currentmarker}{}%
     2128\end{pgfscope}%
     2129\begin{pgfscope}%
     2130\pgfsys@transformshift{1.927273in}{1.221115in}%
     2131\pgfsys@useobject{currentmarker}{}%
     2132\end{pgfscope}%
     2133\begin{pgfscope}%
     2134\pgfsys@transformshift{3.129697in}{0.810456in}%
     2135\pgfsys@useobject{currentmarker}{}%
     2136\end{pgfscope}%
     2137\begin{pgfscope}%
     2138\pgfsys@transformshift{4.332121in}{0.758096in}%
     2139\pgfsys@useobject{currentmarker}{}%
     2140\end{pgfscope}%
     2141\begin{pgfscope}%
     2142\pgfsys@transformshift{5.534545in}{0.796927in}%
     2143\pgfsys@useobject{currentmarker}{}%
     2144\end{pgfscope}%
     2145\end{pgfscope}%
     2146\begin{pgfscope}%
     2147\pgfsetrectcap%
     2148\pgfsetmiterjoin%
     2149\pgfsetlinewidth{0.803000pt}%
     2150\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}%
     2151\pgfsetstrokecolor{currentstroke}%
     2152\pgfsetdash{}{0pt}%
     2153\pgfpathmoveto{\pgfqpoint{0.800000in}{0.528000in}}%
     2154\pgfpathlineto{\pgfqpoint{0.800000in}{4.224000in}}%
     2155\pgfusepath{stroke}%
     2156\end{pgfscope}%
     2157\begin{pgfscope}%
     2158\pgfsetrectcap%
     2159\pgfsetmiterjoin%
     2160\pgfsetlinewidth{0.803000pt}%
     2161\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}%
     2162\pgfsetstrokecolor{currentstroke}%
     2163\pgfsetdash{}{0pt}%
     2164\pgfpathmoveto{\pgfqpoint{5.760000in}{0.528000in}}%
     2165\pgfpathlineto{\pgfqpoint{5.760000in}{4.224000in}}%
     2166\pgfusepath{stroke}%
     2167\end{pgfscope}%
     2168\begin{pgfscope}%
     2169\pgfsetrectcap%
     2170\pgfsetmiterjoin%
     2171\pgfsetlinewidth{0.803000pt}%
     2172\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}%
     2173\pgfsetstrokecolor{currentstroke}%
     2174\pgfsetdash{}{0pt}%
     2175\pgfpathmoveto{\pgfqpoint{0.800000in}{0.528000in}}%
     2176\pgfpathlineto{\pgfqpoint{5.760000in}{0.528000in}}%
     2177\pgfusepath{stroke}%
     2178\end{pgfscope}%
     2179\begin{pgfscope}%
     2180\pgfsetrectcap%
     2181\pgfsetmiterjoin%
     2182\pgfsetlinewidth{0.803000pt}%
     2183\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}%
     2184\pgfsetstrokecolor{currentstroke}%
     2185\pgfsetdash{}{0pt}%
     2186\pgfpathmoveto{\pgfqpoint{0.800000in}{4.224000in}}%
     2187\pgfpathlineto{\pgfqpoint{5.760000in}{4.224000in}}%
     2188\pgfusepath{stroke}%
    23762189\end{pgfscope}%
    23772190\begin{pgfscope}%
     
    23792192\pgfsetstrokecolor{textcolor}%
    23802193\pgfsetfillcolor{textcolor}%
    2381 \pgftext[x=4.269368in,y=2.478238in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont CPP-baseline}%
    2382 \end{pgfscope}%
    2383 \begin{pgfscope}%
    2384 \pgfsetbuttcap%
    2385 \pgfsetroundjoin%
    2386 \pgfsetlinewidth{1.505625pt}%
    2387 \definecolor{currentstroke}{rgb}{0.172549,0.627451,0.172549}%
    2388 \pgfsetstrokecolor{currentstroke}%
    2389 \pgfsetdash{}{0pt}%
    2390 \pgfpathmoveto{\pgfqpoint{3.869368in}{2.120444in}}%
    2391 \pgfpathlineto{\pgfqpoint{3.869368in}{2.342667in}}%
    2392 \pgfusepath{stroke}%
    2393 \end{pgfscope}%
    2394 \begin{pgfscope}%
    2395 \pgfsetbuttcap%
    2396 \pgfsetroundjoin%
    2397 \definecolor{currentfill}{rgb}{0.172549,0.627451,0.172549}%
    2398 \pgfsetfillcolor{currentfill}%
     2194\pgftext[x=3.280000in,y=4.307333in,,base]{\color{textcolor}\rmfamily\fontsize{12.000000}{14.400000}\selectfont Aggregate Lock Benchmark: 8 Locks}%
     2195\end{pgfscope}%
     2196\begin{pgfscope}%
     2197\pgfsetbuttcap%
     2198\pgfsetmiterjoin%
     2199\definecolor{currentfill}{rgb}{1.000000,1.000000,1.000000}%
     2200\pgfsetfillcolor{currentfill}%
     2201\pgfsetfillopacity{0.800000}%
    23992202\pgfsetlinewidth{1.003750pt}%
    2400 \definecolor{currentstroke}{rgb}{0.172549,0.627451,0.172549}%
     2203\definecolor{currentstroke}{rgb}{0.800000,0.800000,0.800000}%
     2204\pgfsetstrokecolor{currentstroke}%
     2205\pgfsetstrokeopacity{0.800000}%
     2206\pgfsetdash{}{0pt}%
     2207\pgfpathmoveto{\pgfqpoint{4.403517in}{1.967821in}}%
     2208\pgfpathlineto{\pgfqpoint{5.662778in}{1.967821in}}%
     2209\pgfpathquadraticcurveto{\pgfqpoint{5.690556in}{1.967821in}}{\pgfqpoint{5.690556in}{1.995599in}}%
     2210\pgfpathlineto{\pgfqpoint{5.690556in}{2.756401in}}%
     2211\pgfpathquadraticcurveto{\pgfqpoint{5.690556in}{2.784179in}}{\pgfqpoint{5.662778in}{2.784179in}}%
     2212\pgfpathlineto{\pgfqpoint{4.403517in}{2.784179in}}%
     2213\pgfpathquadraticcurveto{\pgfqpoint{4.375739in}{2.784179in}}{\pgfqpoint{4.375739in}{2.756401in}}%
     2214\pgfpathlineto{\pgfqpoint{4.375739in}{1.995599in}}%
     2215\pgfpathquadraticcurveto{\pgfqpoint{4.375739in}{1.967821in}}{\pgfqpoint{4.403517in}{1.967821in}}%
     2216\pgfpathclose%
     2217\pgfusepath{stroke,fill}%
     2218\end{pgfscope}%
     2219\begin{pgfscope}%
     2220\pgfsetbuttcap%
     2221\pgfsetroundjoin%
     2222\pgfsetlinewidth{1.505625pt}%
     2223\definecolor{currentstroke}{rgb}{0.121569,0.466667,0.705882}%
     2224\pgfsetstrokecolor{currentstroke}%
     2225\pgfsetdash{}{0pt}%
     2226\pgfpathmoveto{\pgfqpoint{4.570184in}{2.610568in}}%
     2227\pgfpathlineto{\pgfqpoint{4.570184in}{2.749457in}}%
     2228\pgfusepath{stroke}%
     2229\end{pgfscope}%
     2230\begin{pgfscope}%
     2231\pgfsetbuttcap%
     2232\pgfsetroundjoin%
     2233\definecolor{currentfill}{rgb}{0.121569,0.466667,0.705882}%
     2234\pgfsetfillcolor{currentfill}%
     2235\pgfsetlinewidth{1.003750pt}%
     2236\definecolor{currentstroke}{rgb}{0.121569,0.466667,0.705882}%
    24012237\pgfsetstrokecolor{currentstroke}%
    24022238\pgfsetdash{}{0pt}%
     
    24072243}%
    24082244\begin{pgfscope}%
    2409 \pgfsys@transformshift{3.869368in}{2.120444in}%
    2410 \pgfsys@useobject{currentmarker}{}%
    2411 \end{pgfscope}%
    2412 \end{pgfscope}%
    2413 \begin{pgfscope}%
    2414 \pgfsetbuttcap%
    2415 \pgfsetroundjoin%
    2416 \definecolor{currentfill}{rgb}{0.172549,0.627451,0.172549}%
     2245\pgfsys@transformshift{4.570184in}{2.610568in}%
     2246\pgfsys@useobject{currentmarker}{}%
     2247\end{pgfscope}%
     2248\end{pgfscope}%
     2249\begin{pgfscope}%
     2250\pgfsetbuttcap%
     2251\pgfsetroundjoin%
     2252\definecolor{currentfill}{rgb}{0.121569,0.466667,0.705882}%
    24172253\pgfsetfillcolor{currentfill}%
    24182254\pgfsetlinewidth{1.003750pt}%
    2419 \definecolor{currentstroke}{rgb}{0.172549,0.627451,0.172549}%
     2255\definecolor{currentstroke}{rgb}{0.121569,0.466667,0.705882}%
    24202256\pgfsetstrokecolor{currentstroke}%
    24212257\pgfsetdash{}{0pt}%
     
    24262262}%
    24272263\begin{pgfscope}%
    2428 \pgfsys@transformshift{3.869368in}{2.342667in}%
     2264\pgfsys@transformshift{4.570184in}{2.749457in}%
    24292265\pgfsys@useobject{currentmarker}{}%
    24302266\end{pgfscope}%
     
    24342270\pgfsetroundjoin%
    24352271\pgfsetlinewidth{1.505625pt}%
    2436 \definecolor{currentstroke}{rgb}{0.172549,0.627451,0.172549}%
    2437 \pgfsetstrokecolor{currentstroke}%
    2438 \pgfsetdash{}{0pt}%
    2439 \pgfpathmoveto{\pgfqpoint{3.647146in}{2.231556in}}%
    2440 \pgfpathlineto{\pgfqpoint{4.091591in}{2.231556in}}%
    2441 \pgfusepath{stroke}%
    2442 \end{pgfscope}%
    2443 \begin{pgfscope}%
    2444 \pgfsetbuttcap%
    2445 \pgfsetmiterjoin%
    2446 \definecolor{currentfill}{rgb}{0.172549,0.627451,0.172549}%
     2272\definecolor{currentstroke}{rgb}{0.121569,0.466667,0.705882}%
     2273\pgfsetstrokecolor{currentstroke}%
     2274\pgfsetdash{}{0pt}%
     2275\pgfpathmoveto{\pgfqpoint{4.431295in}{2.680012in}}%
     2276\pgfpathlineto{\pgfqpoint{4.709073in}{2.680012in}}%
     2277\pgfusepath{stroke}%
     2278\end{pgfscope}%
     2279\begin{pgfscope}%
     2280\pgfsetbuttcap%
     2281\pgfsetroundjoin%
     2282\definecolor{currentfill}{rgb}{0.121569,0.466667,0.705882}%
    24472283\pgfsetfillcolor{currentfill}%
    24482284\pgfsetlinewidth{1.003750pt}%
    2449 \definecolor{currentstroke}{rgb}{0.172549,0.627451,0.172549}%
     2285\definecolor{currentstroke}{rgb}{0.121569,0.466667,0.705882}%
    24502286\pgfsetstrokecolor{currentstroke}%
    24512287\pgfsetdash{}{0pt}%
    24522288\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.041667in}{-0.041667in}}{\pgfqpoint{0.041667in}{0.041667in}}{%
    2453 \pgfpathmoveto{\pgfqpoint{-0.041667in}{-0.041667in}}%
    2454 \pgfpathlineto{\pgfqpoint{0.041667in}{-0.041667in}}%
    2455 \pgfpathlineto{\pgfqpoint{0.041667in}{0.041667in}}%
    2456 \pgfpathlineto{\pgfqpoint{-0.041667in}{0.041667in}}%
     2289\pgfpathmoveto{\pgfqpoint{0.000000in}{-0.041667in}}%
     2290\pgfpathcurveto{\pgfqpoint{0.011050in}{-0.041667in}}{\pgfqpoint{0.021649in}{-0.037276in}}{\pgfqpoint{0.029463in}{-0.029463in}}%
     2291\pgfpathcurveto{\pgfqpoint{0.037276in}{-0.021649in}}{\pgfqpoint{0.041667in}{-0.011050in}}{\pgfqpoint{0.041667in}{0.000000in}}%
     2292\pgfpathcurveto{\pgfqpoint{0.041667in}{0.011050in}}{\pgfqpoint{0.037276in}{0.021649in}}{\pgfqpoint{0.029463in}{0.029463in}}%
     2293\pgfpathcurveto{\pgfqpoint{0.021649in}{0.037276in}}{\pgfqpoint{0.011050in}{0.041667in}}{\pgfqpoint{0.000000in}{0.041667in}}%
     2294\pgfpathcurveto{\pgfqpoint{-0.011050in}{0.041667in}}{\pgfqpoint{-0.021649in}{0.037276in}}{\pgfqpoint{-0.029463in}{0.029463in}}%
     2295\pgfpathcurveto{\pgfqpoint{-0.037276in}{0.021649in}}{\pgfqpoint{-0.041667in}{0.011050in}}{\pgfqpoint{-0.041667in}{0.000000in}}%
     2296\pgfpathcurveto{\pgfqpoint{-0.041667in}{-0.011050in}}{\pgfqpoint{-0.037276in}{-0.021649in}}{\pgfqpoint{-0.029463in}{-0.029463in}}%
     2297\pgfpathcurveto{\pgfqpoint{-0.021649in}{-0.037276in}}{\pgfqpoint{-0.011050in}{-0.041667in}}{\pgfqpoint{0.000000in}{-0.041667in}}%
    24572298\pgfpathclose%
    24582299\pgfusepath{stroke,fill}%
    24592300}%
    24602301\begin{pgfscope}%
    2461 \pgfsys@transformshift{3.869368in}{2.231556in}%
     2302\pgfsys@transformshift{4.570184in}{2.680012in}%
    24622303\pgfsys@useobject{currentmarker}{}%
    24632304\end{pgfscope}%
     
    24672308\pgfsetstrokecolor{textcolor}%
    24682309\pgfsetfillcolor{textcolor}%
    2469 \pgftext[x=4.269368in,y=2.153778in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont CFA-rand}%
    2470 \end{pgfscope}%
    2471 \begin{pgfscope}%
    2472 \pgfsetbuttcap%
    2473 \pgfsetroundjoin%
    2474 \pgfsetlinewidth{1.505625pt}%
    2475 \definecolor{currentstroke}{rgb}{0.839216,0.152941,0.156863}%
    2476 \pgfsetstrokecolor{currentstroke}%
    2477 \pgfsetdash{}{0pt}%
    2478 \pgfpathmoveto{\pgfqpoint{3.869368in}{1.795985in}}%
    2479 \pgfpathlineto{\pgfqpoint{3.869368in}{2.018207in}}%
    2480 \pgfusepath{stroke}%
    2481 \end{pgfscope}%
    2482 \begin{pgfscope}%
    2483 \pgfsetbuttcap%
    2484 \pgfsetroundjoin%
    2485 \definecolor{currentfill}{rgb}{0.839216,0.152941,0.156863}%
     2310\pgftext[x=4.820184in,y=2.631401in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont CFA-baseline}%
     2311\end{pgfscope}%
     2312\begin{pgfscope}%
     2313\pgfsetbuttcap%
     2314\pgfsetroundjoin%
     2315\pgfsetlinewidth{1.505625pt}%
     2316\definecolor{currentstroke}{rgb}{1.000000,0.498039,0.054902}%
     2317\pgfsetstrokecolor{currentstroke}%
     2318\pgfsetdash{}{0pt}%
     2319\pgfpathmoveto{\pgfqpoint{4.570184in}{2.416895in}}%
     2320\pgfpathlineto{\pgfqpoint{4.570184in}{2.555784in}}%
     2321\pgfusepath{stroke}%
     2322\end{pgfscope}%
     2323\begin{pgfscope}%
     2324\pgfsetbuttcap%
     2325\pgfsetroundjoin%
     2326\definecolor{currentfill}{rgb}{1.000000,0.498039,0.054902}%
    24862327\pgfsetfillcolor{currentfill}%
    24872328\pgfsetlinewidth{1.003750pt}%
    2488 \definecolor{currentstroke}{rgb}{0.839216,0.152941,0.156863}%
     2329\definecolor{currentstroke}{rgb}{1.000000,0.498039,0.054902}%
    24892330\pgfsetstrokecolor{currentstroke}%
    24902331\pgfsetdash{}{0pt}%
     
    24952336}%
    24962337\begin{pgfscope}%
    2497 \pgfsys@transformshift{3.869368in}{1.795985in}%
    2498 \pgfsys@useobject{currentmarker}{}%
    2499 \end{pgfscope}%
    2500 \end{pgfscope}%
    2501 \begin{pgfscope}%
    2502 \pgfsetbuttcap%
    2503 \pgfsetroundjoin%
    2504 \definecolor{currentfill}{rgb}{0.839216,0.152941,0.156863}%
     2338\pgfsys@transformshift{4.570184in}{2.416895in}%
     2339\pgfsys@useobject{currentmarker}{}%
     2340\end{pgfscope}%
     2341\end{pgfscope}%
     2342\begin{pgfscope}%
     2343\pgfsetbuttcap%
     2344\pgfsetroundjoin%
     2345\definecolor{currentfill}{rgb}{1.000000,0.498039,0.054902}%
    25052346\pgfsetfillcolor{currentfill}%
    25062347\pgfsetlinewidth{1.003750pt}%
    2507 \definecolor{currentstroke}{rgb}{0.839216,0.152941,0.156863}%
     2348\definecolor{currentstroke}{rgb}{1.000000,0.498039,0.054902}%
    25082349\pgfsetstrokecolor{currentstroke}%
    25092350\pgfsetdash{}{0pt}%
     
    25142355}%
    25152356\begin{pgfscope}%
    2516 \pgfsys@transformshift{3.869368in}{2.018207in}%
     2357\pgfsys@transformshift{4.570184in}{2.555784in}%
    25172358\pgfsys@useobject{currentmarker}{}%
    25182359\end{pgfscope}%
     
    25222363\pgfsetroundjoin%
    25232364\pgfsetlinewidth{1.505625pt}%
    2524 \definecolor{currentstroke}{rgb}{0.839216,0.152941,0.156863}%
    2525 \pgfsetstrokecolor{currentstroke}%
    2526 \pgfsetdash{}{0pt}%
    2527 \pgfpathmoveto{\pgfqpoint{3.647146in}{1.907096in}}%
    2528 \pgfpathlineto{\pgfqpoint{4.091591in}{1.907096in}}%
    2529 \pgfusepath{stroke}%
    2530 \end{pgfscope}%
    2531 \begin{pgfscope}%
    2532 \pgfsetbuttcap%
    2533 \pgfsetmiterjoin%
    2534 \definecolor{currentfill}{rgb}{0.839216,0.152941,0.156863}%
     2365\definecolor{currentstroke}{rgb}{1.000000,0.498039,0.054902}%
     2366\pgfsetstrokecolor{currentstroke}%
     2367\pgfsetdash{}{0pt}%
     2368\pgfpathmoveto{\pgfqpoint{4.431295in}{2.486339in}}%
     2369\pgfpathlineto{\pgfqpoint{4.709073in}{2.486339in}}%
     2370\pgfusepath{stroke}%
     2371\end{pgfscope}%
     2372\begin{pgfscope}%
     2373\pgfsetbuttcap%
     2374\pgfsetroundjoin%
     2375\definecolor{currentfill}{rgb}{1.000000,0.498039,0.054902}%
    25352376\pgfsetfillcolor{currentfill}%
    25362377\pgfsetlinewidth{1.003750pt}%
    2537 \definecolor{currentstroke}{rgb}{0.839216,0.152941,0.156863}%
    2538 \pgfsetstrokecolor{currentstroke}%
    2539 \pgfsetdash{}{0pt}%
    2540 \pgfsys@defobject{currentmarker}{\pgfqpoint{-0.058926in}{-0.058926in}}{\pgfqpoint{0.058926in}{0.058926in}}{%
    2541 \pgfpathmoveto{\pgfqpoint{-0.000000in}{-0.058926in}}%
    2542 \pgfpathlineto{\pgfqpoint{0.058926in}{0.000000in}}%
    2543 \pgfpathlineto{\pgfqpoint{0.000000in}{0.058926in}}%
    2544 \pgfpathlineto{\pgfqpoint{-0.058926in}{0.000000in}}%
     2378\definecolor{currentstroke}{rgb}{1.000000,0.498039,0.054902}%
     2379\pgfsetstrokecolor{currentstroke}%
     2380\pgfsetdash{}{0pt}%
     2381\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.041667in}{-0.041667in}}{\pgfqpoint{0.041667in}{0.041667in}}{%
     2382\pgfpathmoveto{\pgfqpoint{0.000000in}{-0.041667in}}%
     2383\pgfpathcurveto{\pgfqpoint{0.011050in}{-0.041667in}}{\pgfqpoint{0.021649in}{-0.037276in}}{\pgfqpoint{0.029463in}{-0.029463in}}%
     2384\pgfpathcurveto{\pgfqpoint{0.037276in}{-0.021649in}}{\pgfqpoint{0.041667in}{-0.011050in}}{\pgfqpoint{0.041667in}{0.000000in}}%
     2385\pgfpathcurveto{\pgfqpoint{0.041667in}{0.011050in}}{\pgfqpoint{0.037276in}{0.021649in}}{\pgfqpoint{0.029463in}{0.029463in}}%
     2386\pgfpathcurveto{\pgfqpoint{0.021649in}{0.037276in}}{\pgfqpoint{0.011050in}{0.041667in}}{\pgfqpoint{0.000000in}{0.041667in}}%
     2387\pgfpathcurveto{\pgfqpoint{-0.011050in}{0.041667in}}{\pgfqpoint{-0.021649in}{0.037276in}}{\pgfqpoint{-0.029463in}{0.029463in}}%
     2388\pgfpathcurveto{\pgfqpoint{-0.037276in}{0.021649in}}{\pgfqpoint{-0.041667in}{0.011050in}}{\pgfqpoint{-0.041667in}{0.000000in}}%
     2389\pgfpathcurveto{\pgfqpoint{-0.041667in}{-0.011050in}}{\pgfqpoint{-0.037276in}{-0.021649in}}{\pgfqpoint{-0.029463in}{-0.029463in}}%
     2390\pgfpathcurveto{\pgfqpoint{-0.021649in}{-0.037276in}}{\pgfqpoint{-0.011050in}{-0.041667in}}{\pgfqpoint{0.000000in}{-0.041667in}}%
    25452391\pgfpathclose%
    25462392\pgfusepath{stroke,fill}%
    25472393}%
    25482394\begin{pgfscope}%
    2549 \pgfsys@transformshift{3.869368in}{1.907096in}%
     2395\pgfsys@transformshift{4.570184in}{2.486339in}%
    25502396\pgfsys@useobject{currentmarker}{}%
    25512397\end{pgfscope}%
     
    25552401\pgfsetstrokecolor{textcolor}%
    25562402\pgfsetfillcolor{textcolor}%
    2557 \pgftext[x=4.269368in,y=1.829318in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont CPP-rand}%
     2403\pgftext[x=4.820184in,y=2.437728in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont CPP-baseline}%
     2404\end{pgfscope}%
     2405\begin{pgfscope}%
     2406\pgfsetbuttcap%
     2407\pgfsetroundjoin%
     2408\pgfsetlinewidth{1.505625pt}%
     2409\definecolor{currentstroke}{rgb}{0.172549,0.627451,0.172549}%
     2410\pgfsetstrokecolor{currentstroke}%
     2411\pgfsetdash{}{0pt}%
     2412\pgfpathmoveto{\pgfqpoint{4.570184in}{2.223222in}}%
     2413\pgfpathlineto{\pgfqpoint{4.570184in}{2.362111in}}%
     2414\pgfusepath{stroke}%
     2415\end{pgfscope}%
     2416\begin{pgfscope}%
     2417\pgfsetbuttcap%
     2418\pgfsetroundjoin%
     2419\definecolor{currentfill}{rgb}{0.172549,0.627451,0.172549}%
     2420\pgfsetfillcolor{currentfill}%
     2421\pgfsetlinewidth{1.003750pt}%
     2422\definecolor{currentstroke}{rgb}{0.172549,0.627451,0.172549}%
     2423\pgfsetstrokecolor{currentstroke}%
     2424\pgfsetdash{}{0pt}%
     2425\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.027778in}{-0.000000in}}{\pgfqpoint{0.027778in}{0.000000in}}{%
     2426\pgfpathmoveto{\pgfqpoint{0.027778in}{-0.000000in}}%
     2427\pgfpathlineto{\pgfqpoint{-0.027778in}{0.000000in}}%
     2428\pgfusepath{stroke,fill}%
     2429}%
     2430\begin{pgfscope}%
     2431\pgfsys@transformshift{4.570184in}{2.223222in}%
     2432\pgfsys@useobject{currentmarker}{}%
     2433\end{pgfscope}%
     2434\end{pgfscope}%
     2435\begin{pgfscope}%
     2436\pgfsetbuttcap%
     2437\pgfsetroundjoin%
     2438\definecolor{currentfill}{rgb}{0.172549,0.627451,0.172549}%
     2439\pgfsetfillcolor{currentfill}%
     2440\pgfsetlinewidth{1.003750pt}%
     2441\definecolor{currentstroke}{rgb}{0.172549,0.627451,0.172549}%
     2442\pgfsetstrokecolor{currentstroke}%
     2443\pgfsetdash{}{0pt}%
     2444\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.027778in}{-0.000000in}}{\pgfqpoint{0.027778in}{0.000000in}}{%
     2445\pgfpathmoveto{\pgfqpoint{0.027778in}{-0.000000in}}%
     2446\pgfpathlineto{\pgfqpoint{-0.027778in}{0.000000in}}%
     2447\pgfusepath{stroke,fill}%
     2448}%
     2449\begin{pgfscope}%
     2450\pgfsys@transformshift{4.570184in}{2.362111in}%
     2451\pgfsys@useobject{currentmarker}{}%
     2452\end{pgfscope}%
     2453\end{pgfscope}%
     2454\begin{pgfscope}%
     2455\pgfsetrectcap%
     2456\pgfsetroundjoin%
     2457\pgfsetlinewidth{1.505625pt}%
     2458\definecolor{currentstroke}{rgb}{0.172549,0.627451,0.172549}%
     2459\pgfsetstrokecolor{currentstroke}%
     2460\pgfsetdash{}{0pt}%
     2461\pgfpathmoveto{\pgfqpoint{4.431295in}{2.292667in}}%
     2462\pgfpathlineto{\pgfqpoint{4.709073in}{2.292667in}}%
     2463\pgfusepath{stroke}%
     2464\end{pgfscope}%
     2465\begin{pgfscope}%
     2466\pgfsetbuttcap%
     2467\pgfsetroundjoin%
     2468\definecolor{currentfill}{rgb}{0.172549,0.627451,0.172549}%
     2469\pgfsetfillcolor{currentfill}%
     2470\pgfsetlinewidth{1.003750pt}%
     2471\definecolor{currentstroke}{rgb}{0.172549,0.627451,0.172549}%
     2472\pgfsetstrokecolor{currentstroke}%
     2473\pgfsetdash{}{0pt}%
     2474\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.041667in}{-0.041667in}}{\pgfqpoint{0.041667in}{0.041667in}}{%
     2475\pgfpathmoveto{\pgfqpoint{0.000000in}{-0.041667in}}%
     2476\pgfpathcurveto{\pgfqpoint{0.011050in}{-0.041667in}}{\pgfqpoint{0.021649in}{-0.037276in}}{\pgfqpoint{0.029463in}{-0.029463in}}%
     2477\pgfpathcurveto{\pgfqpoint{0.037276in}{-0.021649in}}{\pgfqpoint{0.041667in}{-0.011050in}}{\pgfqpoint{0.041667in}{0.000000in}}%
     2478\pgfpathcurveto{\pgfqpoint{0.041667in}{0.011050in}}{\pgfqpoint{0.037276in}{0.021649in}}{\pgfqpoint{0.029463in}{0.029463in}}%
     2479\pgfpathcurveto{\pgfqpoint{0.021649in}{0.037276in}}{\pgfqpoint{0.011050in}{0.041667in}}{\pgfqpoint{0.000000in}{0.041667in}}%
     2480\pgfpathcurveto{\pgfqpoint{-0.011050in}{0.041667in}}{\pgfqpoint{-0.021649in}{0.037276in}}{\pgfqpoint{-0.029463in}{0.029463in}}%
     2481\pgfpathcurveto{\pgfqpoint{-0.037276in}{0.021649in}}{\pgfqpoint{-0.041667in}{0.011050in}}{\pgfqpoint{-0.041667in}{0.000000in}}%
     2482\pgfpathcurveto{\pgfqpoint{-0.041667in}{-0.011050in}}{\pgfqpoint{-0.037276in}{-0.021649in}}{\pgfqpoint{-0.029463in}{-0.029463in}}%
     2483\pgfpathcurveto{\pgfqpoint{-0.021649in}{-0.037276in}}{\pgfqpoint{-0.011050in}{-0.041667in}}{\pgfqpoint{0.000000in}{-0.041667in}}%
     2484\pgfpathclose%
     2485\pgfusepath{stroke,fill}%
     2486}%
     2487\begin{pgfscope}%
     2488\pgfsys@transformshift{4.570184in}{2.292667in}%
     2489\pgfsys@useobject{currentmarker}{}%
     2490\end{pgfscope}%
     2491\end{pgfscope}%
     2492\begin{pgfscope}%
     2493\definecolor{textcolor}{rgb}{0.000000,0.000000,0.000000}%
     2494\pgfsetstrokecolor{textcolor}%
     2495\pgfsetfillcolor{textcolor}%
     2496\pgftext[x=4.820184in,y=2.244056in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont CFA-rand}%
     2497\end{pgfscope}%
     2498\begin{pgfscope}%
     2499\pgfsetbuttcap%
     2500\pgfsetroundjoin%
     2501\pgfsetlinewidth{1.505625pt}%
     2502\definecolor{currentstroke}{rgb}{0.839216,0.152941,0.156863}%
     2503\pgfsetstrokecolor{currentstroke}%
     2504\pgfsetdash{}{0pt}%
     2505\pgfpathmoveto{\pgfqpoint{4.570184in}{2.029549in}}%
     2506\pgfpathlineto{\pgfqpoint{4.570184in}{2.168438in}}%
     2507\pgfusepath{stroke}%
     2508\end{pgfscope}%
     2509\begin{pgfscope}%
     2510\pgfsetbuttcap%
     2511\pgfsetroundjoin%
     2512\definecolor{currentfill}{rgb}{0.839216,0.152941,0.156863}%
     2513\pgfsetfillcolor{currentfill}%
     2514\pgfsetlinewidth{1.003750pt}%
     2515\definecolor{currentstroke}{rgb}{0.839216,0.152941,0.156863}%
     2516\pgfsetstrokecolor{currentstroke}%
     2517\pgfsetdash{}{0pt}%
     2518\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.027778in}{-0.000000in}}{\pgfqpoint{0.027778in}{0.000000in}}{%
     2519\pgfpathmoveto{\pgfqpoint{0.027778in}{-0.000000in}}%
     2520\pgfpathlineto{\pgfqpoint{-0.027778in}{0.000000in}}%
     2521\pgfusepath{stroke,fill}%
     2522}%
     2523\begin{pgfscope}%
     2524\pgfsys@transformshift{4.570184in}{2.029549in}%
     2525\pgfsys@useobject{currentmarker}{}%
     2526\end{pgfscope}%
     2527\end{pgfscope}%
     2528\begin{pgfscope}%
     2529\pgfsetbuttcap%
     2530\pgfsetroundjoin%
     2531\definecolor{currentfill}{rgb}{0.839216,0.152941,0.156863}%
     2532\pgfsetfillcolor{currentfill}%
     2533\pgfsetlinewidth{1.003750pt}%
     2534\definecolor{currentstroke}{rgb}{0.839216,0.152941,0.156863}%
     2535\pgfsetstrokecolor{currentstroke}%
     2536\pgfsetdash{}{0pt}%
     2537\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.027778in}{-0.000000in}}{\pgfqpoint{0.027778in}{0.000000in}}{%
     2538\pgfpathmoveto{\pgfqpoint{0.027778in}{-0.000000in}}%
     2539\pgfpathlineto{\pgfqpoint{-0.027778in}{0.000000in}}%
     2540\pgfusepath{stroke,fill}%
     2541}%
     2542\begin{pgfscope}%
     2543\pgfsys@transformshift{4.570184in}{2.168438in}%
     2544\pgfsys@useobject{currentmarker}{}%
     2545\end{pgfscope}%
     2546\end{pgfscope}%
     2547\begin{pgfscope}%
     2548\pgfsetrectcap%
     2549\pgfsetroundjoin%
     2550\pgfsetlinewidth{1.505625pt}%
     2551\definecolor{currentstroke}{rgb}{0.839216,0.152941,0.156863}%
     2552\pgfsetstrokecolor{currentstroke}%
     2553\pgfsetdash{}{0pt}%
     2554\pgfpathmoveto{\pgfqpoint{4.431295in}{2.098994in}}%
     2555\pgfpathlineto{\pgfqpoint{4.709073in}{2.098994in}}%
     2556\pgfusepath{stroke}%
     2557\end{pgfscope}%
     2558\begin{pgfscope}%
     2559\pgfsetbuttcap%
     2560\pgfsetroundjoin%
     2561\definecolor{currentfill}{rgb}{0.839216,0.152941,0.156863}%
     2562\pgfsetfillcolor{currentfill}%
     2563\pgfsetlinewidth{1.003750pt}%
     2564\definecolor{currentstroke}{rgb}{0.839216,0.152941,0.156863}%
     2565\pgfsetstrokecolor{currentstroke}%
     2566\pgfsetdash{}{0pt}%
     2567\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.041667in}{-0.041667in}}{\pgfqpoint{0.041667in}{0.041667in}}{%
     2568\pgfpathmoveto{\pgfqpoint{0.000000in}{-0.041667in}}%
     2569\pgfpathcurveto{\pgfqpoint{0.011050in}{-0.041667in}}{\pgfqpoint{0.021649in}{-0.037276in}}{\pgfqpoint{0.029463in}{-0.029463in}}%
     2570\pgfpathcurveto{\pgfqpoint{0.037276in}{-0.021649in}}{\pgfqpoint{0.041667in}{-0.011050in}}{\pgfqpoint{0.041667in}{0.000000in}}%
     2571\pgfpathcurveto{\pgfqpoint{0.041667in}{0.011050in}}{\pgfqpoint{0.037276in}{0.021649in}}{\pgfqpoint{0.029463in}{0.029463in}}%
     2572\pgfpathcurveto{\pgfqpoint{0.021649in}{0.037276in}}{\pgfqpoint{0.011050in}{0.041667in}}{\pgfqpoint{0.000000in}{0.041667in}}%
     2573\pgfpathcurveto{\pgfqpoint{-0.011050in}{0.041667in}}{\pgfqpoint{-0.021649in}{0.037276in}}{\pgfqpoint{-0.029463in}{0.029463in}}%
     2574\pgfpathcurveto{\pgfqpoint{-0.037276in}{0.021649in}}{\pgfqpoint{-0.041667in}{0.011050in}}{\pgfqpoint{-0.041667in}{0.000000in}}%
     2575\pgfpathcurveto{\pgfqpoint{-0.041667in}{-0.011050in}}{\pgfqpoint{-0.037276in}{-0.021649in}}{\pgfqpoint{-0.029463in}{-0.029463in}}%
     2576\pgfpathcurveto{\pgfqpoint{-0.021649in}{-0.037276in}}{\pgfqpoint{-0.011050in}{-0.041667in}}{\pgfqpoint{0.000000in}{-0.041667in}}%
     2577\pgfpathclose%
     2578\pgfusepath{stroke,fill}%
     2579}%
     2580\begin{pgfscope}%
     2581\pgfsys@transformshift{4.570184in}{2.098994in}%
     2582\pgfsys@useobject{currentmarker}{}%
     2583\end{pgfscope}%
     2584\end{pgfscope}%
     2585\begin{pgfscope}%
     2586\definecolor{textcolor}{rgb}{0.000000,0.000000,0.000000}%
     2587\pgfsetstrokecolor{textcolor}%
     2588\pgfsetfillcolor{textcolor}%
     2589\pgftext[x=4.820184in,y=2.050383in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont CPP-rand}%
    25582590\end{pgfscope}%
    25592591\end{pgfpicture}%
  • doc/theses/colby_parsons_MMAth/figures/nasus_Channel_Contention.pgf

    r044ae62 r3a513d89  
    7777\pgfsetstrokecolor{textcolor}%
    7878\pgfsetfillcolor{textcolor}%
    79 \pgftext[x=1.025455in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 2\)}%
     79\pgftext[x=1.025455in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 2\)}%
    8080\end{pgfscope}%
    8181\begin{pgfscope}%
     
    102102\pgfsetstrokecolor{textcolor}%
    103103\pgfsetfillcolor{textcolor}%
    104 \pgftext[x=1.326061in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 4\)}%
     104\pgftext[x=1.326061in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 4\)}%
    105105\end{pgfscope}%
    106106\begin{pgfscope}%
     
    127127\pgfsetstrokecolor{textcolor}%
    128128\pgfsetfillcolor{textcolor}%
    129 \pgftext[x=1.927273in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 8\)}%
     129\pgftext[x=1.927273in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 8\)}%
    130130\end{pgfscope}%
    131131\begin{pgfscope}%
     
    152152\pgfsetstrokecolor{textcolor}%
    153153\pgfsetfillcolor{textcolor}%
    154 \pgftext[x=3.129697in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 16\)}%
     154\pgftext[x=3.129697in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 16\)}%
    155155\end{pgfscope}%
    156156\begin{pgfscope}%
     
    177177\pgfsetstrokecolor{textcolor}%
    178178\pgfsetfillcolor{textcolor}%
    179 \pgftext[x=4.332121in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 24\)}%
     179\pgftext[x=4.332121in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 24\)}%
    180180\end{pgfscope}%
    181181\begin{pgfscope}%
     
    202202\pgfsetstrokecolor{textcolor}%
    203203\pgfsetfillcolor{textcolor}%
    204 \pgftext[x=5.534545in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 32\)}%
     204\pgftext[x=5.534545in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 32\)}%
    205205\end{pgfscope}%
    206206\begin{pgfscope}%
     
    208208\pgfsetstrokecolor{textcolor}%
    209209\pgfsetfillcolor{textcolor}%
    210 \pgftext[x=3.280000in,y=0.161874in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont Cores}%
     210\pgftext[x=3.280000in,y=0.251766in,,top]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont Cores}%
    211211\end{pgfscope}%
    212212\begin{pgfscope}%
     
    233233\pgfsetstrokecolor{textcolor}%
    234234\pgfsetfillcolor{textcolor}%
    235 \pgftext[x=0.399655in,y=2.012615in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 10^{8}\)}%
     235\pgftext[x=0.501581in,y=2.047723in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 10^{8}\)}%
    236236\end{pgfscope}%
    237237\begin{pgfscope}%
     
    467467\pgfsetstrokecolor{textcolor}%
    468468\pgfsetfillcolor{textcolor}%
    469 \pgftext[x=0.344100in,y=2.376000in,,bottom,rotate=90.000000]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont Throughput (channel operations)}%
     469\pgftext[x=0.446026in,y=2.376000in,,bottom,rotate=90.000000]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont Throughput (channel operations)}%
    470470\end{pgfscope}%
    471471\begin{pgfscope}%
     
    876876\pgfusepath{clip}%
    877877\pgfsetbuttcap%
    878 \pgfsetmiterjoin%
     878\pgfsetroundjoin%
    879879\definecolor{currentfill}{rgb}{1.000000,0.498039,0.054902}%
    880880\pgfsetfillcolor{currentfill}%
    881881\pgfsetlinewidth{1.003750pt}%
    882882\definecolor{currentstroke}{rgb}{1.000000,0.498039,0.054902}%
    883 \pgfsetstrokecolor{currentstroke}%
    884 \pgfsetdash{}{0pt}%
    885 \pgfsys@defobject{currentmarker}{\pgfqpoint{-0.041667in}{-0.041667in}}{\pgfqpoint{0.041667in}{0.041667in}}{%
    886 \pgfpathmoveto{\pgfqpoint{-0.041667in}{-0.041667in}}%
    887 \pgfpathlineto{\pgfqpoint{0.041667in}{-0.041667in}}%
    888 \pgfpathlineto{\pgfqpoint{0.041667in}{0.041667in}}%
    889 \pgfpathlineto{\pgfqpoint{-0.041667in}{0.041667in}}%
    890 \pgfpathclose%
    891 \pgfusepath{stroke,fill}%
    892 }%
    893 \begin{pgfscope}%
    894 \pgfsys@transformshift{1.025455in}{3.406486in}%
    895 \pgfsys@useobject{currentmarker}{}%
    896 \end{pgfscope}%
    897 \begin{pgfscope}%
    898 \pgfsys@transformshift{1.326061in}{3.091073in}%
    899 \pgfsys@useobject{currentmarker}{}%
    900 \end{pgfscope}%
    901 \begin{pgfscope}%
    902 \pgfsys@transformshift{1.927273in}{2.246470in}%
    903 \pgfsys@useobject{currentmarker}{}%
    904 \end{pgfscope}%
    905 \begin{pgfscope}%
    906 \pgfsys@transformshift{3.129697in}{1.072038in}%
    907 \pgfsys@useobject{currentmarker}{}%
    908 \end{pgfscope}%
    909 \begin{pgfscope}%
    910 \pgfsys@transformshift{4.332121in}{0.890889in}%
    911 \pgfsys@useobject{currentmarker}{}%
    912 \end{pgfscope}%
    913 \begin{pgfscope}%
    914 \pgfsys@transformshift{5.534545in}{1.106104in}%
    915 \pgfsys@useobject{currentmarker}{}%
    916 \end{pgfscope}%
    917 \end{pgfscope}%
    918 \begin{pgfscope}%
    919 \pgfsetrectcap%
    920 \pgfsetmiterjoin%
    921 \pgfsetlinewidth{0.803000pt}%
    922 \definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}%
    923 \pgfsetstrokecolor{currentstroke}%
    924 \pgfsetdash{}{0pt}%
    925 \pgfpathmoveto{\pgfqpoint{0.800000in}{0.528000in}}%
    926 \pgfpathlineto{\pgfqpoint{0.800000in}{4.224000in}}%
    927 \pgfusepath{stroke}%
    928 \end{pgfscope}%
    929 \begin{pgfscope}%
    930 \pgfsetrectcap%
    931 \pgfsetmiterjoin%
    932 \pgfsetlinewidth{0.803000pt}%
    933 \definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}%
    934 \pgfsetstrokecolor{currentstroke}%
    935 \pgfsetdash{}{0pt}%
    936 \pgfpathmoveto{\pgfqpoint{5.760000in}{0.528000in}}%
    937 \pgfpathlineto{\pgfqpoint{5.760000in}{4.224000in}}%
    938 \pgfusepath{stroke}%
    939 \end{pgfscope}%
    940 \begin{pgfscope}%
    941 \pgfsetrectcap%
    942 \pgfsetmiterjoin%
    943 \pgfsetlinewidth{0.803000pt}%
    944 \definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}%
    945 \pgfsetstrokecolor{currentstroke}%
    946 \pgfsetdash{}{0pt}%
    947 \pgfpathmoveto{\pgfqpoint{0.800000in}{0.528000in}}%
    948 \pgfpathlineto{\pgfqpoint{5.760000in}{0.528000in}}%
    949 \pgfusepath{stroke}%
    950 \end{pgfscope}%
    951 \begin{pgfscope}%
    952 \pgfsetrectcap%
    953 \pgfsetmiterjoin%
    954 \pgfsetlinewidth{0.803000pt}%
    955 \definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}%
    956 \pgfsetstrokecolor{currentstroke}%
    957 \pgfsetdash{}{0pt}%
    958 \pgfpathmoveto{\pgfqpoint{0.800000in}{4.224000in}}%
    959 \pgfpathlineto{\pgfqpoint{5.760000in}{4.224000in}}%
    960 \pgfusepath{stroke}%
    961 \end{pgfscope}%
    962 \begin{pgfscope}%
    963 \definecolor{textcolor}{rgb}{0.000000,0.000000,0.000000}%
    964 \pgfsetstrokecolor{textcolor}%
    965 \pgfsetfillcolor{textcolor}%
    966 \pgftext[x=3.280000in,y=4.307333in,,base]{\color{textcolor}\rmfamily\fontsize{19.200000}{23.040000}\selectfont Channel Contention Benchmark}%
    967 \end{pgfscope}%
    968 \begin{pgfscope}%
    969 \pgfsetbuttcap%
    970 \pgfsetmiterjoin%
    971 \definecolor{currentfill}{rgb}{1.000000,1.000000,1.000000}%
    972 \pgfsetfillcolor{currentfill}%
    973 \pgfsetfillopacity{0.800000}%
    974 \pgfsetlinewidth{1.003750pt}%
    975 \definecolor{currentstroke}{rgb}{0.800000,0.800000,0.800000}%
    976 \pgfsetstrokecolor{currentstroke}%
    977 \pgfsetstrokeopacity{0.800000}%
    978 \pgfsetdash{}{0pt}%
    979 \pgfpathmoveto{\pgfqpoint{4.447292in}{3.397303in}}%
    980 \pgfpathlineto{\pgfqpoint{5.604444in}{3.397303in}}%
    981 \pgfpathquadraticcurveto{\pgfqpoint{5.648889in}{3.397303in}}{\pgfqpoint{5.648889in}{3.441747in}}%
    982 \pgfpathlineto{\pgfqpoint{5.648889in}{4.068444in}}%
    983 \pgfpathquadraticcurveto{\pgfqpoint{5.648889in}{4.112889in}}{\pgfqpoint{5.604444in}{4.112889in}}%
    984 \pgfpathlineto{\pgfqpoint{4.447292in}{4.112889in}}%
    985 \pgfpathquadraticcurveto{\pgfqpoint{4.402848in}{4.112889in}}{\pgfqpoint{4.402848in}{4.068444in}}%
    986 \pgfpathlineto{\pgfqpoint{4.402848in}{3.441747in}}%
    987 \pgfpathquadraticcurveto{\pgfqpoint{4.402848in}{3.397303in}}{\pgfqpoint{4.447292in}{3.397303in}}%
    988 \pgfpathclose%
    989 \pgfusepath{stroke,fill}%
    990 \end{pgfscope}%
    991 \begin{pgfscope}%
    992 \pgfsetbuttcap%
    993 \pgfsetroundjoin%
    994 \pgfsetlinewidth{1.505625pt}%
    995 \definecolor{currentstroke}{rgb}{0.121569,0.466667,0.705882}%
    996 \pgfsetstrokecolor{currentstroke}%
    997 \pgfsetdash{}{0pt}%
    998 \pgfpathmoveto{\pgfqpoint{4.713959in}{3.824000in}}%
    999 \pgfpathlineto{\pgfqpoint{4.713959in}{4.046222in}}%
    1000 \pgfusepath{stroke}%
    1001 \end{pgfscope}%
    1002 \begin{pgfscope}%
    1003 \pgfsetbuttcap%
    1004 \pgfsetroundjoin%
    1005 \definecolor{currentfill}{rgb}{0.121569,0.466667,0.705882}%
    1006 \pgfsetfillcolor{currentfill}%
    1007 \pgfsetlinewidth{1.003750pt}%
    1008 \definecolor{currentstroke}{rgb}{0.121569,0.466667,0.705882}%
    1009 \pgfsetstrokecolor{currentstroke}%
    1010 \pgfsetdash{}{0pt}%
    1011 \pgfsys@defobject{currentmarker}{\pgfqpoint{-0.027778in}{-0.000000in}}{\pgfqpoint{0.027778in}{0.000000in}}{%
    1012 \pgfpathmoveto{\pgfqpoint{0.027778in}{-0.000000in}}%
    1013 \pgfpathlineto{\pgfqpoint{-0.027778in}{0.000000in}}%
    1014 \pgfusepath{stroke,fill}%
    1015 }%
    1016 \begin{pgfscope}%
    1017 \pgfsys@transformshift{4.713959in}{3.824000in}%
    1018 \pgfsys@useobject{currentmarker}{}%
    1019 \end{pgfscope}%
    1020 \end{pgfscope}%
    1021 \begin{pgfscope}%
    1022 \pgfsetbuttcap%
    1023 \pgfsetroundjoin%
    1024 \definecolor{currentfill}{rgb}{0.121569,0.466667,0.705882}%
    1025 \pgfsetfillcolor{currentfill}%
    1026 \pgfsetlinewidth{1.003750pt}%
    1027 \definecolor{currentstroke}{rgb}{0.121569,0.466667,0.705882}%
    1028 \pgfsetstrokecolor{currentstroke}%
    1029 \pgfsetdash{}{0pt}%
    1030 \pgfsys@defobject{currentmarker}{\pgfqpoint{-0.027778in}{-0.000000in}}{\pgfqpoint{0.027778in}{0.000000in}}{%
    1031 \pgfpathmoveto{\pgfqpoint{0.027778in}{-0.000000in}}%
    1032 \pgfpathlineto{\pgfqpoint{-0.027778in}{0.000000in}}%
    1033 \pgfusepath{stroke,fill}%
    1034 }%
    1035 \begin{pgfscope}%
    1036 \pgfsys@transformshift{4.713959in}{4.046222in}%
    1037 \pgfsys@useobject{currentmarker}{}%
    1038 \end{pgfscope}%
    1039 \end{pgfscope}%
    1040 \begin{pgfscope}%
    1041 \pgfsetrectcap%
    1042 \pgfsetroundjoin%
    1043 \pgfsetlinewidth{1.505625pt}%
    1044 \definecolor{currentstroke}{rgb}{0.121569,0.466667,0.705882}%
    1045 \pgfsetstrokecolor{currentstroke}%
    1046 \pgfsetdash{}{0pt}%
    1047 \pgfpathmoveto{\pgfqpoint{4.491737in}{3.935111in}}%
    1048 \pgfpathlineto{\pgfqpoint{4.936181in}{3.935111in}}%
    1049 \pgfusepath{stroke}%
    1050 \end{pgfscope}%
    1051 \begin{pgfscope}%
    1052 \pgfsetbuttcap%
    1053 \pgfsetroundjoin%
    1054 \definecolor{currentfill}{rgb}{0.121569,0.466667,0.705882}%
    1055 \pgfsetfillcolor{currentfill}%
    1056 \pgfsetlinewidth{1.003750pt}%
    1057 \definecolor{currentstroke}{rgb}{0.121569,0.466667,0.705882}%
    1058883\pgfsetstrokecolor{currentstroke}%
    1059884\pgfsetdash{}{0pt}%
     
    1072897}%
    1073898\begin{pgfscope}%
    1074 \pgfsys@transformshift{4.713959in}{3.935111in}%
    1075 \pgfsys@useobject{currentmarker}{}%
    1076 \end{pgfscope}%
     899\pgfsys@transformshift{1.025455in}{3.406486in}%
     900\pgfsys@useobject{currentmarker}{}%
     901\end{pgfscope}%
     902\begin{pgfscope}%
     903\pgfsys@transformshift{1.326061in}{3.091073in}%
     904\pgfsys@useobject{currentmarker}{}%
     905\end{pgfscope}%
     906\begin{pgfscope}%
     907\pgfsys@transformshift{1.927273in}{2.246470in}%
     908\pgfsys@useobject{currentmarker}{}%
     909\end{pgfscope}%
     910\begin{pgfscope}%
     911\pgfsys@transformshift{3.129697in}{1.072038in}%
     912\pgfsys@useobject{currentmarker}{}%
     913\end{pgfscope}%
     914\begin{pgfscope}%
     915\pgfsys@transformshift{4.332121in}{0.890889in}%
     916\pgfsys@useobject{currentmarker}{}%
     917\end{pgfscope}%
     918\begin{pgfscope}%
     919\pgfsys@transformshift{5.534545in}{1.106104in}%
     920\pgfsys@useobject{currentmarker}{}%
     921\end{pgfscope}%
     922\end{pgfscope}%
     923\begin{pgfscope}%
     924\pgfsetrectcap%
     925\pgfsetmiterjoin%
     926\pgfsetlinewidth{0.803000pt}%
     927\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}%
     928\pgfsetstrokecolor{currentstroke}%
     929\pgfsetdash{}{0pt}%
     930\pgfpathmoveto{\pgfqpoint{0.800000in}{0.528000in}}%
     931\pgfpathlineto{\pgfqpoint{0.800000in}{4.224000in}}%
     932\pgfusepath{stroke}%
     933\end{pgfscope}%
     934\begin{pgfscope}%
     935\pgfsetrectcap%
     936\pgfsetmiterjoin%
     937\pgfsetlinewidth{0.803000pt}%
     938\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}%
     939\pgfsetstrokecolor{currentstroke}%
     940\pgfsetdash{}{0pt}%
     941\pgfpathmoveto{\pgfqpoint{5.760000in}{0.528000in}}%
     942\pgfpathlineto{\pgfqpoint{5.760000in}{4.224000in}}%
     943\pgfusepath{stroke}%
     944\end{pgfscope}%
     945\begin{pgfscope}%
     946\pgfsetrectcap%
     947\pgfsetmiterjoin%
     948\pgfsetlinewidth{0.803000pt}%
     949\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}%
     950\pgfsetstrokecolor{currentstroke}%
     951\pgfsetdash{}{0pt}%
     952\pgfpathmoveto{\pgfqpoint{0.800000in}{0.528000in}}%
     953\pgfpathlineto{\pgfqpoint{5.760000in}{0.528000in}}%
     954\pgfusepath{stroke}%
     955\end{pgfscope}%
     956\begin{pgfscope}%
     957\pgfsetrectcap%
     958\pgfsetmiterjoin%
     959\pgfsetlinewidth{0.803000pt}%
     960\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}%
     961\pgfsetstrokecolor{currentstroke}%
     962\pgfsetdash{}{0pt}%
     963\pgfpathmoveto{\pgfqpoint{0.800000in}{4.224000in}}%
     964\pgfpathlineto{\pgfqpoint{5.760000in}{4.224000in}}%
     965\pgfusepath{stroke}%
    1077966\end{pgfscope}%
    1078967\begin{pgfscope}%
     
    1080969\pgfsetstrokecolor{textcolor}%
    1081970\pgfsetfillcolor{textcolor}%
    1082 \pgftext[x=5.113959in,y=3.857333in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont CFA}%
    1083 \end{pgfscope}%
    1084 \begin{pgfscope}%
    1085 \pgfsetbuttcap%
    1086 \pgfsetroundjoin%
    1087 \pgfsetlinewidth{1.505625pt}%
    1088 \definecolor{currentstroke}{rgb}{1.000000,0.498039,0.054902}%
    1089 \pgfsetstrokecolor{currentstroke}%
    1090 \pgfsetdash{}{0pt}%
    1091 \pgfpathmoveto{\pgfqpoint{4.713959in}{3.499540in}}%
    1092 \pgfpathlineto{\pgfqpoint{4.713959in}{3.721763in}}%
    1093 \pgfusepath{stroke}%
    1094 \end{pgfscope}%
    1095 \begin{pgfscope}%
    1096 \pgfsetbuttcap%
    1097 \pgfsetroundjoin%
    1098 \definecolor{currentfill}{rgb}{1.000000,0.498039,0.054902}%
    1099 \pgfsetfillcolor{currentfill}%
    1100 \pgfsetlinewidth{1.003750pt}%
    1101 \definecolor{currentstroke}{rgb}{1.000000,0.498039,0.054902}%
     971\pgftext[x=3.280000in,y=4.307333in,,base]{\color{textcolor}\rmfamily\fontsize{12.000000}{14.400000}\selectfont Channel Contention Benchmark}%
     972\end{pgfscope}%
     973\begin{pgfscope}%
     974\pgfsetbuttcap%
     975\pgfsetmiterjoin%
     976\definecolor{currentfill}{rgb}{1.000000,1.000000,1.000000}%
     977\pgfsetfillcolor{currentfill}%
     978\pgfsetfillopacity{0.800000}%
     979\pgfsetlinewidth{1.003750pt}%
     980\definecolor{currentstroke}{rgb}{0.800000,0.800000,0.800000}%
     981\pgfsetstrokecolor{currentstroke}%
     982\pgfsetstrokeopacity{0.800000}%
     983\pgfsetdash{}{0pt}%
     984\pgfpathmoveto{\pgfqpoint{4.938626in}{3.725543in}}%
     985\pgfpathlineto{\pgfqpoint{5.662778in}{3.725543in}}%
     986\pgfpathquadraticcurveto{\pgfqpoint{5.690556in}{3.725543in}}{\pgfqpoint{5.690556in}{3.753321in}}%
     987\pgfpathlineto{\pgfqpoint{5.690556in}{4.126778in}}%
     988\pgfpathquadraticcurveto{\pgfqpoint{5.690556in}{4.154556in}}{\pgfqpoint{5.662778in}{4.154556in}}%
     989\pgfpathlineto{\pgfqpoint{4.938626in}{4.154556in}}%
     990\pgfpathquadraticcurveto{\pgfqpoint{4.910848in}{4.154556in}}{\pgfqpoint{4.910848in}{4.126778in}}%
     991\pgfpathlineto{\pgfqpoint{4.910848in}{3.753321in}}%
     992\pgfpathquadraticcurveto{\pgfqpoint{4.910848in}{3.725543in}}{\pgfqpoint{4.938626in}{3.725543in}}%
     993\pgfpathclose%
     994\pgfusepath{stroke,fill}%
     995\end{pgfscope}%
     996\begin{pgfscope}%
     997\pgfsetbuttcap%
     998\pgfsetroundjoin%
     999\pgfsetlinewidth{1.505625pt}%
     1000\definecolor{currentstroke}{rgb}{0.121569,0.466667,0.705882}%
     1001\pgfsetstrokecolor{currentstroke}%
     1002\pgfsetdash{}{0pt}%
     1003\pgfpathmoveto{\pgfqpoint{5.105293in}{3.980944in}}%
     1004\pgfpathlineto{\pgfqpoint{5.105293in}{4.119833in}}%
     1005\pgfusepath{stroke}%
     1006\end{pgfscope}%
     1007\begin{pgfscope}%
     1008\pgfsetbuttcap%
     1009\pgfsetroundjoin%
     1010\definecolor{currentfill}{rgb}{0.121569,0.466667,0.705882}%
     1011\pgfsetfillcolor{currentfill}%
     1012\pgfsetlinewidth{1.003750pt}%
     1013\definecolor{currentstroke}{rgb}{0.121569,0.466667,0.705882}%
    11021014\pgfsetstrokecolor{currentstroke}%
    11031015\pgfsetdash{}{0pt}%
     
    11081020}%
    11091021\begin{pgfscope}%
    1110 \pgfsys@transformshift{4.713959in}{3.499540in}%
    1111 \pgfsys@useobject{currentmarker}{}%
    1112 \end{pgfscope}%
    1113 \end{pgfscope}%
    1114 \begin{pgfscope}%
    1115 \pgfsetbuttcap%
    1116 \pgfsetroundjoin%
    1117 \definecolor{currentfill}{rgb}{1.000000,0.498039,0.054902}%
    1118 \pgfsetfillcolor{currentfill}%
    1119 \pgfsetlinewidth{1.003750pt}%
    1120 \definecolor{currentstroke}{rgb}{1.000000,0.498039,0.054902}%
     1022\pgfsys@transformshift{5.105293in}{3.980944in}%
     1023\pgfsys@useobject{currentmarker}{}%
     1024\end{pgfscope}%
     1025\end{pgfscope}%
     1026\begin{pgfscope}%
     1027\pgfsetbuttcap%
     1028\pgfsetroundjoin%
     1029\definecolor{currentfill}{rgb}{0.121569,0.466667,0.705882}%
     1030\pgfsetfillcolor{currentfill}%
     1031\pgfsetlinewidth{1.003750pt}%
     1032\definecolor{currentstroke}{rgb}{0.121569,0.466667,0.705882}%
    11211033\pgfsetstrokecolor{currentstroke}%
    11221034\pgfsetdash{}{0pt}%
     
    11271039}%
    11281040\begin{pgfscope}%
    1129 \pgfsys@transformshift{4.713959in}{3.721763in}%
     1041\pgfsys@transformshift{5.105293in}{4.119833in}%
    11301042\pgfsys@useobject{currentmarker}{}%
    11311043\end{pgfscope}%
     
    11351047\pgfsetroundjoin%
    11361048\pgfsetlinewidth{1.505625pt}%
    1137 \definecolor{currentstroke}{rgb}{1.000000,0.498039,0.054902}%
    1138 \pgfsetstrokecolor{currentstroke}%
    1139 \pgfsetdash{}{0pt}%
    1140 \pgfpathmoveto{\pgfqpoint{4.491737in}{3.610651in}}%
    1141 \pgfpathlineto{\pgfqpoint{4.936181in}{3.610651in}}%
    1142 \pgfusepath{stroke}%
    1143 \end{pgfscope}%
    1144 \begin{pgfscope}%
    1145 \pgfsetbuttcap%
    1146 \pgfsetmiterjoin%
    1147 \definecolor{currentfill}{rgb}{1.000000,0.498039,0.054902}%
    1148 \pgfsetfillcolor{currentfill}%
    1149 \pgfsetlinewidth{1.003750pt}%
    1150 \definecolor{currentstroke}{rgb}{1.000000,0.498039,0.054902}%
     1049\definecolor{currentstroke}{rgb}{0.121569,0.466667,0.705882}%
     1050\pgfsetstrokecolor{currentstroke}%
     1051\pgfsetdash{}{0pt}%
     1052\pgfpathmoveto{\pgfqpoint{4.966404in}{4.050389in}}%
     1053\pgfpathlineto{\pgfqpoint{5.244182in}{4.050389in}}%
     1054\pgfusepath{stroke}%
     1055\end{pgfscope}%
     1056\begin{pgfscope}%
     1057\pgfsetbuttcap%
     1058\pgfsetroundjoin%
     1059\definecolor{currentfill}{rgb}{0.121569,0.466667,0.705882}%
     1060\pgfsetfillcolor{currentfill}%
     1061\pgfsetlinewidth{1.003750pt}%
     1062\definecolor{currentstroke}{rgb}{0.121569,0.466667,0.705882}%
    11511063\pgfsetstrokecolor{currentstroke}%
    11521064\pgfsetdash{}{0pt}%
    11531065\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.041667in}{-0.041667in}}{\pgfqpoint{0.041667in}{0.041667in}}{%
    1154 \pgfpathmoveto{\pgfqpoint{-0.041667in}{-0.041667in}}%
    1155 \pgfpathlineto{\pgfqpoint{0.041667in}{-0.041667in}}%
    1156 \pgfpathlineto{\pgfqpoint{0.041667in}{0.041667in}}%
    1157 \pgfpathlineto{\pgfqpoint{-0.041667in}{0.041667in}}%
     1066\pgfpathmoveto{\pgfqpoint{0.000000in}{-0.041667in}}%
     1067\pgfpathcurveto{\pgfqpoint{0.011050in}{-0.041667in}}{\pgfqpoint{0.021649in}{-0.037276in}}{\pgfqpoint{0.029463in}{-0.029463in}}%
     1068\pgfpathcurveto{\pgfqpoint{0.037276in}{-0.021649in}}{\pgfqpoint{0.041667in}{-0.011050in}}{\pgfqpoint{0.041667in}{0.000000in}}%
     1069\pgfpathcurveto{\pgfqpoint{0.041667in}{0.011050in}}{\pgfqpoint{0.037276in}{0.021649in}}{\pgfqpoint{0.029463in}{0.029463in}}%
     1070\pgfpathcurveto{\pgfqpoint{0.021649in}{0.037276in}}{\pgfqpoint{0.011050in}{0.041667in}}{\pgfqpoint{0.000000in}{0.041667in}}%
     1071\pgfpathcurveto{\pgfqpoint{-0.011050in}{0.041667in}}{\pgfqpoint{-0.021649in}{0.037276in}}{\pgfqpoint{-0.029463in}{0.029463in}}%
     1072\pgfpathcurveto{\pgfqpoint{-0.037276in}{0.021649in}}{\pgfqpoint{-0.041667in}{0.011050in}}{\pgfqpoint{-0.041667in}{0.000000in}}%
     1073\pgfpathcurveto{\pgfqpoint{-0.041667in}{-0.011050in}}{\pgfqpoint{-0.037276in}{-0.021649in}}{\pgfqpoint{-0.029463in}{-0.029463in}}%
     1074\pgfpathcurveto{\pgfqpoint{-0.021649in}{-0.037276in}}{\pgfqpoint{-0.011050in}{-0.041667in}}{\pgfqpoint{0.000000in}{-0.041667in}}%
    11581075\pgfpathclose%
    11591076\pgfusepath{stroke,fill}%
    11601077}%
    11611078\begin{pgfscope}%
    1162 \pgfsys@transformshift{4.713959in}{3.610651in}%
     1079\pgfsys@transformshift{5.105293in}{4.050389in}%
    11631080\pgfsys@useobject{currentmarker}{}%
    11641081\end{pgfscope}%
     
    11681085\pgfsetstrokecolor{textcolor}%
    11691086\pgfsetfillcolor{textcolor}%
    1170 \pgftext[x=5.113959in,y=3.532874in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont Go}%
     1087\pgftext[x=5.355293in,y=4.001778in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont CFA}%
     1088\end{pgfscope}%
     1089\begin{pgfscope}%
     1090\pgfsetbuttcap%
     1091\pgfsetroundjoin%
     1092\pgfsetlinewidth{1.505625pt}%
     1093\definecolor{currentstroke}{rgb}{1.000000,0.498039,0.054902}%
     1094\pgfsetstrokecolor{currentstroke}%
     1095\pgfsetdash{}{0pt}%
     1096\pgfpathmoveto{\pgfqpoint{5.105293in}{3.787272in}}%
     1097\pgfpathlineto{\pgfqpoint{5.105293in}{3.926161in}}%
     1098\pgfusepath{stroke}%
     1099\end{pgfscope}%
     1100\begin{pgfscope}%
     1101\pgfsetbuttcap%
     1102\pgfsetroundjoin%
     1103\definecolor{currentfill}{rgb}{1.000000,0.498039,0.054902}%
     1104\pgfsetfillcolor{currentfill}%
     1105\pgfsetlinewidth{1.003750pt}%
     1106\definecolor{currentstroke}{rgb}{1.000000,0.498039,0.054902}%
     1107\pgfsetstrokecolor{currentstroke}%
     1108\pgfsetdash{}{0pt}%
     1109\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.027778in}{-0.000000in}}{\pgfqpoint{0.027778in}{0.000000in}}{%
     1110\pgfpathmoveto{\pgfqpoint{0.027778in}{-0.000000in}}%
     1111\pgfpathlineto{\pgfqpoint{-0.027778in}{0.000000in}}%
     1112\pgfusepath{stroke,fill}%
     1113}%
     1114\begin{pgfscope}%
     1115\pgfsys@transformshift{5.105293in}{3.787272in}%
     1116\pgfsys@useobject{currentmarker}{}%
     1117\end{pgfscope}%
     1118\end{pgfscope}%
     1119\begin{pgfscope}%
     1120\pgfsetbuttcap%
     1121\pgfsetroundjoin%
     1122\definecolor{currentfill}{rgb}{1.000000,0.498039,0.054902}%
     1123\pgfsetfillcolor{currentfill}%
     1124\pgfsetlinewidth{1.003750pt}%
     1125\definecolor{currentstroke}{rgb}{1.000000,0.498039,0.054902}%
     1126\pgfsetstrokecolor{currentstroke}%
     1127\pgfsetdash{}{0pt}%
     1128\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.027778in}{-0.000000in}}{\pgfqpoint{0.027778in}{0.000000in}}{%
     1129\pgfpathmoveto{\pgfqpoint{0.027778in}{-0.000000in}}%
     1130\pgfpathlineto{\pgfqpoint{-0.027778in}{0.000000in}}%
     1131\pgfusepath{stroke,fill}%
     1132}%
     1133\begin{pgfscope}%
     1134\pgfsys@transformshift{5.105293in}{3.926161in}%
     1135\pgfsys@useobject{currentmarker}{}%
     1136\end{pgfscope}%
     1137\end{pgfscope}%
     1138\begin{pgfscope}%
     1139\pgfsetrectcap%
     1140\pgfsetroundjoin%
     1141\pgfsetlinewidth{1.505625pt}%
     1142\definecolor{currentstroke}{rgb}{1.000000,0.498039,0.054902}%
     1143\pgfsetstrokecolor{currentstroke}%
     1144\pgfsetdash{}{0pt}%
     1145\pgfpathmoveto{\pgfqpoint{4.966404in}{3.856716in}}%
     1146\pgfpathlineto{\pgfqpoint{5.244182in}{3.856716in}}%
     1147\pgfusepath{stroke}%
     1148\end{pgfscope}%
     1149\begin{pgfscope}%
     1150\pgfsetbuttcap%
     1151\pgfsetroundjoin%
     1152\definecolor{currentfill}{rgb}{1.000000,0.498039,0.054902}%
     1153\pgfsetfillcolor{currentfill}%
     1154\pgfsetlinewidth{1.003750pt}%
     1155\definecolor{currentstroke}{rgb}{1.000000,0.498039,0.054902}%
     1156\pgfsetstrokecolor{currentstroke}%
     1157\pgfsetdash{}{0pt}%
     1158\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.041667in}{-0.041667in}}{\pgfqpoint{0.041667in}{0.041667in}}{%
     1159\pgfpathmoveto{\pgfqpoint{0.000000in}{-0.041667in}}%
     1160\pgfpathcurveto{\pgfqpoint{0.011050in}{-0.041667in}}{\pgfqpoint{0.021649in}{-0.037276in}}{\pgfqpoint{0.029463in}{-0.029463in}}%
     1161\pgfpathcurveto{\pgfqpoint{0.037276in}{-0.021649in}}{\pgfqpoint{0.041667in}{-0.011050in}}{\pgfqpoint{0.041667in}{0.000000in}}%
     1162\pgfpathcurveto{\pgfqpoint{0.041667in}{0.011050in}}{\pgfqpoint{0.037276in}{0.021649in}}{\pgfqpoint{0.029463in}{0.029463in}}%
     1163\pgfpathcurveto{\pgfqpoint{0.021649in}{0.037276in}}{\pgfqpoint{0.011050in}{0.041667in}}{\pgfqpoint{0.000000in}{0.041667in}}%
     1164\pgfpathcurveto{\pgfqpoint{-0.011050in}{0.041667in}}{\pgfqpoint{-0.021649in}{0.037276in}}{\pgfqpoint{-0.029463in}{0.029463in}}%
     1165\pgfpathcurveto{\pgfqpoint{-0.037276in}{0.021649in}}{\pgfqpoint{-0.041667in}{0.011050in}}{\pgfqpoint{-0.041667in}{0.000000in}}%
     1166\pgfpathcurveto{\pgfqpoint{-0.041667in}{-0.011050in}}{\pgfqpoint{-0.037276in}{-0.021649in}}{\pgfqpoint{-0.029463in}{-0.029463in}}%
     1167\pgfpathcurveto{\pgfqpoint{-0.021649in}{-0.037276in}}{\pgfqpoint{-0.011050in}{-0.041667in}}{\pgfqpoint{0.000000in}{-0.041667in}}%
     1168\pgfpathclose%
     1169\pgfusepath{stroke,fill}%
     1170}%
     1171\begin{pgfscope}%
     1172\pgfsys@transformshift{5.105293in}{3.856716in}%
     1173\pgfsys@useobject{currentmarker}{}%
     1174\end{pgfscope}%
     1175\end{pgfscope}%
     1176\begin{pgfscope}%
     1177\definecolor{textcolor}{rgb}{0.000000,0.000000,0.000000}%
     1178\pgfsetstrokecolor{textcolor}%
     1179\pgfsetfillcolor{textcolor}%
     1180\pgftext[x=5.355293in,y=3.808105in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont Go}%
    11711181\end{pgfscope}%
    11721182\end{pgfpicture}%
  • doc/theses/colby_parsons_MMAth/figures/pyke_Aggregate_Lock_2.pgf

    r044ae62 r3a513d89  
    7777\pgfsetstrokecolor{textcolor}%
    7878\pgfsetfillcolor{textcolor}%
    79 \pgftext[x=1.025455in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 2\)}%
     79\pgftext[x=1.025455in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 2\)}%
    8080\end{pgfscope}%
    8181\begin{pgfscope}%
     
    102102\pgfsetstrokecolor{textcolor}%
    103103\pgfsetfillcolor{textcolor}%
    104 \pgftext[x=1.326061in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 4\)}%
     104\pgftext[x=1.326061in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 4\)}%
    105105\end{pgfscope}%
    106106\begin{pgfscope}%
     
    127127\pgfsetstrokecolor{textcolor}%
    128128\pgfsetfillcolor{textcolor}%
    129 \pgftext[x=1.927273in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 8\)}%
     129\pgftext[x=1.927273in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 8\)}%
    130130\end{pgfscope}%
    131131\begin{pgfscope}%
     
    152152\pgfsetstrokecolor{textcolor}%
    153153\pgfsetfillcolor{textcolor}%
    154 \pgftext[x=3.129697in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 16\)}%
     154\pgftext[x=3.129697in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 16\)}%
    155155\end{pgfscope}%
    156156\begin{pgfscope}%
     
    177177\pgfsetstrokecolor{textcolor}%
    178178\pgfsetfillcolor{textcolor}%
    179 \pgftext[x=4.332121in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 24\)}%
     179\pgftext[x=4.332121in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 24\)}%
    180180\end{pgfscope}%
    181181\begin{pgfscope}%
     
    202202\pgfsetstrokecolor{textcolor}%
    203203\pgfsetfillcolor{textcolor}%
    204 \pgftext[x=5.534545in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 32\)}%
     204\pgftext[x=5.534545in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 32\)}%
    205205\end{pgfscope}%
    206206\begin{pgfscope}%
     
    208208\pgfsetstrokecolor{textcolor}%
    209209\pgfsetfillcolor{textcolor}%
    210 \pgftext[x=3.280000in,y=0.161874in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont Cores}%
     210\pgftext[x=3.280000in,y=0.251766in,,top]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont Cores}%
    211211\end{pgfscope}%
    212212\begin{pgfscope}%
     
    233233\pgfsetstrokecolor{textcolor}%
    234234\pgfsetfillcolor{textcolor}%
    235 \pgftext[x=0.399655in,y=0.928807in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 10^{6}\)}%
     235\pgftext[x=0.501581in,y=0.963915in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 10^{6}\)}%
    236236\end{pgfscope}%
    237237\begin{pgfscope}%
     
    258258\pgfsetstrokecolor{textcolor}%
    259259\pgfsetfillcolor{textcolor}%
    260 \pgftext[x=0.399655in,y=2.320168in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 10^{7}\)}%
     260\pgftext[x=0.501581in,y=2.355276in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 10^{7}\)}%
    261261\end{pgfscope}%
    262262\begin{pgfscope}%
     
    283283\pgfsetstrokecolor{textcolor}%
    284284\pgfsetfillcolor{textcolor}%
    285 \pgftext[x=0.399655in,y=3.711528in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 10^{8}\)}%
     285\pgftext[x=0.501581in,y=3.746636in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 10^{8}\)}%
    286286\end{pgfscope}%
    287287\begin{pgfscope}%
     
    707707\pgfsetstrokecolor{textcolor}%
    708708\pgfsetfillcolor{textcolor}%
    709 \pgftext[x=0.344100in,y=2.376000in,,bottom,rotate=90.000000]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont Throughput (entries)}%
     709\pgftext[x=0.446026in,y=2.376000in,,bottom,rotate=90.000000]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont Throughput (entries)}%
    710710\end{pgfscope}%
    711711\begin{pgfscope}%
     
    14361436\pgfusepath{clip}%
    14371437\pgfsetbuttcap%
    1438 \pgfsetmiterjoin%
     1438\pgfsetroundjoin%
    14391439\definecolor{currentfill}{rgb}{1.000000,0.498039,0.054902}%
    14401440\pgfsetfillcolor{currentfill}%
    14411441\pgfsetlinewidth{1.003750pt}%
    14421442\definecolor{currentstroke}{rgb}{1.000000,0.498039,0.054902}%
    1443 \pgfsetstrokecolor{currentstroke}%
    1444 \pgfsetdash{}{0pt}%
    1445 \pgfsys@defobject{currentmarker}{\pgfqpoint{-0.041667in}{-0.041667in}}{\pgfqpoint{0.041667in}{0.041667in}}{%
    1446 \pgfpathmoveto{\pgfqpoint{-0.041667in}{-0.041667in}}%
    1447 \pgfpathlineto{\pgfqpoint{0.041667in}{-0.041667in}}%
    1448 \pgfpathlineto{\pgfqpoint{0.041667in}{0.041667in}}%
    1449 \pgfpathlineto{\pgfqpoint{-0.041667in}{0.041667in}}%
    1450 \pgfpathclose%
    1451 \pgfusepath{stroke,fill}%
    1452 }%
    1453 \begin{pgfscope}%
    1454 \pgfsys@transformshift{1.025455in}{4.014803in}%
    1455 \pgfsys@useobject{currentmarker}{}%
    1456 \end{pgfscope}%
    1457 \begin{pgfscope}%
    1458 \pgfsys@transformshift{1.326061in}{3.745922in}%
    1459 \pgfsys@useobject{currentmarker}{}%
    1460 \end{pgfscope}%
    1461 \begin{pgfscope}%
    1462 \pgfsys@transformshift{1.927273in}{3.503889in}%
    1463 \pgfsys@useobject{currentmarker}{}%
    1464 \end{pgfscope}%
    1465 \begin{pgfscope}%
    1466 \pgfsys@transformshift{3.129697in}{3.173273in}%
    1467 \pgfsys@useobject{currentmarker}{}%
    1468 \end{pgfscope}%
    1469 \begin{pgfscope}%
    1470 \pgfsys@transformshift{4.332121in}{2.828641in}%
    1471 \pgfsys@useobject{currentmarker}{}%
    1472 \end{pgfscope}%
    1473 \begin{pgfscope}%
    1474 \pgfsys@transformshift{5.534545in}{2.787501in}%
    1475 \pgfsys@useobject{currentmarker}{}%
    1476 \end{pgfscope}%
    1477 \end{pgfscope}%
    1478 \begin{pgfscope}%
    1479 \pgfpathrectangle{\pgfqpoint{0.800000in}{0.528000in}}{\pgfqpoint{4.960000in}{3.696000in}}%
    1480 \pgfusepath{clip}%
    1481 \pgfsetrectcap%
    1482 \pgfsetroundjoin%
    1483 \pgfsetlinewidth{1.505625pt}%
    1484 \definecolor{currentstroke}{rgb}{0.172549,0.627451,0.172549}%
    1485 \pgfsetstrokecolor{currentstroke}%
    1486 \pgfsetdash{}{0pt}%
    1487 \pgfpathmoveto{\pgfqpoint{1.025455in}{3.845372in}}%
    1488 \pgfpathlineto{\pgfqpoint{1.326061in}{3.591512in}}%
    1489 \pgfpathlineto{\pgfqpoint{1.927273in}{3.353860in}}%
    1490 \pgfpathlineto{\pgfqpoint{3.129697in}{2.972783in}}%
    1491 \pgfpathlineto{\pgfqpoint{4.332121in}{2.504321in}}%
    1492 \pgfpathlineto{\pgfqpoint{5.534545in}{2.425566in}}%
    1493 \pgfusepath{stroke}%
    1494 \end{pgfscope}%
    1495 \begin{pgfscope}%
    1496 \pgfpathrectangle{\pgfqpoint{0.800000in}{0.528000in}}{\pgfqpoint{4.960000in}{3.696000in}}%
    1497 \pgfusepath{clip}%
    1498 \pgfsetbuttcap%
    1499 \pgfsetmiterjoin%
    1500 \definecolor{currentfill}{rgb}{0.172549,0.627451,0.172549}%
    1501 \pgfsetfillcolor{currentfill}%
    1502 \pgfsetlinewidth{1.003750pt}%
    1503 \definecolor{currentstroke}{rgb}{0.172549,0.627451,0.172549}%
    1504 \pgfsetstrokecolor{currentstroke}%
    1505 \pgfsetdash{}{0pt}%
    1506 \pgfsys@defobject{currentmarker}{\pgfqpoint{-0.058926in}{-0.058926in}}{\pgfqpoint{0.058926in}{0.058926in}}{%
    1507 \pgfpathmoveto{\pgfqpoint{-0.000000in}{-0.058926in}}%
    1508 \pgfpathlineto{\pgfqpoint{0.058926in}{0.000000in}}%
    1509 \pgfpathlineto{\pgfqpoint{0.000000in}{0.058926in}}%
    1510 \pgfpathlineto{\pgfqpoint{-0.058926in}{0.000000in}}%
    1511 \pgfpathclose%
    1512 \pgfusepath{stroke,fill}%
    1513 }%
    1514 \begin{pgfscope}%
    1515 \pgfsys@transformshift{1.025455in}{3.845372in}%
    1516 \pgfsys@useobject{currentmarker}{}%
    1517 \end{pgfscope}%
    1518 \begin{pgfscope}%
    1519 \pgfsys@transformshift{1.326061in}{3.591512in}%
    1520 \pgfsys@useobject{currentmarker}{}%
    1521 \end{pgfscope}%
    1522 \begin{pgfscope}%
    1523 \pgfsys@transformshift{1.927273in}{3.353860in}%
    1524 \pgfsys@useobject{currentmarker}{}%
    1525 \end{pgfscope}%
    1526 \begin{pgfscope}%
    1527 \pgfsys@transformshift{3.129697in}{2.972783in}%
    1528 \pgfsys@useobject{currentmarker}{}%
    1529 \end{pgfscope}%
    1530 \begin{pgfscope}%
    1531 \pgfsys@transformshift{4.332121in}{2.504321in}%
    1532 \pgfsys@useobject{currentmarker}{}%
    1533 \end{pgfscope}%
    1534 \begin{pgfscope}%
    1535 \pgfsys@transformshift{5.534545in}{2.425566in}%
    1536 \pgfsys@useobject{currentmarker}{}%
    1537 \end{pgfscope}%
    1538 \end{pgfscope}%
    1539 \begin{pgfscope}%
    1540 \pgfpathrectangle{\pgfqpoint{0.800000in}{0.528000in}}{\pgfqpoint{4.960000in}{3.696000in}}%
    1541 \pgfusepath{clip}%
    1542 \pgfsetrectcap%
    1543 \pgfsetroundjoin%
    1544 \pgfsetlinewidth{1.505625pt}%
    1545 \definecolor{currentstroke}{rgb}{0.839216,0.152941,0.156863}%
    1546 \pgfsetstrokecolor{currentstroke}%
    1547 \pgfsetdash{}{0pt}%
    1548 \pgfpathmoveto{\pgfqpoint{1.025455in}{3.748153in}}%
    1549 \pgfpathlineto{\pgfqpoint{1.326061in}{3.100576in}}%
    1550 \pgfpathlineto{\pgfqpoint{1.927273in}{2.500046in}}%
    1551 \pgfpathlineto{\pgfqpoint{3.129697in}{1.740526in}}%
    1552 \pgfpathlineto{\pgfqpoint{4.332121in}{1.218298in}}%
    1553 \pgfpathlineto{\pgfqpoint{5.534545in}{0.734521in}}%
    1554 \pgfusepath{stroke}%
    1555 \end{pgfscope}%
    1556 \begin{pgfscope}%
    1557 \pgfpathrectangle{\pgfqpoint{0.800000in}{0.528000in}}{\pgfqpoint{4.960000in}{3.696000in}}%
    1558 \pgfusepath{clip}%
    1559 \pgfsetbuttcap%
    1560 \pgfsetroundjoin%
    1561 \definecolor{currentfill}{rgb}{0.839216,0.152941,0.156863}%
    1562 \pgfsetfillcolor{currentfill}%
    1563 \pgfsetlinewidth{1.003750pt}%
    1564 \definecolor{currentstroke}{rgb}{0.839216,0.152941,0.156863}%
    1565 \pgfsetstrokecolor{currentstroke}%
    1566 \pgfsetdash{}{0pt}%
    1567 \pgfsys@defobject{currentmarker}{\pgfqpoint{-0.041667in}{-0.041667in}}{\pgfqpoint{0.041667in}{0.041667in}}{%
    1568 \pgfpathmoveto{\pgfqpoint{-0.041667in}{-0.041667in}}%
    1569 \pgfpathlineto{\pgfqpoint{0.041667in}{0.041667in}}%
    1570 \pgfpathmoveto{\pgfqpoint{-0.041667in}{0.041667in}}%
    1571 \pgfpathlineto{\pgfqpoint{0.041667in}{-0.041667in}}%
    1572 \pgfusepath{stroke,fill}%
    1573 }%
    1574 \begin{pgfscope}%
    1575 \pgfsys@transformshift{1.025455in}{3.748153in}%
    1576 \pgfsys@useobject{currentmarker}{}%
    1577 \end{pgfscope}%
    1578 \begin{pgfscope}%
    1579 \pgfsys@transformshift{1.326061in}{3.100576in}%
    1580 \pgfsys@useobject{currentmarker}{}%
    1581 \end{pgfscope}%
    1582 \begin{pgfscope}%
    1583 \pgfsys@transformshift{1.927273in}{2.500046in}%
    1584 \pgfsys@useobject{currentmarker}{}%
    1585 \end{pgfscope}%
    1586 \begin{pgfscope}%
    1587 \pgfsys@transformshift{3.129697in}{1.740526in}%
    1588 \pgfsys@useobject{currentmarker}{}%
    1589 \end{pgfscope}%
    1590 \begin{pgfscope}%
    1591 \pgfsys@transformshift{4.332121in}{1.218298in}%
    1592 \pgfsys@useobject{currentmarker}{}%
    1593 \end{pgfscope}%
    1594 \begin{pgfscope}%
    1595 \pgfsys@transformshift{5.534545in}{0.734521in}%
    1596 \pgfsys@useobject{currentmarker}{}%
    1597 \end{pgfscope}%
    1598 \end{pgfscope}%
    1599 \begin{pgfscope}%
    1600 \pgfsetrectcap%
    1601 \pgfsetmiterjoin%
    1602 \pgfsetlinewidth{0.803000pt}%
    1603 \definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}%
    1604 \pgfsetstrokecolor{currentstroke}%
    1605 \pgfsetdash{}{0pt}%
    1606 \pgfpathmoveto{\pgfqpoint{0.800000in}{0.528000in}}%
    1607 \pgfpathlineto{\pgfqpoint{0.800000in}{4.224000in}}%
    1608 \pgfusepath{stroke}%
    1609 \end{pgfscope}%
    1610 \begin{pgfscope}%
    1611 \pgfsetrectcap%
    1612 \pgfsetmiterjoin%
    1613 \pgfsetlinewidth{0.803000pt}%
    1614 \definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}%
    1615 \pgfsetstrokecolor{currentstroke}%
    1616 \pgfsetdash{}{0pt}%
    1617 \pgfpathmoveto{\pgfqpoint{5.760000in}{0.528000in}}%
    1618 \pgfpathlineto{\pgfqpoint{5.760000in}{4.224000in}}%
    1619 \pgfusepath{stroke}%
    1620 \end{pgfscope}%
    1621 \begin{pgfscope}%
    1622 \pgfsetrectcap%
    1623 \pgfsetmiterjoin%
    1624 \pgfsetlinewidth{0.803000pt}%
    1625 \definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}%
    1626 \pgfsetstrokecolor{currentstroke}%
    1627 \pgfsetdash{}{0pt}%
    1628 \pgfpathmoveto{\pgfqpoint{0.800000in}{0.528000in}}%
    1629 \pgfpathlineto{\pgfqpoint{5.760000in}{0.528000in}}%
    1630 \pgfusepath{stroke}%
    1631 \end{pgfscope}%
    1632 \begin{pgfscope}%
    1633 \pgfsetrectcap%
    1634 \pgfsetmiterjoin%
    1635 \pgfsetlinewidth{0.803000pt}%
    1636 \definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}%
    1637 \pgfsetstrokecolor{currentstroke}%
    1638 \pgfsetdash{}{0pt}%
    1639 \pgfpathmoveto{\pgfqpoint{0.800000in}{4.224000in}}%
    1640 \pgfpathlineto{\pgfqpoint{5.760000in}{4.224000in}}%
    1641 \pgfusepath{stroke}%
    1642 \end{pgfscope}%
    1643 \begin{pgfscope}%
    1644 \definecolor{textcolor}{rgb}{0.000000,0.000000,0.000000}%
    1645 \pgfsetstrokecolor{textcolor}%
    1646 \pgfsetfillcolor{textcolor}%
    1647 \pgftext[x=3.280000in,y=4.307333in,,base]{\color{textcolor}\rmfamily\fontsize{19.200000}{23.040000}\selectfont Aggregate Lock Benchmark: 2 Locks}%
    1648 \end{pgfscope}%
    1649 \begin{pgfscope}%
    1650 \pgfsetbuttcap%
    1651 \pgfsetmiterjoin%
    1652 \definecolor{currentfill}{rgb}{1.000000,1.000000,1.000000}%
    1653 \pgfsetfillcolor{currentfill}%
    1654 \pgfsetfillopacity{0.800000}%
    1655 \pgfsetlinewidth{1.003750pt}%
    1656 \definecolor{currentstroke}{rgb}{0.800000,0.800000,0.800000}%
    1657 \pgfsetstrokecolor{currentstroke}%
    1658 \pgfsetstrokeopacity{0.800000}%
    1659 \pgfsetdash{}{0pt}%
    1660 \pgfpathmoveto{\pgfqpoint{0.955556in}{0.639111in}}%
    1661 \pgfpathlineto{\pgfqpoint{2.957298in}{0.639111in}}%
    1662 \pgfpathquadraticcurveto{\pgfqpoint{3.001743in}{0.639111in}}{\pgfqpoint{3.001743in}{0.683556in}}%
    1663 \pgfpathlineto{\pgfqpoint{3.001743in}{1.959172in}}%
    1664 \pgfpathquadraticcurveto{\pgfqpoint{3.001743in}{2.003617in}}{\pgfqpoint{2.957298in}{2.003617in}}%
    1665 \pgfpathlineto{\pgfqpoint{0.955556in}{2.003617in}}%
    1666 \pgfpathquadraticcurveto{\pgfqpoint{0.911111in}{2.003617in}}{\pgfqpoint{0.911111in}{1.959172in}}%
    1667 \pgfpathlineto{\pgfqpoint{0.911111in}{0.683556in}}%
    1668 \pgfpathquadraticcurveto{\pgfqpoint{0.911111in}{0.639111in}}{\pgfqpoint{0.955556in}{0.639111in}}%
    1669 \pgfpathclose%
    1670 \pgfusepath{stroke,fill}%
    1671 \end{pgfscope}%
    1672 \begin{pgfscope}%
    1673 \pgfsetbuttcap%
    1674 \pgfsetroundjoin%
    1675 \pgfsetlinewidth{1.505625pt}%
    1676 \definecolor{currentstroke}{rgb}{0.121569,0.466667,0.705882}%
    1677 \pgfsetstrokecolor{currentstroke}%
    1678 \pgfsetdash{}{0pt}%
    1679 \pgfpathmoveto{\pgfqpoint{1.222222in}{1.714728in}}%
    1680 \pgfpathlineto{\pgfqpoint{1.222222in}{1.936950in}}%
    1681 \pgfusepath{stroke}%
    1682 \end{pgfscope}%
    1683 \begin{pgfscope}%
    1684 \pgfsetbuttcap%
    1685 \pgfsetroundjoin%
    1686 \definecolor{currentfill}{rgb}{0.121569,0.466667,0.705882}%
    1687 \pgfsetfillcolor{currentfill}%
    1688 \pgfsetlinewidth{1.003750pt}%
    1689 \definecolor{currentstroke}{rgb}{0.121569,0.466667,0.705882}%
    1690 \pgfsetstrokecolor{currentstroke}%
    1691 \pgfsetdash{}{0pt}%
    1692 \pgfsys@defobject{currentmarker}{\pgfqpoint{-0.027778in}{-0.000000in}}{\pgfqpoint{0.027778in}{0.000000in}}{%
    1693 \pgfpathmoveto{\pgfqpoint{0.027778in}{-0.000000in}}%
    1694 \pgfpathlineto{\pgfqpoint{-0.027778in}{0.000000in}}%
    1695 \pgfusepath{stroke,fill}%
    1696 }%
    1697 \begin{pgfscope}%
    1698 \pgfsys@transformshift{1.222222in}{1.714728in}%
    1699 \pgfsys@useobject{currentmarker}{}%
    1700 \end{pgfscope}%
    1701 \end{pgfscope}%
    1702 \begin{pgfscope}%
    1703 \pgfsetbuttcap%
    1704 \pgfsetroundjoin%
    1705 \definecolor{currentfill}{rgb}{0.121569,0.466667,0.705882}%
    1706 \pgfsetfillcolor{currentfill}%
    1707 \pgfsetlinewidth{1.003750pt}%
    1708 \definecolor{currentstroke}{rgb}{0.121569,0.466667,0.705882}%
    1709 \pgfsetstrokecolor{currentstroke}%
    1710 \pgfsetdash{}{0pt}%
    1711 \pgfsys@defobject{currentmarker}{\pgfqpoint{-0.027778in}{-0.000000in}}{\pgfqpoint{0.027778in}{0.000000in}}{%
    1712 \pgfpathmoveto{\pgfqpoint{0.027778in}{-0.000000in}}%
    1713 \pgfpathlineto{\pgfqpoint{-0.027778in}{0.000000in}}%
    1714 \pgfusepath{stroke,fill}%
    1715 }%
    1716 \begin{pgfscope}%
    1717 \pgfsys@transformshift{1.222222in}{1.936950in}%
    1718 \pgfsys@useobject{currentmarker}{}%
    1719 \end{pgfscope}%
    1720 \end{pgfscope}%
    1721 \begin{pgfscope}%
    1722 \pgfsetrectcap%
    1723 \pgfsetroundjoin%
    1724 \pgfsetlinewidth{1.505625pt}%
    1725 \definecolor{currentstroke}{rgb}{0.121569,0.466667,0.705882}%
    1726 \pgfsetstrokecolor{currentstroke}%
    1727 \pgfsetdash{}{0pt}%
    1728 \pgfpathmoveto{\pgfqpoint{1.000000in}{1.825839in}}%
    1729 \pgfpathlineto{\pgfqpoint{1.444444in}{1.825839in}}%
    1730 \pgfusepath{stroke}%
    1731 \end{pgfscope}%
    1732 \begin{pgfscope}%
    1733 \pgfsetbuttcap%
    1734 \pgfsetroundjoin%
    1735 \definecolor{currentfill}{rgb}{0.121569,0.466667,0.705882}%
    1736 \pgfsetfillcolor{currentfill}%
    1737 \pgfsetlinewidth{1.003750pt}%
    1738 \definecolor{currentstroke}{rgb}{0.121569,0.466667,0.705882}%
    17391443\pgfsetstrokecolor{currentstroke}%
    17401444\pgfsetdash{}{0pt}%
     
    17531457}%
    17541458\begin{pgfscope}%
    1755 \pgfsys@transformshift{1.222222in}{1.825839in}%
    1756 \pgfsys@useobject{currentmarker}{}%
    1757 \end{pgfscope}%
     1459\pgfsys@transformshift{1.025455in}{4.014803in}%
     1460\pgfsys@useobject{currentmarker}{}%
     1461\end{pgfscope}%
     1462\begin{pgfscope}%
     1463\pgfsys@transformshift{1.326061in}{3.745922in}%
     1464\pgfsys@useobject{currentmarker}{}%
     1465\end{pgfscope}%
     1466\begin{pgfscope}%
     1467\pgfsys@transformshift{1.927273in}{3.503889in}%
     1468\pgfsys@useobject{currentmarker}{}%
     1469\end{pgfscope}%
     1470\begin{pgfscope}%
     1471\pgfsys@transformshift{3.129697in}{3.173273in}%
     1472\pgfsys@useobject{currentmarker}{}%
     1473\end{pgfscope}%
     1474\begin{pgfscope}%
     1475\pgfsys@transformshift{4.332121in}{2.828641in}%
     1476\pgfsys@useobject{currentmarker}{}%
     1477\end{pgfscope}%
     1478\begin{pgfscope}%
     1479\pgfsys@transformshift{5.534545in}{2.787501in}%
     1480\pgfsys@useobject{currentmarker}{}%
     1481\end{pgfscope}%
     1482\end{pgfscope}%
     1483\begin{pgfscope}%
     1484\pgfpathrectangle{\pgfqpoint{0.800000in}{0.528000in}}{\pgfqpoint{4.960000in}{3.696000in}}%
     1485\pgfusepath{clip}%
     1486\pgfsetrectcap%
     1487\pgfsetroundjoin%
     1488\pgfsetlinewidth{1.505625pt}%
     1489\definecolor{currentstroke}{rgb}{0.172549,0.627451,0.172549}%
     1490\pgfsetstrokecolor{currentstroke}%
     1491\pgfsetdash{}{0pt}%
     1492\pgfpathmoveto{\pgfqpoint{1.025455in}{3.845372in}}%
     1493\pgfpathlineto{\pgfqpoint{1.326061in}{3.591512in}}%
     1494\pgfpathlineto{\pgfqpoint{1.927273in}{3.353860in}}%
     1495\pgfpathlineto{\pgfqpoint{3.129697in}{2.972783in}}%
     1496\pgfpathlineto{\pgfqpoint{4.332121in}{2.504321in}}%
     1497\pgfpathlineto{\pgfqpoint{5.534545in}{2.425566in}}%
     1498\pgfusepath{stroke}%
     1499\end{pgfscope}%
     1500\begin{pgfscope}%
     1501\pgfpathrectangle{\pgfqpoint{0.800000in}{0.528000in}}{\pgfqpoint{4.960000in}{3.696000in}}%
     1502\pgfusepath{clip}%
     1503\pgfsetbuttcap%
     1504\pgfsetroundjoin%
     1505\definecolor{currentfill}{rgb}{0.172549,0.627451,0.172549}%
     1506\pgfsetfillcolor{currentfill}%
     1507\pgfsetlinewidth{1.003750pt}%
     1508\definecolor{currentstroke}{rgb}{0.172549,0.627451,0.172549}%
     1509\pgfsetstrokecolor{currentstroke}%
     1510\pgfsetdash{}{0pt}%
     1511\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.041667in}{-0.041667in}}{\pgfqpoint{0.041667in}{0.041667in}}{%
     1512\pgfpathmoveto{\pgfqpoint{0.000000in}{-0.041667in}}%
     1513\pgfpathcurveto{\pgfqpoint{0.011050in}{-0.041667in}}{\pgfqpoint{0.021649in}{-0.037276in}}{\pgfqpoint{0.029463in}{-0.029463in}}%
     1514\pgfpathcurveto{\pgfqpoint{0.037276in}{-0.021649in}}{\pgfqpoint{0.041667in}{-0.011050in}}{\pgfqpoint{0.041667in}{0.000000in}}%
     1515\pgfpathcurveto{\pgfqpoint{0.041667in}{0.011050in}}{\pgfqpoint{0.037276in}{0.021649in}}{\pgfqpoint{0.029463in}{0.029463in}}%
     1516\pgfpathcurveto{\pgfqpoint{0.021649in}{0.037276in}}{\pgfqpoint{0.011050in}{0.041667in}}{\pgfqpoint{0.000000in}{0.041667in}}%
     1517\pgfpathcurveto{\pgfqpoint{-0.011050in}{0.041667in}}{\pgfqpoint{-0.021649in}{0.037276in}}{\pgfqpoint{-0.029463in}{0.029463in}}%
     1518\pgfpathcurveto{\pgfqpoint{-0.037276in}{0.021649in}}{\pgfqpoint{-0.041667in}{0.011050in}}{\pgfqpoint{-0.041667in}{0.000000in}}%
     1519\pgfpathcurveto{\pgfqpoint{-0.041667in}{-0.011050in}}{\pgfqpoint{-0.037276in}{-0.021649in}}{\pgfqpoint{-0.029463in}{-0.029463in}}%
     1520\pgfpathcurveto{\pgfqpoint{-0.021649in}{-0.037276in}}{\pgfqpoint{-0.011050in}{-0.041667in}}{\pgfqpoint{0.000000in}{-0.041667in}}%
     1521\pgfpathclose%
     1522\pgfusepath{stroke,fill}%
     1523}%
     1524\begin{pgfscope}%
     1525\pgfsys@transformshift{1.025455in}{3.845372in}%
     1526\pgfsys@useobject{currentmarker}{}%
     1527\end{pgfscope}%
     1528\begin{pgfscope}%
     1529\pgfsys@transformshift{1.326061in}{3.591512in}%
     1530\pgfsys@useobject{currentmarker}{}%
     1531\end{pgfscope}%
     1532\begin{pgfscope}%
     1533\pgfsys@transformshift{1.927273in}{3.353860in}%
     1534\pgfsys@useobject{currentmarker}{}%
     1535\end{pgfscope}%
     1536\begin{pgfscope}%
     1537\pgfsys@transformshift{3.129697in}{2.972783in}%
     1538\pgfsys@useobject{currentmarker}{}%
     1539\end{pgfscope}%
     1540\begin{pgfscope}%
     1541\pgfsys@transformshift{4.332121in}{2.504321in}%
     1542\pgfsys@useobject{currentmarker}{}%
     1543\end{pgfscope}%
     1544\begin{pgfscope}%
     1545\pgfsys@transformshift{5.534545in}{2.425566in}%
     1546\pgfsys@useobject{currentmarker}{}%
     1547\end{pgfscope}%
     1548\end{pgfscope}%
     1549\begin{pgfscope}%
     1550\pgfpathrectangle{\pgfqpoint{0.800000in}{0.528000in}}{\pgfqpoint{4.960000in}{3.696000in}}%
     1551\pgfusepath{clip}%
     1552\pgfsetrectcap%
     1553\pgfsetroundjoin%
     1554\pgfsetlinewidth{1.505625pt}%
     1555\definecolor{currentstroke}{rgb}{0.839216,0.152941,0.156863}%
     1556\pgfsetstrokecolor{currentstroke}%
     1557\pgfsetdash{}{0pt}%
     1558\pgfpathmoveto{\pgfqpoint{1.025455in}{3.748153in}}%
     1559\pgfpathlineto{\pgfqpoint{1.326061in}{3.100576in}}%
     1560\pgfpathlineto{\pgfqpoint{1.927273in}{2.500046in}}%
     1561\pgfpathlineto{\pgfqpoint{3.129697in}{1.740526in}}%
     1562\pgfpathlineto{\pgfqpoint{4.332121in}{1.218298in}}%
     1563\pgfpathlineto{\pgfqpoint{5.534545in}{0.734521in}}%
     1564\pgfusepath{stroke}%
     1565\end{pgfscope}%
     1566\begin{pgfscope}%
     1567\pgfpathrectangle{\pgfqpoint{0.800000in}{0.528000in}}{\pgfqpoint{4.960000in}{3.696000in}}%
     1568\pgfusepath{clip}%
     1569\pgfsetbuttcap%
     1570\pgfsetroundjoin%
     1571\definecolor{currentfill}{rgb}{0.839216,0.152941,0.156863}%
     1572\pgfsetfillcolor{currentfill}%
     1573\pgfsetlinewidth{1.003750pt}%
     1574\definecolor{currentstroke}{rgb}{0.839216,0.152941,0.156863}%
     1575\pgfsetstrokecolor{currentstroke}%
     1576\pgfsetdash{}{0pt}%
     1577\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.041667in}{-0.041667in}}{\pgfqpoint{0.041667in}{0.041667in}}{%
     1578\pgfpathmoveto{\pgfqpoint{0.000000in}{-0.041667in}}%
     1579\pgfpathcurveto{\pgfqpoint{0.011050in}{-0.041667in}}{\pgfqpoint{0.021649in}{-0.037276in}}{\pgfqpoint{0.029463in}{-0.029463in}}%
     1580\pgfpathcurveto{\pgfqpoint{0.037276in}{-0.021649in}}{\pgfqpoint{0.041667in}{-0.011050in}}{\pgfqpoint{0.041667in}{0.000000in}}%
     1581\pgfpathcurveto{\pgfqpoint{0.041667in}{0.011050in}}{\pgfqpoint{0.037276in}{0.021649in}}{\pgfqpoint{0.029463in}{0.029463in}}%
     1582\pgfpathcurveto{\pgfqpoint{0.021649in}{0.037276in}}{\pgfqpoint{0.011050in}{0.041667in}}{\pgfqpoint{0.000000in}{0.041667in}}%
     1583\pgfpathcurveto{\pgfqpoint{-0.011050in}{0.041667in}}{\pgfqpoint{-0.021649in}{0.037276in}}{\pgfqpoint{-0.029463in}{0.029463in}}%
     1584\pgfpathcurveto{\pgfqpoint{-0.037276in}{0.021649in}}{\pgfqpoint{-0.041667in}{0.011050in}}{\pgfqpoint{-0.041667in}{0.000000in}}%
     1585\pgfpathcurveto{\pgfqpoint{-0.041667in}{-0.011050in}}{\pgfqpoint{-0.037276in}{-0.021649in}}{\pgfqpoint{-0.029463in}{-0.029463in}}%
     1586\pgfpathcurveto{\pgfqpoint{-0.021649in}{-0.037276in}}{\pgfqpoint{-0.011050in}{-0.041667in}}{\pgfqpoint{0.000000in}{-0.041667in}}%
     1587\pgfpathclose%
     1588\pgfusepath{stroke,fill}%
     1589}%
     1590\begin{pgfscope}%
     1591\pgfsys@transformshift{1.025455in}{3.748153in}%
     1592\pgfsys@useobject{currentmarker}{}%
     1593\end{pgfscope}%
     1594\begin{pgfscope}%
     1595\pgfsys@transformshift{1.326061in}{3.100576in}%
     1596\pgfsys@useobject{currentmarker}{}%
     1597\end{pgfscope}%
     1598\begin{pgfscope}%
     1599\pgfsys@transformshift{1.927273in}{2.500046in}%
     1600\pgfsys@useobject{currentmarker}{}%
     1601\end{pgfscope}%
     1602\begin{pgfscope}%
     1603\pgfsys@transformshift{3.129697in}{1.740526in}%
     1604\pgfsys@useobject{currentmarker}{}%
     1605\end{pgfscope}%
     1606\begin{pgfscope}%
     1607\pgfsys@transformshift{4.332121in}{1.218298in}%
     1608\pgfsys@useobject{currentmarker}{}%
     1609\end{pgfscope}%
     1610\begin{pgfscope}%
     1611\pgfsys@transformshift{5.534545in}{0.734521in}%
     1612\pgfsys@useobject{currentmarker}{}%
     1613\end{pgfscope}%
     1614\end{pgfscope}%
     1615\begin{pgfscope}%
     1616\pgfsetrectcap%
     1617\pgfsetmiterjoin%
     1618\pgfsetlinewidth{0.803000pt}%
     1619\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}%
     1620\pgfsetstrokecolor{currentstroke}%
     1621\pgfsetdash{}{0pt}%
     1622\pgfpathmoveto{\pgfqpoint{0.800000in}{0.528000in}}%
     1623\pgfpathlineto{\pgfqpoint{0.800000in}{4.224000in}}%
     1624\pgfusepath{stroke}%
     1625\end{pgfscope}%
     1626\begin{pgfscope}%
     1627\pgfsetrectcap%
     1628\pgfsetmiterjoin%
     1629\pgfsetlinewidth{0.803000pt}%
     1630\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}%
     1631\pgfsetstrokecolor{currentstroke}%
     1632\pgfsetdash{}{0pt}%
     1633\pgfpathmoveto{\pgfqpoint{5.760000in}{0.528000in}}%
     1634\pgfpathlineto{\pgfqpoint{5.760000in}{4.224000in}}%
     1635\pgfusepath{stroke}%
     1636\end{pgfscope}%
     1637\begin{pgfscope}%
     1638\pgfsetrectcap%
     1639\pgfsetmiterjoin%
     1640\pgfsetlinewidth{0.803000pt}%
     1641\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}%
     1642\pgfsetstrokecolor{currentstroke}%
     1643\pgfsetdash{}{0pt}%
     1644\pgfpathmoveto{\pgfqpoint{0.800000in}{0.528000in}}%
     1645\pgfpathlineto{\pgfqpoint{5.760000in}{0.528000in}}%
     1646\pgfusepath{stroke}%
     1647\end{pgfscope}%
     1648\begin{pgfscope}%
     1649\pgfsetrectcap%
     1650\pgfsetmiterjoin%
     1651\pgfsetlinewidth{0.803000pt}%
     1652\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}%
     1653\pgfsetstrokecolor{currentstroke}%
     1654\pgfsetdash{}{0pt}%
     1655\pgfpathmoveto{\pgfqpoint{0.800000in}{4.224000in}}%
     1656\pgfpathlineto{\pgfqpoint{5.760000in}{4.224000in}}%
     1657\pgfusepath{stroke}%
    17581658\end{pgfscope}%
    17591659\begin{pgfscope}%
     
    17611661\pgfsetstrokecolor{textcolor}%
    17621662\pgfsetfillcolor{textcolor}%
    1763 \pgftext[x=1.622222in,y=1.748061in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont CFA-baseline}%
    1764 \end{pgfscope}%
    1765 \begin{pgfscope}%
    1766 \pgfsetbuttcap%
    1767 \pgfsetroundjoin%
    1768 \pgfsetlinewidth{1.505625pt}%
    1769 \definecolor{currentstroke}{rgb}{1.000000,0.498039,0.054902}%
    1770 \pgfsetstrokecolor{currentstroke}%
    1771 \pgfsetdash{}{0pt}%
    1772 \pgfpathmoveto{\pgfqpoint{1.222222in}{1.390268in}}%
    1773 \pgfpathlineto{\pgfqpoint{1.222222in}{1.612490in}}%
    1774 \pgfusepath{stroke}%
    1775 \end{pgfscope}%
    1776 \begin{pgfscope}%
    1777 \pgfsetbuttcap%
    1778 \pgfsetroundjoin%
    1779 \definecolor{currentfill}{rgb}{1.000000,0.498039,0.054902}%
    1780 \pgfsetfillcolor{currentfill}%
    1781 \pgfsetlinewidth{1.003750pt}%
    1782 \definecolor{currentstroke}{rgb}{1.000000,0.498039,0.054902}%
     1663\pgftext[x=3.280000in,y=4.307333in,,base]{\color{textcolor}\rmfamily\fontsize{12.000000}{14.400000}\selectfont Aggregate Lock Benchmark: 2 Locks}%
     1664\end{pgfscope}%
     1665\begin{pgfscope}%
     1666\pgfsetbuttcap%
     1667\pgfsetmiterjoin%
     1668\definecolor{currentfill}{rgb}{1.000000,1.000000,1.000000}%
     1669\pgfsetfillcolor{currentfill}%
     1670\pgfsetfillopacity{0.800000}%
     1671\pgfsetlinewidth{1.003750pt}%
     1672\definecolor{currentstroke}{rgb}{0.800000,0.800000,0.800000}%
     1673\pgfsetstrokecolor{currentstroke}%
     1674\pgfsetstrokeopacity{0.800000}%
     1675\pgfsetdash{}{0pt}%
     1676\pgfpathmoveto{\pgfqpoint{4.403517in}{3.338198in}}%
     1677\pgfpathlineto{\pgfqpoint{5.662778in}{3.338198in}}%
     1678\pgfpathquadraticcurveto{\pgfqpoint{5.690556in}{3.338198in}}{\pgfqpoint{5.690556in}{3.365976in}}%
     1679\pgfpathlineto{\pgfqpoint{5.690556in}{4.126778in}}%
     1680\pgfpathquadraticcurveto{\pgfqpoint{5.690556in}{4.154556in}}{\pgfqpoint{5.662778in}{4.154556in}}%
     1681\pgfpathlineto{\pgfqpoint{4.403517in}{4.154556in}}%
     1682\pgfpathquadraticcurveto{\pgfqpoint{4.375739in}{4.154556in}}{\pgfqpoint{4.375739in}{4.126778in}}%
     1683\pgfpathlineto{\pgfqpoint{4.375739in}{3.365976in}}%
     1684\pgfpathquadraticcurveto{\pgfqpoint{4.375739in}{3.338198in}}{\pgfqpoint{4.403517in}{3.338198in}}%
     1685\pgfpathclose%
     1686\pgfusepath{stroke,fill}%
     1687\end{pgfscope}%
     1688\begin{pgfscope}%
     1689\pgfsetbuttcap%
     1690\pgfsetroundjoin%
     1691\pgfsetlinewidth{1.505625pt}%
     1692\definecolor{currentstroke}{rgb}{0.121569,0.466667,0.705882}%
     1693\pgfsetstrokecolor{currentstroke}%
     1694\pgfsetdash{}{0pt}%
     1695\pgfpathmoveto{\pgfqpoint{4.570184in}{3.980944in}}%
     1696\pgfpathlineto{\pgfqpoint{4.570184in}{4.119833in}}%
     1697\pgfusepath{stroke}%
     1698\end{pgfscope}%
     1699\begin{pgfscope}%
     1700\pgfsetbuttcap%
     1701\pgfsetroundjoin%
     1702\definecolor{currentfill}{rgb}{0.121569,0.466667,0.705882}%
     1703\pgfsetfillcolor{currentfill}%
     1704\pgfsetlinewidth{1.003750pt}%
     1705\definecolor{currentstroke}{rgb}{0.121569,0.466667,0.705882}%
    17831706\pgfsetstrokecolor{currentstroke}%
    17841707\pgfsetdash{}{0pt}%
     
    17891712}%
    17901713\begin{pgfscope}%
    1791 \pgfsys@transformshift{1.222222in}{1.390268in}%
    1792 \pgfsys@useobject{currentmarker}{}%
    1793 \end{pgfscope}%
    1794 \end{pgfscope}%
    1795 \begin{pgfscope}%
    1796 \pgfsetbuttcap%
    1797 \pgfsetroundjoin%
    1798 \definecolor{currentfill}{rgb}{1.000000,0.498039,0.054902}%
    1799 \pgfsetfillcolor{currentfill}%
    1800 \pgfsetlinewidth{1.003750pt}%
    1801 \definecolor{currentstroke}{rgb}{1.000000,0.498039,0.054902}%
     1714\pgfsys@transformshift{4.570184in}{3.980944in}%
     1715\pgfsys@useobject{currentmarker}{}%
     1716\end{pgfscope}%
     1717\end{pgfscope}%
     1718\begin{pgfscope}%
     1719\pgfsetbuttcap%
     1720\pgfsetroundjoin%
     1721\definecolor{currentfill}{rgb}{0.121569,0.466667,0.705882}%
     1722\pgfsetfillcolor{currentfill}%
     1723\pgfsetlinewidth{1.003750pt}%
     1724\definecolor{currentstroke}{rgb}{0.121569,0.466667,0.705882}%
    18021725\pgfsetstrokecolor{currentstroke}%
    18031726\pgfsetdash{}{0pt}%
     
    18081731}%
    18091732\begin{pgfscope}%
    1810 \pgfsys@transformshift{1.222222in}{1.612490in}%
     1733\pgfsys@transformshift{4.570184in}{4.119833in}%
    18111734\pgfsys@useobject{currentmarker}{}%
    18121735\end{pgfscope}%
     
    18161739\pgfsetroundjoin%
    18171740\pgfsetlinewidth{1.505625pt}%
    1818 \definecolor{currentstroke}{rgb}{1.000000,0.498039,0.054902}%
    1819 \pgfsetstrokecolor{currentstroke}%
    1820 \pgfsetdash{}{0pt}%
    1821 \pgfpathmoveto{\pgfqpoint{1.000000in}{1.501379in}}%
    1822 \pgfpathlineto{\pgfqpoint{1.444444in}{1.501379in}}%
    1823 \pgfusepath{stroke}%
    1824 \end{pgfscope}%
    1825 \begin{pgfscope}%
    1826 \pgfsetbuttcap%
    1827 \pgfsetmiterjoin%
    1828 \definecolor{currentfill}{rgb}{1.000000,0.498039,0.054902}%
    1829 \pgfsetfillcolor{currentfill}%
    1830 \pgfsetlinewidth{1.003750pt}%
    1831 \definecolor{currentstroke}{rgb}{1.000000,0.498039,0.054902}%
     1741\definecolor{currentstroke}{rgb}{0.121569,0.466667,0.705882}%
     1742\pgfsetstrokecolor{currentstroke}%
     1743\pgfsetdash{}{0pt}%
     1744\pgfpathmoveto{\pgfqpoint{4.431295in}{4.050389in}}%
     1745\pgfpathlineto{\pgfqpoint{4.709073in}{4.050389in}}%
     1746\pgfusepath{stroke}%
     1747\end{pgfscope}%
     1748\begin{pgfscope}%
     1749\pgfsetbuttcap%
     1750\pgfsetroundjoin%
     1751\definecolor{currentfill}{rgb}{0.121569,0.466667,0.705882}%
     1752\pgfsetfillcolor{currentfill}%
     1753\pgfsetlinewidth{1.003750pt}%
     1754\definecolor{currentstroke}{rgb}{0.121569,0.466667,0.705882}%
    18321755\pgfsetstrokecolor{currentstroke}%
    18331756\pgfsetdash{}{0pt}%
    18341757\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.041667in}{-0.041667in}}{\pgfqpoint{0.041667in}{0.041667in}}{%
    1835 \pgfpathmoveto{\pgfqpoint{-0.041667in}{-0.041667in}}%
    1836 \pgfpathlineto{\pgfqpoint{0.041667in}{-0.041667in}}%
    1837 \pgfpathlineto{\pgfqpoint{0.041667in}{0.041667in}}%
    1838 \pgfpathlineto{\pgfqpoint{-0.041667in}{0.041667in}}%
     1758\pgfpathmoveto{\pgfqpoint{0.000000in}{-0.041667in}}%
     1759\pgfpathcurveto{\pgfqpoint{0.011050in}{-0.041667in}}{\pgfqpoint{0.021649in}{-0.037276in}}{\pgfqpoint{0.029463in}{-0.029463in}}%
     1760\pgfpathcurveto{\pgfqpoint{0.037276in}{-0.021649in}}{\pgfqpoint{0.041667in}{-0.011050in}}{\pgfqpoint{0.041667in}{0.000000in}}%
     1761\pgfpathcurveto{\pgfqpoint{0.041667in}{0.011050in}}{\pgfqpoint{0.037276in}{0.021649in}}{\pgfqpoint{0.029463in}{0.029463in}}%
     1762\pgfpathcurveto{\pgfqpoint{0.021649in}{0.037276in}}{\pgfqpoint{0.011050in}{0.041667in}}{\pgfqpoint{0.000000in}{0.041667in}}%
     1763\pgfpathcurveto{\pgfqpoint{-0.011050in}{0.041667in}}{\pgfqpoint{-0.021649in}{0.037276in}}{\pgfqpoint{-0.029463in}{0.029463in}}%
     1764\pgfpathcurveto{\pgfqpoint{-0.037276in}{0.021649in}}{\pgfqpoint{-0.041667in}{0.011050in}}{\pgfqpoint{-0.041667in}{0.000000in}}%
     1765\pgfpathcurveto{\pgfqpoint{-0.041667in}{-0.011050in}}{\pgfqpoint{-0.037276in}{-0.021649in}}{\pgfqpoint{-0.029463in}{-0.029463in}}%
     1766\pgfpathcurveto{\pgfqpoint{-0.021649in}{-0.037276in}}{\pgfqpoint{-0.011050in}{-0.041667in}}{\pgfqpoint{0.000000in}{-0.041667in}}%
    18391767\pgfpathclose%
    18401768\pgfusepath{stroke,fill}%
    18411769}%
    18421770\begin{pgfscope}%
    1843 \pgfsys@transformshift{1.222222in}{1.501379in}%
     1771\pgfsys@transformshift{4.570184in}{4.050389in}%
    18441772\pgfsys@useobject{currentmarker}{}%
    18451773\end{pgfscope}%
     
    18491777\pgfsetstrokecolor{textcolor}%
    18501778\pgfsetfillcolor{textcolor}%
    1851 \pgftext[x=1.622222in,y=1.423601in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont CPP-baseline}%
    1852 \end{pgfscope}%
    1853 \begin{pgfscope}%
    1854 \pgfsetbuttcap%
    1855 \pgfsetroundjoin%
    1856 \pgfsetlinewidth{1.505625pt}%
    1857 \definecolor{currentstroke}{rgb}{0.172549,0.627451,0.172549}%
    1858 \pgfsetstrokecolor{currentstroke}%
    1859 \pgfsetdash{}{0pt}%
    1860 \pgfpathmoveto{\pgfqpoint{1.222222in}{1.065808in}}%
    1861 \pgfpathlineto{\pgfqpoint{1.222222in}{1.288031in}}%
    1862 \pgfusepath{stroke}%
    1863 \end{pgfscope}%
    1864 \begin{pgfscope}%
    1865 \pgfsetbuttcap%
    1866 \pgfsetroundjoin%
    1867 \definecolor{currentfill}{rgb}{0.172549,0.627451,0.172549}%
    1868 \pgfsetfillcolor{currentfill}%
    1869 \pgfsetlinewidth{1.003750pt}%
    1870 \definecolor{currentstroke}{rgb}{0.172549,0.627451,0.172549}%
     1779\pgftext[x=4.820184in,y=4.001778in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont CFA-baseline}%
     1780\end{pgfscope}%
     1781\begin{pgfscope}%
     1782\pgfsetbuttcap%
     1783\pgfsetroundjoin%
     1784\pgfsetlinewidth{1.505625pt}%
     1785\definecolor{currentstroke}{rgb}{1.000000,0.498039,0.054902}%
     1786\pgfsetstrokecolor{currentstroke}%
     1787\pgfsetdash{}{0pt}%
     1788\pgfpathmoveto{\pgfqpoint{4.570184in}{3.787272in}}%
     1789\pgfpathlineto{\pgfqpoint{4.570184in}{3.926161in}}%
     1790\pgfusepath{stroke}%
     1791\end{pgfscope}%
     1792\begin{pgfscope}%
     1793\pgfsetbuttcap%
     1794\pgfsetroundjoin%
     1795\definecolor{currentfill}{rgb}{1.000000,0.498039,0.054902}%
     1796\pgfsetfillcolor{currentfill}%
     1797\pgfsetlinewidth{1.003750pt}%
     1798\definecolor{currentstroke}{rgb}{1.000000,0.498039,0.054902}%
    18711799\pgfsetstrokecolor{currentstroke}%
    18721800\pgfsetdash{}{0pt}%
     
    18771805}%
    18781806\begin{pgfscope}%
    1879 \pgfsys@transformshift{1.222222in}{1.065808in}%
    1880 \pgfsys@useobject{currentmarker}{}%
    1881 \end{pgfscope}%
    1882 \end{pgfscope}%
    1883 \begin{pgfscope}%
    1884 \pgfsetbuttcap%
    1885 \pgfsetroundjoin%
    1886 \definecolor{currentfill}{rgb}{0.172549,0.627451,0.172549}%
    1887 \pgfsetfillcolor{currentfill}%
    1888 \pgfsetlinewidth{1.003750pt}%
    1889 \definecolor{currentstroke}{rgb}{0.172549,0.627451,0.172549}%
     1807\pgfsys@transformshift{4.570184in}{3.787272in}%
     1808\pgfsys@useobject{currentmarker}{}%
     1809\end{pgfscope}%
     1810\end{pgfscope}%
     1811\begin{pgfscope}%
     1812\pgfsetbuttcap%
     1813\pgfsetroundjoin%
     1814\definecolor{currentfill}{rgb}{1.000000,0.498039,0.054902}%
     1815\pgfsetfillcolor{currentfill}%
     1816\pgfsetlinewidth{1.003750pt}%
     1817\definecolor{currentstroke}{rgb}{1.000000,0.498039,0.054902}%
    18901818\pgfsetstrokecolor{currentstroke}%
    18911819\pgfsetdash{}{0pt}%
     
    18961824}%
    18971825\begin{pgfscope}%
    1898 \pgfsys@transformshift{1.222222in}{1.288031in}%
     1826\pgfsys@transformshift{4.570184in}{3.926161in}%
    18991827\pgfsys@useobject{currentmarker}{}%
    19001828\end{pgfscope}%
     
    19041832\pgfsetroundjoin%
    19051833\pgfsetlinewidth{1.505625pt}%
    1906 \definecolor{currentstroke}{rgb}{0.172549,0.627451,0.172549}%
    1907 \pgfsetstrokecolor{currentstroke}%
    1908 \pgfsetdash{}{0pt}%
    1909 \pgfpathmoveto{\pgfqpoint{1.000000in}{1.176919in}}%
    1910 \pgfpathlineto{\pgfqpoint{1.444444in}{1.176919in}}%
    1911 \pgfusepath{stroke}%
    1912 \end{pgfscope}%
    1913 \begin{pgfscope}%
    1914 \pgfsetbuttcap%
    1915 \pgfsetmiterjoin%
    1916 \definecolor{currentfill}{rgb}{0.172549,0.627451,0.172549}%
    1917 \pgfsetfillcolor{currentfill}%
    1918 \pgfsetlinewidth{1.003750pt}%
    1919 \definecolor{currentstroke}{rgb}{0.172549,0.627451,0.172549}%
    1920 \pgfsetstrokecolor{currentstroke}%
    1921 \pgfsetdash{}{0pt}%
    1922 \pgfsys@defobject{currentmarker}{\pgfqpoint{-0.058926in}{-0.058926in}}{\pgfqpoint{0.058926in}{0.058926in}}{%
    1923 \pgfpathmoveto{\pgfqpoint{-0.000000in}{-0.058926in}}%
    1924 \pgfpathlineto{\pgfqpoint{0.058926in}{0.000000in}}%
    1925 \pgfpathlineto{\pgfqpoint{0.000000in}{0.058926in}}%
    1926 \pgfpathlineto{\pgfqpoint{-0.058926in}{0.000000in}}%
     1834\definecolor{currentstroke}{rgb}{1.000000,0.498039,0.054902}%
     1835\pgfsetstrokecolor{currentstroke}%
     1836\pgfsetdash{}{0pt}%
     1837\pgfpathmoveto{\pgfqpoint{4.431295in}{3.856716in}}%
     1838\pgfpathlineto{\pgfqpoint{4.709073in}{3.856716in}}%
     1839\pgfusepath{stroke}%
     1840\end{pgfscope}%
     1841\begin{pgfscope}%
     1842\pgfsetbuttcap%
     1843\pgfsetroundjoin%
     1844\definecolor{currentfill}{rgb}{1.000000,0.498039,0.054902}%
     1845\pgfsetfillcolor{currentfill}%
     1846\pgfsetlinewidth{1.003750pt}%
     1847\definecolor{currentstroke}{rgb}{1.000000,0.498039,0.054902}%
     1848\pgfsetstrokecolor{currentstroke}%
     1849\pgfsetdash{}{0pt}%
     1850\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.041667in}{-0.041667in}}{\pgfqpoint{0.041667in}{0.041667in}}{%
     1851\pgfpathmoveto{\pgfqpoint{0.000000in}{-0.041667in}}%
     1852\pgfpathcurveto{\pgfqpoint{0.011050in}{-0.041667in}}{\pgfqpoint{0.021649in}{-0.037276in}}{\pgfqpoint{0.029463in}{-0.029463in}}%
     1853\pgfpathcurveto{\pgfqpoint{0.037276in}{-0.021649in}}{\pgfqpoint{0.041667in}{-0.011050in}}{\pgfqpoint{0.041667in}{0.000000in}}%
     1854\pgfpathcurveto{\pgfqpoint{0.041667in}{0.011050in}}{\pgfqpoint{0.037276in}{0.021649in}}{\pgfqpoint{0.029463in}{0.029463in}}%
     1855\pgfpathcurveto{\pgfqpoint{0.021649in}{0.037276in}}{\pgfqpoint{0.011050in}{0.041667in}}{\pgfqpoint{0.000000in}{0.041667in}}%
     1856\pgfpathcurveto{\pgfqpoint{-0.011050in}{0.041667in}}{\pgfqpoint{-0.021649in}{0.037276in}}{\pgfqpoint{-0.029463in}{0.029463in}}%
     1857\pgfpathcurveto{\pgfqpoint{-0.037276in}{0.021649in}}{\pgfqpoint{-0.041667in}{0.011050in}}{\pgfqpoint{-0.041667in}{0.000000in}}%
     1858\pgfpathcurveto{\pgfqpoint{-0.041667in}{-0.011050in}}{\pgfqpoint{-0.037276in}{-0.021649in}}{\pgfqpoint{-0.029463in}{-0.029463in}}%
     1859\pgfpathcurveto{\pgfqpoint{-0.021649in}{-0.037276in}}{\pgfqpoint{-0.011050in}{-0.041667in}}{\pgfqpoint{0.000000in}{-0.041667in}}%
    19271860\pgfpathclose%
    19281861\pgfusepath{stroke,fill}%
    19291862}%
    19301863\begin{pgfscope}%
    1931 \pgfsys@transformshift{1.222222in}{1.176919in}%
     1864\pgfsys@transformshift{4.570184in}{3.856716in}%
    19321865\pgfsys@useobject{currentmarker}{}%
    19331866\end{pgfscope}%
     
    19371870\pgfsetstrokecolor{textcolor}%
    19381871\pgfsetfillcolor{textcolor}%
    1939 \pgftext[x=1.622222in,y=1.099142in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont CFA-rand}%
    1940 \end{pgfscope}%
    1941 \begin{pgfscope}%
    1942 \pgfsetbuttcap%
    1943 \pgfsetroundjoin%
    1944 \pgfsetlinewidth{1.505625pt}%
    1945 \definecolor{currentstroke}{rgb}{0.839216,0.152941,0.156863}%
    1946 \pgfsetstrokecolor{currentstroke}%
    1947 \pgfsetdash{}{0pt}%
    1948 \pgfpathmoveto{\pgfqpoint{1.222222in}{0.741349in}}%
    1949 \pgfpathlineto{\pgfqpoint{1.222222in}{0.963571in}}%
    1950 \pgfusepath{stroke}%
    1951 \end{pgfscope}%
    1952 \begin{pgfscope}%
    1953 \pgfsetbuttcap%
    1954 \pgfsetroundjoin%
    1955 \definecolor{currentfill}{rgb}{0.839216,0.152941,0.156863}%
    1956 \pgfsetfillcolor{currentfill}%
    1957 \pgfsetlinewidth{1.003750pt}%
    1958 \definecolor{currentstroke}{rgb}{0.839216,0.152941,0.156863}%
     1872\pgftext[x=4.820184in,y=3.808105in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont CPP-baseline}%
     1873\end{pgfscope}%
     1874\begin{pgfscope}%
     1875\pgfsetbuttcap%
     1876\pgfsetroundjoin%
     1877\pgfsetlinewidth{1.505625pt}%
     1878\definecolor{currentstroke}{rgb}{0.172549,0.627451,0.172549}%
     1879\pgfsetstrokecolor{currentstroke}%
     1880\pgfsetdash{}{0pt}%
     1881\pgfpathmoveto{\pgfqpoint{4.570184in}{3.593599in}}%
     1882\pgfpathlineto{\pgfqpoint{4.570184in}{3.732488in}}%
     1883\pgfusepath{stroke}%
     1884\end{pgfscope}%
     1885\begin{pgfscope}%
     1886\pgfsetbuttcap%
     1887\pgfsetroundjoin%
     1888\definecolor{currentfill}{rgb}{0.172549,0.627451,0.172549}%
     1889\pgfsetfillcolor{currentfill}%
     1890\pgfsetlinewidth{1.003750pt}%
     1891\definecolor{currentstroke}{rgb}{0.172549,0.627451,0.172549}%
    19591892\pgfsetstrokecolor{currentstroke}%
    19601893\pgfsetdash{}{0pt}%
     
    19651898}%
    19661899\begin{pgfscope}%
    1967 \pgfsys@transformshift{1.222222in}{0.741349in}%
    1968 \pgfsys@useobject{currentmarker}{}%
    1969 \end{pgfscope}%
    1970 \end{pgfscope}%
    1971 \begin{pgfscope}%
    1972 \pgfsetbuttcap%
    1973 \pgfsetroundjoin%
    1974 \definecolor{currentfill}{rgb}{0.839216,0.152941,0.156863}%
    1975 \pgfsetfillcolor{currentfill}%
    1976 \pgfsetlinewidth{1.003750pt}%
    1977 \definecolor{currentstroke}{rgb}{0.839216,0.152941,0.156863}%
     1900\pgfsys@transformshift{4.570184in}{3.593599in}%
     1901\pgfsys@useobject{currentmarker}{}%
     1902\end{pgfscope}%
     1903\end{pgfscope}%
     1904\begin{pgfscope}%
     1905\pgfsetbuttcap%
     1906\pgfsetroundjoin%
     1907\definecolor{currentfill}{rgb}{0.172549,0.627451,0.172549}%
     1908\pgfsetfillcolor{currentfill}%
     1909\pgfsetlinewidth{1.003750pt}%
     1910\definecolor{currentstroke}{rgb}{0.172549,0.627451,0.172549}%
    19781911\pgfsetstrokecolor{currentstroke}%
    19791912\pgfsetdash{}{0pt}%
     
    19841917}%
    19851918\begin{pgfscope}%
    1986 \pgfsys@transformshift{1.222222in}{0.963571in}%
     1919\pgfsys@transformshift{4.570184in}{3.732488in}%
    19871920\pgfsys@useobject{currentmarker}{}%
    19881921\end{pgfscope}%
     
    19921925\pgfsetroundjoin%
    19931926\pgfsetlinewidth{1.505625pt}%
    1994 \definecolor{currentstroke}{rgb}{0.839216,0.152941,0.156863}%
    1995 \pgfsetstrokecolor{currentstroke}%
    1996 \pgfsetdash{}{0pt}%
    1997 \pgfpathmoveto{\pgfqpoint{1.000000in}{0.852460in}}%
    1998 \pgfpathlineto{\pgfqpoint{1.444444in}{0.852460in}}%
    1999 \pgfusepath{stroke}%
    2000 \end{pgfscope}%
    2001 \begin{pgfscope}%
    2002 \pgfsetbuttcap%
    2003 \pgfsetroundjoin%
    2004 \definecolor{currentfill}{rgb}{0.839216,0.152941,0.156863}%
    2005 \pgfsetfillcolor{currentfill}%
    2006 \pgfsetlinewidth{1.003750pt}%
    2007 \definecolor{currentstroke}{rgb}{0.839216,0.152941,0.156863}%
     1927\definecolor{currentstroke}{rgb}{0.172549,0.627451,0.172549}%
     1928\pgfsetstrokecolor{currentstroke}%
     1929\pgfsetdash{}{0pt}%
     1930\pgfpathmoveto{\pgfqpoint{4.431295in}{3.663043in}}%
     1931\pgfpathlineto{\pgfqpoint{4.709073in}{3.663043in}}%
     1932\pgfusepath{stroke}%
     1933\end{pgfscope}%
     1934\begin{pgfscope}%
     1935\pgfsetbuttcap%
     1936\pgfsetroundjoin%
     1937\definecolor{currentfill}{rgb}{0.172549,0.627451,0.172549}%
     1938\pgfsetfillcolor{currentfill}%
     1939\pgfsetlinewidth{1.003750pt}%
     1940\definecolor{currentstroke}{rgb}{0.172549,0.627451,0.172549}%
    20081941\pgfsetstrokecolor{currentstroke}%
    20091942\pgfsetdash{}{0pt}%
    20101943\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.041667in}{-0.041667in}}{\pgfqpoint{0.041667in}{0.041667in}}{%
    2011 \pgfpathmoveto{\pgfqpoint{-0.041667in}{-0.041667in}}%
    2012 \pgfpathlineto{\pgfqpoint{0.041667in}{0.041667in}}%
    2013 \pgfpathmoveto{\pgfqpoint{-0.041667in}{0.041667in}}%
    2014 \pgfpathlineto{\pgfqpoint{0.041667in}{-0.041667in}}%
    2015 \pgfusepath{stroke,fill}%
    2016 }%
    2017 \begin{pgfscope}%
    2018 \pgfsys@transformshift{1.222222in}{0.852460in}%
     1944\pgfpathmoveto{\pgfqpoint{0.000000in}{-0.041667in}}%
     1945\pgfpathcurveto{\pgfqpoint{0.011050in}{-0.041667in}}{\pgfqpoint{0.021649in}{-0.037276in}}{\pgfqpoint{0.029463in}{-0.029463in}}%
     1946\pgfpathcurveto{\pgfqpoint{0.037276in}{-0.021649in}}{\pgfqpoint{0.041667in}{-0.011050in}}{\pgfqpoint{0.041667in}{0.000000in}}%
     1947\pgfpathcurveto{\pgfqpoint{0.041667in}{0.011050in}}{\pgfqpoint{0.037276in}{0.021649in}}{\pgfqpoint{0.029463in}{0.029463in}}%
     1948\pgfpathcurveto{\pgfqpoint{0.021649in}{0.037276in}}{\pgfqpoint{0.011050in}{0.041667in}}{\pgfqpoint{0.000000in}{0.041667in}}%
     1949\pgfpathcurveto{\pgfqpoint{-0.011050in}{0.041667in}}{\pgfqpoint{-0.021649in}{0.037276in}}{\pgfqpoint{-0.029463in}{0.029463in}}%
     1950\pgfpathcurveto{\pgfqpoint{-0.037276in}{0.021649in}}{\pgfqpoint{-0.041667in}{0.011050in}}{\pgfqpoint{-0.041667in}{0.000000in}}%
     1951\pgfpathcurveto{\pgfqpoint{-0.041667in}{-0.011050in}}{\pgfqpoint{-0.037276in}{-0.021649in}}{\pgfqpoint{-0.029463in}{-0.029463in}}%
     1952\pgfpathcurveto{\pgfqpoint{-0.021649in}{-0.037276in}}{\pgfqpoint{-0.011050in}{-0.041667in}}{\pgfqpoint{0.000000in}{-0.041667in}}%
     1953\pgfpathclose%
     1954\pgfusepath{stroke,fill}%
     1955}%
     1956\begin{pgfscope}%
     1957\pgfsys@transformshift{4.570184in}{3.663043in}%
    20191958\pgfsys@useobject{currentmarker}{}%
    20201959\end{pgfscope}%
     
    20241963\pgfsetstrokecolor{textcolor}%
    20251964\pgfsetfillcolor{textcolor}%
    2026 \pgftext[x=1.622222in,y=0.774682in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont CPP-rand}%
     1965\pgftext[x=4.820184in,y=3.614432in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont CFA-rand}%
     1966\end{pgfscope}%
     1967\begin{pgfscope}%
     1968\pgfsetbuttcap%
     1969\pgfsetroundjoin%
     1970\pgfsetlinewidth{1.505625pt}%
     1971\definecolor{currentstroke}{rgb}{0.839216,0.152941,0.156863}%
     1972\pgfsetstrokecolor{currentstroke}%
     1973\pgfsetdash{}{0pt}%
     1974\pgfpathmoveto{\pgfqpoint{4.570184in}{3.399926in}}%
     1975\pgfpathlineto{\pgfqpoint{4.570184in}{3.538815in}}%
     1976\pgfusepath{stroke}%
     1977\end{pgfscope}%
     1978\begin{pgfscope}%
     1979\pgfsetbuttcap%
     1980\pgfsetroundjoin%
     1981\definecolor{currentfill}{rgb}{0.839216,0.152941,0.156863}%
     1982\pgfsetfillcolor{currentfill}%
     1983\pgfsetlinewidth{1.003750pt}%
     1984\definecolor{currentstroke}{rgb}{0.839216,0.152941,0.156863}%
     1985\pgfsetstrokecolor{currentstroke}%
     1986\pgfsetdash{}{0pt}%
     1987\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.027778in}{-0.000000in}}{\pgfqpoint{0.027778in}{0.000000in}}{%
     1988\pgfpathmoveto{\pgfqpoint{0.027778in}{-0.000000in}}%
     1989\pgfpathlineto{\pgfqpoint{-0.027778in}{0.000000in}}%
     1990\pgfusepath{stroke,fill}%
     1991}%
     1992\begin{pgfscope}%
     1993\pgfsys@transformshift{4.570184in}{3.399926in}%
     1994\pgfsys@useobject{currentmarker}{}%
     1995\end{pgfscope}%
     1996\end{pgfscope}%
     1997\begin{pgfscope}%
     1998\pgfsetbuttcap%
     1999\pgfsetroundjoin%
     2000\definecolor{currentfill}{rgb}{0.839216,0.152941,0.156863}%
     2001\pgfsetfillcolor{currentfill}%
     2002\pgfsetlinewidth{1.003750pt}%
     2003\definecolor{currentstroke}{rgb}{0.839216,0.152941,0.156863}%
     2004\pgfsetstrokecolor{currentstroke}%
     2005\pgfsetdash{}{0pt}%
     2006\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.027778in}{-0.000000in}}{\pgfqpoint{0.027778in}{0.000000in}}{%
     2007\pgfpathmoveto{\pgfqpoint{0.027778in}{-0.000000in}}%
     2008\pgfpathlineto{\pgfqpoint{-0.027778in}{0.000000in}}%
     2009\pgfusepath{stroke,fill}%
     2010}%
     2011\begin{pgfscope}%
     2012\pgfsys@transformshift{4.570184in}{3.538815in}%
     2013\pgfsys@useobject{currentmarker}{}%
     2014\end{pgfscope}%
     2015\end{pgfscope}%
     2016\begin{pgfscope}%
     2017\pgfsetrectcap%
     2018\pgfsetroundjoin%
     2019\pgfsetlinewidth{1.505625pt}%
     2020\definecolor{currentstroke}{rgb}{0.839216,0.152941,0.156863}%
     2021\pgfsetstrokecolor{currentstroke}%
     2022\pgfsetdash{}{0pt}%
     2023\pgfpathmoveto{\pgfqpoint{4.431295in}{3.469371in}}%
     2024\pgfpathlineto{\pgfqpoint{4.709073in}{3.469371in}}%
     2025\pgfusepath{stroke}%
     2026\end{pgfscope}%
     2027\begin{pgfscope}%
     2028\pgfsetbuttcap%
     2029\pgfsetroundjoin%
     2030\definecolor{currentfill}{rgb}{0.839216,0.152941,0.156863}%
     2031\pgfsetfillcolor{currentfill}%
     2032\pgfsetlinewidth{1.003750pt}%
     2033\definecolor{currentstroke}{rgb}{0.839216,0.152941,0.156863}%
     2034\pgfsetstrokecolor{currentstroke}%
     2035\pgfsetdash{}{0pt}%
     2036\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.041667in}{-0.041667in}}{\pgfqpoint{0.041667in}{0.041667in}}{%
     2037\pgfpathmoveto{\pgfqpoint{0.000000in}{-0.041667in}}%
     2038\pgfpathcurveto{\pgfqpoint{0.011050in}{-0.041667in}}{\pgfqpoint{0.021649in}{-0.037276in}}{\pgfqpoint{0.029463in}{-0.029463in}}%
     2039\pgfpathcurveto{\pgfqpoint{0.037276in}{-0.021649in}}{\pgfqpoint{0.041667in}{-0.011050in}}{\pgfqpoint{0.041667in}{0.000000in}}%
     2040\pgfpathcurveto{\pgfqpoint{0.041667in}{0.011050in}}{\pgfqpoint{0.037276in}{0.021649in}}{\pgfqpoint{0.029463in}{0.029463in}}%
     2041\pgfpathcurveto{\pgfqpoint{0.021649in}{0.037276in}}{\pgfqpoint{0.011050in}{0.041667in}}{\pgfqpoint{0.000000in}{0.041667in}}%
     2042\pgfpathcurveto{\pgfqpoint{-0.011050in}{0.041667in}}{\pgfqpoint{-0.021649in}{0.037276in}}{\pgfqpoint{-0.029463in}{0.029463in}}%
     2043\pgfpathcurveto{\pgfqpoint{-0.037276in}{0.021649in}}{\pgfqpoint{-0.041667in}{0.011050in}}{\pgfqpoint{-0.041667in}{0.000000in}}%
     2044\pgfpathcurveto{\pgfqpoint{-0.041667in}{-0.011050in}}{\pgfqpoint{-0.037276in}{-0.021649in}}{\pgfqpoint{-0.029463in}{-0.029463in}}%
     2045\pgfpathcurveto{\pgfqpoint{-0.021649in}{-0.037276in}}{\pgfqpoint{-0.011050in}{-0.041667in}}{\pgfqpoint{0.000000in}{-0.041667in}}%
     2046\pgfpathclose%
     2047\pgfusepath{stroke,fill}%
     2048}%
     2049\begin{pgfscope}%
     2050\pgfsys@transformshift{4.570184in}{3.469371in}%
     2051\pgfsys@useobject{currentmarker}{}%
     2052\end{pgfscope}%
     2053\end{pgfscope}%
     2054\begin{pgfscope}%
     2055\definecolor{textcolor}{rgb}{0.000000,0.000000,0.000000}%
     2056\pgfsetstrokecolor{textcolor}%
     2057\pgfsetfillcolor{textcolor}%
     2058\pgftext[x=4.820184in,y=3.420759in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont CPP-rand}%
    20272059\end{pgfscope}%
    20282060\end{pgfpicture}%
  • doc/theses/colby_parsons_MMAth/figures/pyke_Aggregate_Lock_4.pgf

    r044ae62 r3a513d89  
    7777\pgfsetstrokecolor{textcolor}%
    7878\pgfsetfillcolor{textcolor}%
    79 \pgftext[x=1.025455in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 2\)}%
     79\pgftext[x=1.025455in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 2\)}%
    8080\end{pgfscope}%
    8181\begin{pgfscope}%
     
    102102\pgfsetstrokecolor{textcolor}%
    103103\pgfsetfillcolor{textcolor}%
    104 \pgftext[x=1.326061in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 4\)}%
     104\pgftext[x=1.326061in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 4\)}%
    105105\end{pgfscope}%
    106106\begin{pgfscope}%
     
    127127\pgfsetstrokecolor{textcolor}%
    128128\pgfsetfillcolor{textcolor}%
    129 \pgftext[x=1.927273in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 8\)}%
     129\pgftext[x=1.927273in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 8\)}%
    130130\end{pgfscope}%
    131131\begin{pgfscope}%
     
    152152\pgfsetstrokecolor{textcolor}%
    153153\pgfsetfillcolor{textcolor}%
    154 \pgftext[x=3.129697in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 16\)}%
     154\pgftext[x=3.129697in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 16\)}%
    155155\end{pgfscope}%
    156156\begin{pgfscope}%
     
    177177\pgfsetstrokecolor{textcolor}%
    178178\pgfsetfillcolor{textcolor}%
    179 \pgftext[x=4.332121in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 24\)}%
     179\pgftext[x=4.332121in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 24\)}%
    180180\end{pgfscope}%
    181181\begin{pgfscope}%
     
    202202\pgfsetstrokecolor{textcolor}%
    203203\pgfsetfillcolor{textcolor}%
    204 \pgftext[x=5.534545in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 32\)}%
     204\pgftext[x=5.534545in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 32\)}%
    205205\end{pgfscope}%
    206206\begin{pgfscope}%
     
    208208\pgfsetstrokecolor{textcolor}%
    209209\pgfsetfillcolor{textcolor}%
    210 \pgftext[x=3.280000in,y=0.161874in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont Cores}%
     210\pgftext[x=3.280000in,y=0.251766in,,top]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont Cores}%
    211211\end{pgfscope}%
    212212\begin{pgfscope}%
     
    233233\pgfsetstrokecolor{textcolor}%
    234234\pgfsetfillcolor{textcolor}%
    235 \pgftext[x=0.399655in,y=0.592592in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 10^{3}\)}%
     235\pgftext[x=0.501581in,y=0.627700in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 10^{3}\)}%
    236236\end{pgfscope}%
    237237\begin{pgfscope}%
     
    258258\pgfsetstrokecolor{textcolor}%
    259259\pgfsetfillcolor{textcolor}%
    260 \pgftext[x=0.399655in,y=1.275604in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 10^{4}\)}%
     260\pgftext[x=0.501581in,y=1.310712in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 10^{4}\)}%
    261261\end{pgfscope}%
    262262\begin{pgfscope}%
     
    283283\pgfsetstrokecolor{textcolor}%
    284284\pgfsetfillcolor{textcolor}%
    285 \pgftext[x=0.399655in,y=1.958615in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 10^{5}\)}%
     285\pgftext[x=0.501581in,y=1.993723in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 10^{5}\)}%
    286286\end{pgfscope}%
    287287\begin{pgfscope}%
     
    308308\pgfsetstrokecolor{textcolor}%
    309309\pgfsetfillcolor{textcolor}%
    310 \pgftext[x=0.399655in,y=2.641627in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 10^{6}\)}%
     310\pgftext[x=0.501581in,y=2.676735in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 10^{6}\)}%
    311311\end{pgfscope}%
    312312\begin{pgfscope}%
     
    333333\pgfsetstrokecolor{textcolor}%
    334334\pgfsetfillcolor{textcolor}%
    335 \pgftext[x=0.399655in,y=3.324638in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 10^{7}\)}%
     335\pgftext[x=0.501581in,y=3.359746in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 10^{7}\)}%
    336336\end{pgfscope}%
    337337\begin{pgfscope}%
     
    358358\pgfsetstrokecolor{textcolor}%
    359359\pgfsetfillcolor{textcolor}%
    360 \pgftext[x=0.399655in,y=4.007649in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 10^{8}\)}%
     360\pgftext[x=0.501581in,y=4.042757in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 10^{8}\)}%
    361361\end{pgfscope}%
    362362\begin{pgfscope}%
     
    11811181\pgfsetstrokecolor{textcolor}%
    11821182\pgfsetfillcolor{textcolor}%
    1183 \pgftext[x=0.344100in,y=2.376000in,,bottom,rotate=90.000000]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont Throughput (entries)}%
     1183\pgftext[x=0.446026in,y=2.376000in,,bottom,rotate=90.000000]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont Throughput (entries)}%
    11841184\end{pgfscope}%
    11851185\begin{pgfscope}%
     
    18441844\pgfusepath{clip}%
    18451845\pgfsetbuttcap%
    1846 \pgfsetmiterjoin%
     1846\pgfsetroundjoin%
    18471847\definecolor{currentfill}{rgb}{0.121569,0.466667,0.705882}%
    18481848\pgfsetfillcolor{currentfill}%
     
    18511851\pgfsetstrokecolor{currentstroke}%
    18521852\pgfsetdash{}{0pt}%
    1853 \pgfsys@defobject{currentmarker}{\pgfqpoint{-0.039627in}{-0.033709in}}{\pgfqpoint{0.039627in}{0.041667in}}{%
    1854 \pgfpathmoveto{\pgfqpoint{0.000000in}{0.041667in}}%
    1855 \pgfpathlineto{\pgfqpoint{-0.039627in}{0.012876in}}%
    1856 \pgfpathlineto{\pgfqpoint{-0.024491in}{-0.033709in}}%
    1857 \pgfpathlineto{\pgfqpoint{0.024491in}{-0.033709in}}%
    1858 \pgfpathlineto{\pgfqpoint{0.039627in}{0.012876in}}%
     1853\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.041667in}{-0.041667in}}{\pgfqpoint{0.041667in}{0.041667in}}{%
     1854\pgfpathmoveto{\pgfqpoint{0.000000in}{-0.041667in}}%
     1855\pgfpathcurveto{\pgfqpoint{0.011050in}{-0.041667in}}{\pgfqpoint{0.021649in}{-0.037276in}}{\pgfqpoint{0.029463in}{-0.029463in}}%
     1856\pgfpathcurveto{\pgfqpoint{0.037276in}{-0.021649in}}{\pgfqpoint{0.041667in}{-0.011050in}}{\pgfqpoint{0.041667in}{0.000000in}}%
     1857\pgfpathcurveto{\pgfqpoint{0.041667in}{0.011050in}}{\pgfqpoint{0.037276in}{0.021649in}}{\pgfqpoint{0.029463in}{0.029463in}}%
     1858\pgfpathcurveto{\pgfqpoint{0.021649in}{0.037276in}}{\pgfqpoint{0.011050in}{0.041667in}}{\pgfqpoint{0.000000in}{0.041667in}}%
     1859\pgfpathcurveto{\pgfqpoint{-0.011050in}{0.041667in}}{\pgfqpoint{-0.021649in}{0.037276in}}{\pgfqpoint{-0.029463in}{0.029463in}}%
     1860\pgfpathcurveto{\pgfqpoint{-0.037276in}{0.021649in}}{\pgfqpoint{-0.041667in}{0.011050in}}{\pgfqpoint{-0.041667in}{0.000000in}}%
     1861\pgfpathcurveto{\pgfqpoint{-0.041667in}{-0.011050in}}{\pgfqpoint{-0.037276in}{-0.021649in}}{\pgfqpoint{-0.029463in}{-0.029463in}}%
     1862\pgfpathcurveto{\pgfqpoint{-0.021649in}{-0.037276in}}{\pgfqpoint{-0.011050in}{-0.041667in}}{\pgfqpoint{0.000000in}{-0.041667in}}%
    18591863\pgfpathclose%
    18601864\pgfusepath{stroke,fill}%
     
    19061910\pgfusepath{clip}%
    19071911\pgfsetbuttcap%
    1908 \pgfsetmiterjoin%
     1912\pgfsetroundjoin%
    19091913\definecolor{currentfill}{rgb}{1.000000,0.498039,0.054902}%
    19101914\pgfsetfillcolor{currentfill}%
     
    19141918\pgfsetdash{}{0pt}%
    19151919\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.041667in}{-0.041667in}}{\pgfqpoint{0.041667in}{0.041667in}}{%
    1916 \pgfpathmoveto{\pgfqpoint{0.000000in}{0.041667in}}%
    1917 \pgfpathlineto{\pgfqpoint{-0.041667in}{-0.041667in}}%
    1918 \pgfpathlineto{\pgfqpoint{0.041667in}{-0.041667in}}%
     1920\pgfpathmoveto{\pgfqpoint{0.000000in}{-0.041667in}}%
     1921\pgfpathcurveto{\pgfqpoint{0.011050in}{-0.041667in}}{\pgfqpoint{0.021649in}{-0.037276in}}{\pgfqpoint{0.029463in}{-0.029463in}}%
     1922\pgfpathcurveto{\pgfqpoint{0.037276in}{-0.021649in}}{\pgfqpoint{0.041667in}{-0.011050in}}{\pgfqpoint{0.041667in}{0.000000in}}%
     1923\pgfpathcurveto{\pgfqpoint{0.041667in}{0.011050in}}{\pgfqpoint{0.037276in}{0.021649in}}{\pgfqpoint{0.029463in}{0.029463in}}%
     1924\pgfpathcurveto{\pgfqpoint{0.021649in}{0.037276in}}{\pgfqpoint{0.011050in}{0.041667in}}{\pgfqpoint{0.000000in}{0.041667in}}%
     1925\pgfpathcurveto{\pgfqpoint{-0.011050in}{0.041667in}}{\pgfqpoint{-0.021649in}{0.037276in}}{\pgfqpoint{-0.029463in}{0.029463in}}%
     1926\pgfpathcurveto{\pgfqpoint{-0.037276in}{0.021649in}}{\pgfqpoint{-0.041667in}{0.011050in}}{\pgfqpoint{-0.041667in}{0.000000in}}%
     1927\pgfpathcurveto{\pgfqpoint{-0.041667in}{-0.011050in}}{\pgfqpoint{-0.037276in}{-0.021649in}}{\pgfqpoint{-0.029463in}{-0.029463in}}%
     1928\pgfpathcurveto{\pgfqpoint{-0.021649in}{-0.037276in}}{\pgfqpoint{-0.011050in}{-0.041667in}}{\pgfqpoint{0.000000in}{-0.041667in}}%
    19191929\pgfpathclose%
    19201930\pgfusepath{stroke,fill}%
     
    19661976\pgfusepath{clip}%
    19671977\pgfsetbuttcap%
    1968 \pgfsetmiterjoin%
     1978\pgfsetroundjoin%
    19691979\definecolor{currentfill}{rgb}{0.172549,0.627451,0.172549}%
    19701980\pgfsetfillcolor{currentfill}%
     
    19731983\pgfsetstrokecolor{currentstroke}%
    19741984\pgfsetdash{}{0pt}%
    1975 \pgfsys@defobject{currentmarker}{\pgfqpoint{-0.036084in}{-0.041667in}}{\pgfqpoint{0.036084in}{0.041667in}}{%
    1976 \pgfpathmoveto{\pgfqpoint{0.000000in}{0.041667in}}%
    1977 \pgfpathlineto{\pgfqpoint{-0.036084in}{0.020833in}}%
    1978 \pgfpathlineto{\pgfqpoint{-0.036084in}{-0.020833in}}%
    1979 \pgfpathlineto{\pgfqpoint{-0.000000in}{-0.041667in}}%
    1980 \pgfpathlineto{\pgfqpoint{0.036084in}{-0.020833in}}%
    1981 \pgfpathlineto{\pgfqpoint{0.036084in}{0.020833in}}%
     1985\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.041667in}{-0.041667in}}{\pgfqpoint{0.041667in}{0.041667in}}{%
     1986\pgfpathmoveto{\pgfqpoint{0.000000in}{-0.041667in}}%
     1987\pgfpathcurveto{\pgfqpoint{0.011050in}{-0.041667in}}{\pgfqpoint{0.021649in}{-0.037276in}}{\pgfqpoint{0.029463in}{-0.029463in}}%
     1988\pgfpathcurveto{\pgfqpoint{0.037276in}{-0.021649in}}{\pgfqpoint{0.041667in}{-0.011050in}}{\pgfqpoint{0.041667in}{0.000000in}}%
     1989\pgfpathcurveto{\pgfqpoint{0.041667in}{0.011050in}}{\pgfqpoint{0.037276in}{0.021649in}}{\pgfqpoint{0.029463in}{0.029463in}}%
     1990\pgfpathcurveto{\pgfqpoint{0.021649in}{0.037276in}}{\pgfqpoint{0.011050in}{0.041667in}}{\pgfqpoint{0.000000in}{0.041667in}}%
     1991\pgfpathcurveto{\pgfqpoint{-0.011050in}{0.041667in}}{\pgfqpoint{-0.021649in}{0.037276in}}{\pgfqpoint{-0.029463in}{0.029463in}}%
     1992\pgfpathcurveto{\pgfqpoint{-0.037276in}{0.021649in}}{\pgfqpoint{-0.041667in}{0.011050in}}{\pgfqpoint{-0.041667in}{0.000000in}}%
     1993\pgfpathcurveto{\pgfqpoint{-0.041667in}{-0.011050in}}{\pgfqpoint{-0.037276in}{-0.021649in}}{\pgfqpoint{-0.029463in}{-0.029463in}}%
     1994\pgfpathcurveto{\pgfqpoint{-0.021649in}{-0.037276in}}{\pgfqpoint{-0.011050in}{-0.041667in}}{\pgfqpoint{0.000000in}{-0.041667in}}%
    19821995\pgfpathclose%
    19831996\pgfusepath{stroke,fill}%
     
    20292042\pgfusepath{clip}%
    20302043\pgfsetbuttcap%
    2031 \pgfsetbeveljoin%
     2044\pgfsetroundjoin%
    20322045\definecolor{currentfill}{rgb}{0.839216,0.152941,0.156863}%
    20332046\pgfsetfillcolor{currentfill}%
     
    20362049\pgfsetstrokecolor{currentstroke}%
    20372050\pgfsetdash{}{0pt}%
    2038 \pgfsys@defobject{currentmarker}{\pgfqpoint{-0.039627in}{-0.033709in}}{\pgfqpoint{0.039627in}{0.041667in}}{%
    2039 \pgfpathmoveto{\pgfqpoint{0.000000in}{0.041667in}}%
    2040 \pgfpathlineto{\pgfqpoint{-0.009355in}{0.012876in}}%
    2041 \pgfpathlineto{\pgfqpoint{-0.039627in}{0.012876in}}%
    2042 \pgfpathlineto{\pgfqpoint{-0.015136in}{-0.004918in}}%
    2043 \pgfpathlineto{\pgfqpoint{-0.024491in}{-0.033709in}}%
    2044 \pgfpathlineto{\pgfqpoint{-0.000000in}{-0.015915in}}%
    2045 \pgfpathlineto{\pgfqpoint{0.024491in}{-0.033709in}}%
    2046 \pgfpathlineto{\pgfqpoint{0.015136in}{-0.004918in}}%
    2047 \pgfpathlineto{\pgfqpoint{0.039627in}{0.012876in}}%
    2048 \pgfpathlineto{\pgfqpoint{0.009355in}{0.012876in}}%
     2051\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.041667in}{-0.041667in}}{\pgfqpoint{0.041667in}{0.041667in}}{%
     2052\pgfpathmoveto{\pgfqpoint{0.000000in}{-0.041667in}}%
     2053\pgfpathcurveto{\pgfqpoint{0.011050in}{-0.041667in}}{\pgfqpoint{0.021649in}{-0.037276in}}{\pgfqpoint{0.029463in}{-0.029463in}}%
     2054\pgfpathcurveto{\pgfqpoint{0.037276in}{-0.021649in}}{\pgfqpoint{0.041667in}{-0.011050in}}{\pgfqpoint{0.041667in}{0.000000in}}%
     2055\pgfpathcurveto{\pgfqpoint{0.041667in}{0.011050in}}{\pgfqpoint{0.037276in}{0.021649in}}{\pgfqpoint{0.029463in}{0.029463in}}%
     2056\pgfpathcurveto{\pgfqpoint{0.021649in}{0.037276in}}{\pgfqpoint{0.011050in}{0.041667in}}{\pgfqpoint{0.000000in}{0.041667in}}%
     2057\pgfpathcurveto{\pgfqpoint{-0.011050in}{0.041667in}}{\pgfqpoint{-0.021649in}{0.037276in}}{\pgfqpoint{-0.029463in}{0.029463in}}%
     2058\pgfpathcurveto{\pgfqpoint{-0.037276in}{0.021649in}}{\pgfqpoint{-0.041667in}{0.011050in}}{\pgfqpoint{-0.041667in}{0.000000in}}%
     2059\pgfpathcurveto{\pgfqpoint{-0.041667in}{-0.011050in}}{\pgfqpoint{-0.037276in}{-0.021649in}}{\pgfqpoint{-0.029463in}{-0.029463in}}%
     2060\pgfpathcurveto{\pgfqpoint{-0.021649in}{-0.037276in}}{\pgfqpoint{-0.011050in}{-0.041667in}}{\pgfqpoint{0.000000in}{-0.041667in}}%
    20492061\pgfpathclose%
    20502062\pgfusepath{stroke,fill}%
     
    21232135\pgfsetstrokecolor{textcolor}%
    21242136\pgfsetfillcolor{textcolor}%
    2125 \pgftext[x=3.280000in,y=4.307333in,,base]{\color{textcolor}\rmfamily\fontsize{19.200000}{23.040000}\selectfont Aggregate Lock Benchmark: 4 Locks}%
     2137\pgftext[x=3.280000in,y=4.307333in,,base]{\color{textcolor}\rmfamily\fontsize{12.000000}{14.400000}\selectfont Aggregate Lock Benchmark: 4 Locks}%
    21262138\end{pgfscope}%
    21272139\begin{pgfscope}%
     
    21362148\pgfsetstrokeopacity{0.800000}%
    21372149\pgfsetdash{}{0pt}%
    2138 \pgfpathmoveto{\pgfqpoint{3.602702in}{1.693747in}}%
    2139 \pgfpathlineto{\pgfqpoint{5.604444in}{1.693747in}}%
    2140 \pgfpathquadraticcurveto{\pgfqpoint{5.648889in}{1.693747in}}{\pgfqpoint{5.648889in}{1.738192in}}%
    2141 \pgfpathlineto{\pgfqpoint{5.648889in}{3.013808in}}%
    2142 \pgfpathquadraticcurveto{\pgfqpoint{5.648889in}{3.058253in}}{\pgfqpoint{5.604444in}{3.058253in}}%
    2143 \pgfpathlineto{\pgfqpoint{3.602702in}{3.058253in}}%
    2144 \pgfpathquadraticcurveto{\pgfqpoint{3.558257in}{3.058253in}}{\pgfqpoint{3.558257in}{3.013808in}}%
    2145 \pgfpathlineto{\pgfqpoint{3.558257in}{1.738192in}}%
    2146 \pgfpathquadraticcurveto{\pgfqpoint{3.558257in}{1.693747in}}{\pgfqpoint{3.602702in}{1.693747in}}%
     2150\pgfpathmoveto{\pgfqpoint{0.897222in}{0.597444in}}%
     2151\pgfpathlineto{\pgfqpoint{2.156483in}{0.597444in}}%
     2152\pgfpathquadraticcurveto{\pgfqpoint{2.184261in}{0.597444in}}{\pgfqpoint{2.184261in}{0.625222in}}%
     2153\pgfpathlineto{\pgfqpoint{2.184261in}{1.386024in}}%
     2154\pgfpathquadraticcurveto{\pgfqpoint{2.184261in}{1.413802in}}{\pgfqpoint{2.156483in}{1.413802in}}%
     2155\pgfpathlineto{\pgfqpoint{0.897222in}{1.413802in}}%
     2156\pgfpathquadraticcurveto{\pgfqpoint{0.869444in}{1.413802in}}{\pgfqpoint{0.869444in}{1.386024in}}%
     2157\pgfpathlineto{\pgfqpoint{0.869444in}{0.625222in}}%
     2158\pgfpathquadraticcurveto{\pgfqpoint{0.869444in}{0.597444in}}{\pgfqpoint{0.897222in}{0.597444in}}%
    21472159\pgfpathclose%
    21482160\pgfusepath{stroke,fill}%
     
    21552167\pgfsetstrokecolor{currentstroke}%
    21562168\pgfsetdash{}{0pt}%
    2157 \pgfpathmoveto{\pgfqpoint{3.869368in}{2.769364in}}%
    2158 \pgfpathlineto{\pgfqpoint{3.869368in}{2.991586in}}%
     2169\pgfpathmoveto{\pgfqpoint{1.063889in}{1.240191in}}%
     2170\pgfpathlineto{\pgfqpoint{1.063889in}{1.379080in}}%
    21592171\pgfusepath{stroke}%
    21602172\end{pgfscope}%
     
    21742186}%
    21752187\begin{pgfscope}%
    2176 \pgfsys@transformshift{3.869368in}{2.769364in}%
     2188\pgfsys@transformshift{1.063889in}{1.240191in}%
    21772189\pgfsys@useobject{currentmarker}{}%
    21782190\end{pgfscope}%
     
    21932205}%
    21942206\begin{pgfscope}%
    2195 \pgfsys@transformshift{3.869368in}{2.991586in}%
     2207\pgfsys@transformshift{1.063889in}{1.379080in}%
    21962208\pgfsys@useobject{currentmarker}{}%
    21972209\end{pgfscope}%
     
    22042216\pgfsetstrokecolor{currentstroke}%
    22052217\pgfsetdash{}{0pt}%
    2206 \pgfpathmoveto{\pgfqpoint{3.647146in}{2.880475in}}%
    2207 \pgfpathlineto{\pgfqpoint{4.091591in}{2.880475in}}%
    2208 \pgfusepath{stroke}%
    2209 \end{pgfscope}%
    2210 \begin{pgfscope}%
    2211 \pgfsetbuttcap%
    2212 \pgfsetmiterjoin%
     2218\pgfpathmoveto{\pgfqpoint{0.925000in}{1.309636in}}%
     2219\pgfpathlineto{\pgfqpoint{1.202778in}{1.309636in}}%
     2220\pgfusepath{stroke}%
     2221\end{pgfscope}%
     2222\begin{pgfscope}%
     2223\pgfsetbuttcap%
     2224\pgfsetroundjoin%
    22132225\definecolor{currentfill}{rgb}{0.121569,0.466667,0.705882}%
    22142226\pgfsetfillcolor{currentfill}%
     
    22172229\pgfsetstrokecolor{currentstroke}%
    22182230\pgfsetdash{}{0pt}%
    2219 \pgfsys@defobject{currentmarker}{\pgfqpoint{-0.039627in}{-0.033709in}}{\pgfqpoint{0.039627in}{0.041667in}}{%
    2220 \pgfpathmoveto{\pgfqpoint{0.000000in}{0.041667in}}%
    2221 \pgfpathlineto{\pgfqpoint{-0.039627in}{0.012876in}}%
    2222 \pgfpathlineto{\pgfqpoint{-0.024491in}{-0.033709in}}%
    2223 \pgfpathlineto{\pgfqpoint{0.024491in}{-0.033709in}}%
    2224 \pgfpathlineto{\pgfqpoint{0.039627in}{0.012876in}}%
     2231\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.041667in}{-0.041667in}}{\pgfqpoint{0.041667in}{0.041667in}}{%
     2232\pgfpathmoveto{\pgfqpoint{0.000000in}{-0.041667in}}%
     2233\pgfpathcurveto{\pgfqpoint{0.011050in}{-0.041667in}}{\pgfqpoint{0.021649in}{-0.037276in}}{\pgfqpoint{0.029463in}{-0.029463in}}%
     2234\pgfpathcurveto{\pgfqpoint{0.037276in}{-0.021649in}}{\pgfqpoint{0.041667in}{-0.011050in}}{\pgfqpoint{0.041667in}{0.000000in}}%
     2235\pgfpathcurveto{\pgfqpoint{0.041667in}{0.011050in}}{\pgfqpoint{0.037276in}{0.021649in}}{\pgfqpoint{0.029463in}{0.029463in}}%
     2236\pgfpathcurveto{\pgfqpoint{0.021649in}{0.037276in}}{\pgfqpoint{0.011050in}{0.041667in}}{\pgfqpoint{0.000000in}{0.041667in}}%
     2237\pgfpathcurveto{\pgfqpoint{-0.011050in}{0.041667in}}{\pgfqpoint{-0.021649in}{0.037276in}}{\pgfqpoint{-0.029463in}{0.029463in}}%
     2238\pgfpathcurveto{\pgfqpoint{-0.037276in}{0.021649in}}{\pgfqpoint{-0.041667in}{0.011050in}}{\pgfqpoint{-0.041667in}{0.000000in}}%
     2239\pgfpathcurveto{\pgfqpoint{-0.041667in}{-0.011050in}}{\pgfqpoint{-0.037276in}{-0.021649in}}{\pgfqpoint{-0.029463in}{-0.029463in}}%
     2240\pgfpathcurveto{\pgfqpoint{-0.021649in}{-0.037276in}}{\pgfqpoint{-0.011050in}{-0.041667in}}{\pgfqpoint{0.000000in}{-0.041667in}}%
    22252241\pgfpathclose%
    22262242\pgfusepath{stroke,fill}%
    22272243}%
    22282244\begin{pgfscope}%
    2229 \pgfsys@transformshift{3.869368in}{2.880475in}%
     2245\pgfsys@transformshift{1.063889in}{1.309636in}%
    22302246\pgfsys@useobject{currentmarker}{}%
    22312247\end{pgfscope}%
     
    22352251\pgfsetstrokecolor{textcolor}%
    22362252\pgfsetfillcolor{textcolor}%
    2237 \pgftext[x=4.269368in,y=2.802697in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont CFA-baseline}%
     2253\pgftext[x=1.313889in,y=1.261024in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont CFA-baseline}%
    22382254\end{pgfscope}%
    22392255\begin{pgfscope}%
     
    22442260\pgfsetstrokecolor{currentstroke}%
    22452261\pgfsetdash{}{0pt}%
    2246 \pgfpathmoveto{\pgfqpoint{3.869368in}{2.444904in}}%
    2247 \pgfpathlineto{\pgfqpoint{3.869368in}{2.667126in}}%
     2262\pgfpathmoveto{\pgfqpoint{1.063889in}{1.046518in}}%
     2263\pgfpathlineto{\pgfqpoint{1.063889in}{1.185407in}}%
    22482264\pgfusepath{stroke}%
    22492265\end{pgfscope}%
     
    22632279}%
    22642280\begin{pgfscope}%
    2265 \pgfsys@transformshift{3.869368in}{2.444904in}%
     2281\pgfsys@transformshift{1.063889in}{1.046518in}%
    22662282\pgfsys@useobject{currentmarker}{}%
    22672283\end{pgfscope}%
     
    22822298}%
    22832299\begin{pgfscope}%
    2284 \pgfsys@transformshift{3.869368in}{2.667126in}%
     2300\pgfsys@transformshift{1.063889in}{1.185407in}%
    22852301\pgfsys@useobject{currentmarker}{}%
    22862302\end{pgfscope}%
     
    22932309\pgfsetstrokecolor{currentstroke}%
    22942310\pgfsetdash{}{0pt}%
    2295 \pgfpathmoveto{\pgfqpoint{3.647146in}{2.556015in}}%
    2296 \pgfpathlineto{\pgfqpoint{4.091591in}{2.556015in}}%
    2297 \pgfusepath{stroke}%
    2298 \end{pgfscope}%
    2299 \begin{pgfscope}%
    2300 \pgfsetbuttcap%
    2301 \pgfsetmiterjoin%
     2311\pgfpathmoveto{\pgfqpoint{0.925000in}{1.115963in}}%
     2312\pgfpathlineto{\pgfqpoint{1.202778in}{1.115963in}}%
     2313\pgfusepath{stroke}%
     2314\end{pgfscope}%
     2315\begin{pgfscope}%
     2316\pgfsetbuttcap%
     2317\pgfsetroundjoin%
    23022318\definecolor{currentfill}{rgb}{1.000000,0.498039,0.054902}%
    23032319\pgfsetfillcolor{currentfill}%
     
    23072323\pgfsetdash{}{0pt}%
    23082324\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.041667in}{-0.041667in}}{\pgfqpoint{0.041667in}{0.041667in}}{%
    2309 \pgfpathmoveto{\pgfqpoint{0.000000in}{0.041667in}}%
    2310 \pgfpathlineto{\pgfqpoint{-0.041667in}{-0.041667in}}%
    2311 \pgfpathlineto{\pgfqpoint{0.041667in}{-0.041667in}}%
     2325\pgfpathmoveto{\pgfqpoint{0.000000in}{-0.041667in}}%
     2326\pgfpathcurveto{\pgfqpoint{0.011050in}{-0.041667in}}{\pgfqpoint{0.021649in}{-0.037276in}}{\pgfqpoint{0.029463in}{-0.029463in}}%
     2327\pgfpathcurveto{\pgfqpoint{0.037276in}{-0.021649in}}{\pgfqpoint{0.041667in}{-0.011050in}}{\pgfqpoint{0.041667in}{0.000000in}}%
     2328\pgfpathcurveto{\pgfqpoint{0.041667in}{0.011050in}}{\pgfqpoint{0.037276in}{0.021649in}}{\pgfqpoint{0.029463in}{0.029463in}}%
     2329\pgfpathcurveto{\pgfqpoint{0.021649in}{0.037276in}}{\pgfqpoint{0.011050in}{0.041667in}}{\pgfqpoint{0.000000in}{0.041667in}}%
     2330\pgfpathcurveto{\pgfqpoint{-0.011050in}{0.041667in}}{\pgfqpoint{-0.021649in}{0.037276in}}{\pgfqpoint{-0.029463in}{0.029463in}}%
     2331\pgfpathcurveto{\pgfqpoint{-0.037276in}{0.021649in}}{\pgfqpoint{-0.041667in}{0.011050in}}{\pgfqpoint{-0.041667in}{0.000000in}}%
     2332\pgfpathcurveto{\pgfqpoint{-0.041667in}{-0.011050in}}{\pgfqpoint{-0.037276in}{-0.021649in}}{\pgfqpoint{-0.029463in}{-0.029463in}}%
     2333\pgfpathcurveto{\pgfqpoint{-0.021649in}{-0.037276in}}{\pgfqpoint{-0.011050in}{-0.041667in}}{\pgfqpoint{0.000000in}{-0.041667in}}%
    23122334\pgfpathclose%
    23132335\pgfusepath{stroke,fill}%
    23142336}%
    23152337\begin{pgfscope}%
    2316 \pgfsys@transformshift{3.869368in}{2.556015in}%
     2338\pgfsys@transformshift{1.063889in}{1.115963in}%
    23172339\pgfsys@useobject{currentmarker}{}%
    23182340\end{pgfscope}%
     
    23222344\pgfsetstrokecolor{textcolor}%
    23232345\pgfsetfillcolor{textcolor}%
    2324 \pgftext[x=4.269368in,y=2.478238in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont CPP-baseline}%
     2346\pgftext[x=1.313889in,y=1.067352in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont CPP-baseline}%
    23252347\end{pgfscope}%
    23262348\begin{pgfscope}%
     
    23312353\pgfsetstrokecolor{currentstroke}%
    23322354\pgfsetdash{}{0pt}%
    2333 \pgfpathmoveto{\pgfqpoint{3.869368in}{2.120444in}}%
    2334 \pgfpathlineto{\pgfqpoint{3.869368in}{2.342667in}}%
     2355\pgfpathmoveto{\pgfqpoint{1.063889in}{0.852846in}}%
     2356\pgfpathlineto{\pgfqpoint{1.063889in}{0.991734in}}%
    23352357\pgfusepath{stroke}%
    23362358\end{pgfscope}%
     
    23502372}%
    23512373\begin{pgfscope}%
    2352 \pgfsys@transformshift{3.869368in}{2.120444in}%
     2374\pgfsys@transformshift{1.063889in}{0.852846in}%
    23532375\pgfsys@useobject{currentmarker}{}%
    23542376\end{pgfscope}%
     
    23692391}%
    23702392\begin{pgfscope}%
    2371 \pgfsys@transformshift{3.869368in}{2.342667in}%
     2393\pgfsys@transformshift{1.063889in}{0.991734in}%
    23722394\pgfsys@useobject{currentmarker}{}%
    23732395\end{pgfscope}%
     
    23802402\pgfsetstrokecolor{currentstroke}%
    23812403\pgfsetdash{}{0pt}%
    2382 \pgfpathmoveto{\pgfqpoint{3.647146in}{2.231556in}}%
    2383 \pgfpathlineto{\pgfqpoint{4.091591in}{2.231556in}}%
    2384 \pgfusepath{stroke}%
    2385 \end{pgfscope}%
    2386 \begin{pgfscope}%
    2387 \pgfsetbuttcap%
    2388 \pgfsetmiterjoin%
     2404\pgfpathmoveto{\pgfqpoint{0.925000in}{0.922290in}}%
     2405\pgfpathlineto{\pgfqpoint{1.202778in}{0.922290in}}%
     2406\pgfusepath{stroke}%
     2407\end{pgfscope}%
     2408\begin{pgfscope}%
     2409\pgfsetbuttcap%
     2410\pgfsetroundjoin%
    23892411\definecolor{currentfill}{rgb}{0.172549,0.627451,0.172549}%
    23902412\pgfsetfillcolor{currentfill}%
     
    23932415\pgfsetstrokecolor{currentstroke}%
    23942416\pgfsetdash{}{0pt}%
    2395 \pgfsys@defobject{currentmarker}{\pgfqpoint{-0.036084in}{-0.041667in}}{\pgfqpoint{0.036084in}{0.041667in}}{%
    2396 \pgfpathmoveto{\pgfqpoint{0.000000in}{0.041667in}}%
    2397 \pgfpathlineto{\pgfqpoint{-0.036084in}{0.020833in}}%
    2398 \pgfpathlineto{\pgfqpoint{-0.036084in}{-0.020833in}}%
    2399 \pgfpathlineto{\pgfqpoint{-0.000000in}{-0.041667in}}%
    2400 \pgfpathlineto{\pgfqpoint{0.036084in}{-0.020833in}}%
    2401 \pgfpathlineto{\pgfqpoint{0.036084in}{0.020833in}}%
     2417\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.041667in}{-0.041667in}}{\pgfqpoint{0.041667in}{0.041667in}}{%
     2418\pgfpathmoveto{\pgfqpoint{0.000000in}{-0.041667in}}%
     2419\pgfpathcurveto{\pgfqpoint{0.011050in}{-0.041667in}}{\pgfqpoint{0.021649in}{-0.037276in}}{\pgfqpoint{0.029463in}{-0.029463in}}%
     2420\pgfpathcurveto{\pgfqpoint{0.037276in}{-0.021649in}}{\pgfqpoint{0.041667in}{-0.011050in}}{\pgfqpoint{0.041667in}{0.000000in}}%
     2421\pgfpathcurveto{\pgfqpoint{0.041667in}{0.011050in}}{\pgfqpoint{0.037276in}{0.021649in}}{\pgfqpoint{0.029463in}{0.029463in}}%
     2422\pgfpathcurveto{\pgfqpoint{0.021649in}{0.037276in}}{\pgfqpoint{0.011050in}{0.041667in}}{\pgfqpoint{0.000000in}{0.041667in}}%
     2423\pgfpathcurveto{\pgfqpoint{-0.011050in}{0.041667in}}{\pgfqpoint{-0.021649in}{0.037276in}}{\pgfqpoint{-0.029463in}{0.029463in}}%
     2424\pgfpathcurveto{\pgfqpoint{-0.037276in}{0.021649in}}{\pgfqpoint{-0.041667in}{0.011050in}}{\pgfqpoint{-0.041667in}{0.000000in}}%
     2425\pgfpathcurveto{\pgfqpoint{-0.041667in}{-0.011050in}}{\pgfqpoint{-0.037276in}{-0.021649in}}{\pgfqpoint{-0.029463in}{-0.029463in}}%
     2426\pgfpathcurveto{\pgfqpoint{-0.021649in}{-0.037276in}}{\pgfqpoint{-0.011050in}{-0.041667in}}{\pgfqpoint{0.000000in}{-0.041667in}}%
    24022427\pgfpathclose%
    24032428\pgfusepath{stroke,fill}%
    24042429}%
    24052430\begin{pgfscope}%
    2406 \pgfsys@transformshift{3.869368in}{2.231556in}%
     2431\pgfsys@transformshift{1.063889in}{0.922290in}%
    24072432\pgfsys@useobject{currentmarker}{}%
    24082433\end{pgfscope}%
     
    24122437\pgfsetstrokecolor{textcolor}%
    24132438\pgfsetfillcolor{textcolor}%
    2414 \pgftext[x=4.269368in,y=2.153778in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont CFA-rand}%
     2439\pgftext[x=1.313889in,y=0.873679in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont CFA-rand}%
    24152440\end{pgfscope}%
    24162441\begin{pgfscope}%
     
    24212446\pgfsetstrokecolor{currentstroke}%
    24222447\pgfsetdash{}{0pt}%
    2423 \pgfpathmoveto{\pgfqpoint{3.869368in}{1.795985in}}%
    2424 \pgfpathlineto{\pgfqpoint{3.869368in}{2.018207in}}%
     2448\pgfpathmoveto{\pgfqpoint{1.063889in}{0.659173in}}%
     2449\pgfpathlineto{\pgfqpoint{1.063889in}{0.798062in}}%
    24252450\pgfusepath{stroke}%
    24262451\end{pgfscope}%
     
    24402465}%
    24412466\begin{pgfscope}%
    2442 \pgfsys@transformshift{3.869368in}{1.795985in}%
     2467\pgfsys@transformshift{1.063889in}{0.659173in}%
    24432468\pgfsys@useobject{currentmarker}{}%
    24442469\end{pgfscope}%
     
    24592484}%
    24602485\begin{pgfscope}%
    2461 \pgfsys@transformshift{3.869368in}{2.018207in}%
     2486\pgfsys@transformshift{1.063889in}{0.798062in}%
    24622487\pgfsys@useobject{currentmarker}{}%
    24632488\end{pgfscope}%
     
    24702495\pgfsetstrokecolor{currentstroke}%
    24712496\pgfsetdash{}{0pt}%
    2472 \pgfpathmoveto{\pgfqpoint{3.647146in}{1.907096in}}%
    2473 \pgfpathlineto{\pgfqpoint{4.091591in}{1.907096in}}%
    2474 \pgfusepath{stroke}%
    2475 \end{pgfscope}%
    2476 \begin{pgfscope}%
    2477 \pgfsetbuttcap%
    2478 \pgfsetbeveljoin%
     2497\pgfpathmoveto{\pgfqpoint{0.925000in}{0.728617in}}%
     2498\pgfpathlineto{\pgfqpoint{1.202778in}{0.728617in}}%
     2499\pgfusepath{stroke}%
     2500\end{pgfscope}%
     2501\begin{pgfscope}%
     2502\pgfsetbuttcap%
     2503\pgfsetroundjoin%
    24792504\definecolor{currentfill}{rgb}{0.839216,0.152941,0.156863}%
    24802505\pgfsetfillcolor{currentfill}%
     
    24832508\pgfsetstrokecolor{currentstroke}%
    24842509\pgfsetdash{}{0pt}%
    2485 \pgfsys@defobject{currentmarker}{\pgfqpoint{-0.039627in}{-0.033709in}}{\pgfqpoint{0.039627in}{0.041667in}}{%
    2486 \pgfpathmoveto{\pgfqpoint{0.000000in}{0.041667in}}%
    2487 \pgfpathlineto{\pgfqpoint{-0.009355in}{0.012876in}}%
    2488 \pgfpathlineto{\pgfqpoint{-0.039627in}{0.012876in}}%
    2489 \pgfpathlineto{\pgfqpoint{-0.015136in}{-0.004918in}}%
    2490 \pgfpathlineto{\pgfqpoint{-0.024491in}{-0.033709in}}%
    2491 \pgfpathlineto{\pgfqpoint{-0.000000in}{-0.015915in}}%
    2492 \pgfpathlineto{\pgfqpoint{0.024491in}{-0.033709in}}%
    2493 \pgfpathlineto{\pgfqpoint{0.015136in}{-0.004918in}}%
    2494 \pgfpathlineto{\pgfqpoint{0.039627in}{0.012876in}}%
    2495 \pgfpathlineto{\pgfqpoint{0.009355in}{0.012876in}}%
     2510\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.041667in}{-0.041667in}}{\pgfqpoint{0.041667in}{0.041667in}}{%
     2511\pgfpathmoveto{\pgfqpoint{0.000000in}{-0.041667in}}%
     2512\pgfpathcurveto{\pgfqpoint{0.011050in}{-0.041667in}}{\pgfqpoint{0.021649in}{-0.037276in}}{\pgfqpoint{0.029463in}{-0.029463in}}%
     2513\pgfpathcurveto{\pgfqpoint{0.037276in}{-0.021649in}}{\pgfqpoint{0.041667in}{-0.011050in}}{\pgfqpoint{0.041667in}{0.000000in}}%
     2514\pgfpathcurveto{\pgfqpoint{0.041667in}{0.011050in}}{\pgfqpoint{0.037276in}{0.021649in}}{\pgfqpoint{0.029463in}{0.029463in}}%
     2515\pgfpathcurveto{\pgfqpoint{0.021649in}{0.037276in}}{\pgfqpoint{0.011050in}{0.041667in}}{\pgfqpoint{0.000000in}{0.041667in}}%
     2516\pgfpathcurveto{\pgfqpoint{-0.011050in}{0.041667in}}{\pgfqpoint{-0.021649in}{0.037276in}}{\pgfqpoint{-0.029463in}{0.029463in}}%
     2517\pgfpathcurveto{\pgfqpoint{-0.037276in}{0.021649in}}{\pgfqpoint{-0.041667in}{0.011050in}}{\pgfqpoint{-0.041667in}{0.000000in}}%
     2518\pgfpathcurveto{\pgfqpoint{-0.041667in}{-0.011050in}}{\pgfqpoint{-0.037276in}{-0.021649in}}{\pgfqpoint{-0.029463in}{-0.029463in}}%
     2519\pgfpathcurveto{\pgfqpoint{-0.021649in}{-0.037276in}}{\pgfqpoint{-0.011050in}{-0.041667in}}{\pgfqpoint{0.000000in}{-0.041667in}}%
    24962520\pgfpathclose%
    24972521\pgfusepath{stroke,fill}%
    24982522}%
    24992523\begin{pgfscope}%
    2500 \pgfsys@transformshift{3.869368in}{1.907096in}%
     2524\pgfsys@transformshift{1.063889in}{0.728617in}%
    25012525\pgfsys@useobject{currentmarker}{}%
    25022526\end{pgfscope}%
     
    25062530\pgfsetstrokecolor{textcolor}%
    25072531\pgfsetfillcolor{textcolor}%
    2508 \pgftext[x=4.269368in,y=1.829318in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont CPP-rand}%
     2532\pgftext[x=1.313889in,y=0.680006in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont CPP-rand}%
    25092533\end{pgfscope}%
    25102534\end{pgfpicture}%
  • doc/theses/colby_parsons_MMAth/figures/pyke_Aggregate_Lock_8.pgf

    r044ae62 r3a513d89  
    7777\pgfsetstrokecolor{textcolor}%
    7878\pgfsetfillcolor{textcolor}%
    79 \pgftext[x=1.025455in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 2\)}%
     79\pgftext[x=1.025455in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 2\)}%
    8080\end{pgfscope}%
    8181\begin{pgfscope}%
     
    102102\pgfsetstrokecolor{textcolor}%
    103103\pgfsetfillcolor{textcolor}%
    104 \pgftext[x=1.326061in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 4\)}%
     104\pgftext[x=1.326061in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 4\)}%
    105105\end{pgfscope}%
    106106\begin{pgfscope}%
     
    127127\pgfsetstrokecolor{textcolor}%
    128128\pgfsetfillcolor{textcolor}%
    129 \pgftext[x=1.927273in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 8\)}%
     129\pgftext[x=1.927273in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 8\)}%
    130130\end{pgfscope}%
    131131\begin{pgfscope}%
     
    152152\pgfsetstrokecolor{textcolor}%
    153153\pgfsetfillcolor{textcolor}%
    154 \pgftext[x=3.129697in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 16\)}%
     154\pgftext[x=3.129697in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 16\)}%
    155155\end{pgfscope}%
    156156\begin{pgfscope}%
     
    177177\pgfsetstrokecolor{textcolor}%
    178178\pgfsetfillcolor{textcolor}%
    179 \pgftext[x=4.332121in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 24\)}%
     179\pgftext[x=4.332121in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 24\)}%
    180180\end{pgfscope}%
    181181\begin{pgfscope}%
     
    202202\pgfsetstrokecolor{textcolor}%
    203203\pgfsetfillcolor{textcolor}%
    204 \pgftext[x=5.534545in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 32\)}%
     204\pgftext[x=5.534545in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 32\)}%
    205205\end{pgfscope}%
    206206\begin{pgfscope}%
     
    208208\pgfsetstrokecolor{textcolor}%
    209209\pgfsetfillcolor{textcolor}%
    210 \pgftext[x=3.280000in,y=0.161874in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont Cores}%
     210\pgftext[x=3.280000in,y=0.251766in,,top]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont Cores}%
    211211\end{pgfscope}%
    212212\begin{pgfscope}%
     
    233233\pgfsetstrokecolor{textcolor}%
    234234\pgfsetfillcolor{textcolor}%
    235 \pgftext[x=0.399655in,y=0.575766in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 10^{2}\)}%
     235\pgftext[x=0.501581in,y=0.610874in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 10^{2}\)}%
    236236\end{pgfscope}%
    237237\begin{pgfscope}%
     
    258258\pgfsetstrokecolor{textcolor}%
    259259\pgfsetfillcolor{textcolor}%
    260 \pgftext[x=0.399655in,y=1.181854in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 10^{3}\)}%
     260\pgftext[x=0.501581in,y=1.216962in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 10^{3}\)}%
    261261\end{pgfscope}%
    262262\begin{pgfscope}%
     
    283283\pgfsetstrokecolor{textcolor}%
    284284\pgfsetfillcolor{textcolor}%
    285 \pgftext[x=0.399655in,y=1.787942in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 10^{4}\)}%
     285\pgftext[x=0.501581in,y=1.823050in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 10^{4}\)}%
    286286\end{pgfscope}%
    287287\begin{pgfscope}%
     
    308308\pgfsetstrokecolor{textcolor}%
    309309\pgfsetfillcolor{textcolor}%
    310 \pgftext[x=0.399655in,y=2.394030in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 10^{5}\)}%
     310\pgftext[x=0.501581in,y=2.429138in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 10^{5}\)}%
    311311\end{pgfscope}%
    312312\begin{pgfscope}%
     
    333333\pgfsetstrokecolor{textcolor}%
    334334\pgfsetfillcolor{textcolor}%
    335 \pgftext[x=0.399655in,y=3.000119in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 10^{6}\)}%
     335\pgftext[x=0.501581in,y=3.035227in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 10^{6}\)}%
    336336\end{pgfscope}%
    337337\begin{pgfscope}%
     
    358358\pgfsetstrokecolor{textcolor}%
    359359\pgfsetfillcolor{textcolor}%
    360 \pgftext[x=0.399655in,y=3.606207in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 10^{7}\)}%
     360\pgftext[x=0.501581in,y=3.641315in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 10^{7}\)}%
    361361\end{pgfscope}%
    362362\begin{pgfscope}%
     
    12951295\pgfsetstrokecolor{textcolor}%
    12961296\pgfsetfillcolor{textcolor}%
    1297 \pgftext[x=0.344100in,y=2.376000in,,bottom,rotate=90.000000]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont Throughput (entries)}%
     1297\pgftext[x=0.446026in,y=2.376000in,,bottom,rotate=90.000000]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont Throughput (entries)}%
    12981298\end{pgfscope}%
    12991299\begin{pgfscope}%
     
    19581958\pgfusepath{clip}%
    19591959\pgfsetbuttcap%
    1960 \pgfsetmiterjoin%
     1960\pgfsetroundjoin%
    19611961\definecolor{currentfill}{rgb}{0.121569,0.466667,0.705882}%
    19621962\pgfsetfillcolor{currentfill}%
    19631963\pgfsetlinewidth{1.003750pt}%
    19641964\definecolor{currentstroke}{rgb}{0.121569,0.466667,0.705882}%
    1965 \pgfsetstrokecolor{currentstroke}%
    1966 \pgfsetdash{}{0pt}%
    1967 \pgfsys@defobject{currentmarker}{\pgfqpoint{-0.041667in}{-0.041667in}}{\pgfqpoint{0.041667in}{0.041667in}}{%
    1968 \pgfpathmoveto{\pgfqpoint{-0.000000in}{-0.041667in}}%
    1969 \pgfpathlineto{\pgfqpoint{0.041667in}{0.041667in}}%
    1970 \pgfpathlineto{\pgfqpoint{-0.041667in}{0.041667in}}%
    1971 \pgfpathclose%
    1972 \pgfusepath{stroke,fill}%
    1973 }%
    1974 \begin{pgfscope}%
    1975 \pgfsys@transformshift{1.025455in}{3.946569in}%
    1976 \pgfsys@useobject{currentmarker}{}%
    1977 \end{pgfscope}%
    1978 \begin{pgfscope}%
    1979 \pgfsys@transformshift{1.326061in}{3.802273in}%
    1980 \pgfsys@useobject{currentmarker}{}%
    1981 \end{pgfscope}%
    1982 \begin{pgfscope}%
    1983 \pgfsys@transformshift{1.927273in}{3.677930in}%
    1984 \pgfsys@useobject{currentmarker}{}%
    1985 \end{pgfscope}%
    1986 \begin{pgfscope}%
    1987 \pgfsys@transformshift{3.129697in}{3.534576in}%
    1988 \pgfsys@useobject{currentmarker}{}%
    1989 \end{pgfscope}%
    1990 \begin{pgfscope}%
    1991 \pgfsys@transformshift{4.332121in}{3.431799in}%
    1992 \pgfsys@useobject{currentmarker}{}%
    1993 \end{pgfscope}%
    1994 \begin{pgfscope}%
    1995 \pgfsys@transformshift{5.534545in}{3.440731in}%
    1996 \pgfsys@useobject{currentmarker}{}%
    1997 \end{pgfscope}%
    1998 \end{pgfscope}%
    1999 \begin{pgfscope}%
    2000 \pgfpathrectangle{\pgfqpoint{0.800000in}{0.528000in}}{\pgfqpoint{4.960000in}{3.696000in}}%
    2001 \pgfusepath{clip}%
    2002 \pgfsetrectcap%
    2003 \pgfsetroundjoin%
    2004 \pgfsetlinewidth{1.505625pt}%
    2005 \definecolor{currentstroke}{rgb}{1.000000,0.498039,0.054902}%
    2006 \pgfsetstrokecolor{currentstroke}%
    2007 \pgfsetdash{}{0pt}%
    2008 \pgfpathmoveto{\pgfqpoint{1.025455in}{4.038293in}}%
    2009 \pgfpathlineto{\pgfqpoint{1.326061in}{3.879198in}}%
    2010 \pgfpathlineto{\pgfqpoint{1.927273in}{3.775409in}}%
    2011 \pgfpathlineto{\pgfqpoint{3.129697in}{3.635703in}}%
    2012 \pgfpathlineto{\pgfqpoint{4.332121in}{3.543668in}}%
    2013 \pgfpathlineto{\pgfqpoint{5.534545in}{3.552229in}}%
    2014 \pgfusepath{stroke}%
    2015 \end{pgfscope}%
    2016 \begin{pgfscope}%
    2017 \pgfpathrectangle{\pgfqpoint{0.800000in}{0.528000in}}{\pgfqpoint{4.960000in}{3.696000in}}%
    2018 \pgfusepath{clip}%
    2019 \pgfsetbuttcap%
    2020 \pgfsetroundjoin%
    2021 \definecolor{currentfill}{rgb}{1.000000,0.498039,0.054902}%
    2022 \pgfsetfillcolor{currentfill}%
    2023 \pgfsetlinewidth{1.003750pt}%
    2024 \definecolor{currentstroke}{rgb}{1.000000,0.498039,0.054902}%
    20251965\pgfsetstrokecolor{currentstroke}%
    20261966\pgfsetdash{}{0pt}%
     
    20391979}%
    20401980\begin{pgfscope}%
    2041 \pgfsys@transformshift{1.025455in}{4.038293in}%
    2042 \pgfsys@useobject{currentmarker}{}%
    2043 \end{pgfscope}%
    2044 \begin{pgfscope}%
    2045 \pgfsys@transformshift{1.326061in}{3.879198in}%
    2046 \pgfsys@useobject{currentmarker}{}%
    2047 \end{pgfscope}%
    2048 \begin{pgfscope}%
    2049 \pgfsys@transformshift{1.927273in}{3.775409in}%
    2050 \pgfsys@useobject{currentmarker}{}%
    2051 \end{pgfscope}%
    2052 \begin{pgfscope}%
    2053 \pgfsys@transformshift{3.129697in}{3.635703in}%
    2054 \pgfsys@useobject{currentmarker}{}%
    2055 \end{pgfscope}%
    2056 \begin{pgfscope}%
    2057 \pgfsys@transformshift{4.332121in}{3.543668in}%
    2058 \pgfsys@useobject{currentmarker}{}%
    2059 \end{pgfscope}%
    2060 \begin{pgfscope}%
    2061 \pgfsys@transformshift{5.534545in}{3.552229in}%
     1981\pgfsys@transformshift{1.025455in}{3.946569in}%
     1982\pgfsys@useobject{currentmarker}{}%
     1983\end{pgfscope}%
     1984\begin{pgfscope}%
     1985\pgfsys@transformshift{1.326061in}{3.802273in}%
     1986\pgfsys@useobject{currentmarker}{}%
     1987\end{pgfscope}%
     1988\begin{pgfscope}%
     1989\pgfsys@transformshift{1.927273in}{3.677930in}%
     1990\pgfsys@useobject{currentmarker}{}%
     1991\end{pgfscope}%
     1992\begin{pgfscope}%
     1993\pgfsys@transformshift{3.129697in}{3.534576in}%
     1994\pgfsys@useobject{currentmarker}{}%
     1995\end{pgfscope}%
     1996\begin{pgfscope}%
     1997\pgfsys@transformshift{4.332121in}{3.431799in}%
     1998\pgfsys@useobject{currentmarker}{}%
     1999\end{pgfscope}%
     2000\begin{pgfscope}%
     2001\pgfsys@transformshift{5.534545in}{3.440731in}%
    20622002\pgfsys@useobject{currentmarker}{}%
    20632003\end{pgfscope}%
     
    20692009\pgfsetroundjoin%
    20702010\pgfsetlinewidth{1.505625pt}%
    2071 \definecolor{currentstroke}{rgb}{0.172549,0.627451,0.172549}%
    2072 \pgfsetstrokecolor{currentstroke}%
    2073 \pgfsetdash{}{0pt}%
    2074 \pgfpathmoveto{\pgfqpoint{1.025455in}{3.986946in}}%
    2075 \pgfpathlineto{\pgfqpoint{1.326061in}{3.894328in}}%
    2076 \pgfpathlineto{\pgfqpoint{1.927273in}{3.799708in}}%
    2077 \pgfpathlineto{\pgfqpoint{3.129697in}{3.659501in}}%
    2078 \pgfpathlineto{\pgfqpoint{4.332121in}{3.551737in}}%
    2079 \pgfpathlineto{\pgfqpoint{5.534545in}{3.536503in}}%
    2080 \pgfusepath{stroke}%
    2081 \end{pgfscope}%
    2082 \begin{pgfscope}%
    2083 \pgfpathrectangle{\pgfqpoint{0.800000in}{0.528000in}}{\pgfqpoint{4.960000in}{3.696000in}}%
    2084 \pgfusepath{clip}%
    2085 \pgfsetbuttcap%
    2086 \pgfsetmiterjoin%
    2087 \definecolor{currentfill}{rgb}{0.172549,0.627451,0.172549}%
    2088 \pgfsetfillcolor{currentfill}%
    2089 \pgfsetlinewidth{1.003750pt}%
    2090 \definecolor{currentstroke}{rgb}{0.172549,0.627451,0.172549}%
    2091 \pgfsetstrokecolor{currentstroke}%
    2092 \pgfsetdash{}{0pt}%
    2093 \pgfsys@defobject{currentmarker}{\pgfqpoint{-0.041667in}{-0.041667in}}{\pgfqpoint{0.041667in}{0.041667in}}{%
    2094 \pgfpathmoveto{\pgfqpoint{-0.041667in}{-0.041667in}}%
    2095 \pgfpathlineto{\pgfqpoint{0.041667in}{-0.041667in}}%
    2096 \pgfpathlineto{\pgfqpoint{0.041667in}{0.041667in}}%
    2097 \pgfpathlineto{\pgfqpoint{-0.041667in}{0.041667in}}%
    2098 \pgfpathclose%
    2099 \pgfusepath{stroke,fill}%
    2100 }%
    2101 \begin{pgfscope}%
    2102 \pgfsys@transformshift{1.025455in}{3.986946in}%
    2103 \pgfsys@useobject{currentmarker}{}%
    2104 \end{pgfscope}%
    2105 \begin{pgfscope}%
    2106 \pgfsys@transformshift{1.326061in}{3.894328in}%
    2107 \pgfsys@useobject{currentmarker}{}%
    2108 \end{pgfscope}%
    2109 \begin{pgfscope}%
    2110 \pgfsys@transformshift{1.927273in}{3.799708in}%
    2111 \pgfsys@useobject{currentmarker}{}%
    2112 \end{pgfscope}%
    2113 \begin{pgfscope}%
    2114 \pgfsys@transformshift{3.129697in}{3.659501in}%
    2115 \pgfsys@useobject{currentmarker}{}%
    2116 \end{pgfscope}%
    2117 \begin{pgfscope}%
    2118 \pgfsys@transformshift{4.332121in}{3.551737in}%
    2119 \pgfsys@useobject{currentmarker}{}%
    2120 \end{pgfscope}%
    2121 \begin{pgfscope}%
    2122 \pgfsys@transformshift{5.534545in}{3.536503in}%
    2123 \pgfsys@useobject{currentmarker}{}%
    2124 \end{pgfscope}%
    2125 \end{pgfscope}%
    2126 \begin{pgfscope}%
    2127 \pgfpathrectangle{\pgfqpoint{0.800000in}{0.528000in}}{\pgfqpoint{4.960000in}{3.696000in}}%
    2128 \pgfusepath{clip}%
    2129 \pgfsetrectcap%
    2130 \pgfsetroundjoin%
    2131 \pgfsetlinewidth{1.505625pt}%
    2132 \definecolor{currentstroke}{rgb}{0.839216,0.152941,0.156863}%
    2133 \pgfsetstrokecolor{currentstroke}%
    2134 \pgfsetdash{}{0pt}%
    2135 \pgfpathmoveto{\pgfqpoint{1.025455in}{3.616719in}}%
    2136 \pgfpathlineto{\pgfqpoint{1.326061in}{2.880579in}}%
    2137 \pgfpathlineto{\pgfqpoint{1.927273in}{1.983335in}}%
    2138 \pgfpathlineto{\pgfqpoint{3.129697in}{1.145651in}}%
    2139 \pgfpathlineto{\pgfqpoint{4.332121in}{0.876039in}}%
    2140 \pgfpathlineto{\pgfqpoint{5.534545in}{0.885117in}}%
    2141 \pgfusepath{stroke}%
    2142 \end{pgfscope}%
    2143 \begin{pgfscope}%
    2144 \pgfpathrectangle{\pgfqpoint{0.800000in}{0.528000in}}{\pgfqpoint{4.960000in}{3.696000in}}%
    2145 \pgfusepath{clip}%
    2146 \pgfsetbuttcap%
    2147 \pgfsetmiterjoin%
    2148 \definecolor{currentfill}{rgb}{0.839216,0.152941,0.156863}%
    2149 \pgfsetfillcolor{currentfill}%
    2150 \pgfsetlinewidth{1.003750pt}%
    2151 \definecolor{currentstroke}{rgb}{0.839216,0.152941,0.156863}%
    2152 \pgfsetstrokecolor{currentstroke}%
    2153 \pgfsetdash{}{0pt}%
    2154 \pgfsys@defobject{currentmarker}{\pgfqpoint{-0.058926in}{-0.058926in}}{\pgfqpoint{0.058926in}{0.058926in}}{%
    2155 \pgfpathmoveto{\pgfqpoint{-0.000000in}{-0.058926in}}%
    2156 \pgfpathlineto{\pgfqpoint{0.058926in}{0.000000in}}%
    2157 \pgfpathlineto{\pgfqpoint{0.000000in}{0.058926in}}%
    2158 \pgfpathlineto{\pgfqpoint{-0.058926in}{0.000000in}}%
    2159 \pgfpathclose%
    2160 \pgfusepath{stroke,fill}%
    2161 }%
    2162 \begin{pgfscope}%
    2163 \pgfsys@transformshift{1.025455in}{3.616719in}%
    2164 \pgfsys@useobject{currentmarker}{}%
    2165 \end{pgfscope}%
    2166 \begin{pgfscope}%
    2167 \pgfsys@transformshift{1.326061in}{2.880579in}%
    2168 \pgfsys@useobject{currentmarker}{}%
    2169 \end{pgfscope}%
    2170 \begin{pgfscope}%
    2171 \pgfsys@transformshift{1.927273in}{1.983335in}%
    2172 \pgfsys@useobject{currentmarker}{}%
    2173 \end{pgfscope}%
    2174 \begin{pgfscope}%
    2175 \pgfsys@transformshift{3.129697in}{1.145651in}%
    2176 \pgfsys@useobject{currentmarker}{}%
    2177 \end{pgfscope}%
    2178 \begin{pgfscope}%
    2179 \pgfsys@transformshift{4.332121in}{0.876039in}%
    2180 \pgfsys@useobject{currentmarker}{}%
    2181 \end{pgfscope}%
    2182 \begin{pgfscope}%
    2183 \pgfsys@transformshift{5.534545in}{0.885117in}%
    2184 \pgfsys@useobject{currentmarker}{}%
    2185 \end{pgfscope}%
    2186 \end{pgfscope}%
    2187 \begin{pgfscope}%
    2188 \pgfsetrectcap%
    2189 \pgfsetmiterjoin%
    2190 \pgfsetlinewidth{0.803000pt}%
    2191 \definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}%
    2192 \pgfsetstrokecolor{currentstroke}%
    2193 \pgfsetdash{}{0pt}%
    2194 \pgfpathmoveto{\pgfqpoint{0.800000in}{0.528000in}}%
    2195 \pgfpathlineto{\pgfqpoint{0.800000in}{4.224000in}}%
    2196 \pgfusepath{stroke}%
    2197 \end{pgfscope}%
    2198 \begin{pgfscope}%
    2199 \pgfsetrectcap%
    2200 \pgfsetmiterjoin%
    2201 \pgfsetlinewidth{0.803000pt}%
    2202 \definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}%
    2203 \pgfsetstrokecolor{currentstroke}%
    2204 \pgfsetdash{}{0pt}%
    2205 \pgfpathmoveto{\pgfqpoint{5.760000in}{0.528000in}}%
    2206 \pgfpathlineto{\pgfqpoint{5.760000in}{4.224000in}}%
    2207 \pgfusepath{stroke}%
    2208 \end{pgfscope}%
    2209 \begin{pgfscope}%
    2210 \pgfsetrectcap%
    2211 \pgfsetmiterjoin%
    2212 \pgfsetlinewidth{0.803000pt}%
    2213 \definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}%
    2214 \pgfsetstrokecolor{currentstroke}%
    2215 \pgfsetdash{}{0pt}%
    2216 \pgfpathmoveto{\pgfqpoint{0.800000in}{0.528000in}}%
    2217 \pgfpathlineto{\pgfqpoint{5.760000in}{0.528000in}}%
    2218 \pgfusepath{stroke}%
    2219 \end{pgfscope}%
    2220 \begin{pgfscope}%
    2221 \pgfsetrectcap%
    2222 \pgfsetmiterjoin%
    2223 \pgfsetlinewidth{0.803000pt}%
    2224 \definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}%
    2225 \pgfsetstrokecolor{currentstroke}%
    2226 \pgfsetdash{}{0pt}%
    2227 \pgfpathmoveto{\pgfqpoint{0.800000in}{4.224000in}}%
    2228 \pgfpathlineto{\pgfqpoint{5.760000in}{4.224000in}}%
    2229 \pgfusepath{stroke}%
    2230 \end{pgfscope}%
    2231 \begin{pgfscope}%
    2232 \definecolor{textcolor}{rgb}{0.000000,0.000000,0.000000}%
    2233 \pgfsetstrokecolor{textcolor}%
    2234 \pgfsetfillcolor{textcolor}%
    2235 \pgftext[x=3.280000in,y=4.307333in,,base]{\color{textcolor}\rmfamily\fontsize{19.200000}{23.040000}\selectfont Aggregate Lock Benchmark: 8 Locks}%
    2236 \end{pgfscope}%
    2237 \begin{pgfscope}%
    2238 \pgfsetbuttcap%
    2239 \pgfsetmiterjoin%
    2240 \definecolor{currentfill}{rgb}{1.000000,1.000000,1.000000}%
    2241 \pgfsetfillcolor{currentfill}%
    2242 \pgfsetfillopacity{0.800000}%
    2243 \pgfsetlinewidth{1.003750pt}%
    2244 \definecolor{currentstroke}{rgb}{0.800000,0.800000,0.800000}%
    2245 \pgfsetstrokecolor{currentstroke}%
    2246 \pgfsetstrokeopacity{0.800000}%
    2247 \pgfsetdash{}{0pt}%
    2248 \pgfpathmoveto{\pgfqpoint{3.602702in}{1.693747in}}%
    2249 \pgfpathlineto{\pgfqpoint{5.604444in}{1.693747in}}%
    2250 \pgfpathquadraticcurveto{\pgfqpoint{5.648889in}{1.693747in}}{\pgfqpoint{5.648889in}{1.738192in}}%
    2251 \pgfpathlineto{\pgfqpoint{5.648889in}{3.013808in}}%
    2252 \pgfpathquadraticcurveto{\pgfqpoint{5.648889in}{3.058253in}}{\pgfqpoint{5.604444in}{3.058253in}}%
    2253 \pgfpathlineto{\pgfqpoint{3.602702in}{3.058253in}}%
    2254 \pgfpathquadraticcurveto{\pgfqpoint{3.558257in}{3.058253in}}{\pgfqpoint{3.558257in}{3.013808in}}%
    2255 \pgfpathlineto{\pgfqpoint{3.558257in}{1.738192in}}%
    2256 \pgfpathquadraticcurveto{\pgfqpoint{3.558257in}{1.693747in}}{\pgfqpoint{3.602702in}{1.693747in}}%
    2257 \pgfpathclose%
    2258 \pgfusepath{stroke,fill}%
    2259 \end{pgfscope}%
    2260 \begin{pgfscope}%
    2261 \pgfsetbuttcap%
    2262 \pgfsetroundjoin%
    2263 \pgfsetlinewidth{1.505625pt}%
    2264 \definecolor{currentstroke}{rgb}{0.121569,0.466667,0.705882}%
    2265 \pgfsetstrokecolor{currentstroke}%
    2266 \pgfsetdash{}{0pt}%
    2267 \pgfpathmoveto{\pgfqpoint{3.869368in}{2.769364in}}%
    2268 \pgfpathlineto{\pgfqpoint{3.869368in}{2.991586in}}%
    2269 \pgfusepath{stroke}%
    2270 \end{pgfscope}%
    2271 \begin{pgfscope}%
    2272 \pgfsetbuttcap%
    2273 \pgfsetroundjoin%
    2274 \definecolor{currentfill}{rgb}{0.121569,0.466667,0.705882}%
    2275 \pgfsetfillcolor{currentfill}%
    2276 \pgfsetlinewidth{1.003750pt}%
    2277 \definecolor{currentstroke}{rgb}{0.121569,0.466667,0.705882}%
    2278 \pgfsetstrokecolor{currentstroke}%
    2279 \pgfsetdash{}{0pt}%
    2280 \pgfsys@defobject{currentmarker}{\pgfqpoint{-0.027778in}{-0.000000in}}{\pgfqpoint{0.027778in}{0.000000in}}{%
    2281 \pgfpathmoveto{\pgfqpoint{0.027778in}{-0.000000in}}%
    2282 \pgfpathlineto{\pgfqpoint{-0.027778in}{0.000000in}}%
    2283 \pgfusepath{stroke,fill}%
    2284 }%
    2285 \begin{pgfscope}%
    2286 \pgfsys@transformshift{3.869368in}{2.769364in}%
    2287 \pgfsys@useobject{currentmarker}{}%
    2288 \end{pgfscope}%
    2289 \end{pgfscope}%
    2290 \begin{pgfscope}%
    2291 \pgfsetbuttcap%
    2292 \pgfsetroundjoin%
    2293 \definecolor{currentfill}{rgb}{0.121569,0.466667,0.705882}%
    2294 \pgfsetfillcolor{currentfill}%
    2295 \pgfsetlinewidth{1.003750pt}%
    2296 \definecolor{currentstroke}{rgb}{0.121569,0.466667,0.705882}%
    2297 \pgfsetstrokecolor{currentstroke}%
    2298 \pgfsetdash{}{0pt}%
    2299 \pgfsys@defobject{currentmarker}{\pgfqpoint{-0.027778in}{-0.000000in}}{\pgfqpoint{0.027778in}{0.000000in}}{%
    2300 \pgfpathmoveto{\pgfqpoint{0.027778in}{-0.000000in}}%
    2301 \pgfpathlineto{\pgfqpoint{-0.027778in}{0.000000in}}%
    2302 \pgfusepath{stroke,fill}%
    2303 }%
    2304 \begin{pgfscope}%
    2305 \pgfsys@transformshift{3.869368in}{2.991586in}%
    2306 \pgfsys@useobject{currentmarker}{}%
    2307 \end{pgfscope}%
    2308 \end{pgfscope}%
    2309 \begin{pgfscope}%
    2310 \pgfsetrectcap%
    2311 \pgfsetroundjoin%
    2312 \pgfsetlinewidth{1.505625pt}%
    2313 \definecolor{currentstroke}{rgb}{0.121569,0.466667,0.705882}%
    2314 \pgfsetstrokecolor{currentstroke}%
    2315 \pgfsetdash{}{0pt}%
    2316 \pgfpathmoveto{\pgfqpoint{3.647146in}{2.880475in}}%
    2317 \pgfpathlineto{\pgfqpoint{4.091591in}{2.880475in}}%
    2318 \pgfusepath{stroke}%
    2319 \end{pgfscope}%
    2320 \begin{pgfscope}%
    2321 \pgfsetbuttcap%
    2322 \pgfsetmiterjoin%
    2323 \definecolor{currentfill}{rgb}{0.121569,0.466667,0.705882}%
    2324 \pgfsetfillcolor{currentfill}%
    2325 \pgfsetlinewidth{1.003750pt}%
    2326 \definecolor{currentstroke}{rgb}{0.121569,0.466667,0.705882}%
    2327 \pgfsetstrokecolor{currentstroke}%
    2328 \pgfsetdash{}{0pt}%
    2329 \pgfsys@defobject{currentmarker}{\pgfqpoint{-0.041667in}{-0.041667in}}{\pgfqpoint{0.041667in}{0.041667in}}{%
    2330 \pgfpathmoveto{\pgfqpoint{-0.000000in}{-0.041667in}}%
    2331 \pgfpathlineto{\pgfqpoint{0.041667in}{0.041667in}}%
    2332 \pgfpathlineto{\pgfqpoint{-0.041667in}{0.041667in}}%
    2333 \pgfpathclose%
    2334 \pgfusepath{stroke,fill}%
    2335 }%
    2336 \begin{pgfscope}%
    2337 \pgfsys@transformshift{3.869368in}{2.880475in}%
    2338 \pgfsys@useobject{currentmarker}{}%
    2339 \end{pgfscope}%
    2340 \end{pgfscope}%
    2341 \begin{pgfscope}%
    2342 \definecolor{textcolor}{rgb}{0.000000,0.000000,0.000000}%
    2343 \pgfsetstrokecolor{textcolor}%
    2344 \pgfsetfillcolor{textcolor}%
    2345 \pgftext[x=4.269368in,y=2.802697in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont CFA-baseline}%
    2346 \end{pgfscope}%
    2347 \begin{pgfscope}%
    2348 \pgfsetbuttcap%
    2349 \pgfsetroundjoin%
    2350 \pgfsetlinewidth{1.505625pt}%
    23512011\definecolor{currentstroke}{rgb}{1.000000,0.498039,0.054902}%
    23522012\pgfsetstrokecolor{currentstroke}%
    23532013\pgfsetdash{}{0pt}%
    2354 \pgfpathmoveto{\pgfqpoint{3.869368in}{2.444904in}}%
    2355 \pgfpathlineto{\pgfqpoint{3.869368in}{2.667126in}}%
    2356 \pgfusepath{stroke}%
    2357 \end{pgfscope}%
    2358 \begin{pgfscope}%
    2359 \pgfsetbuttcap%
    2360 \pgfsetroundjoin%
    2361 \definecolor{currentfill}{rgb}{1.000000,0.498039,0.054902}%
    2362 \pgfsetfillcolor{currentfill}%
    2363 \pgfsetlinewidth{1.003750pt}%
    2364 \definecolor{currentstroke}{rgb}{1.000000,0.498039,0.054902}%
    2365 \pgfsetstrokecolor{currentstroke}%
    2366 \pgfsetdash{}{0pt}%
    2367 \pgfsys@defobject{currentmarker}{\pgfqpoint{-0.027778in}{-0.000000in}}{\pgfqpoint{0.027778in}{0.000000in}}{%
    2368 \pgfpathmoveto{\pgfqpoint{0.027778in}{-0.000000in}}%
    2369 \pgfpathlineto{\pgfqpoint{-0.027778in}{0.000000in}}%
    2370 \pgfusepath{stroke,fill}%
    2371 }%
    2372 \begin{pgfscope}%
    2373 \pgfsys@transformshift{3.869368in}{2.444904in}%
    2374 \pgfsys@useobject{currentmarker}{}%
    2375 \end{pgfscope}%
    2376 \end{pgfscope}%
    2377 \begin{pgfscope}%
    2378 \pgfsetbuttcap%
    2379 \pgfsetroundjoin%
    2380 \definecolor{currentfill}{rgb}{1.000000,0.498039,0.054902}%
    2381 \pgfsetfillcolor{currentfill}%
    2382 \pgfsetlinewidth{1.003750pt}%
    2383 \definecolor{currentstroke}{rgb}{1.000000,0.498039,0.054902}%
    2384 \pgfsetstrokecolor{currentstroke}%
    2385 \pgfsetdash{}{0pt}%
    2386 \pgfsys@defobject{currentmarker}{\pgfqpoint{-0.027778in}{-0.000000in}}{\pgfqpoint{0.027778in}{0.000000in}}{%
    2387 \pgfpathmoveto{\pgfqpoint{0.027778in}{-0.000000in}}%
    2388 \pgfpathlineto{\pgfqpoint{-0.027778in}{0.000000in}}%
    2389 \pgfusepath{stroke,fill}%
    2390 }%
    2391 \begin{pgfscope}%
    2392 \pgfsys@transformshift{3.869368in}{2.667126in}%
    2393 \pgfsys@useobject{currentmarker}{}%
    2394 \end{pgfscope}%
    2395 \end{pgfscope}%
    2396 \begin{pgfscope}%
    2397 \pgfsetrectcap%
    2398 \pgfsetroundjoin%
    2399 \pgfsetlinewidth{1.505625pt}%
    2400 \definecolor{currentstroke}{rgb}{1.000000,0.498039,0.054902}%
    2401 \pgfsetstrokecolor{currentstroke}%
    2402 \pgfsetdash{}{0pt}%
    2403 \pgfpathmoveto{\pgfqpoint{3.647146in}{2.556015in}}%
    2404 \pgfpathlineto{\pgfqpoint{4.091591in}{2.556015in}}%
    2405 \pgfusepath{stroke}%
    2406 \end{pgfscope}%
    2407 \begin{pgfscope}%
     2014\pgfpathmoveto{\pgfqpoint{1.025455in}{4.038293in}}%
     2015\pgfpathlineto{\pgfqpoint{1.326061in}{3.879198in}}%
     2016\pgfpathlineto{\pgfqpoint{1.927273in}{3.775409in}}%
     2017\pgfpathlineto{\pgfqpoint{3.129697in}{3.635703in}}%
     2018\pgfpathlineto{\pgfqpoint{4.332121in}{3.543668in}}%
     2019\pgfpathlineto{\pgfqpoint{5.534545in}{3.552229in}}%
     2020\pgfusepath{stroke}%
     2021\end{pgfscope}%
     2022\begin{pgfscope}%
     2023\pgfpathrectangle{\pgfqpoint{0.800000in}{0.528000in}}{\pgfqpoint{4.960000in}{3.696000in}}%
     2024\pgfusepath{clip}%
    24082025\pgfsetbuttcap%
    24092026\pgfsetroundjoin%
     
    24282045}%
    24292046\begin{pgfscope}%
    2430 \pgfsys@transformshift{3.869368in}{2.556015in}%
    2431 \pgfsys@useobject{currentmarker}{}%
    2432 \end{pgfscope}%
     2047\pgfsys@transformshift{1.025455in}{4.038293in}%
     2048\pgfsys@useobject{currentmarker}{}%
     2049\end{pgfscope}%
     2050\begin{pgfscope}%
     2051\pgfsys@transformshift{1.326061in}{3.879198in}%
     2052\pgfsys@useobject{currentmarker}{}%
     2053\end{pgfscope}%
     2054\begin{pgfscope}%
     2055\pgfsys@transformshift{1.927273in}{3.775409in}%
     2056\pgfsys@useobject{currentmarker}{}%
     2057\end{pgfscope}%
     2058\begin{pgfscope}%
     2059\pgfsys@transformshift{3.129697in}{3.635703in}%
     2060\pgfsys@useobject{currentmarker}{}%
     2061\end{pgfscope}%
     2062\begin{pgfscope}%
     2063\pgfsys@transformshift{4.332121in}{3.543668in}%
     2064\pgfsys@useobject{currentmarker}{}%
     2065\end{pgfscope}%
     2066\begin{pgfscope}%
     2067\pgfsys@transformshift{5.534545in}{3.552229in}%
     2068\pgfsys@useobject{currentmarker}{}%
     2069\end{pgfscope}%
     2070\end{pgfscope}%
     2071\begin{pgfscope}%
     2072\pgfpathrectangle{\pgfqpoint{0.800000in}{0.528000in}}{\pgfqpoint{4.960000in}{3.696000in}}%
     2073\pgfusepath{clip}%
     2074\pgfsetrectcap%
     2075\pgfsetroundjoin%
     2076\pgfsetlinewidth{1.505625pt}%
     2077\definecolor{currentstroke}{rgb}{0.172549,0.627451,0.172549}%
     2078\pgfsetstrokecolor{currentstroke}%
     2079\pgfsetdash{}{0pt}%
     2080\pgfpathmoveto{\pgfqpoint{1.025455in}{3.986946in}}%
     2081\pgfpathlineto{\pgfqpoint{1.326061in}{3.894328in}}%
     2082\pgfpathlineto{\pgfqpoint{1.927273in}{3.799708in}}%
     2083\pgfpathlineto{\pgfqpoint{3.129697in}{3.659501in}}%
     2084\pgfpathlineto{\pgfqpoint{4.332121in}{3.551737in}}%
     2085\pgfpathlineto{\pgfqpoint{5.534545in}{3.536503in}}%
     2086\pgfusepath{stroke}%
     2087\end{pgfscope}%
     2088\begin{pgfscope}%
     2089\pgfpathrectangle{\pgfqpoint{0.800000in}{0.528000in}}{\pgfqpoint{4.960000in}{3.696000in}}%
     2090\pgfusepath{clip}%
     2091\pgfsetbuttcap%
     2092\pgfsetroundjoin%
     2093\definecolor{currentfill}{rgb}{0.172549,0.627451,0.172549}%
     2094\pgfsetfillcolor{currentfill}%
     2095\pgfsetlinewidth{1.003750pt}%
     2096\definecolor{currentstroke}{rgb}{0.172549,0.627451,0.172549}%
     2097\pgfsetstrokecolor{currentstroke}%
     2098\pgfsetdash{}{0pt}%
     2099\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.041667in}{-0.041667in}}{\pgfqpoint{0.041667in}{0.041667in}}{%
     2100\pgfpathmoveto{\pgfqpoint{0.000000in}{-0.041667in}}%
     2101\pgfpathcurveto{\pgfqpoint{0.011050in}{-0.041667in}}{\pgfqpoint{0.021649in}{-0.037276in}}{\pgfqpoint{0.029463in}{-0.029463in}}%
     2102\pgfpathcurveto{\pgfqpoint{0.037276in}{-0.021649in}}{\pgfqpoint{0.041667in}{-0.011050in}}{\pgfqpoint{0.041667in}{0.000000in}}%
     2103\pgfpathcurveto{\pgfqpoint{0.041667in}{0.011050in}}{\pgfqpoint{0.037276in}{0.021649in}}{\pgfqpoint{0.029463in}{0.029463in}}%
     2104\pgfpathcurveto{\pgfqpoint{0.021649in}{0.037276in}}{\pgfqpoint{0.011050in}{0.041667in}}{\pgfqpoint{0.000000in}{0.041667in}}%
     2105\pgfpathcurveto{\pgfqpoint{-0.011050in}{0.041667in}}{\pgfqpoint{-0.021649in}{0.037276in}}{\pgfqpoint{-0.029463in}{0.029463in}}%
     2106\pgfpathcurveto{\pgfqpoint{-0.037276in}{0.021649in}}{\pgfqpoint{-0.041667in}{0.011050in}}{\pgfqpoint{-0.041667in}{0.000000in}}%
     2107\pgfpathcurveto{\pgfqpoint{-0.041667in}{-0.011050in}}{\pgfqpoint{-0.037276in}{-0.021649in}}{\pgfqpoint{-0.029463in}{-0.029463in}}%
     2108\pgfpathcurveto{\pgfqpoint{-0.021649in}{-0.037276in}}{\pgfqpoint{-0.011050in}{-0.041667in}}{\pgfqpoint{0.000000in}{-0.041667in}}%
     2109\pgfpathclose%
     2110\pgfusepath{stroke,fill}%
     2111}%
     2112\begin{pgfscope}%
     2113\pgfsys@transformshift{1.025455in}{3.986946in}%
     2114\pgfsys@useobject{currentmarker}{}%
     2115\end{pgfscope}%
     2116\begin{pgfscope}%
     2117\pgfsys@transformshift{1.326061in}{3.894328in}%
     2118\pgfsys@useobject{currentmarker}{}%
     2119\end{pgfscope}%
     2120\begin{pgfscope}%
     2121\pgfsys@transformshift{1.927273in}{3.799708in}%
     2122\pgfsys@useobject{currentmarker}{}%
     2123\end{pgfscope}%
     2124\begin{pgfscope}%
     2125\pgfsys@transformshift{3.129697in}{3.659501in}%
     2126\pgfsys@useobject{currentmarker}{}%
     2127\end{pgfscope}%
     2128\begin{pgfscope}%
     2129\pgfsys@transformshift{4.332121in}{3.551737in}%
     2130\pgfsys@useobject{currentmarker}{}%
     2131\end{pgfscope}%
     2132\begin{pgfscope}%
     2133\pgfsys@transformshift{5.534545in}{3.536503in}%
     2134\pgfsys@useobject{currentmarker}{}%
     2135\end{pgfscope}%
     2136\end{pgfscope}%
     2137\begin{pgfscope}%
     2138\pgfpathrectangle{\pgfqpoint{0.800000in}{0.528000in}}{\pgfqpoint{4.960000in}{3.696000in}}%
     2139\pgfusepath{clip}%
     2140\pgfsetrectcap%
     2141\pgfsetroundjoin%
     2142\pgfsetlinewidth{1.505625pt}%
     2143\definecolor{currentstroke}{rgb}{0.839216,0.152941,0.156863}%
     2144\pgfsetstrokecolor{currentstroke}%
     2145\pgfsetdash{}{0pt}%
     2146\pgfpathmoveto{\pgfqpoint{1.025455in}{3.616719in}}%
     2147\pgfpathlineto{\pgfqpoint{1.326061in}{2.880579in}}%
     2148\pgfpathlineto{\pgfqpoint{1.927273in}{1.983335in}}%
     2149\pgfpathlineto{\pgfqpoint{3.129697in}{1.145651in}}%
     2150\pgfpathlineto{\pgfqpoint{4.332121in}{0.876039in}}%
     2151\pgfpathlineto{\pgfqpoint{5.534545in}{0.885117in}}%
     2152\pgfusepath{stroke}%
     2153\end{pgfscope}%
     2154\begin{pgfscope}%
     2155\pgfpathrectangle{\pgfqpoint{0.800000in}{0.528000in}}{\pgfqpoint{4.960000in}{3.696000in}}%
     2156\pgfusepath{clip}%
     2157\pgfsetbuttcap%
     2158\pgfsetroundjoin%
     2159\definecolor{currentfill}{rgb}{0.839216,0.152941,0.156863}%
     2160\pgfsetfillcolor{currentfill}%
     2161\pgfsetlinewidth{1.003750pt}%
     2162\definecolor{currentstroke}{rgb}{0.839216,0.152941,0.156863}%
     2163\pgfsetstrokecolor{currentstroke}%
     2164\pgfsetdash{}{0pt}%
     2165\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.041667in}{-0.041667in}}{\pgfqpoint{0.041667in}{0.041667in}}{%
     2166\pgfpathmoveto{\pgfqpoint{0.000000in}{-0.041667in}}%
     2167\pgfpathcurveto{\pgfqpoint{0.011050in}{-0.041667in}}{\pgfqpoint{0.021649in}{-0.037276in}}{\pgfqpoint{0.029463in}{-0.029463in}}%
     2168\pgfpathcurveto{\pgfqpoint{0.037276in}{-0.021649in}}{\pgfqpoint{0.041667in}{-0.011050in}}{\pgfqpoint{0.041667in}{0.000000in}}%
     2169\pgfpathcurveto{\pgfqpoint{0.041667in}{0.011050in}}{\pgfqpoint{0.037276in}{0.021649in}}{\pgfqpoint{0.029463in}{0.029463in}}%
     2170\pgfpathcurveto{\pgfqpoint{0.021649in}{0.037276in}}{\pgfqpoint{0.011050in}{0.041667in}}{\pgfqpoint{0.000000in}{0.041667in}}%
     2171\pgfpathcurveto{\pgfqpoint{-0.011050in}{0.041667in}}{\pgfqpoint{-0.021649in}{0.037276in}}{\pgfqpoint{-0.029463in}{0.029463in}}%
     2172\pgfpathcurveto{\pgfqpoint{-0.037276in}{0.021649in}}{\pgfqpoint{-0.041667in}{0.011050in}}{\pgfqpoint{-0.041667in}{0.000000in}}%
     2173\pgfpathcurveto{\pgfqpoint{-0.041667in}{-0.011050in}}{\pgfqpoint{-0.037276in}{-0.021649in}}{\pgfqpoint{-0.029463in}{-0.029463in}}%
     2174\pgfpathcurveto{\pgfqpoint{-0.021649in}{-0.037276in}}{\pgfqpoint{-0.011050in}{-0.041667in}}{\pgfqpoint{0.000000in}{-0.041667in}}%
     2175\pgfpathclose%
     2176\pgfusepath{stroke,fill}%
     2177}%
     2178\begin{pgfscope}%
     2179\pgfsys@transformshift{1.025455in}{3.616719in}%
     2180\pgfsys@useobject{currentmarker}{}%
     2181\end{pgfscope}%
     2182\begin{pgfscope}%
     2183\pgfsys@transformshift{1.326061in}{2.880579in}%
     2184\pgfsys@useobject{currentmarker}{}%
     2185\end{pgfscope}%
     2186\begin{pgfscope}%
     2187\pgfsys@transformshift{1.927273in}{1.983335in}%
     2188\pgfsys@useobject{currentmarker}{}%
     2189\end{pgfscope}%
     2190\begin{pgfscope}%
     2191\pgfsys@transformshift{3.129697in}{1.145651in}%
     2192\pgfsys@useobject{currentmarker}{}%
     2193\end{pgfscope}%
     2194\begin{pgfscope}%
     2195\pgfsys@transformshift{4.332121in}{0.876039in}%
     2196\pgfsys@useobject{currentmarker}{}%
     2197\end{pgfscope}%
     2198\begin{pgfscope}%
     2199\pgfsys@transformshift{5.534545in}{0.885117in}%
     2200\pgfsys@useobject{currentmarker}{}%
     2201\end{pgfscope}%
     2202\end{pgfscope}%
     2203\begin{pgfscope}%
     2204\pgfsetrectcap%
     2205\pgfsetmiterjoin%
     2206\pgfsetlinewidth{0.803000pt}%
     2207\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}%
     2208\pgfsetstrokecolor{currentstroke}%
     2209\pgfsetdash{}{0pt}%
     2210\pgfpathmoveto{\pgfqpoint{0.800000in}{0.528000in}}%
     2211\pgfpathlineto{\pgfqpoint{0.800000in}{4.224000in}}%
     2212\pgfusepath{stroke}%
     2213\end{pgfscope}%
     2214\begin{pgfscope}%
     2215\pgfsetrectcap%
     2216\pgfsetmiterjoin%
     2217\pgfsetlinewidth{0.803000pt}%
     2218\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}%
     2219\pgfsetstrokecolor{currentstroke}%
     2220\pgfsetdash{}{0pt}%
     2221\pgfpathmoveto{\pgfqpoint{5.760000in}{0.528000in}}%
     2222\pgfpathlineto{\pgfqpoint{5.760000in}{4.224000in}}%
     2223\pgfusepath{stroke}%
     2224\end{pgfscope}%
     2225\begin{pgfscope}%
     2226\pgfsetrectcap%
     2227\pgfsetmiterjoin%
     2228\pgfsetlinewidth{0.803000pt}%
     2229\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}%
     2230\pgfsetstrokecolor{currentstroke}%
     2231\pgfsetdash{}{0pt}%
     2232\pgfpathmoveto{\pgfqpoint{0.800000in}{0.528000in}}%
     2233\pgfpathlineto{\pgfqpoint{5.760000in}{0.528000in}}%
     2234\pgfusepath{stroke}%
     2235\end{pgfscope}%
     2236\begin{pgfscope}%
     2237\pgfsetrectcap%
     2238\pgfsetmiterjoin%
     2239\pgfsetlinewidth{0.803000pt}%
     2240\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}%
     2241\pgfsetstrokecolor{currentstroke}%
     2242\pgfsetdash{}{0pt}%
     2243\pgfpathmoveto{\pgfqpoint{0.800000in}{4.224000in}}%
     2244\pgfpathlineto{\pgfqpoint{5.760000in}{4.224000in}}%
     2245\pgfusepath{stroke}%
    24332246\end{pgfscope}%
    24342247\begin{pgfscope}%
     
    24362249\pgfsetstrokecolor{textcolor}%
    24372250\pgfsetfillcolor{textcolor}%
    2438 \pgftext[x=4.269368in,y=2.478238in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont CPP-baseline}%
    2439 \end{pgfscope}%
    2440 \begin{pgfscope}%
    2441 \pgfsetbuttcap%
    2442 \pgfsetroundjoin%
    2443 \pgfsetlinewidth{1.505625pt}%
    2444 \definecolor{currentstroke}{rgb}{0.172549,0.627451,0.172549}%
    2445 \pgfsetstrokecolor{currentstroke}%
    2446 \pgfsetdash{}{0pt}%
    2447 \pgfpathmoveto{\pgfqpoint{3.869368in}{2.120444in}}%
    2448 \pgfpathlineto{\pgfqpoint{3.869368in}{2.342667in}}%
    2449 \pgfusepath{stroke}%
    2450 \end{pgfscope}%
    2451 \begin{pgfscope}%
    2452 \pgfsetbuttcap%
    2453 \pgfsetroundjoin%
    2454 \definecolor{currentfill}{rgb}{0.172549,0.627451,0.172549}%
    2455 \pgfsetfillcolor{currentfill}%
     2251\pgftext[x=3.280000in,y=4.307333in,,base]{\color{textcolor}\rmfamily\fontsize{12.000000}{14.400000}\selectfont Aggregate Lock Benchmark: 8 Locks}%
     2252\end{pgfscope}%
     2253\begin{pgfscope}%
     2254\pgfsetbuttcap%
     2255\pgfsetmiterjoin%
     2256\definecolor{currentfill}{rgb}{1.000000,1.000000,1.000000}%
     2257\pgfsetfillcolor{currentfill}%
     2258\pgfsetfillopacity{0.800000}%
    24562259\pgfsetlinewidth{1.003750pt}%
    2457 \definecolor{currentstroke}{rgb}{0.172549,0.627451,0.172549}%
     2260\definecolor{currentstroke}{rgb}{0.800000,0.800000,0.800000}%
     2261\pgfsetstrokecolor{currentstroke}%
     2262\pgfsetstrokeopacity{0.800000}%
     2263\pgfsetdash{}{0pt}%
     2264\pgfpathmoveto{\pgfqpoint{0.897222in}{0.597444in}}%
     2265\pgfpathlineto{\pgfqpoint{2.156483in}{0.597444in}}%
     2266\pgfpathquadraticcurveto{\pgfqpoint{2.184261in}{0.597444in}}{\pgfqpoint{2.184261in}{0.625222in}}%
     2267\pgfpathlineto{\pgfqpoint{2.184261in}{1.386024in}}%
     2268\pgfpathquadraticcurveto{\pgfqpoint{2.184261in}{1.413802in}}{\pgfqpoint{2.156483in}{1.413802in}}%
     2269\pgfpathlineto{\pgfqpoint{0.897222in}{1.413802in}}%
     2270\pgfpathquadraticcurveto{\pgfqpoint{0.869444in}{1.413802in}}{\pgfqpoint{0.869444in}{1.386024in}}%
     2271\pgfpathlineto{\pgfqpoint{0.869444in}{0.625222in}}%
     2272\pgfpathquadraticcurveto{\pgfqpoint{0.869444in}{0.597444in}}{\pgfqpoint{0.897222in}{0.597444in}}%
     2273\pgfpathclose%
     2274\pgfusepath{stroke,fill}%
     2275\end{pgfscope}%
     2276\begin{pgfscope}%
     2277\pgfsetbuttcap%
     2278\pgfsetroundjoin%
     2279\pgfsetlinewidth{1.505625pt}%
     2280\definecolor{currentstroke}{rgb}{0.121569,0.466667,0.705882}%
     2281\pgfsetstrokecolor{currentstroke}%
     2282\pgfsetdash{}{0pt}%
     2283\pgfpathmoveto{\pgfqpoint{1.063889in}{1.240191in}}%
     2284\pgfpathlineto{\pgfqpoint{1.063889in}{1.379080in}}%
     2285\pgfusepath{stroke}%
     2286\end{pgfscope}%
     2287\begin{pgfscope}%
     2288\pgfsetbuttcap%
     2289\pgfsetroundjoin%
     2290\definecolor{currentfill}{rgb}{0.121569,0.466667,0.705882}%
     2291\pgfsetfillcolor{currentfill}%
     2292\pgfsetlinewidth{1.003750pt}%
     2293\definecolor{currentstroke}{rgb}{0.121569,0.466667,0.705882}%
    24582294\pgfsetstrokecolor{currentstroke}%
    24592295\pgfsetdash{}{0pt}%
     
    24642300}%
    24652301\begin{pgfscope}%
    2466 \pgfsys@transformshift{3.869368in}{2.120444in}%
    2467 \pgfsys@useobject{currentmarker}{}%
    2468 \end{pgfscope}%
    2469 \end{pgfscope}%
    2470 \begin{pgfscope}%
    2471 \pgfsetbuttcap%
    2472 \pgfsetroundjoin%
    2473 \definecolor{currentfill}{rgb}{0.172549,0.627451,0.172549}%
     2302\pgfsys@transformshift{1.063889in}{1.240191in}%
     2303\pgfsys@useobject{currentmarker}{}%
     2304\end{pgfscope}%
     2305\end{pgfscope}%
     2306\begin{pgfscope}%
     2307\pgfsetbuttcap%
     2308\pgfsetroundjoin%
     2309\definecolor{currentfill}{rgb}{0.121569,0.466667,0.705882}%
    24742310\pgfsetfillcolor{currentfill}%
    24752311\pgfsetlinewidth{1.003750pt}%
    2476 \definecolor{currentstroke}{rgb}{0.172549,0.627451,0.172549}%
     2312\definecolor{currentstroke}{rgb}{0.121569,0.466667,0.705882}%
    24772313\pgfsetstrokecolor{currentstroke}%
    24782314\pgfsetdash{}{0pt}%
     
    24832319}%
    24842320\begin{pgfscope}%
    2485 \pgfsys@transformshift{3.869368in}{2.342667in}%
     2321\pgfsys@transformshift{1.063889in}{1.379080in}%
    24862322\pgfsys@useobject{currentmarker}{}%
    24872323\end{pgfscope}%
     
    24912327\pgfsetroundjoin%
    24922328\pgfsetlinewidth{1.505625pt}%
    2493 \definecolor{currentstroke}{rgb}{0.172549,0.627451,0.172549}%
    2494 \pgfsetstrokecolor{currentstroke}%
    2495 \pgfsetdash{}{0pt}%
    2496 \pgfpathmoveto{\pgfqpoint{3.647146in}{2.231556in}}%
    2497 \pgfpathlineto{\pgfqpoint{4.091591in}{2.231556in}}%
    2498 \pgfusepath{stroke}%
    2499 \end{pgfscope}%
    2500 \begin{pgfscope}%
    2501 \pgfsetbuttcap%
    2502 \pgfsetmiterjoin%
    2503 \definecolor{currentfill}{rgb}{0.172549,0.627451,0.172549}%
     2329\definecolor{currentstroke}{rgb}{0.121569,0.466667,0.705882}%
     2330\pgfsetstrokecolor{currentstroke}%
     2331\pgfsetdash{}{0pt}%
     2332\pgfpathmoveto{\pgfqpoint{0.925000in}{1.309636in}}%
     2333\pgfpathlineto{\pgfqpoint{1.202778in}{1.309636in}}%
     2334\pgfusepath{stroke}%
     2335\end{pgfscope}%
     2336\begin{pgfscope}%
     2337\pgfsetbuttcap%
     2338\pgfsetroundjoin%
     2339\definecolor{currentfill}{rgb}{0.121569,0.466667,0.705882}%
    25042340\pgfsetfillcolor{currentfill}%
    25052341\pgfsetlinewidth{1.003750pt}%
    2506 \definecolor{currentstroke}{rgb}{0.172549,0.627451,0.172549}%
     2342\definecolor{currentstroke}{rgb}{0.121569,0.466667,0.705882}%
    25072343\pgfsetstrokecolor{currentstroke}%
    25082344\pgfsetdash{}{0pt}%
    25092345\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.041667in}{-0.041667in}}{\pgfqpoint{0.041667in}{0.041667in}}{%
    2510 \pgfpathmoveto{\pgfqpoint{-0.041667in}{-0.041667in}}%
    2511 \pgfpathlineto{\pgfqpoint{0.041667in}{-0.041667in}}%
    2512 \pgfpathlineto{\pgfqpoint{0.041667in}{0.041667in}}%
    2513 \pgfpathlineto{\pgfqpoint{-0.041667in}{0.041667in}}%
     2346\pgfpathmoveto{\pgfqpoint{0.000000in}{-0.041667in}}%
     2347\pgfpathcurveto{\pgfqpoint{0.011050in}{-0.041667in}}{\pgfqpoint{0.021649in}{-0.037276in}}{\pgfqpoint{0.029463in}{-0.029463in}}%
     2348\pgfpathcurveto{\pgfqpoint{0.037276in}{-0.021649in}}{\pgfqpoint{0.041667in}{-0.011050in}}{\pgfqpoint{0.041667in}{0.000000in}}%
     2349\pgfpathcurveto{\pgfqpoint{0.041667in}{0.011050in}}{\pgfqpoint{0.037276in}{0.021649in}}{\pgfqpoint{0.029463in}{0.029463in}}%
     2350\pgfpathcurveto{\pgfqpoint{0.021649in}{0.037276in}}{\pgfqpoint{0.011050in}{0.041667in}}{\pgfqpoint{0.000000in}{0.041667in}}%
     2351\pgfpathcurveto{\pgfqpoint{-0.011050in}{0.041667in}}{\pgfqpoint{-0.021649in}{0.037276in}}{\pgfqpoint{-0.029463in}{0.029463in}}%
     2352\pgfpathcurveto{\pgfqpoint{-0.037276in}{0.021649in}}{\pgfqpoint{-0.041667in}{0.011050in}}{\pgfqpoint{-0.041667in}{0.000000in}}%
     2353\pgfpathcurveto{\pgfqpoint{-0.041667in}{-0.011050in}}{\pgfqpoint{-0.037276in}{-0.021649in}}{\pgfqpoint{-0.029463in}{-0.029463in}}%
     2354\pgfpathcurveto{\pgfqpoint{-0.021649in}{-0.037276in}}{\pgfqpoint{-0.011050in}{-0.041667in}}{\pgfqpoint{0.000000in}{-0.041667in}}%
    25142355\pgfpathclose%
    25152356\pgfusepath{stroke,fill}%
    25162357}%
    25172358\begin{pgfscope}%
    2518 \pgfsys@transformshift{3.869368in}{2.231556in}%
     2359\pgfsys@transformshift{1.063889in}{1.309636in}%
    25192360\pgfsys@useobject{currentmarker}{}%
    25202361\end{pgfscope}%
     
    25242365\pgfsetstrokecolor{textcolor}%
    25252366\pgfsetfillcolor{textcolor}%
    2526 \pgftext[x=4.269368in,y=2.153778in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont CFA-rand}%
    2527 \end{pgfscope}%
    2528 \begin{pgfscope}%
    2529 \pgfsetbuttcap%
    2530 \pgfsetroundjoin%
    2531 \pgfsetlinewidth{1.505625pt}%
    2532 \definecolor{currentstroke}{rgb}{0.839216,0.152941,0.156863}%
    2533 \pgfsetstrokecolor{currentstroke}%
    2534 \pgfsetdash{}{0pt}%
    2535 \pgfpathmoveto{\pgfqpoint{3.869368in}{1.795985in}}%
    2536 \pgfpathlineto{\pgfqpoint{3.869368in}{2.018207in}}%
    2537 \pgfusepath{stroke}%
    2538 \end{pgfscope}%
    2539 \begin{pgfscope}%
    2540 \pgfsetbuttcap%
    2541 \pgfsetroundjoin%
    2542 \definecolor{currentfill}{rgb}{0.839216,0.152941,0.156863}%
     2367\pgftext[x=1.313889in,y=1.261024in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont CFA-baseline}%
     2368\end{pgfscope}%
     2369\begin{pgfscope}%
     2370\pgfsetbuttcap%
     2371\pgfsetroundjoin%
     2372\pgfsetlinewidth{1.505625pt}%
     2373\definecolor{currentstroke}{rgb}{1.000000,0.498039,0.054902}%
     2374\pgfsetstrokecolor{currentstroke}%
     2375\pgfsetdash{}{0pt}%
     2376\pgfpathmoveto{\pgfqpoint{1.063889in}{1.046518in}}%
     2377\pgfpathlineto{\pgfqpoint{1.063889in}{1.185407in}}%
     2378\pgfusepath{stroke}%
     2379\end{pgfscope}%
     2380\begin{pgfscope}%
     2381\pgfsetbuttcap%
     2382\pgfsetroundjoin%
     2383\definecolor{currentfill}{rgb}{1.000000,0.498039,0.054902}%
    25432384\pgfsetfillcolor{currentfill}%
    25442385\pgfsetlinewidth{1.003750pt}%
    2545 \definecolor{currentstroke}{rgb}{0.839216,0.152941,0.156863}%
     2386\definecolor{currentstroke}{rgb}{1.000000,0.498039,0.054902}%
    25462387\pgfsetstrokecolor{currentstroke}%
    25472388\pgfsetdash{}{0pt}%
     
    25522393}%
    25532394\begin{pgfscope}%
    2554 \pgfsys@transformshift{3.869368in}{1.795985in}%
    2555 \pgfsys@useobject{currentmarker}{}%
    2556 \end{pgfscope}%
    2557 \end{pgfscope}%
    2558 \begin{pgfscope}%
    2559 \pgfsetbuttcap%
    2560 \pgfsetroundjoin%
    2561 \definecolor{currentfill}{rgb}{0.839216,0.152941,0.156863}%
     2395\pgfsys@transformshift{1.063889in}{1.046518in}%
     2396\pgfsys@useobject{currentmarker}{}%
     2397\end{pgfscope}%
     2398\end{pgfscope}%
     2399\begin{pgfscope}%
     2400\pgfsetbuttcap%
     2401\pgfsetroundjoin%
     2402\definecolor{currentfill}{rgb}{1.000000,0.498039,0.054902}%
    25622403\pgfsetfillcolor{currentfill}%
    25632404\pgfsetlinewidth{1.003750pt}%
    2564 \definecolor{currentstroke}{rgb}{0.839216,0.152941,0.156863}%
     2405\definecolor{currentstroke}{rgb}{1.000000,0.498039,0.054902}%
    25652406\pgfsetstrokecolor{currentstroke}%
    25662407\pgfsetdash{}{0pt}%
     
    25712412}%
    25722413\begin{pgfscope}%
    2573 \pgfsys@transformshift{3.869368in}{2.018207in}%
     2414\pgfsys@transformshift{1.063889in}{1.185407in}%
    25742415\pgfsys@useobject{currentmarker}{}%
    25752416\end{pgfscope}%
     
    25792420\pgfsetroundjoin%
    25802421\pgfsetlinewidth{1.505625pt}%
    2581 \definecolor{currentstroke}{rgb}{0.839216,0.152941,0.156863}%
    2582 \pgfsetstrokecolor{currentstroke}%
    2583 \pgfsetdash{}{0pt}%
    2584 \pgfpathmoveto{\pgfqpoint{3.647146in}{1.907096in}}%
    2585 \pgfpathlineto{\pgfqpoint{4.091591in}{1.907096in}}%
    2586 \pgfusepath{stroke}%
    2587 \end{pgfscope}%
    2588 \begin{pgfscope}%
    2589 \pgfsetbuttcap%
    2590 \pgfsetmiterjoin%
    2591 \definecolor{currentfill}{rgb}{0.839216,0.152941,0.156863}%
     2422\definecolor{currentstroke}{rgb}{1.000000,0.498039,0.054902}%
     2423\pgfsetstrokecolor{currentstroke}%
     2424\pgfsetdash{}{0pt}%
     2425\pgfpathmoveto{\pgfqpoint{0.925000in}{1.115963in}}%
     2426\pgfpathlineto{\pgfqpoint{1.202778in}{1.115963in}}%
     2427\pgfusepath{stroke}%
     2428\end{pgfscope}%
     2429\begin{pgfscope}%
     2430\pgfsetbuttcap%
     2431\pgfsetroundjoin%
     2432\definecolor{currentfill}{rgb}{1.000000,0.498039,0.054902}%
    25922433\pgfsetfillcolor{currentfill}%
    25932434\pgfsetlinewidth{1.003750pt}%
    2594 \definecolor{currentstroke}{rgb}{0.839216,0.152941,0.156863}%
    2595 \pgfsetstrokecolor{currentstroke}%
    2596 \pgfsetdash{}{0pt}%
    2597 \pgfsys@defobject{currentmarker}{\pgfqpoint{-0.058926in}{-0.058926in}}{\pgfqpoint{0.058926in}{0.058926in}}{%
    2598 \pgfpathmoveto{\pgfqpoint{-0.000000in}{-0.058926in}}%
    2599 \pgfpathlineto{\pgfqpoint{0.058926in}{0.000000in}}%
    2600 \pgfpathlineto{\pgfqpoint{0.000000in}{0.058926in}}%
    2601 \pgfpathlineto{\pgfqpoint{-0.058926in}{0.000000in}}%
     2435\definecolor{currentstroke}{rgb}{1.000000,0.498039,0.054902}%
     2436\pgfsetstrokecolor{currentstroke}%
     2437\pgfsetdash{}{0pt}%
     2438\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.041667in}{-0.041667in}}{\pgfqpoint{0.041667in}{0.041667in}}{%
     2439\pgfpathmoveto{\pgfqpoint{0.000000in}{-0.041667in}}%
     2440\pgfpathcurveto{\pgfqpoint{0.011050in}{-0.041667in}}{\pgfqpoint{0.021649in}{-0.037276in}}{\pgfqpoint{0.029463in}{-0.029463in}}%
     2441\pgfpathcurveto{\pgfqpoint{0.037276in}{-0.021649in}}{\pgfqpoint{0.041667in}{-0.011050in}}{\pgfqpoint{0.041667in}{0.000000in}}%
     2442\pgfpathcurveto{\pgfqpoint{0.041667in}{0.011050in}}{\pgfqpoint{0.037276in}{0.021649in}}{\pgfqpoint{0.029463in}{0.029463in}}%
     2443\pgfpathcurveto{\pgfqpoint{0.021649in}{0.037276in}}{\pgfqpoint{0.011050in}{0.041667in}}{\pgfqpoint{0.000000in}{0.041667in}}%
     2444\pgfpathcurveto{\pgfqpoint{-0.011050in}{0.041667in}}{\pgfqpoint{-0.021649in}{0.037276in}}{\pgfqpoint{-0.029463in}{0.029463in}}%
     2445\pgfpathcurveto{\pgfqpoint{-0.037276in}{0.021649in}}{\pgfqpoint{-0.041667in}{0.011050in}}{\pgfqpoint{-0.041667in}{0.000000in}}%
     2446\pgfpathcurveto{\pgfqpoint{-0.041667in}{-0.011050in}}{\pgfqpoint{-0.037276in}{-0.021649in}}{\pgfqpoint{-0.029463in}{-0.029463in}}%
     2447\pgfpathcurveto{\pgfqpoint{-0.021649in}{-0.037276in}}{\pgfqpoint{-0.011050in}{-0.041667in}}{\pgfqpoint{0.000000in}{-0.041667in}}%
    26022448\pgfpathclose%
    26032449\pgfusepath{stroke,fill}%
    26042450}%
    26052451\begin{pgfscope}%
    2606 \pgfsys@transformshift{3.869368in}{1.907096in}%
     2452\pgfsys@transformshift{1.063889in}{1.115963in}%
    26072453\pgfsys@useobject{currentmarker}{}%
    26082454\end{pgfscope}%
     
    26122458\pgfsetstrokecolor{textcolor}%
    26132459\pgfsetfillcolor{textcolor}%
    2614 \pgftext[x=4.269368in,y=1.829318in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont CPP-rand}%
     2460\pgftext[x=1.313889in,y=1.067352in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont CPP-baseline}%
     2461\end{pgfscope}%
     2462\begin{pgfscope}%
     2463\pgfsetbuttcap%
     2464\pgfsetroundjoin%
     2465\pgfsetlinewidth{1.505625pt}%
     2466\definecolor{currentstroke}{rgb}{0.172549,0.627451,0.172549}%
     2467\pgfsetstrokecolor{currentstroke}%
     2468\pgfsetdash{}{0pt}%
     2469\pgfpathmoveto{\pgfqpoint{1.063889in}{0.852846in}}%
     2470\pgfpathlineto{\pgfqpoint{1.063889in}{0.991734in}}%
     2471\pgfusepath{stroke}%
     2472\end{pgfscope}%
     2473\begin{pgfscope}%
     2474\pgfsetbuttcap%
     2475\pgfsetroundjoin%
     2476\definecolor{currentfill}{rgb}{0.172549,0.627451,0.172549}%
     2477\pgfsetfillcolor{currentfill}%
     2478\pgfsetlinewidth{1.003750pt}%
     2479\definecolor{currentstroke}{rgb}{0.172549,0.627451,0.172549}%
     2480\pgfsetstrokecolor{currentstroke}%
     2481\pgfsetdash{}{0pt}%
     2482\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.027778in}{-0.000000in}}{\pgfqpoint{0.027778in}{0.000000in}}{%
     2483\pgfpathmoveto{\pgfqpoint{0.027778in}{-0.000000in}}%
     2484\pgfpathlineto{\pgfqpoint{-0.027778in}{0.000000in}}%
     2485\pgfusepath{stroke,fill}%
     2486}%
     2487\begin{pgfscope}%
     2488\pgfsys@transformshift{1.063889in}{0.852846in}%
     2489\pgfsys@useobject{currentmarker}{}%
     2490\end{pgfscope}%
     2491\end{pgfscope}%
     2492\begin{pgfscope}%
     2493\pgfsetbuttcap%
     2494\pgfsetroundjoin%
     2495\definecolor{currentfill}{rgb}{0.172549,0.627451,0.172549}%
     2496\pgfsetfillcolor{currentfill}%
     2497\pgfsetlinewidth{1.003750pt}%
     2498\definecolor{currentstroke}{rgb}{0.172549,0.627451,0.172549}%
     2499\pgfsetstrokecolor{currentstroke}%
     2500\pgfsetdash{}{0pt}%
     2501\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.027778in}{-0.000000in}}{\pgfqpoint{0.027778in}{0.000000in}}{%
     2502\pgfpathmoveto{\pgfqpoint{0.027778in}{-0.000000in}}%
     2503\pgfpathlineto{\pgfqpoint{-0.027778in}{0.000000in}}%
     2504\pgfusepath{stroke,fill}%
     2505}%
     2506\begin{pgfscope}%
     2507\pgfsys@transformshift{1.063889in}{0.991734in}%
     2508\pgfsys@useobject{currentmarker}{}%
     2509\end{pgfscope}%
     2510\end{pgfscope}%
     2511\begin{pgfscope}%
     2512\pgfsetrectcap%
     2513\pgfsetroundjoin%
     2514\pgfsetlinewidth{1.505625pt}%
     2515\definecolor{currentstroke}{rgb}{0.172549,0.627451,0.172549}%
     2516\pgfsetstrokecolor{currentstroke}%
     2517\pgfsetdash{}{0pt}%
     2518\pgfpathmoveto{\pgfqpoint{0.925000in}{0.922290in}}%
     2519\pgfpathlineto{\pgfqpoint{1.202778in}{0.922290in}}%
     2520\pgfusepath{stroke}%
     2521\end{pgfscope}%
     2522\begin{pgfscope}%
     2523\pgfsetbuttcap%
     2524\pgfsetroundjoin%
     2525\definecolor{currentfill}{rgb}{0.172549,0.627451,0.172549}%
     2526\pgfsetfillcolor{currentfill}%
     2527\pgfsetlinewidth{1.003750pt}%
     2528\definecolor{currentstroke}{rgb}{0.172549,0.627451,0.172549}%
     2529\pgfsetstrokecolor{currentstroke}%
     2530\pgfsetdash{}{0pt}%
     2531\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.041667in}{-0.041667in}}{\pgfqpoint{0.041667in}{0.041667in}}{%
     2532\pgfpathmoveto{\pgfqpoint{0.000000in}{-0.041667in}}%
     2533\pgfpathcurveto{\pgfqpoint{0.011050in}{-0.041667in}}{\pgfqpoint{0.021649in}{-0.037276in}}{\pgfqpoint{0.029463in}{-0.029463in}}%
     2534\pgfpathcurveto{\pgfqpoint{0.037276in}{-0.021649in}}{\pgfqpoint{0.041667in}{-0.011050in}}{\pgfqpoint{0.041667in}{0.000000in}}%
     2535\pgfpathcurveto{\pgfqpoint{0.041667in}{0.011050in}}{\pgfqpoint{0.037276in}{0.021649in}}{\pgfqpoint{0.029463in}{0.029463in}}%
     2536\pgfpathcurveto{\pgfqpoint{0.021649in}{0.037276in}}{\pgfqpoint{0.011050in}{0.041667in}}{\pgfqpoint{0.000000in}{0.041667in}}%
     2537\pgfpathcurveto{\pgfqpoint{-0.011050in}{0.041667in}}{\pgfqpoint{-0.021649in}{0.037276in}}{\pgfqpoint{-0.029463in}{0.029463in}}%
     2538\pgfpathcurveto{\pgfqpoint{-0.037276in}{0.021649in}}{\pgfqpoint{-0.041667in}{0.011050in}}{\pgfqpoint{-0.041667in}{0.000000in}}%
     2539\pgfpathcurveto{\pgfqpoint{-0.041667in}{-0.011050in}}{\pgfqpoint{-0.037276in}{-0.021649in}}{\pgfqpoint{-0.029463in}{-0.029463in}}%
     2540\pgfpathcurveto{\pgfqpoint{-0.021649in}{-0.037276in}}{\pgfqpoint{-0.011050in}{-0.041667in}}{\pgfqpoint{0.000000in}{-0.041667in}}%
     2541\pgfpathclose%
     2542\pgfusepath{stroke,fill}%
     2543}%
     2544\begin{pgfscope}%
     2545\pgfsys@transformshift{1.063889in}{0.922290in}%
     2546\pgfsys@useobject{currentmarker}{}%
     2547\end{pgfscope}%
     2548\end{pgfscope}%
     2549\begin{pgfscope}%
     2550\definecolor{textcolor}{rgb}{0.000000,0.000000,0.000000}%
     2551\pgfsetstrokecolor{textcolor}%
     2552\pgfsetfillcolor{textcolor}%
     2553\pgftext[x=1.313889in,y=0.873679in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont CFA-rand}%
     2554\end{pgfscope}%
     2555\begin{pgfscope}%
     2556\pgfsetbuttcap%
     2557\pgfsetroundjoin%
     2558\pgfsetlinewidth{1.505625pt}%
     2559\definecolor{currentstroke}{rgb}{0.839216,0.152941,0.156863}%
     2560\pgfsetstrokecolor{currentstroke}%
     2561\pgfsetdash{}{0pt}%
     2562\pgfpathmoveto{\pgfqpoint{1.063889in}{0.659173in}}%
     2563\pgfpathlineto{\pgfqpoint{1.063889in}{0.798062in}}%
     2564\pgfusepath{stroke}%
     2565\end{pgfscope}%
     2566\begin{pgfscope}%
     2567\pgfsetbuttcap%
     2568\pgfsetroundjoin%
     2569\definecolor{currentfill}{rgb}{0.839216,0.152941,0.156863}%
     2570\pgfsetfillcolor{currentfill}%
     2571\pgfsetlinewidth{1.003750pt}%
     2572\definecolor{currentstroke}{rgb}{0.839216,0.152941,0.156863}%
     2573\pgfsetstrokecolor{currentstroke}%
     2574\pgfsetdash{}{0pt}%
     2575\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.027778in}{-0.000000in}}{\pgfqpoint{0.027778in}{0.000000in}}{%
     2576\pgfpathmoveto{\pgfqpoint{0.027778in}{-0.000000in}}%
     2577\pgfpathlineto{\pgfqpoint{-0.027778in}{0.000000in}}%
     2578\pgfusepath{stroke,fill}%
     2579}%
     2580\begin{pgfscope}%
     2581\pgfsys@transformshift{1.063889in}{0.659173in}%
     2582\pgfsys@useobject{currentmarker}{}%
     2583\end{pgfscope}%
     2584\end{pgfscope}%
     2585\begin{pgfscope}%
     2586\pgfsetbuttcap%
     2587\pgfsetroundjoin%
     2588\definecolor{currentfill}{rgb}{0.839216,0.152941,0.156863}%
     2589\pgfsetfillcolor{currentfill}%
     2590\pgfsetlinewidth{1.003750pt}%
     2591\definecolor{currentstroke}{rgb}{0.839216,0.152941,0.156863}%
     2592\pgfsetstrokecolor{currentstroke}%
     2593\pgfsetdash{}{0pt}%
     2594\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.027778in}{-0.000000in}}{\pgfqpoint{0.027778in}{0.000000in}}{%
     2595\pgfpathmoveto{\pgfqpoint{0.027778in}{-0.000000in}}%
     2596\pgfpathlineto{\pgfqpoint{-0.027778in}{0.000000in}}%
     2597\pgfusepath{stroke,fill}%
     2598}%
     2599\begin{pgfscope}%
     2600\pgfsys@transformshift{1.063889in}{0.798062in}%
     2601\pgfsys@useobject{currentmarker}{}%
     2602\end{pgfscope}%
     2603\end{pgfscope}%
     2604\begin{pgfscope}%
     2605\pgfsetrectcap%
     2606\pgfsetroundjoin%
     2607\pgfsetlinewidth{1.505625pt}%
     2608\definecolor{currentstroke}{rgb}{0.839216,0.152941,0.156863}%
     2609\pgfsetstrokecolor{currentstroke}%
     2610\pgfsetdash{}{0pt}%
     2611\pgfpathmoveto{\pgfqpoint{0.925000in}{0.728617in}}%
     2612\pgfpathlineto{\pgfqpoint{1.202778in}{0.728617in}}%
     2613\pgfusepath{stroke}%
     2614\end{pgfscope}%
     2615\begin{pgfscope}%
     2616\pgfsetbuttcap%
     2617\pgfsetroundjoin%
     2618\definecolor{currentfill}{rgb}{0.839216,0.152941,0.156863}%
     2619\pgfsetfillcolor{currentfill}%
     2620\pgfsetlinewidth{1.003750pt}%
     2621\definecolor{currentstroke}{rgb}{0.839216,0.152941,0.156863}%
     2622\pgfsetstrokecolor{currentstroke}%
     2623\pgfsetdash{}{0pt}%
     2624\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.041667in}{-0.041667in}}{\pgfqpoint{0.041667in}{0.041667in}}{%
     2625\pgfpathmoveto{\pgfqpoint{0.000000in}{-0.041667in}}%
     2626\pgfpathcurveto{\pgfqpoint{0.011050in}{-0.041667in}}{\pgfqpoint{0.021649in}{-0.037276in}}{\pgfqpoint{0.029463in}{-0.029463in}}%
     2627\pgfpathcurveto{\pgfqpoint{0.037276in}{-0.021649in}}{\pgfqpoint{0.041667in}{-0.011050in}}{\pgfqpoint{0.041667in}{0.000000in}}%
     2628\pgfpathcurveto{\pgfqpoint{0.041667in}{0.011050in}}{\pgfqpoint{0.037276in}{0.021649in}}{\pgfqpoint{0.029463in}{0.029463in}}%
     2629\pgfpathcurveto{\pgfqpoint{0.021649in}{0.037276in}}{\pgfqpoint{0.011050in}{0.041667in}}{\pgfqpoint{0.000000in}{0.041667in}}%
     2630\pgfpathcurveto{\pgfqpoint{-0.011050in}{0.041667in}}{\pgfqpoint{-0.021649in}{0.037276in}}{\pgfqpoint{-0.029463in}{0.029463in}}%
     2631\pgfpathcurveto{\pgfqpoint{-0.037276in}{0.021649in}}{\pgfqpoint{-0.041667in}{0.011050in}}{\pgfqpoint{-0.041667in}{0.000000in}}%
     2632\pgfpathcurveto{\pgfqpoint{-0.041667in}{-0.011050in}}{\pgfqpoint{-0.037276in}{-0.021649in}}{\pgfqpoint{-0.029463in}{-0.029463in}}%
     2633\pgfpathcurveto{\pgfqpoint{-0.021649in}{-0.037276in}}{\pgfqpoint{-0.011050in}{-0.041667in}}{\pgfqpoint{0.000000in}{-0.041667in}}%
     2634\pgfpathclose%
     2635\pgfusepath{stroke,fill}%
     2636}%
     2637\begin{pgfscope}%
     2638\pgfsys@transformshift{1.063889in}{0.728617in}%
     2639\pgfsys@useobject{currentmarker}{}%
     2640\end{pgfscope}%
     2641\end{pgfscope}%
     2642\begin{pgfscope}%
     2643\definecolor{textcolor}{rgb}{0.000000,0.000000,0.000000}%
     2644\pgfsetstrokecolor{textcolor}%
     2645\pgfsetfillcolor{textcolor}%
     2646\pgftext[x=1.313889in,y=0.680006in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont CPP-rand}%
    26152647\end{pgfscope}%
    26162648\end{pgfpicture}%
  • doc/theses/colby_parsons_MMAth/figures/pyke_Channel_Contention.pgf

    r044ae62 r3a513d89  
    7777\pgfsetstrokecolor{textcolor}%
    7878\pgfsetfillcolor{textcolor}%
    79 \pgftext[x=1.025455in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 2\)}%
     79\pgftext[x=1.025455in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 2\)}%
    8080\end{pgfscope}%
    8181\begin{pgfscope}%
     
    102102\pgfsetstrokecolor{textcolor}%
    103103\pgfsetfillcolor{textcolor}%
    104 \pgftext[x=1.326061in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 4\)}%
     104\pgftext[x=1.326061in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 4\)}%
    105105\end{pgfscope}%
    106106\begin{pgfscope}%
     
    127127\pgfsetstrokecolor{textcolor}%
    128128\pgfsetfillcolor{textcolor}%
    129 \pgftext[x=1.927273in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 8\)}%
     129\pgftext[x=1.927273in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 8\)}%
    130130\end{pgfscope}%
    131131\begin{pgfscope}%
     
    152152\pgfsetstrokecolor{textcolor}%
    153153\pgfsetfillcolor{textcolor}%
    154 \pgftext[x=3.129697in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 16\)}%
     154\pgftext[x=3.129697in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 16\)}%
    155155\end{pgfscope}%
    156156\begin{pgfscope}%
     
    177177\pgfsetstrokecolor{textcolor}%
    178178\pgfsetfillcolor{textcolor}%
    179 \pgftext[x=4.332121in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 24\)}%
     179\pgftext[x=4.332121in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 24\)}%
    180180\end{pgfscope}%
    181181\begin{pgfscope}%
     
    202202\pgfsetstrokecolor{textcolor}%
    203203\pgfsetfillcolor{textcolor}%
    204 \pgftext[x=5.534545in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 32\)}%
     204\pgftext[x=5.534545in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 32\)}%
    205205\end{pgfscope}%
    206206\begin{pgfscope}%
     
    208208\pgfsetstrokecolor{textcolor}%
    209209\pgfsetfillcolor{textcolor}%
    210 \pgftext[x=3.280000in,y=0.161874in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont Cores}%
     210\pgftext[x=3.280000in,y=0.251766in,,top]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont Cores}%
    211211\end{pgfscope}%
    212212\begin{pgfscope}%
     
    233233\pgfsetstrokecolor{textcolor}%
    234234\pgfsetfillcolor{textcolor}%
    235 \pgftext[x=0.399655in,y=2.241198in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 10^{8}\)}%
     235\pgftext[x=0.501581in,y=2.276306in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 10^{8}\)}%
    236236\end{pgfscope}%
    237237\begin{pgfscope}%
     
    429429\pgfsetstrokecolor{textcolor}%
    430430\pgfsetfillcolor{textcolor}%
    431 \pgftext[x=0.344100in,y=2.376000in,,bottom,rotate=90.000000]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont Throughput (channel operations)}%
     431\pgftext[x=0.446026in,y=2.376000in,,bottom,rotate=90.000000]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont Throughput (channel operations)}%
    432432\end{pgfscope}%
    433433\begin{pgfscope}%
     
    838838\pgfusepath{clip}%
    839839\pgfsetbuttcap%
    840 \pgfsetmiterjoin%
     840\pgfsetroundjoin%
    841841\definecolor{currentfill}{rgb}{1.000000,0.498039,0.054902}%
    842842\pgfsetfillcolor{currentfill}%
    843843\pgfsetlinewidth{1.003750pt}%
    844844\definecolor{currentstroke}{rgb}{1.000000,0.498039,0.054902}%
    845 \pgfsetstrokecolor{currentstroke}%
    846 \pgfsetdash{}{0pt}%
    847 \pgfsys@defobject{currentmarker}{\pgfqpoint{-0.041667in}{-0.041667in}}{\pgfqpoint{0.041667in}{0.041667in}}{%
    848 \pgfpathmoveto{\pgfqpoint{-0.041667in}{-0.041667in}}%
    849 \pgfpathlineto{\pgfqpoint{0.041667in}{-0.041667in}}%
    850 \pgfpathlineto{\pgfqpoint{0.041667in}{0.041667in}}%
    851 \pgfpathlineto{\pgfqpoint{-0.041667in}{0.041667in}}%
    852 \pgfpathclose%
    853 \pgfusepath{stroke,fill}%
    854 }%
    855 \begin{pgfscope}%
    856 \pgfsys@transformshift{1.025455in}{3.619140in}%
    857 \pgfsys@useobject{currentmarker}{}%
    858 \end{pgfscope}%
    859 \begin{pgfscope}%
    860 \pgfsys@transformshift{1.326061in}{3.242405in}%
    861 \pgfsys@useobject{currentmarker}{}%
    862 \end{pgfscope}%
    863 \begin{pgfscope}%
    864 \pgfsys@transformshift{1.927273in}{2.083323in}%
    865 \pgfsys@useobject{currentmarker}{}%
    866 \end{pgfscope}%
    867 \begin{pgfscope}%
    868 \pgfsys@transformshift{3.129697in}{0.987727in}%
    869 \pgfsys@useobject{currentmarker}{}%
    870 \end{pgfscope}%
    871 \begin{pgfscope}%
    872 \pgfsys@transformshift{4.332121in}{0.742138in}%
    873 \pgfsys@useobject{currentmarker}{}%
    874 \end{pgfscope}%
    875 \begin{pgfscope}%
    876 \pgfsys@transformshift{5.534545in}{0.704967in}%
    877 \pgfsys@useobject{currentmarker}{}%
    878 \end{pgfscope}%
    879 \end{pgfscope}%
    880 \begin{pgfscope}%
    881 \pgfsetrectcap%
    882 \pgfsetmiterjoin%
    883 \pgfsetlinewidth{0.803000pt}%
    884 \definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}%
    885 \pgfsetstrokecolor{currentstroke}%
    886 \pgfsetdash{}{0pt}%
    887 \pgfpathmoveto{\pgfqpoint{0.800000in}{0.528000in}}%
    888 \pgfpathlineto{\pgfqpoint{0.800000in}{4.224000in}}%
    889 \pgfusepath{stroke}%
    890 \end{pgfscope}%
    891 \begin{pgfscope}%
    892 \pgfsetrectcap%
    893 \pgfsetmiterjoin%
    894 \pgfsetlinewidth{0.803000pt}%
    895 \definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}%
    896 \pgfsetstrokecolor{currentstroke}%
    897 \pgfsetdash{}{0pt}%
    898 \pgfpathmoveto{\pgfqpoint{5.760000in}{0.528000in}}%
    899 \pgfpathlineto{\pgfqpoint{5.760000in}{4.224000in}}%
    900 \pgfusepath{stroke}%
    901 \end{pgfscope}%
    902 \begin{pgfscope}%
    903 \pgfsetrectcap%
    904 \pgfsetmiterjoin%
    905 \pgfsetlinewidth{0.803000pt}%
    906 \definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}%
    907 \pgfsetstrokecolor{currentstroke}%
    908 \pgfsetdash{}{0pt}%
    909 \pgfpathmoveto{\pgfqpoint{0.800000in}{0.528000in}}%
    910 \pgfpathlineto{\pgfqpoint{5.760000in}{0.528000in}}%
    911 \pgfusepath{stroke}%
    912 \end{pgfscope}%
    913 \begin{pgfscope}%
    914 \pgfsetrectcap%
    915 \pgfsetmiterjoin%
    916 \pgfsetlinewidth{0.803000pt}%
    917 \definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}%
    918 \pgfsetstrokecolor{currentstroke}%
    919 \pgfsetdash{}{0pt}%
    920 \pgfpathmoveto{\pgfqpoint{0.800000in}{4.224000in}}%
    921 \pgfpathlineto{\pgfqpoint{5.760000in}{4.224000in}}%
    922 \pgfusepath{stroke}%
    923 \end{pgfscope}%
    924 \begin{pgfscope}%
    925 \definecolor{textcolor}{rgb}{0.000000,0.000000,0.000000}%
    926 \pgfsetstrokecolor{textcolor}%
    927 \pgfsetfillcolor{textcolor}%
    928 \pgftext[x=3.280000in,y=4.307333in,,base]{\color{textcolor}\rmfamily\fontsize{19.200000}{23.040000}\selectfont Channel Contention Benchmark}%
    929 \end{pgfscope}%
    930 \begin{pgfscope}%
    931 \pgfsetbuttcap%
    932 \pgfsetmiterjoin%
    933 \definecolor{currentfill}{rgb}{1.000000,1.000000,1.000000}%
    934 \pgfsetfillcolor{currentfill}%
    935 \pgfsetfillopacity{0.800000}%
    936 \pgfsetlinewidth{1.003750pt}%
    937 \definecolor{currentstroke}{rgb}{0.800000,0.800000,0.800000}%
    938 \pgfsetstrokecolor{currentstroke}%
    939 \pgfsetstrokeopacity{0.800000}%
    940 \pgfsetdash{}{0pt}%
    941 \pgfpathmoveto{\pgfqpoint{4.447292in}{3.397303in}}%
    942 \pgfpathlineto{\pgfqpoint{5.604444in}{3.397303in}}%
    943 \pgfpathquadraticcurveto{\pgfqpoint{5.648889in}{3.397303in}}{\pgfqpoint{5.648889in}{3.441747in}}%
    944 \pgfpathlineto{\pgfqpoint{5.648889in}{4.068444in}}%
    945 \pgfpathquadraticcurveto{\pgfqpoint{5.648889in}{4.112889in}}{\pgfqpoint{5.604444in}{4.112889in}}%
    946 \pgfpathlineto{\pgfqpoint{4.447292in}{4.112889in}}%
    947 \pgfpathquadraticcurveto{\pgfqpoint{4.402848in}{4.112889in}}{\pgfqpoint{4.402848in}{4.068444in}}%
    948 \pgfpathlineto{\pgfqpoint{4.402848in}{3.441747in}}%
    949 \pgfpathquadraticcurveto{\pgfqpoint{4.402848in}{3.397303in}}{\pgfqpoint{4.447292in}{3.397303in}}%
    950 \pgfpathclose%
    951 \pgfusepath{stroke,fill}%
    952 \end{pgfscope}%
    953 \begin{pgfscope}%
    954 \pgfsetbuttcap%
    955 \pgfsetroundjoin%
    956 \pgfsetlinewidth{1.505625pt}%
    957 \definecolor{currentstroke}{rgb}{0.121569,0.466667,0.705882}%
    958 \pgfsetstrokecolor{currentstroke}%
    959 \pgfsetdash{}{0pt}%
    960 \pgfpathmoveto{\pgfqpoint{4.713959in}{3.824000in}}%
    961 \pgfpathlineto{\pgfqpoint{4.713959in}{4.046222in}}%
    962 \pgfusepath{stroke}%
    963 \end{pgfscope}%
    964 \begin{pgfscope}%
    965 \pgfsetbuttcap%
    966 \pgfsetroundjoin%
    967 \definecolor{currentfill}{rgb}{0.121569,0.466667,0.705882}%
    968 \pgfsetfillcolor{currentfill}%
    969 \pgfsetlinewidth{1.003750pt}%
    970 \definecolor{currentstroke}{rgb}{0.121569,0.466667,0.705882}%
    971 \pgfsetstrokecolor{currentstroke}%
    972 \pgfsetdash{}{0pt}%
    973 \pgfsys@defobject{currentmarker}{\pgfqpoint{-0.027778in}{-0.000000in}}{\pgfqpoint{0.027778in}{0.000000in}}{%
    974 \pgfpathmoveto{\pgfqpoint{0.027778in}{-0.000000in}}%
    975 \pgfpathlineto{\pgfqpoint{-0.027778in}{0.000000in}}%
    976 \pgfusepath{stroke,fill}%
    977 }%
    978 \begin{pgfscope}%
    979 \pgfsys@transformshift{4.713959in}{3.824000in}%
    980 \pgfsys@useobject{currentmarker}{}%
    981 \end{pgfscope}%
    982 \end{pgfscope}%
    983 \begin{pgfscope}%
    984 \pgfsetbuttcap%
    985 \pgfsetroundjoin%
    986 \definecolor{currentfill}{rgb}{0.121569,0.466667,0.705882}%
    987 \pgfsetfillcolor{currentfill}%
    988 \pgfsetlinewidth{1.003750pt}%
    989 \definecolor{currentstroke}{rgb}{0.121569,0.466667,0.705882}%
    990 \pgfsetstrokecolor{currentstroke}%
    991 \pgfsetdash{}{0pt}%
    992 \pgfsys@defobject{currentmarker}{\pgfqpoint{-0.027778in}{-0.000000in}}{\pgfqpoint{0.027778in}{0.000000in}}{%
    993 \pgfpathmoveto{\pgfqpoint{0.027778in}{-0.000000in}}%
    994 \pgfpathlineto{\pgfqpoint{-0.027778in}{0.000000in}}%
    995 \pgfusepath{stroke,fill}%
    996 }%
    997 \begin{pgfscope}%
    998 \pgfsys@transformshift{4.713959in}{4.046222in}%
    999 \pgfsys@useobject{currentmarker}{}%
    1000 \end{pgfscope}%
    1001 \end{pgfscope}%
    1002 \begin{pgfscope}%
    1003 \pgfsetrectcap%
    1004 \pgfsetroundjoin%
    1005 \pgfsetlinewidth{1.505625pt}%
    1006 \definecolor{currentstroke}{rgb}{0.121569,0.466667,0.705882}%
    1007 \pgfsetstrokecolor{currentstroke}%
    1008 \pgfsetdash{}{0pt}%
    1009 \pgfpathmoveto{\pgfqpoint{4.491737in}{3.935111in}}%
    1010 \pgfpathlineto{\pgfqpoint{4.936181in}{3.935111in}}%
    1011 \pgfusepath{stroke}%
    1012 \end{pgfscope}%
    1013 \begin{pgfscope}%
    1014 \pgfsetbuttcap%
    1015 \pgfsetroundjoin%
    1016 \definecolor{currentfill}{rgb}{0.121569,0.466667,0.705882}%
    1017 \pgfsetfillcolor{currentfill}%
    1018 \pgfsetlinewidth{1.003750pt}%
    1019 \definecolor{currentstroke}{rgb}{0.121569,0.466667,0.705882}%
    1020845\pgfsetstrokecolor{currentstroke}%
    1021846\pgfsetdash{}{0pt}%
     
    1034859}%
    1035860\begin{pgfscope}%
    1036 \pgfsys@transformshift{4.713959in}{3.935111in}%
    1037 \pgfsys@useobject{currentmarker}{}%
    1038 \end{pgfscope}%
     861\pgfsys@transformshift{1.025455in}{3.619140in}%
     862\pgfsys@useobject{currentmarker}{}%
     863\end{pgfscope}%
     864\begin{pgfscope}%
     865\pgfsys@transformshift{1.326061in}{3.242405in}%
     866\pgfsys@useobject{currentmarker}{}%
     867\end{pgfscope}%
     868\begin{pgfscope}%
     869\pgfsys@transformshift{1.927273in}{2.083323in}%
     870\pgfsys@useobject{currentmarker}{}%
     871\end{pgfscope}%
     872\begin{pgfscope}%
     873\pgfsys@transformshift{3.129697in}{0.987727in}%
     874\pgfsys@useobject{currentmarker}{}%
     875\end{pgfscope}%
     876\begin{pgfscope}%
     877\pgfsys@transformshift{4.332121in}{0.742138in}%
     878\pgfsys@useobject{currentmarker}{}%
     879\end{pgfscope}%
     880\begin{pgfscope}%
     881\pgfsys@transformshift{5.534545in}{0.704967in}%
     882\pgfsys@useobject{currentmarker}{}%
     883\end{pgfscope}%
     884\end{pgfscope}%
     885\begin{pgfscope}%
     886\pgfsetrectcap%
     887\pgfsetmiterjoin%
     888\pgfsetlinewidth{0.803000pt}%
     889\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}%
     890\pgfsetstrokecolor{currentstroke}%
     891\pgfsetdash{}{0pt}%
     892\pgfpathmoveto{\pgfqpoint{0.800000in}{0.528000in}}%
     893\pgfpathlineto{\pgfqpoint{0.800000in}{4.224000in}}%
     894\pgfusepath{stroke}%
     895\end{pgfscope}%
     896\begin{pgfscope}%
     897\pgfsetrectcap%
     898\pgfsetmiterjoin%
     899\pgfsetlinewidth{0.803000pt}%
     900\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}%
     901\pgfsetstrokecolor{currentstroke}%
     902\pgfsetdash{}{0pt}%
     903\pgfpathmoveto{\pgfqpoint{5.760000in}{0.528000in}}%
     904\pgfpathlineto{\pgfqpoint{5.760000in}{4.224000in}}%
     905\pgfusepath{stroke}%
     906\end{pgfscope}%
     907\begin{pgfscope}%
     908\pgfsetrectcap%
     909\pgfsetmiterjoin%
     910\pgfsetlinewidth{0.803000pt}%
     911\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}%
     912\pgfsetstrokecolor{currentstroke}%
     913\pgfsetdash{}{0pt}%
     914\pgfpathmoveto{\pgfqpoint{0.800000in}{0.528000in}}%
     915\pgfpathlineto{\pgfqpoint{5.760000in}{0.528000in}}%
     916\pgfusepath{stroke}%
     917\end{pgfscope}%
     918\begin{pgfscope}%
     919\pgfsetrectcap%
     920\pgfsetmiterjoin%
     921\pgfsetlinewidth{0.803000pt}%
     922\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}%
     923\pgfsetstrokecolor{currentstroke}%
     924\pgfsetdash{}{0pt}%
     925\pgfpathmoveto{\pgfqpoint{0.800000in}{4.224000in}}%
     926\pgfpathlineto{\pgfqpoint{5.760000in}{4.224000in}}%
     927\pgfusepath{stroke}%
    1039928\end{pgfscope}%
    1040929\begin{pgfscope}%
     
    1042931\pgfsetstrokecolor{textcolor}%
    1043932\pgfsetfillcolor{textcolor}%
    1044 \pgftext[x=5.113959in,y=3.857333in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont CFA}%
    1045 \end{pgfscope}%
    1046 \begin{pgfscope}%
    1047 \pgfsetbuttcap%
    1048 \pgfsetroundjoin%
    1049 \pgfsetlinewidth{1.505625pt}%
    1050 \definecolor{currentstroke}{rgb}{1.000000,0.498039,0.054902}%
    1051 \pgfsetstrokecolor{currentstroke}%
    1052 \pgfsetdash{}{0pt}%
    1053 \pgfpathmoveto{\pgfqpoint{4.713959in}{3.499540in}}%
    1054 \pgfpathlineto{\pgfqpoint{4.713959in}{3.721763in}}%
    1055 \pgfusepath{stroke}%
    1056 \end{pgfscope}%
    1057 \begin{pgfscope}%
    1058 \pgfsetbuttcap%
    1059 \pgfsetroundjoin%
    1060 \definecolor{currentfill}{rgb}{1.000000,0.498039,0.054902}%
    1061 \pgfsetfillcolor{currentfill}%
    1062 \pgfsetlinewidth{1.003750pt}%
    1063 \definecolor{currentstroke}{rgb}{1.000000,0.498039,0.054902}%
     933\pgftext[x=3.280000in,y=4.307333in,,base]{\color{textcolor}\rmfamily\fontsize{12.000000}{14.400000}\selectfont Channel Contention Benchmark}%
     934\end{pgfscope}%
     935\begin{pgfscope}%
     936\pgfsetbuttcap%
     937\pgfsetmiterjoin%
     938\definecolor{currentfill}{rgb}{1.000000,1.000000,1.000000}%
     939\pgfsetfillcolor{currentfill}%
     940\pgfsetfillopacity{0.800000}%
     941\pgfsetlinewidth{1.003750pt}%
     942\definecolor{currentstroke}{rgb}{0.800000,0.800000,0.800000}%
     943\pgfsetstrokecolor{currentstroke}%
     944\pgfsetstrokeopacity{0.800000}%
     945\pgfsetdash{}{0pt}%
     946\pgfpathmoveto{\pgfqpoint{4.938626in}{3.725543in}}%
     947\pgfpathlineto{\pgfqpoint{5.662778in}{3.725543in}}%
     948\pgfpathquadraticcurveto{\pgfqpoint{5.690556in}{3.725543in}}{\pgfqpoint{5.690556in}{3.753321in}}%
     949\pgfpathlineto{\pgfqpoint{5.690556in}{4.126778in}}%
     950\pgfpathquadraticcurveto{\pgfqpoint{5.690556in}{4.154556in}}{\pgfqpoint{5.662778in}{4.154556in}}%
     951\pgfpathlineto{\pgfqpoint{4.938626in}{4.154556in}}%
     952\pgfpathquadraticcurveto{\pgfqpoint{4.910848in}{4.154556in}}{\pgfqpoint{4.910848in}{4.126778in}}%
     953\pgfpathlineto{\pgfqpoint{4.910848in}{3.753321in}}%
     954\pgfpathquadraticcurveto{\pgfqpoint{4.910848in}{3.725543in}}{\pgfqpoint{4.938626in}{3.725543in}}%
     955\pgfpathclose%
     956\pgfusepath{stroke,fill}%
     957\end{pgfscope}%
     958\begin{pgfscope}%
     959\pgfsetbuttcap%
     960\pgfsetroundjoin%
     961\pgfsetlinewidth{1.505625pt}%
     962\definecolor{currentstroke}{rgb}{0.121569,0.466667,0.705882}%
     963\pgfsetstrokecolor{currentstroke}%
     964\pgfsetdash{}{0pt}%
     965\pgfpathmoveto{\pgfqpoint{5.105293in}{3.980944in}}%
     966\pgfpathlineto{\pgfqpoint{5.105293in}{4.119833in}}%
     967\pgfusepath{stroke}%
     968\end{pgfscope}%
     969\begin{pgfscope}%
     970\pgfsetbuttcap%
     971\pgfsetroundjoin%
     972\definecolor{currentfill}{rgb}{0.121569,0.466667,0.705882}%
     973\pgfsetfillcolor{currentfill}%
     974\pgfsetlinewidth{1.003750pt}%
     975\definecolor{currentstroke}{rgb}{0.121569,0.466667,0.705882}%
    1064976\pgfsetstrokecolor{currentstroke}%
    1065977\pgfsetdash{}{0pt}%
     
    1070982}%
    1071983\begin{pgfscope}%
    1072 \pgfsys@transformshift{4.713959in}{3.499540in}%
    1073 \pgfsys@useobject{currentmarker}{}%
    1074 \end{pgfscope}%
    1075 \end{pgfscope}%
    1076 \begin{pgfscope}%
    1077 \pgfsetbuttcap%
    1078 \pgfsetroundjoin%
    1079 \definecolor{currentfill}{rgb}{1.000000,0.498039,0.054902}%
    1080 \pgfsetfillcolor{currentfill}%
    1081 \pgfsetlinewidth{1.003750pt}%
    1082 \definecolor{currentstroke}{rgb}{1.000000,0.498039,0.054902}%
     984\pgfsys@transformshift{5.105293in}{3.980944in}%
     985\pgfsys@useobject{currentmarker}{}%
     986\end{pgfscope}%
     987\end{pgfscope}%
     988\begin{pgfscope}%
     989\pgfsetbuttcap%
     990\pgfsetroundjoin%
     991\definecolor{currentfill}{rgb}{0.121569,0.466667,0.705882}%
     992\pgfsetfillcolor{currentfill}%
     993\pgfsetlinewidth{1.003750pt}%
     994\definecolor{currentstroke}{rgb}{0.121569,0.466667,0.705882}%
    1083995\pgfsetstrokecolor{currentstroke}%
    1084996\pgfsetdash{}{0pt}%
     
    10891001}%
    10901002\begin{pgfscope}%
    1091 \pgfsys@transformshift{4.713959in}{3.721763in}%
     1003\pgfsys@transformshift{5.105293in}{4.119833in}%
    10921004\pgfsys@useobject{currentmarker}{}%
    10931005\end{pgfscope}%
     
    10971009\pgfsetroundjoin%
    10981010\pgfsetlinewidth{1.505625pt}%
    1099 \definecolor{currentstroke}{rgb}{1.000000,0.498039,0.054902}%
    1100 \pgfsetstrokecolor{currentstroke}%
    1101 \pgfsetdash{}{0pt}%
    1102 \pgfpathmoveto{\pgfqpoint{4.491737in}{3.610651in}}%
    1103 \pgfpathlineto{\pgfqpoint{4.936181in}{3.610651in}}%
    1104 \pgfusepath{stroke}%
    1105 \end{pgfscope}%
    1106 \begin{pgfscope}%
    1107 \pgfsetbuttcap%
    1108 \pgfsetmiterjoin%
    1109 \definecolor{currentfill}{rgb}{1.000000,0.498039,0.054902}%
    1110 \pgfsetfillcolor{currentfill}%
    1111 \pgfsetlinewidth{1.003750pt}%
    1112 \definecolor{currentstroke}{rgb}{1.000000,0.498039,0.054902}%
     1011\definecolor{currentstroke}{rgb}{0.121569,0.466667,0.705882}%
     1012\pgfsetstrokecolor{currentstroke}%
     1013\pgfsetdash{}{0pt}%
     1014\pgfpathmoveto{\pgfqpoint{4.966404in}{4.050389in}}%
     1015\pgfpathlineto{\pgfqpoint{5.244182in}{4.050389in}}%
     1016\pgfusepath{stroke}%
     1017\end{pgfscope}%
     1018\begin{pgfscope}%
     1019\pgfsetbuttcap%
     1020\pgfsetroundjoin%
     1021\definecolor{currentfill}{rgb}{0.121569,0.466667,0.705882}%
     1022\pgfsetfillcolor{currentfill}%
     1023\pgfsetlinewidth{1.003750pt}%
     1024\definecolor{currentstroke}{rgb}{0.121569,0.466667,0.705882}%
    11131025\pgfsetstrokecolor{currentstroke}%
    11141026\pgfsetdash{}{0pt}%
    11151027\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.041667in}{-0.041667in}}{\pgfqpoint{0.041667in}{0.041667in}}{%
    1116 \pgfpathmoveto{\pgfqpoint{-0.041667in}{-0.041667in}}%
    1117 \pgfpathlineto{\pgfqpoint{0.041667in}{-0.041667in}}%
    1118 \pgfpathlineto{\pgfqpoint{0.041667in}{0.041667in}}%
    1119 \pgfpathlineto{\pgfqpoint{-0.041667in}{0.041667in}}%
     1028\pgfpathmoveto{\pgfqpoint{0.000000in}{-0.041667in}}%
     1029\pgfpathcurveto{\pgfqpoint{0.011050in}{-0.041667in}}{\pgfqpoint{0.021649in}{-0.037276in}}{\pgfqpoint{0.029463in}{-0.029463in}}%
     1030\pgfpathcurveto{\pgfqpoint{0.037276in}{-0.021649in}}{\pgfqpoint{0.041667in}{-0.011050in}}{\pgfqpoint{0.041667in}{0.000000in}}%
     1031\pgfpathcurveto{\pgfqpoint{0.041667in}{0.011050in}}{\pgfqpoint{0.037276in}{0.021649in}}{\pgfqpoint{0.029463in}{0.029463in}}%
     1032\pgfpathcurveto{\pgfqpoint{0.021649in}{0.037276in}}{\pgfqpoint{0.011050in}{0.041667in}}{\pgfqpoint{0.000000in}{0.041667in}}%
     1033\pgfpathcurveto{\pgfqpoint{-0.011050in}{0.041667in}}{\pgfqpoint{-0.021649in}{0.037276in}}{\pgfqpoint{-0.029463in}{0.029463in}}%
     1034\pgfpathcurveto{\pgfqpoint{-0.037276in}{0.021649in}}{\pgfqpoint{-0.041667in}{0.011050in}}{\pgfqpoint{-0.041667in}{0.000000in}}%
     1035\pgfpathcurveto{\pgfqpoint{-0.041667in}{-0.011050in}}{\pgfqpoint{-0.037276in}{-0.021649in}}{\pgfqpoint{-0.029463in}{-0.029463in}}%
     1036\pgfpathcurveto{\pgfqpoint{-0.021649in}{-0.037276in}}{\pgfqpoint{-0.011050in}{-0.041667in}}{\pgfqpoint{0.000000in}{-0.041667in}}%
    11201037\pgfpathclose%
    11211038\pgfusepath{stroke,fill}%
    11221039}%
    11231040\begin{pgfscope}%
    1124 \pgfsys@transformshift{4.713959in}{3.610651in}%
     1041\pgfsys@transformshift{5.105293in}{4.050389in}%
    11251042\pgfsys@useobject{currentmarker}{}%
    11261043\end{pgfscope}%
     
    11301047\pgfsetstrokecolor{textcolor}%
    11311048\pgfsetfillcolor{textcolor}%
    1132 \pgftext[x=5.113959in,y=3.532874in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont Go}%
     1049\pgftext[x=5.355293in,y=4.001778in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont CFA}%
     1050\end{pgfscope}%
     1051\begin{pgfscope}%
     1052\pgfsetbuttcap%
     1053\pgfsetroundjoin%
     1054\pgfsetlinewidth{1.505625pt}%
     1055\definecolor{currentstroke}{rgb}{1.000000,0.498039,0.054902}%
     1056\pgfsetstrokecolor{currentstroke}%
     1057\pgfsetdash{}{0pt}%
     1058\pgfpathmoveto{\pgfqpoint{5.105293in}{3.787272in}}%
     1059\pgfpathlineto{\pgfqpoint{5.105293in}{3.926161in}}%
     1060\pgfusepath{stroke}%
     1061\end{pgfscope}%
     1062\begin{pgfscope}%
     1063\pgfsetbuttcap%
     1064\pgfsetroundjoin%
     1065\definecolor{currentfill}{rgb}{1.000000,0.498039,0.054902}%
     1066\pgfsetfillcolor{currentfill}%
     1067\pgfsetlinewidth{1.003750pt}%
     1068\definecolor{currentstroke}{rgb}{1.000000,0.498039,0.054902}%
     1069\pgfsetstrokecolor{currentstroke}%
     1070\pgfsetdash{}{0pt}%
     1071\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.027778in}{-0.000000in}}{\pgfqpoint{0.027778in}{0.000000in}}{%
     1072\pgfpathmoveto{\pgfqpoint{0.027778in}{-0.000000in}}%
     1073\pgfpathlineto{\pgfqpoint{-0.027778in}{0.000000in}}%
     1074\pgfusepath{stroke,fill}%
     1075}%
     1076\begin{pgfscope}%
     1077\pgfsys@transformshift{5.105293in}{3.787272in}%
     1078\pgfsys@useobject{currentmarker}{}%
     1079\end{pgfscope}%
     1080\end{pgfscope}%
     1081\begin{pgfscope}%
     1082\pgfsetbuttcap%
     1083\pgfsetroundjoin%
     1084\definecolor{currentfill}{rgb}{1.000000,0.498039,0.054902}%
     1085\pgfsetfillcolor{currentfill}%
     1086\pgfsetlinewidth{1.003750pt}%
     1087\definecolor{currentstroke}{rgb}{1.000000,0.498039,0.054902}%
     1088\pgfsetstrokecolor{currentstroke}%
     1089\pgfsetdash{}{0pt}%
     1090\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.027778in}{-0.000000in}}{\pgfqpoint{0.027778in}{0.000000in}}{%
     1091\pgfpathmoveto{\pgfqpoint{0.027778in}{-0.000000in}}%
     1092\pgfpathlineto{\pgfqpoint{-0.027778in}{0.000000in}}%
     1093\pgfusepath{stroke,fill}%
     1094}%
     1095\begin{pgfscope}%
     1096\pgfsys@transformshift{5.105293in}{3.926161in}%
     1097\pgfsys@useobject{currentmarker}{}%
     1098\end{pgfscope}%
     1099\end{pgfscope}%
     1100\begin{pgfscope}%
     1101\pgfsetrectcap%
     1102\pgfsetroundjoin%
     1103\pgfsetlinewidth{1.505625pt}%
     1104\definecolor{currentstroke}{rgb}{1.000000,0.498039,0.054902}%
     1105\pgfsetstrokecolor{currentstroke}%
     1106\pgfsetdash{}{0pt}%
     1107\pgfpathmoveto{\pgfqpoint{4.966404in}{3.856716in}}%
     1108\pgfpathlineto{\pgfqpoint{5.244182in}{3.856716in}}%
     1109\pgfusepath{stroke}%
     1110\end{pgfscope}%
     1111\begin{pgfscope}%
     1112\pgfsetbuttcap%
     1113\pgfsetroundjoin%
     1114\definecolor{currentfill}{rgb}{1.000000,0.498039,0.054902}%
     1115\pgfsetfillcolor{currentfill}%
     1116\pgfsetlinewidth{1.003750pt}%
     1117\definecolor{currentstroke}{rgb}{1.000000,0.498039,0.054902}%
     1118\pgfsetstrokecolor{currentstroke}%
     1119\pgfsetdash{}{0pt}%
     1120\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.041667in}{-0.041667in}}{\pgfqpoint{0.041667in}{0.041667in}}{%
     1121\pgfpathmoveto{\pgfqpoint{0.000000in}{-0.041667in}}%
     1122\pgfpathcurveto{\pgfqpoint{0.011050in}{-0.041667in}}{\pgfqpoint{0.021649in}{-0.037276in}}{\pgfqpoint{0.029463in}{-0.029463in}}%
     1123\pgfpathcurveto{\pgfqpoint{0.037276in}{-0.021649in}}{\pgfqpoint{0.041667in}{-0.011050in}}{\pgfqpoint{0.041667in}{0.000000in}}%
     1124\pgfpathcurveto{\pgfqpoint{0.041667in}{0.011050in}}{\pgfqpoint{0.037276in}{0.021649in}}{\pgfqpoint{0.029463in}{0.029463in}}%
     1125\pgfpathcurveto{\pgfqpoint{0.021649in}{0.037276in}}{\pgfqpoint{0.011050in}{0.041667in}}{\pgfqpoint{0.000000in}{0.041667in}}%
     1126\pgfpathcurveto{\pgfqpoint{-0.011050in}{0.041667in}}{\pgfqpoint{-0.021649in}{0.037276in}}{\pgfqpoint{-0.029463in}{0.029463in}}%
     1127\pgfpathcurveto{\pgfqpoint{-0.037276in}{0.021649in}}{\pgfqpoint{-0.041667in}{0.011050in}}{\pgfqpoint{-0.041667in}{0.000000in}}%
     1128\pgfpathcurveto{\pgfqpoint{-0.041667in}{-0.011050in}}{\pgfqpoint{-0.037276in}{-0.021649in}}{\pgfqpoint{-0.029463in}{-0.029463in}}%
     1129\pgfpathcurveto{\pgfqpoint{-0.021649in}{-0.037276in}}{\pgfqpoint{-0.011050in}{-0.041667in}}{\pgfqpoint{0.000000in}{-0.041667in}}%
     1130\pgfpathclose%
     1131\pgfusepath{stroke,fill}%
     1132}%
     1133\begin{pgfscope}%
     1134\pgfsys@transformshift{5.105293in}{3.856716in}%
     1135\pgfsys@useobject{currentmarker}{}%
     1136\end{pgfscope}%
     1137\end{pgfscope}%
     1138\begin{pgfscope}%
     1139\definecolor{textcolor}{rgb}{0.000000,0.000000,0.000000}%
     1140\pgfsetstrokecolor{textcolor}%
     1141\pgfsetfillcolor{textcolor}%
     1142\pgftext[x=5.355293in,y=3.808105in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont Go}%
    11331143\end{pgfscope}%
    11341144\end{pgfpicture}%
  • doc/theses/colby_parsons_MMAth/glossary.tex

    r044ae62 r3a513d89  
    6060description={An implementation of the actor model.}
    6161}
    62 
    63 \newglossaryentry{synch_multiplex}
    64 {
    65 name=synchronous multiplexing,
    66 description={synchronization on some subset of a set of resources.}
    67 }
  • doc/theses/colby_parsons_MMAth/local.bib

    r044ae62 r3a513d89  
    5555url={http://hdl.handle.net/10012/17617}
    5656}
    57 
    58 @article{Roscoe88,
    59   title={The laws of occam programming},
    60   author={Roscoe, Andrew William and Hoare, Charles Antony Richard},
    61   journal={Theoretical Computer Science},
    62   volume={60},
    63   number={2},
    64   pages={177--229},
    65   year={1988},
    66   publisher={Elsevier}
    67 }
    68 
    69 @article{Pike84,
    70   title={The UNIX system: The blit: A multiplexed graphics terminal},
    71   author={Pike, Rob},
    72   journal={AT\&T Bell Laboratories Technical Journal},
    73   volume={63},
    74   number={8},
    75   pages={1607--1631},
    76   year={1984},
    77   publisher={Nokia Bell Labs}
    78 }
    79 
    80 @inproceedings{Dice11,
    81   title={Brief announcement: multilane-a concurrent blocking multiset},
    82   author={Dice, David and Otenko, Oleksandr},
    83   booktitle={Proceedings of the twenty-third annual ACM symposium on Parallelism in algorithms and architectures},
    84   pages={313--314},
    85   year={2011}
    86 }
    87 
    88 @misc{go:chan,
    89   author = "The Go Programming Language",
    90   title = "src/runtime/chan.go",
    91   howpublished = {\href{https://go.dev/src/runtime/chan.go}},
    92   note = "[Online; accessed 23-May-2023]"
    93 }
    94 
    95 @misc{go:select,
    96   author = "The Go Programming Language",
    97   title = "src/runtime/chan.go",
    98   howpublished = {\href{https://go.dev/src/runtime/select.go}},
    99   note = "[Online; accessed 23-May-2023]"
    100 }
    101 
  • doc/theses/colby_parsons_MMAth/style/style.tex

    r044ae62 r3a513d89  
    77
    88\newcommand{\code}[1]{\lstinline[language=CFA]{#1}}
    9 \newcommand{\Go}[1]{\lstinline[language=Go]{#1}}
    109\newcommand{\uC}{$\mu$\CC}
    1110\newcommand{\PAB}[1]{{\color{red}PAB: #1}}
    12 \newcommand{\CAP}[1]{{\color{orange}CAP: #1}}
    1311
    1412\newsavebox{\myboxA}                                    % used with subfigure
  • doc/theses/colby_parsons_MMAth/text/CFA_concurrency.tex

    r044ae62 r3a513d89  
    77\section{Threading Model}\label{s:threading}
    88\CFA provides user-level threading and supports an $M$:$N$ threading model where $M$ user threads are scheduled on $N$ kernel threads, where both $M$ and $N$ can be explicitly set by the user.
    9 Kernel threads are created by declaring a @processor@ structure.
     9Kernel threads are created by instancing a @processor@ structure.
    1010User-thread types are defined by creating a @thread@ aggregate-type, \ie replace @struct@ with @thread@.
    1111For each thread type a corresponding @main@ routine must be defined, which is where the thread starts running once it is created.
     
    3030When processors are added, they are added alongside the existing processor given to each program.
    3131Thus, for $N$ processors, allocate $N-1$ processors.
    32 A thread is implicitly joined at deallocation, either implicitly at block exit for stack allocation or explicitly at @delete@ for heap allocation.
     32A thread is implicitly joined at deallocated, either implicitly at block exit for stack allocation or explicitly at @delete@ for heap allocation.
    3333The thread performing the deallocation must wait for the thread to terminate before the deallocation can occur.
    3434A thread terminates by returning from the main routine where it starts.
  • doc/theses/colby_parsons_MMAth/text/CFA_intro.tex

    r044ae62 r3a513d89  
    66
    77\section{Overview}
    8 The following serves as an introduction to \CFA.
    9 \CFA is a layer over C, is transpiled\footnote{Source to source translator.} to C, and is largely considered to be an extension of C.
    10 Beyond C, it adds productivity features, extended libraries, an advanced type-system, and many control-flow/concurrency constructions.
    11 However, \CFA stays true to the C programming style, with most code revolving around @struct@'s and routines, and respects the same rules as C.
    12 \CFA is not object oriented as it has no notion of @this@ (receiver) and no structures with methods, but supports some object oriented ideas including constructors, destructors, and limited nominal inheritance.
     8The following serves as an introduction to \CFA. 
     9\CFA is a layer over C, is transpiled\footnote{Source to source translator.} to C, and is largely considered to be an extension of C. 
     10Beyond C, it adds productivity features, extended libraries, an advanced type system, and many control-flow/concurrency constructions.
     11However, \CFA stays true to the C programming style, with most code revolving around @struct@'s and routines, and respects the same rules as C. 
     12\CFA is not object oriented as it has no notion of @this@ (receiver) and no structures with methods, but supports some object oriented ideas including constructors, destructors, and limited containment inheritance.
    1313While \CFA is rich with interesting features, only the subset pertinent to this work is discussed.
    1414
    1515\section{References}
    16 References in \CFA are similar to references in \CC; however \CFA references are \emph{rebindable}, and support multi-level referencing.
    17 References in \CFA are a layer of syntactic sugar over pointers to reduce the number of ref/deref operations needed with pointer usage.
     16References in \CFA are similar to references in \CC; however \CFA references are rebindable, and support multi-level referencing.
     17References in \CFA are a layer of syntactic sugar over pointers to reduce the number of ref/deref operations needed with pointer usage. 
    1818Another difference is the use of @0p@ instead of C's @NULL@ or \CC's @nullptr@.
    19 Examples of references are shown in \VRef[Listing]{l:cfa_ref}.
     19Examples of references are shown in \VRef[Listing]{l:cfa_ref}. 
    2020
    2121\begin{cfa}[caption={Example of \CFA references},label={l:cfa_ref}]
     
    3737
    3838\section{Overloading}\label{s:Overloading}
    39 \CFA routines can be overloaded on parameter type, number of parameters, and \emph{return type}.
    40 Variables can also be overloaded on type, meaning that two variables can have the same name so long as they have different types.
     39\CFA routines can be overloaded on parameter type, number of parameters, and \emph{return type}. 
     40Variables can also be overloaded on type, meaning that two variables can have the same name so long as they have different types. 
    4141A routine or variable is disambiguated at each usage site via its type and surrounding expression context.
    42 A cast is used to disambiguate any conflicting usage.
    43 Examples of overloading are shown in \VRef[Listing]{l:cfa_overload}.
     42A cast is used to disambiguate any conflicting usage. 
     43Examples of overloading are shown in \VRef[Listing]{l:cfa_overload}. 
    4444
    4545\begin{cfa}[caption={Example of \CFA overloading},label={l:cfa_overload}]
     
    6060
    6161
    62 \section{\lstinline{with} Statement}
     62\section{With Statement}
    6363The \CFA @with@ statement is for exposing fields of an aggregate type within a scope, allowing field names without qualification.
    64 This feature is also implemented in Pascal~\cite{Pascal}.
    65 It can exist as a stand-alone statement or wrap a routine body to expose aggregate fields.
    66 Examples of the @with@ statement are shown in \VRef[Listing]{l:cfa_with}.
     64This feature is also implemented in Pascal~\cite{Pascal}. 
     65It can exist as a stand-alone statement or wrap a routine body to expose aggregate fields. 
     66Examples of the @with@ statement are shown in \VRef[Listing]{l:cfa_with}. 
    6767
    6868\begin{cfa}[caption={Example of \CFA \lstinline{with} statement},label={l:cfa_with}]
     
    8383
    8484\section{Operators}
    85 Operators can be overloaded in \CFA with operator routines.
     85Operators can be overloaded in \CFA with operator routines. 
    8686Operators in \CFA are named using an operator symbol and '@?@' to represent operands.
    87 Examples of \CFA operators are shown in \VRef[Listing]{l:cfa_operate}.
     87Examples of \CFA operators are shown in \VRef[Listing]{l:cfa_operate}. 
    8888
    8989\begin{cfa}[caption={Example of \CFA operators},label={l:cfa_operate}]
     
    102102
    103103\section{Constructors and Destructors}
    104 Constructors and destructors in \CFA are special operator routines used for creation and destruction of objects.
    105 The default constructor and destructor for a type are called implicitly upon creation and deletion, respectively.
    106 Examples of \CFA constructors and destructors are shown in \VRef[Listing]{l:cfa_ctor}.
     104Constructors and destructors in \CFA are special operator routines used for creation and destruction of objects. 
     105The default constructor and destructor for a type are called implicitly upon creation and deletion, respectively. 
     106Examples of \CFA constructors and destructors are shown in \VRef[Listing]{l:cfa_ctor}. 
    107107
    108108\begin{cfa}[caption={Example of \CFA constructors and destructors},label={l:cfa_ctor}]
     
    128128\section{Polymorphism}\label{s:poly}
    129129C supports limited polymorphism, often requiring users to implement polymorphism using a @void *@ (type erasure) approach.
    130 \CFA extends C with generalized overloading polymorphism (see \VRef{s:Overloading}), as well as, parametric polymorphism and limited nominal inheritance.
     130\CFA extends C with generalized overloading polymorphism (see \VRef{s:Overloading}), as well as, parametric polymorphism and nominal inheritance.
    131131
    132132\subsection{Parametric Polymorphism}
    133 \CFA provides parametric polymorphism in the form of @forall@, and @trait@s.
    134 A @forall@ takes in a set of types and a list of constraints.
    135 The declarations that follow the @forall@ are parameterized over the types listed that satisfy the constraints.
    136 A list of @forall@ constraints can be refactored into a named @trait@ and reused in @forall@s.
    137 Examples of \CFA parametric polymorphism are shown in \VRef[Listing]{l:cfa_poly}.
     133\CFA provides parametric polymorphism in the form of @forall@, and @trait@s. 
     134A @forall@ takes in a set of types and a list of constraints. 
     135The declarations that follow the @forall@ are parameterized over the types listed that satisfy the constraints. 
     136A list of @forall@ constraints can be refactored into a named @trait@ and reused in @forall@s. 
     137Examples of \CFA parametric polymorphism are shown in \VRef[Listing]{l:cfa_poly}. 
    138138
    139139\begin{cfa}[caption={Example of \CFA parametric polymorphism},label={l:cfa_poly}]
     
    180180
    181181\subsection{Inheritance}
    182 Inheritance in \CFA is taken from Plan-9 C's nominal inheritance.
    183 In \CFA, @struct@s can @inline@ another struct type to gain its fields and masquerade as that type.
    184 Examples of \CFA nominal inheritance are shown in \VRef[Listing]{l:cfa_inherit}.
    185 
    186 \begin{cfa}[caption={Example of \CFA nominal inheritance},label={l:cfa_inherit}]
     182Inheritance in \CFA is taken from Plan-9 C's containment inheritance.
     183In \CFA, @struct@s can @inline@ another struct type to gain its fields and masquerade as that type. 
     184Examples of \CFA containment inheritance are shown in \VRef[Listing]{l:cfa_inherit}.
     185
     186\begin{cfa}[caption={Example of \CFA containment inheritance},label={l:cfa_inherit}]
    187187struct one_d { double x; };
    188 struct two_d {
     188struct two_d { 
    189189        @inline@ one_d;
    190190        double y;
    191191};
    192 struct three_d {
     192struct three_d { 
    193193        @inline@ two_d;
    194194        double z;
  • doc/theses/colby_parsons_MMAth/text/actors.tex

    r044ae62 r3a513d89  
    673673
    674674\section{Performance}\label{s:actor_perf}
    675 \CAP{I will update the figures to have the larger font size and different line markers once we start editing this chapter.}
    676675The performance of \CFA's actor system is tested using a suite of microbenchmarks, and compared with other actor systems.
    677676Most of the benchmarks are the same as those presented in \ref{}, with a few additions.
  • doc/theses/colby_parsons_MMAth/text/channels.tex

    r044ae62 r3a513d89  
    55% ======================================================================
    66
     7Channels are a concurrent-language feature used to perform \Newterm{message-passing concurrency}: a model of concurrency where threads communicate by sending (mostly nonblocking) data as messages and synchronizing by receiving (blocking) sent data.
     8This model is an alternative to shared-memory concurrency, where threads can communicate directly by changing shared state.
    79Most modern concurrent programming languages do not subscribe to just one style of communication among threads and provide features that support multiple approaches.
    8 Channels are a concurrent-language feature used to perform \Newterm{message-passing concurrency}: a model of concurrency where threads communicate by sending data as messages (mostly non\-blocking) and synchronizing by receiving sent messages (blocking).
    9 This model is an alternative to shared-memory concurrency, where threads communicate directly by changing shared state.
    1010
    1111Channels were first introduced by Kahn~\cite{Kahn74} and extended by Hoare~\cite{Hoare78} (CSP).
     
    1313Both languages are highly restrictive.
    1414Kahn's language restricts a reading process to only wait for data on a single channel at a time and different writing processes cannot send data on the same channel.
    15 Hoare's language restricts both the sender and receiver to explicitly name the process that is the destination of a channel send or the source of a channel receive.
    16 These channel semantics remove the ability to have an anonymous sender or receiver.
    17 Additionally all channel operations in CSP are synchronous (no buffering).
    18 Advanced channels as a programming language feature has been popularized in recent years by the language Go~\cite{Go}, which encourages the use of channels as its fundamental concurrent feature.
    19 It was the popularity of Go channels that lead to their implemention in \CFA.
    20 Neither Go nor \CFA channels have the restrictions of the early channel-based concurrent systems.
     15Hoare's language restricts ...
     16Channels as a programming language feature has been popularized in recent years due to the language Go, which encourages the use of channels as its fundamental concurrent feature.
     17Go's restrictions are ...
     18\CFA channels do not have these restrictions.
    2119
    2220\section{Producer-Consumer Problem}
    23 A channel is an abstraction for a shared-memory buffer, which turns the implementation of a channel into the producer-consumer problem.
    24 The producer-consumer problem, also known as the bounded-buffer problem, was introduced by Dijkstra~\cite[\S~4.1]{Dijkstra65}.
    25 In the problem, threads interact with a buffer in two ways: producing threads insert values into the buffer and consuming threads remove values from the buffer.
    26 In general, a buffer needs protection to ensure a producer only inserts into a non-full buffer and a consumer only removes from a non-empty buffer (synchronization).
    27 As well, a buffer needs protection from concurrent access by multiple producers or consumers attempting to insert or remove simultaneously (MX).
    28 
    29 \section{Channel Size}\label{s:ChannelSize}
    30 Channels come in three flavours of buffers:
    31 \begin{enumerate}
    32 \item
    33 Zero sized implies the communication is synchronous, \ie the producer must wait for the consumer to arrive or vice versa for a value to be communicated.
    34 \item
    35 Fixed sized (bounded) implies the communication is asynchronous, \ie the producer can proceed up to the buffer size and vice versa for the consumer with respect to removal.
    36 \item
    37 Infinite sized (unbounded) implies the communication is asynchronous, \ie the producer never waits but the consumer waits when the buffer is empty.
    38 Since memory is finite, all unbounded buffers are ultimately bounded;
    39 this restriction must be part of its implementation.
    40 \end{enumerate}
    41 
    42 In general, the order values are processed by the consumer does not affect the correctness of the producer-consumer problem.
    43 For example, the buffer can be LIFO, FIFO, or prioritized with respect to insertion and removal.
    44 However, like MX, a buffer should ensure every value is eventually removed after some reasonable bounded time (no long-term starvation).
    45 The simplest way to prevent starvation is to implement the buffer as a queue, either with a cyclic array or linked nodes.
     21Most channels in modern programming languages are built on top of a shared memory buffer.
     22While it is possible to create a channel that contains an unbounded buffer, most implementations opt to only support a fixed size channel, where the size is given at the time of channel creation.
     23This turns the implementation of a channel into the producer-consumer problem.
     24The producer-consumer problem, also known as the bounded buffer problem, was introduced by Dijkstra in his book Cooperating Sequential Processes\cite{Dijkstra65}.
     25In the problem threads interact with the buffer in two ways, either consuming values by removing them from the buffer, or producing values and inserting them in the buffer.
     26The buffer needs to be protected from concurrent access since each item in the buffer should only be produced and consumed once.
     27Additionally, a consumer can only remove from a non-empty buffer and a producer can only insert into a non-full buffer.
    4628
    4729\section{First-Come First-Served}
    48 As pointed out, a bounded buffer requires MX among multiple producers or consumers.
    49 This MX should be fair among threads, independent of the FIFO buffer being fair among values.
    50 Fairness among threads is called \gls{fcfs} and was defined by Lamport~\cite[p.~454]{Lamport74}.
     30The channel implementations that will be discussed are \gls{fcfs}.
     31This term was defined by Lamport~\cite{Lamport74}.
    5132\gls{fcfs} is defined in relation to a doorway~\cite[p.~330]{Lamport86II}, which is the point at which an ordering among threads can be established.
    52 Given this doorway, a CS is said to be \gls{fcfs}, if threads access the shared resource in the order they proceed through the doorway.
    53 A consequence of \gls{fcfs} execution is the elimination of \Newterm{barging}, where barging means a thread arrives at a CS with waiting threads, and the MX protecting the CS allows the arriving thread to enter the CS ahead of one or more of the waiting threads.
    54 
    55 \gls{fcfs} is a fairness property that prevents unequal access to the shared resource and prevents starvation, however it comes at a cost.
    56 Implementing an algorithm with \gls{fcfs} can lead to \Newterm{double blocking}, where arriving threads block outside the doorway waiting for a thread in the lock entry-protocol and inside the doorway waiting for a thread in the CS.
    57 An analogue is boarding an airplane: first you wait to get through security to the departure gates (short term), and then wait again at the departure gate for the airplane (long term).
    58 As such, algorithms that are not \gls{fcfs} (barging) can be more performant by skipping the wait for the CS and entering directly;
    59 however, this performance gain comes by introducing unfairness with possible starvation for waiting threads.
     33Given this doorway, a critical section is said to be \gls{fcfs}, if threads access the shared resource in the order they proceed through the doorway.
     34\gls{fcfs} is a fairness property which prevents unequal access to the shared resource and prevents starvation, however it can come at a cost.
     35Implementing an algorithm with \gls{fcfs} can lead to double blocking, where entering threads may need to block to allow other threads to proceed first, resulting in blocking both inside and outside the doorway.
     36As such algorithms that are not \gls{fcfs} may be more performant but that performance comes with the downside of likely introducing starvation and unfairness.
    6037
    6138\section{Channel Implementation}
    62 Currently, only the Go programming language provides user-level threading where the primary communication mechanism is channels.
    63 Experiments were conducted that varied the producer-consumer problem algorithm and lock type used inside the channel.
    64 With the exception of non-\gls{fcfs} or non-FIFO algorithms, no algorithm or lock usage in the channel implementation was found to be consistently more performant that Go's choice of algorithm and lock implementation.
    65 Performance of channels can be improved by sharding the underlying buffer \cite{Dice11}.
    66 In doing so the FIFO property is lost, which is undesireable for user-facing channels.
    67 Therefore, the low-level channel implementation in \CFA is largely copied from the Go implementation, but adapted to the \CFA type and runtime systems.
     39The channel implementation in \CFA is a near carbon copy of the Go implementation.
     40Experimentation was conducted that varied the producer-consumer problem algorithm and lock type used inside the channel.
     41With the exception of non-\gls{fcfs} algorithms, no algorithm or lock usage in the channel implementation was found to be consistently more performant that Go's choice of algorithm and lock implementation.
    6842As such the research contributions added by \CFA's channel implementation lie in the realm of safety and productivity features.
    69 
    70 The Go channel implementation utilitizes cooperation between threads to achieve good performance~\cite{go:chan}.
    71 The cooperation between threads only occurs when producers or consumers need to block due to the buffer being full or empty.
    72 In these cases the blocking thread stores their relevant data in a shared location and the signalling thread will complete their operation before waking them.
    73 This helps improve performance in a few ways.
    74 First, each thread interacting with the channel with only acquire and release the internal channel lock exactly once.
    75 This decreases contention on the internal lock, as only entering threads will compete for the lock since signalled threads never reacquire the lock.
    76 The other advantage of the cooperation approach is that it eliminates the potential bottleneck of waiting for signalled threads.
    77 The property of acquiring/releasing the lock only once can be achieved without cooperation by \Newterm{baton passing} the lock.
    78 Baton passing is when one thread acquires a lock but does not release it, and instead signals a thread inside the critical section conceptually "passing" the mutual exclusion to the signalled thread.
    79 While baton passing is useful in some algorithms, it results in worse performance than the cooperation approach in channel implementations since all entering threads then need to wait for the blocked thread to reach the front of the ready queue and run before other operations on the channel can proceed.
    80 
    81 In this work, all channel sizes \see{Sections~\ref{s:ChannelSize}} are implemented with bounded buffers.
    82 However, only non-zero-sized buffers are analysed because of their complexity and higher usage.
    8343
    8444\section{Safety and Productivity}
     
    8747
    8848\begin{itemize}
    89 \item Toggle-able statistic collection on channel behaviour that count channel and blocking operations.
    90 Tracking blocking operations helps illustrate usage for tuning the channel size, where the aim is to reduce blocking.
    91 
    92 \item Deadlock detection on channel deallocation.
    93 If threads are blocked inside a channel when it terminates, this case is detected and the user is informed, as this can cause a deadlock.
    94 
    95 \item A @flush@ routine that delivers copies of an element to all waiting consumers, flushing the buffer.
    96 Programmers use this mechanism to broadcast a sentinel value to multiple consumers.
    97 Additionally, the @flush@ routine is more performant then looping around the @insert@ operation since it can deliver the elements without having to reacquire mutual exclusion for each element sent.
     49\item Toggle-able statistic collection on channel behaviour that counts channel operations, and the number of the operations that block.
     50Tracking blocking operations helps users tune their channel size or channel usage when the channel is used for buffering, where the aim is to have as few blocking operations as possible.
     51\item Deadlock detection on deallocation of the channel.
     52If any threads are blocked inside the channel when it terminates it is detected and informs the user, as this would cause a deadlock.
     53\item A \code{flush} routine that delivers copies of an element to all waiting consumers, flushing the buffer.
     54Programmers can use this to easily to broadcast data to multiple consumers.
     55Additionally, the \code{flush} routine is more performant then looping around the \code{insert} operation since it can deliver the elements without having to reacquire mutual exclusion for each element sent.
    9856\end{itemize}
    9957
    100 \subsection{Toggle-able Statistics}
    101 As discussed, a channel is a concurrent layer over a bounded buffer.
    102 To achieve efficient buffering users should aim for as few blocking operations on a channel as possible.
    103 Often to achieve this users may change the buffer size, shard a channel into multiple channels, or tweak the number of producer and consumer threads.
    104 Fo users to be able to make informed decisions when tuning channel usage, toggle-able channel statistics are provided.
    105 The statistics are toggled at compile time via the @CHAN_STATS@ macro to ensure that they are entirely elided when not used.
    106 When statistics are turned on, four counters are maintained per channel, two for producers and two for consumers.
    107 The two counters per type of operation track the number of blocking operations and total operations.
    108 In the channel destructor the counters are printed out aggregated and also per type of operation.
    109 An example use case of the counters follows.
    110 A user is buffering information between producer and consumer threads and wants to analyze channel performance.
    111 Via the statistics they see that producers block for a large percentage of their operations while consumers do not block often.
    112 They then can use this information to adjust their number of producers/consumers or channel size to achieve a larger percentage of non-blocking producer operations, thus increasing their channel throughput.
    113 
    114 \subsection{Deadlock Detection}
    115 The deadlock detection in the \CFA channels is fairly basic.
    116 It only detects the case where threads are blocked on the channel during deallocation.
    117 This case is guaranteed to deadlock since the list holding the blocked thread is internal to the channel and will be deallocated.
    118 If a user maintained a separate reference to a thread and unparked it outside the channel they could avoid the deadlock, but would run into other runtime errors since the thread would access channel data after waking that is now deallocated.
    119 More robust deadlock detection surrounding channel usage would have to be implemented separate from the channel implementation since it would require knowledge about the threading system and other channel/thread state.
    120 
    121 \subsection{Program Shutdown}
     58The other safety and productivity feature of \CFA channels deals with concurrent termination.
    12259Terminating concurrent programs is often one of the most difficult parts of writing concurrent code, particularly if graceful termination is needed.
    123 The difficulty of graceful termination often arises from the usage of synchronization primitives that need to be handled carefully during shutdown.
     60The difficulty of graceful termination often arises from the usage of synchronization primitives which need to be handled carefully during shutdown.
    12461It is easy to deadlock during termination if threads are left behind on synchronization primitives.
    12562Additionally, most synchronization primitives are prone to \gls{toctou} issues where there is race between one thread checking the state of a concurrent object and another thread changing the state.
    12663\gls{toctou} issues with synchronization primitives often involve a race between one thread checking the primitive for blocked threads and another thread blocking on it.
    127 Channels are a particularly hard synchronization primitive to terminate since both sending and receiving to/from a channel can block.
     64Channels are a particularly hard synchronization primitive to terminate since both sending and receiving off a channel can block.
    12865Thus, improperly handled \gls{toctou} issues with channels often result in deadlocks as threads trying to perform the termination may end up unexpectedly blocking in their attempt to help other threads exit the system.
    12966
    130 \paragraph{Go channels} provide a set of tools to help with concurrent shutdown~\cite{go:chan}.
    131 Channels in Go have a @close@ operation and a \Go{select} statement that both can be used to help threads terminate.
    132 The \Go{select} statement is discussed in \ref{s:waituntil}, where \CFA's @waituntil@ statement is compared with the Go \Go{select} statement.
    133 
    134 The @close@ operation on a channel in Go changes the state of the channel.
    135 When a channel is closed, sends to the channel panic along with additional calls to @close@.
    136 Receives are handled differently.
    137 Receivers (consumers) never block on a closed channel and continue to remove elements from the channel.
    138 Once a channel is empty, receivers can continue to remove elements, but receive the zero-value version of the element type.
    139 To avoid unwanted zero-value elements, Go provides the ability to iterate over a closed channel to remove the remaining elements.
    140 These Go design choices enforce a specific interaction style with channels during termination: careful thought is needed to ensure additional @close@ calls do not occur and no sends occur after a channel is closed.
     67% C_TODO: add reference to select chapter, add citation to go channels info
     68Go channels provide a set of tools to help with concurrent shutdown.
     69Channels in Go have a \code{close} operation and a \code{select} statement that both can be used to help threads terminate.
     70The \code{select} statement will be discussed in \ref{}, where \CFA's \code{waituntil} statement will be compared with the Go \code{select} statement.
     71The \code{close} operation on a channel in Go changes the state of the channel.
     72When a channel is closed, sends to the channel will panic and additional calls to \code{close} will panic.
     73Receives are handled differently where receivers will never block on a closed channel and will continue to remove elements from the channel.
     74Once a channel is empty, receivers can continue to remove elements, but will receive the zero-value version of the element type.
     75To aid in avoiding unwanted zero-value elements, Go provides the ability to iterate over a closed channel to remove the remaining elements.
     76These design choices for Go channels enforce a specific interaction style with channels during termination, where careful thought is needed to ensure that additional \code{close} calls don't occur and that no sends occur after channels are closed.
    14177These design choices fit Go's paradigm of error management, where users are expected to explicitly check for errors, rather than letting errors occur and catching them.
    142 If errors need to occur in Go, return codes are used to pass error information up call levels.
    143 Note, panics in Go can be caught, but it is not the idiomatic way to write Go programs.
     78If errors need to occur in Go, return codes are used to pass error information where they are needed.
     79Note that panics in Go can be caught, but it is not considered an idiomatic way to write Go programs.
    14480
    14581While Go's channel closing semantics are powerful enough to perform any concurrent termination needed by a program, their lack of ease of use leaves much to be desired.
    146 Since both closing and sending panic once a channel is closed, a user often has to synchronize the senders (producers) before the channel can be closed to avoid panics.
    147 However, in doing so it renders the @close@ operation nearly useless, as the only utilities it provides are the ability to ensure receivers no longer block on the channel and receive zero-valued elements.
    148 This functionality is only useful if the zero-typed element is recognized as a sentinel value, but if another sentinel value is necessary, then @close@ only provides the non-blocking feature.
    149 To avoid \gls{toctou} issues during shutdown, a busy wait with a \Go{select} statement is often used to add or remove elements from a channel.
     82Since both closing and sending panic, once a channel is closed, a user often has to synchronize the senders to a channel before the channel can be closed to avoid panics.
     83However, in doing so it renders the \code{close} operation nearly useless, as the only utilities it provides are the ability to ensure that receivers no longer block on the channel, and will receive zero-valued elements.
     84This can be useful if the zero-typed element is recognized as a sentinel value, but if another sentinel value is preferred, then \code{close} only provides its non-blocking feature.
     85To avoid \gls{toctou} issues during shutdown, a busy wait with a \code{select} statement is often used to add or remove elements from a channel.
    15086Due to Go's asymmetric approach to channel shutdown, separate synchronization between producers and consumers of a channel has to occur during shutdown.
    15187
    152 \paragraph{\CFA channels} have access to an extensive exception handling mechanism~\cite{Beach21}.
    153 As such \CFA uses an exception-based approach to channel shutdown that is symmetric for both producers and consumers, and supports graceful shutdown.
    154 
    155 Exceptions in \CFA support both termination and resumption.
    156 \Newterm{Termination exception}s perform a dynamic call that unwinds the stack preventing the exception handler from returning to the raise point, such as in \CC, Python and Java.
    157 \Newterm{Resumption exception}s perform a dynamic call that does not unwind the stack allowing the exception handler to return to the raise point.
    158 In \CFA, if a resumption exception is not handled, it is reraised as a termination exception.
    159 This mechanism is used to create a flexible and robust termination system for channels.
    160 
    161 When a channel in \CFA is closed, all subsequent calls to the channel raise a resumption exception at the caller.
    162 If the resumption is handled, the caller attempts to complete the channel operation.
    163 However, if channel operation would block, a termination exception is thrown.
    164 If the resumption is not handled, the exception is rethrown as a termination.
    165 These termination exceptions allow for non-local transfer that is used to great effect to eagerly and gracefully shut down a thread.
     88In \CFA, exception handling is an encouraged paradigm and has full language support \cite{Beach21}.
     89As such \CFA uses an exception based approach to channel shutdown that is symmetric for both producers and consumers, and supports graceful shutdown.Exceptions in \CFA support both termination and resumption.Termination exceptions operate in the same way as exceptions seen in many popular programming languages such as \CC, Python and Java.
     90Resumption exceptions are a style of exception that when caught run the corresponding catch block in the same way that termination exceptions do.
     91The difference between the exception handling mechanisms arises after the exception is handled.
     92In termination handling, the control flow continues into the code following the catch after the exception is handled.
     93In resumption handling, the control flow returns to the site of the \code{throw}, allowing the control to continue where it left off.
     94Note that in resumption, since control can return to the point of error propagation, the stack is not unwound during resumption propagation.
     95In \CFA if a resumption is not handled, it is reraised as a termination.
     96This mechanism can be used to create a flexible and robust termination system for channels.
     97
     98When a channel in \CFA is closed, all subsequent calls to the channel will throw a resumption exception at the caller.
     99If the resumption is handled, then the caller will proceed to attempt to complete their operation.
     100If the resumption is not handled it is then rethrown as a termination exception.
     101Or, if the resumption is handled, but the subsequent attempt at an operation would block, a termination exception is thrown.
     102These termination exceptions allow for non-local transfer that can be used to great effect to eagerly and gracefully shut down a thread.
    166103When a channel is closed, if there are any blocked producers or consumers inside the channel, they are woken up and also have a resumption thrown at them.
    167 The resumption exception, @channel_closed@, has a couple fields to aid in handling the exception.
     104The resumption exception, \code{channel_closed}, has a couple fields to aid in handling the exception.
    168105The exception contains a pointer to the channel it was thrown from, and a pointer to an element.
    169106In exceptions thrown from remove the element pointer will be null.
     
    175112This should not be an issue, since termination is rarely an fast-path of an application and ensuring that termination can be implemented correctly with ease is the aim of the exception approach.
    176113
    177 \section{\CFA / Go channel Examples}
    178 To highlight the differences between \CFA's and Go's close semantics, three examples will be presented.
    179 The first example is a simple shutdown case, where there are producer threads and consumer threads operating on a channel for a fixed duration.
    180 Once the duration ends, producers and consumers terminate without worrying about any leftover values in the channel.
    181 The second example extends the first example by requiring the channel to be empty upon shutdown.
    182 Both the first and second example are shown in Figure~\ref{f:ChannelTermination}.
    183 
    184 
    185 First the Go solutions to these examples shown in Figure~\ref{l:go_chan_term} are discussed.
    186 Since some of the elements being passed through the channel are zero-valued, closing the channel in Go does not aid in communicating shutdown.
    187 Instead, a different mechanism to communicate with the consumers and producers needs to be used.
     114To highlight the differences between \CFA's and Go's close semantics, an example program is presented.
     115The program is a barrier implemented using two channels shown in Listings~\ref{l:cfa_chan_bar} and \ref{l:go_chan_bar}.
     116Both of these examples are implemented using \CFA syntax so that they can be easily compared.
     117Listing~\ref{l:go_chan_bar} uses go-style channel close semantics and Listing~\ref{l:cfa_chan_bar} uses \CFA close semantics.
     118In this problem it is infeasible to use the Go \code{close} call since all tasks are both potentially producers and consumers, causing panics on close to be unavoidable.
     119As such in Listing~\ref{l:go_chan_bar} to implement a flush routine for the buffer, a sentinel value of $-1$ has to be used to indicate to threads that they need to leave the barrier.
     120This sentinel value has to be checked at two points.
     121Furthermore, an additional flag \code{done} is needed to communicate to threads once they have left the barrier that they are done.
    188122This use of an additional flag or communication method is common in Go channel shutdown code, since to avoid panics on a channel, the shutdown of a channel often has to be communicated with threads before it occurs.
    189 In this example, a flag is used to communicate with producers and another flag is used for consumers.
    190 Producers and consumers need separate avenues of communication both so that producers terminate before the channel is closed to avoid panicking, and to avoid the case where all the consumers terminate first, which can result in a deadlock for producers if the channel is full.
    191 The producer flag is set first, then after producers terminate the consumer flag is set and the channel is closed.
    192 In the second example where all values need to be consumed, the main thread iterates over the closed channel to process any remaining values.
    193 
    194 
    195 In the \CFA solutions in Figure~\ref{l:cfa_chan_term}, shutdown is communicated directly to both producers and consumers via the @close@ call.
    196 In the first example where all values do not need to be consumed, both producers and consumers do not handle the resumption and finish once they receive the termination exception.
    197 The second \CFA example where all values must be consumed highlights how resumption is used with channel shutdown.
    198 The @Producer@ thread-main knows to stop producing when the @insert@ call on a closed channel raises exception @channel_closed@.
    199 The @Consumer@ thread-main knows to stop consuming after all elements of a closed channel are removed and the call to @remove@ would block.
    200 Hence, the consumer knows the moment the channel closes because a resumption exception is raised, caught, and ignored, and then control returns to @remove@ to return another item from the buffer.
    201 Only when the buffer is drained and the call to @remove@ would block, a termination exception is raised to stop consuming.
    202 The \CFA semantics allow users to communicate channel shutdown directly through the channel, without having to share extra state between threads.
    203 Additionally, when the channel needs to be drained, \CFA provides users with easy options for processing the leftover channel values in the main thread or in the consumer threads.
    204 If one wishes to consume the leftover values in the consumer threads in Go, extra synchronization between the main thread and the consumer threads is needed.
    205 
    206 \begin{figure}
    207 \centering
    208 
    209 \begin{lrbox}{\myboxA}
    210 \begin{cfa}[aboveskip=0pt,belowskip=0pt]
    211 channel( size_t ) Channel{ ChannelSize };
    212 
    213 thread Consumer {};
    214 void main( Consumer & this ) {
    215     try {
    216         for ( ;; )
    217             remove( Channel );
    218     @} catchResume( channel_closed * ) { @
    219     // handled resume => consume from chan
    220     } catch( channel_closed * ) {
    221         // empty or unhandled resume
    222     }
    223 }
    224 
    225 thread Producer {};
    226 void main( Producer & this ) {
    227     size_t count = 0;
    228     try {
    229         for ( ;; )
    230             insert( Channel, count++ );
    231     } catch ( channel_closed * ) {
    232         // unhandled resume or full
    233     }
    234 }
    235 
    236 int main( int argc, char * argv[] ) {
    237     Consumer c[Consumers];
    238     Producer p[Producers];
    239     sleep(Duration`s);
    240     close( Channel );
    241     return 0;
    242 }
    243 \end{cfa}
    244 \end{lrbox}
    245 
    246 \begin{lrbox}{\myboxB}
    247 \begin{cfa}[aboveskip=0pt,belowskip=0pt]
    248 var cons_done, prod_done bool = false, false;
    249 var prodJoin chan int = make(chan int, Producers)
    250 var consJoin chan int = make(chan int, Consumers)
    251 
    252 func consumer( channel chan uint64 ) {
    253     for {
    254         if cons_done { break }
    255         <-channel
    256     }
    257     consJoin <- 0 // synch with main thd
    258 }
    259 
    260 func producer( channel chan uint64 ) {
    261     var count uint64 = 0
    262     for {
    263         if prod_done { break }
    264         channel <- count++
    265     }
    266     prodJoin <- 0 // synch with main thd
    267 }
    268 
    269 func main() {
    270     channel = make(chan uint64, ChannelSize)
    271     for j := 0; j < Consumers; j++ {
    272         go consumer( channel )
    273     }
    274     for j := 0; j < Producers; j++ {
    275         go producer( channel )
    276     }
    277     time.Sleep(time.Second * Duration)
    278     prod_done = true
    279     for j := 0; j < Producers ; j++ {
    280         <-prodJoin // wait for prods
    281     }
    282     cons_done = true
    283     close(channel) // ensure no cons deadlock
    284     @for elem := range channel { @
    285         // process leftover values
    286     @}@
    287     for j := 0; j < Consumers; j++{
    288         <-consJoin // wait for cons
    289     }
    290 }
    291 \end{cfa}
    292 \end{lrbox}
    293 
    294 \subfloat[\CFA style]{\label{l:cfa_chan_term}\usebox\myboxA}
    295 \hspace*{3pt}
    296 \vrule
    297 \hspace*{3pt}
    298 \subfloat[Go style]{\label{l:go_chan_term}\usebox\myboxB}
    299 \caption{Channel Termination Examples 1 and 2. Code specific to example 2 is highlighted.}
    300 \label{f:ChannelTermination}
    301 \end{figure}
    302 
    303 The final shutdown example uses channels to implement a barrier.
    304 It is shown in Figure~\ref{f:ChannelBarrierTermination}.
    305 The problem of implementing a barrier is chosen since threads are both producers and consumers on the barrier-internal channels, which removes the ability to easily synchronize producers before consumers during shutdown.
    306 As such, while the shutdown details will be discussed with this problem in mind, they are also applicable to other problems taht have individual threads both producing and consuming from channels.
    307 Both of these examples are implemented using \CFA syntax so that they can be easily compared.
    308 Figure~\ref{l:cfa_chan_bar} uses \CFA-style channel close semantics and Figure~\ref{l:go_chan_bar} uses Go-style close semantics.
    309 In this example it is infeasible to use the Go @close@ call since all threads are both potentially producers and consumers, causing panics on close to be unavoidable without complex synchronization.
    310 As such in Figure~\ref{l:go_chan_bar} to implement a flush routine for the buffer, a sentinel value of @-1@ has to be used to indicate to threads that they need to leave the barrier.
    311 This sentinel value has to be checked at two points.
    312 Furthermore, an additional flag @done@ is needed to communicate to threads once they have left the barrier that they are done.
    313 
    314123In the \CFA version~\ref{l:cfa_chan_bar}, the barrier shutdown results in an exception being thrown at threads operating on it, which informs the threads that they must terminate.
    315124This avoids the need to use a separate communication method other than the barrier, and avoids extra conditional checks on the fast path of the barrier implementation.
    316125Also note that in the Go version~\ref{l:go_chan_bar}, the size of the barrier channels has to be larger than in the \CFA version to ensure that the main thread does not block when attempting to clear the barrier.
    317126
    318 \begin{figure}
    319 \centering
    320 
    321 \begin{lrbox}{\myboxA}
    322 \begin{cfa}[aboveskip=0pt,belowskip=0pt]
     127\begin{cfa}[caption={\CFA channel barrier termination},label={l:cfa_chan_bar}]
    323128struct barrier {
    324         channel( int ) barWait, entryWait;
     129        channel( int ) barWait;
     130        channel( int ) entryWait;
    325131        int size;
    326 };
    327 void ?{}( barrier & this, int size ) with(this) {
    328         barWait{size};   entryWait{size};
     132}
     133void ?{}(barrier & this, int size) with(this) {
     134        barWait{size};
     135        entryWait{size};
    329136        this.size = size;
    330         for ( i; size )
    331                 insert( entryWait, i );
    332 }
    333 void wait( barrier & this ) with(this) {
    334         int ticket = remove( entryWait );
    335 
     137        for ( j; size )
     138                insert( *entryWait, j );
     139}
     140
     141void flush(barrier & this) with(this) {
     142        close(barWait);
     143        close(entryWait);
     144}
     145void wait(barrier & this) with(this) {
     146        int ticket = remove( *entryWait );
    336147        if ( ticket == size - 1 ) {
    337                 for ( i; size - 1 )
    338                         insert( barWait, i );
     148                for ( j; size - 1 )
     149                        insert( *barWait, j );
    339150                return;
    340151        }
    341         ticket = remove( barWait );
    342 
    343         if ( size == 1 || ticket == size - 2 ) { // last ?
    344                 for ( i; size )
    345                         insert( entryWait, i );
    346         }
    347 }
     152        ticket = remove( *barWait );
     153
     154        // last one out
     155        if ( size == 1 || ticket == size - 2 ) {
     156                for ( j; size )
     157                        insert( *entryWait, j );
     158        }
     159}
     160barrier b{Tasks};
     161
     162// thread main
     163void main(Task & this) {
     164        try {
     165                for ( ;; ) {
     166                        wait( b );
     167                }
     168        } catch ( channel_closed * e ) {}
     169}
     170
     171int main() {
     172        {
     173                Task t[Tasks];
     174
     175                sleep(10`s);
     176                flush( b );
     177        } // wait for tasks to terminate
     178        return 0;
     179}
     180\end{cfa}
     181
     182\begin{cfa}[caption={Go channel barrier termination},label={l:go_chan_bar}]
     183
     184struct barrier {
     185        channel( int ) barWait;
     186        channel( int ) entryWait;
     187        int size;
     188}
     189void ?{}(barrier & this, int size) with(this) {
     190        barWait{size + 1};
     191        entryWait{size + 1};
     192        this.size = size;
     193        for ( j; size )
     194                insert( *entryWait, j );
     195}
     196
    348197void flush(barrier & this) with(this) {
    349         @close( barWait );   close( entryWait );@
    350 }
    351 enum { Threads = 4 };
    352 barrier b{Threads};
    353 
    354 thread Thread {};
    355 void main( Thread & this ) {
    356         @try {@
    357                 for ()
    358                         wait( b );
    359         @} catch ( channel_closed * ) {}@
    360 }
     198        insert( *entryWait, -1 );
     199        insert( *barWait, -1 );
     200}
     201void wait(barrier & this) with(this) {
     202        int ticket = remove( *entryWait );
     203        if ( ticket == -1 ) {
     204                insert( *entryWait, -1 );
     205                return;
     206        }
     207        if ( ticket == size - 1 ) {
     208                for ( j; size - 1 )
     209                        insert( *barWait, j );
     210                return;
     211        }
     212        ticket = remove( *barWait );
     213        if ( ticket == -1 ) {
     214                insert( *barWait, -1 );
     215                return;
     216        }
     217
     218        // last one out
     219        if ( size == 1 || ticket == size - 2 ) {
     220                for ( j; size )
     221                        insert( *entryWait, j );
     222        }
     223}
     224barrier b;
     225
     226bool done = false;
     227// thread main
     228void main(Task & this) {
     229        for ( ;; ) {
     230                if ( done ) break;
     231                wait( b );
     232        }
     233}
     234
    361235int main() {
    362         Thread t[Threads];
    363         sleep(10`s);
    364 
    365         flush( b );
    366 } // wait for threads to terminate
     236        {
     237                Task t[Tasks];
     238
     239                sleep(10`s);
     240                done = true;
     241
     242                flush( b );
     243        } // wait for tasks to terminate
     244        return 0;
     245}
    367246\end{cfa}
    368 \end{lrbox}
    369 
    370 \begin{lrbox}{\myboxB}
    371 \begin{cfa}[aboveskip=0pt,belowskip=0pt]
    372 struct barrier {
    373         channel( int ) barWait, entryWait;
    374         int size;
    375 };
    376 void ?{}( barrier & this, int size ) with(this) {
    377         barWait{size + 1};   entryWait{size + 1};
    378         this.size = size;
    379         for ( i; size )
    380                 insert( entryWait, i );
    381 }
    382 void wait( barrier & this ) with(this) {
    383         int ticket = remove( entryWait );
    384         @if ( ticket == -1 ) { insert( entryWait, -1 ); return; }@
    385         if ( ticket == size - 1 ) {
    386                 for ( i; size - 1 )
    387                         insert( barWait, i );
    388                 return;
    389         }
    390         ticket = remove( barWait );
    391         @if ( ticket == -1 ) { insert( barWait, -1 ); return; }@
    392         if ( size == 1 || ticket == size - 2 ) { // last ?
    393                 for ( i; size )
    394                         insert( entryWait, i );
    395         }
    396 }
    397 void flush(barrier & this) with(this) {
    398         @insert( entryWait, -1 );   insert( barWait, -1 );@
    399 }
    400 enum { Threads = 4 };
    401 barrier b{Threads};
    402 @bool done = false;@
    403 thread Thread {};
    404 void main( Thread & this ) {
    405         for () {
    406           @if ( done ) break;@
    407                 wait( b );
    408         }
    409 }
    410 int main() {
    411         Thread t[Threads];
    412         sleep(10`s);
    413         done = true;
    414         flush( b );
    415 } // wait for threads to terminate
     247
     248In Listing~\ref{l:cfa_resume} an example of channel closing with resumption is used.
     249This program uses resumption in the \code{Consumer} thread main to ensure that all elements in the channel are removed before the consumer thread terminates.
     250The producer only has a \code{catch} so the moment it receives an exception it terminates, whereas the consumer will continue to remove from the closed channel via handling resumptions until the buffer is empty, which then throws a termination exception.
     251If the same program was implemented in Go it would require explicit synchronization with both producers and consumers by some mechanism outside the channel to ensure that all elements were removed before task termination.
     252
     253\begin{cfa}[caption={\CFA channel resumption usage},label={l:cfa_resume}]
     254channel( int ) chan{ 128 };
     255
     256// Consumer thread main
     257void main(Consumer & this) {
     258        size_t runs = 0;
     259        try {
     260                for ( ;; ) {
     261                        remove( chan );
     262                }
     263        } catchResume ( channel_closed * e ) {}
     264        catch ( channel_closed * e ) {}
     265}
     266
     267// Producer thread main
     268void main(Producer & this) {
     269        int j = 0;
     270        try {
     271                for ( ;;j++ ) {
     272                        insert( chan, j );
     273                }
     274        } catch ( channel_closed * e ) {}
     275}
     276
     277int main( int argc, char * argv[] ) {
     278        {
     279                Consumers c[4];
     280                Producer p[4];
     281
     282                sleep(10`s);
     283
     284                for ( i; Channels )
     285                        close( channels[i] );
     286        }
     287        return 0;
     288}
    416289\end{cfa}
    417 \end{lrbox}
    418 
    419 \subfloat[\CFA style]{\label{l:cfa_chan_bar}\usebox\myboxA}
    420 \hspace*{3pt}
    421 \vrule
    422 \hspace*{3pt}
    423 \subfloat[Go style]{\label{l:go_chan_bar}\usebox\myboxB}
    424 \caption{Channel Barrier Termination}
    425 \label{f:ChannelBarrierTermination}
    426 \end{figure}
    427290
    428291\section{Performance}
    429292
    430 Given that the base implementation of the \CFA channels is very similar to the Go implementation, this section aims to show the performance of the two implementations are comparable.
    431 The microbenchmark for the channel comparison is similar to Figure~\ref{f:ChannelTermination}, where the number of threads and processors is set from the command line.
    432 The processors are divided equally between producers and consumers, with one producer or consumer owning each core.
     293Given that the base implementation of the \CFA channels is very similar to the Go implementation, this section aims to show that the performance of the two implementations are comparable.
     294One microbenchmark is conducted to compare Go and \CFA.
     295The benchmark is a ten second experiment where producers and consumers operate on a channel in parallel and throughput is measured.
    433296The number of cores is varied to measure how throughput scales.
    434 
     297The cores are divided equally between producers and consumers, with one producer or consumer owning each core.
    435298The results of the benchmark are shown in Figure~\ref{f:chanPerf}.
    436299The performance of Go and \CFA channels on this microbenchmark is comparable.
    437 Note, the performance should decline as the number of cores increases as the channel operations occur in a critical section, so increasing cores results in higher contention with no increase in parallelism.
     300Note, it is expected for the performance to decline as the number of cores increases as the channel operations all occur in a critical section so an increase in cores results in higher contention with no increase in parallelism.
     301
    438302
    439303\begin{figure}
  • doc/theses/colby_parsons_MMAth/text/frontpgs.tex

    r044ae62 r3a513d89  
    8080Concurrent programs are notoriously hard to program and even harder to debug. Furthermore concurrent programs must be performant, as the introduction of concurrency into a program is often done to achieve some form of speedup.
    8181
    82 This thesis presents a suite of high-level concurrent-language features in the new programming-language \CFA, all of which are implemented with the aim of improving the performance, productivity, and safety of concurrent programs.
    83 \CFA is a non-object-oriented programming language that extends C.
    84 The foundation for concurrency in \CFA was laid by Thierry Delisle~\cite{Delisle18}, who implemented coroutines, user-level threads, and monitors.
    85 This thesis builds upon that work and introduces a suite of new concurrent features as its main contribution.
    86 The features include a @mutex@ statement (similar to a \CC scoped lock or Java \lstinline[language=Java]{synchronized} statement), Go-like channels and \lstinline[language=Go]{select} statement, and an actor system.
    87 The root ideas behind these features are not new, but the \CFA implementations extends the original ideas in performance, productivity, and safety.
     82This thesis presents a suite of high-level concurrent-language features in the new programming language \CFA, all of which are implemented with the aim of improving the performance, productivity, and safety of concurrent programs. \CFA is a non object-oriented programming language that extends C. The foundation for concurrency in \CFA was laid by Thierry Delisle~\cite{Delisle18}, who implemented coroutines, user-level threads, and monitors. This thesis builds upon that work and introduces a suite of new concurrent features as its main contribution. The features include Go-like channels, mutex statements (similar to \CC scoped locks or Java synchronized statement), an actor system, and a Go-like select statement. The root ideas behind these features are not new, but the \CFA implementations extends the original ideas in performance, productivity, and safety.
    8883
    8984\cleardoublepage
  • doc/theses/colby_parsons_MMAth/text/intro.tex

    r044ae62 r3a513d89  
    88To seize the reins and write performant and safe concurrent code, high-level concurrent-language features are needed.
    99Like any other craftsmen, programmers are only as good as their tools, and concurrent tooling and features are no exception.
    10 
    11 This thesis presents a suite of high-level concurrent-language features implemented in the new programming-language \CFA.
     10This thesis presents a set of concurrent features implemented in the new programming-language \CFA.
    1211These features aim to improve the performance of concurrent programs, aid in writing safe programs, and assist user productivity by improving the ease of concurrent programming.
    1312The groundwork for concurrent features in \CFA was implemented by Thierry Delisle~\cite{Delisle18}, who contributed the threading system, coroutines, monitors and other tools.
    1413This thesis builds on top of that foundation by providing a suite of high-level concurrent features.
    15 The features include a @mutex@ statement, channels and a @waituntil@ statement, and an actor system.
     14These features include mutex statements, channels, an actor system and a waituntil statement.
    1615All of these features exist in other programming in some shape or form, however this thesis extends the original ideas by improving performance, productivity, and safety.
  • doc/theses/colby_parsons_MMAth/text/mutex_stmt.tex

    r044ae62 r3a513d89  
    55% ======================================================================
    66
    7 The mutual exclusion problem was introduced by Dijkstra in 1965~\cite{Dijkstra65,Dijkstra65a}:
    8 there are several concurrent processes or threads that communicate by shared variables and from time to time need exclusive access to shared resources.
     7The mutual exclusion problem was introduced by Dijkstra in 1965~\cite{Dijkstra65,Dijkstra65a}.
     8There are several concurrent processes or threads that communicate by shared variables and from time to time need exclusive access to shared resources.
    99A shared resource and code manipulating it form a pairing called a \Newterm{critical section (CS)}, which is a many-to-one relationship;
    1010\eg if multiple files are being written to by multiple threads, only the pairings of simultaneous writes to the same files are CSs.
     
    2626
    2727\section{Monitor}
    28 \CFA provides a high-level locking object, called a \Newterm{monitor}, an elegant and efficient abstraction for providing mutual exclusion and synchronization for shared-memory systems.
    29 First proposed by Brinch Hansen~\cite{Hansen73} and later described and extended by C.A.R.~Hoare~\cite{Hoare74}.
    30 Several concurrent programming languages provide monitors as an explicit language construct: \eg Concurrent Pascal~\cite{ConcurrentPascal}, Mesa~\cite{Mesa}, Turing~\cite{Turing:old}, Modula-3~\cite{Modula-3}, \uC~\cite{Buhr92a} and Java~\cite{Java}.
     28\CFA provides a high-level locking object, called a \Newterm{monitor}, an elegant, efficient, high-level mechanisms for mutual exclusion and synchronization for shared-memory systems.
     29First proposed by Brinch Hansen~\cite{Hansen73} and later described and extended by C.A.R.~Hoare~\cite{Hoare74}, several concurrent programming languages provide monitors as an explicit language construct: \eg Concurrent Pascal~\cite{ConcurrentPascal}, Mesa~\cite{Mesa}, Turing~\cite{Turing:old}, Modula-3~\cite{Modula-3}, \uC~\cite{Buhr92a} and Java~\cite{Java}.
    3130In addition, operating-system kernels and device drivers have a monitor-like structure, although they often use lower-level primitives such as mutex locks or semaphores to manually implement a monitor.
    3231
    3332Figure~\ref{f:AtomicCounter} shows a \CFA and Java monitor implementing an atomic counter.
    3433A \Newterm{monitor} is a programming technique that implicitly binds mutual exclusion to static function scope by call and return.
    35 In contrast, lock mutual exclusion, defined by acquire/release calls, is independent of lexical context (analogous to block versus heap storage allocation).
     34Lock mutual exclusion, defined by acquire/release calls, is independent of lexical context (analogous to block versus heap storage allocation).
    3635Restricting acquire and release points in a monitor eases programming, comprehension, and maintenance, at a slight cost in flexibility and efficiency.
    3736Ultimately, a monitor is implemented using a combination of basic locks and atomic instructions.
     
    111110To increase locking flexibility, some languages introduce a mutex statement.
    112111\VRef[Figure]{f:ReadersWriter} shows the outline of a reader/writer lock written as a \CFA monitor and mutex statements.
    113 (The exact lock implementation is irrelevant.)
     112(The exact lock implement is irrelevant.)
    114113The @read@ and @write@ functions are called with a reader/write lock and any arguments to perform reading or writing.
    115114The @read@ function is not MX because multiple readers can read simultaneously.
     
    272271The @scoped_lock@ uses a deadlock avoidance algorithm where all locks after the first are acquired using @try_lock@ and if any of the lock attempts fail, all acquired locks are released.
    273272This repeats after selecting a new starting point in a cyclic manner until all locks are acquired successfully.
    274 This deadlock avoidance algorithm is shown in Figure~\ref{f:cc_deadlock_avoid}.
     273This deadlock avoidance algorithm is shown in Listing~\ref{l:cc_deadlock_avoid}.
    275274The algorithm is taken directly from the source code of the @<mutex>@ header, with some renaming and comments for clarity.
    276275
    277 \begin{figure}
    278 \begin{cfa}
     276\begin{cfa}[caption={\CC \lstinline{scoped_lock} deadlock avoidance algorithm},label={l:cc_deadlock_avoid}]
    279277int first = 0;  // first lock to attempt to lock
    280278do {
     
    293291} while ( ! locks[first].owns_lock() );  $\C{// is first lock held?}$
    294292\end{cfa}
    295 \caption{\CC \lstinline{scoped_lock} deadlock avoidance algorithm}
    296 \label{f:cc_deadlock_avoid}
    297 \end{figure}
    298 
    299 While this algorithm successfully avoids deadlock, there is a livelock scenario.
     293
     294While the algorithm in \ref{l:cc_deadlock_avoid} successfully avoids deadlock, there is a livelock scenario.
    300295Assume two threads, $A$ and $B$, create a @scoped_lock@ accessing two locks, $L1$ and $L2$.
    301296A livelock can form as follows.
     
    340335\end{cquote}
    341336Comparatively, if the @scoped_lock@ is used and the same locks are acquired elsewhere, there is no concern of the @scoped_lock@ deadlocking, due to its avoidance scheme, but it may livelock.
    342 The convenience and safety of the @mutex@ statement, \eg guaranteed lock release with exceptions, should encourage programmers to always use it for locking, mitigating any deadlock scenario versus combining manual locking with the mutex statement.
     337The convenience and safety of the @mutex@ statement, \eg guaranteed lock release with exceptions, should encourage programmers to always use it for locking, mitigating any deadlock scenario.
    343338
    344339\section{Performance}
     
    350345
    351346The benchmark used to evaluate the avoidance algorithms repeatedly acquires a fixed number of locks in a random order and then releases them.
    352 The pseudocode for the deadlock avoidance benchmark is shown in \VRef[Listing]{l:deadlock_avoid_pseudo}.
     347The pseudo code for the deadlock avoidance benchmark is shown in \VRef[Listing]{l:deadlock_avoid_pseudo}.
    353348To ensure the comparison exercises the implementation of each lock avoidance algorithm, an identical spinlock is implemented in each language using a set of builtin atomics available in both \CC and \CFA.
    354349The benchmarks are run for a fixed duration of 10 seconds and then terminate.
     
    357352The median is calculated and is plotted alongside the 95\% confidence intervals for each point.
    358353
    359 \begin{cfa}[caption={Deadlock avoidance benchmark pseudocode},label={l:deadlock_avoid_pseudo}]
    360 
    361 size_t n_locks; $\C{// number of locks}$
    362 size_t n_thds; $\C{// number of threads}$
    363 size_t n_gens; $\C{// number of random orderings (default 100)}$
    364 size_t total = 0; $\C{// global throughput aggregator}$
    365 volatile bool done = false; $\C{// termination flag}$
    366 
    367 test_spinlock locks[n_locks];
    368 size_t rands[n_thds][n_locks * n_gens]; $\C{// random ordering per thread}$
    369 
    370 void main( worker & w ) with(w) { $\C{// thread main}$
    371     size_t count = 0, idx = 0;
    372     while ( !done ) {
    373         idx = (count % n_locks * n_gens) * n_locks; $\C{// get start of next sequence}$
    374         mutex(locks[rands[0]], ..., locks[rands[n_locks - 1]]){} $\C{// lock sequence of locks}$
    375         count++;
    376     }
    377     __atomic_add_fetch(&total, count, __ATOMIC_SEQ_CST); $\C{// atomically add to total}$
    378 }
    379 
    380 int main( int argc, char * argv[] ) {
    381     gen_orders(); $\C{// generate random orderings}$
    382     {
    383         worker w[n_thds];
    384         sleep( 10`s );
    385         done = true;
    386     }
    387     printf( "%lu\n", total );
    388 }
     354\begin{cfa}[caption={Deadlock avoidance bendchmark pseudo code},label={l:deadlock_avoid_pseudo}]
     355
     356
     357
     358$\PAB{// add pseudo code}$
     359
     360
    389361
    390362\end{cfa}
     
    402374
    403375Figure~\ref{f:mutex_bench} shows the results of the benchmark experiments.
     376\PAB{Make the points in the graphs for each line different.
     377Also, make the text in the graphs larger.}
    404378The baseline results for both languages are mostly comparable, except for the 8 locks results in \ref{f:mutex_bench8_AMD} and \ref{f:mutex_bench8_Intel}, where the \CFA baseline is slightly slower.
    405379The avoidance result for both languages is significantly different, where \CFA's mutex statement achieves throughput that is magnitudes higher than \CC's @scoped_lock@.
     
    409383For example, on the AMD machine with 32 threads and 8 locks, the benchmarks would occasionally livelock indefinitely, with no threads making any progress for 3 hours before the experiment was terminated manually.
    410384It is likely that shorter bouts of livelock occurred in many of the experiments, which would explain large confidence intervals for some of the data points in the \CC data.
    411 In Figures~\ref{f:mutex_bench8_AMD} and \ref{f:mutex_bench8_Intel} there is the counter-intuitive result of the mutex statement performing better than the baseline.
    412 At 7 locks and above the mutex statement switches from a hard coded sort to insertion sort, which should decrease performance.
    413 It is likely the increase in throughput compared to baseline is due to the delay spent in the insertion sort, which decreases contention on the locks.
     385In Figures~\ref{f:mutex_bench8_AMD} and \ref{f:mutex_bench8_Intel} the mutex statement performs better than the baseline.
     386At 7 locks and above the mutex statement switches from a hard coded sort to insertion sort.
     387It is likely that the improvement in throughput compared to baseline is due to the time spent in the insertion sort, which decreases contention on the locks.
    414388
    415389\begin{figure}
  • doc/theses/colby_parsons_MMAth/thesis.tex

    r044ae62 r3a513d89  
    200200\input{actors}
    201201
    202 \input{waituntil}
    203 
    204202%----------------------------------------------------------------------
    205203% END MATERIAL
  • driver/cfa.cc

    r044ae62 r3a513d89  
    1010// Created On       : Tue Aug 20 13:44:49 2002
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Tue May 23 16:22:47 2023
    13 // Update Count     : 477
     12// Last Modified On : Mon Apr 10 21:16:00 2023
     13// Update Count     : 476
    1414//
    1515
     
    329329        #endif // __x86_64__
    330330
    331         #ifdef __ARM_ARCH
    332         args[nargs++] = "-mno-outline-atomics";                         // use ARM LL/SC instructions for atomics
    333         #endif // __ARM_ARCH
    334 
    335331        #ifdef __DEBUG_H__
    336332        cerr << "args:";
  • libcfa/src/Makefile.am

    r044ae62 r3a513d89  
    115115        concurrency/kernel/fwd.hfa \
    116116        concurrency/mutex_stmt.hfa \
     117    concurrency/select.hfa \
    117118    concurrency/channel.hfa \
    118119    concurrency/actor.hfa
     
    127128        concurrency/monitor.hfa \
    128129        concurrency/mutex.hfa \
    129     concurrency/select.hfa \
    130130        concurrency/thread.hfa
    131131
  • libcfa/src/bits/weakso_locks.cfa

    r044ae62 r3a513d89  
    1515// Update Count     :
    1616//
     17
    1718#include "bits/weakso_locks.hfa"
     19
    1820#pragma GCC visibility push(default)
    1921
     
    2527void unlock( blocking_lock & ) {}
    2628void on_notify( blocking_lock &, struct thread$ * ) {}
    27 size_t on_wait( blocking_lock &, void (*pp_fn)( void * ), void * pp_datum ) { return 0; }
     29size_t on_wait( blocking_lock & ) { return 0; }
    2830void on_wakeup( blocking_lock &, size_t ) {}
    2931size_t wait_count( blocking_lock & ) { return 0; }
    30 bool register_select( blocking_lock & this, select_node & node ) { return false; }
    31 bool unregister_select( blocking_lock & this, select_node & node ) { return false; }
    32 bool on_selected( blocking_lock & this, select_node & node ) { return true; }
    33 
  • libcfa/src/bits/weakso_locks.hfa

    r044ae62 r3a513d89  
    2323#include "containers/list.hfa"
    2424
    25 struct select_node;
     25struct thread$;
    2626
    2727//-----------------------------------------------------------------------------
     
    3232
    3333        // List of blocked threads
    34         dlist( select_node ) blocked_threads;
     34        dlist( thread$ ) blocked_threads;
    3535
    3636        // Count of current blocked threads
     
    5757void unlock( blocking_lock & this ) OPTIONAL_THREAD;
    5858void on_notify( blocking_lock & this, struct thread$ * t ) OPTIONAL_THREAD;
    59 size_t on_wait( blocking_lock & this, void (*pp_fn)( void * ), void * pp_datum ) OPTIONAL_THREAD;
     59size_t on_wait( blocking_lock & this ) OPTIONAL_THREAD;
    6060void on_wakeup( blocking_lock & this, size_t ) OPTIONAL_THREAD;
    6161size_t wait_count( blocking_lock & this ) OPTIONAL_THREAD;
    62 bool register_select( blocking_lock & this, select_node & node ) OPTIONAL_THREAD;
    63 bool unregister_select( blocking_lock & this, select_node & node ) OPTIONAL_THREAD;
    64 bool on_selected( blocking_lock & this, select_node & node ) OPTIONAL_THREAD;
    6562
    6663//----------
     
    7572static inline bool   try_lock ( multiple_acquisition_lock & this ) { return try_lock( (blocking_lock &)this ); }
    7673static inline void   unlock   ( multiple_acquisition_lock & this ) { unlock  ( (blocking_lock &)this ); }
    77 static inline size_t on_wait  ( multiple_acquisition_lock & this, void (*pp_fn)( void * ), void * pp_datum ) { return on_wait ( (blocking_lock &)this, pp_fn, pp_datum ); }
     74static inline size_t on_wait  ( multiple_acquisition_lock & this ) { return on_wait ( (blocking_lock &)this ); }
    7875static inline void   on_wakeup( multiple_acquisition_lock & this, size_t v ) { on_wakeup ( (blocking_lock &)this, v ); }
    7976static inline void   on_notify( multiple_acquisition_lock & this, struct thread$ * t ){ on_notify( (blocking_lock &)this, t ); }
    80 static inline bool   register_select( multiple_acquisition_lock & this, select_node & node ) { return register_select( (blocking_lock &)this, node ); }
    81 static inline bool   unregister_select( multiple_acquisition_lock & this, select_node & node ) { return unregister_select( (blocking_lock &)this, node ); }
    82 static inline bool   on_selected( multiple_acquisition_lock & this, select_node & node ) { return on_selected( (blocking_lock &)this, node ); }
  • libcfa/src/concurrency/channel.hfa

    r044ae62 r3a513d89  
    1 //
    2 // Cforall Version 1.0.0 Copyright (C) 2021 University of Waterloo
    3 //
    4 // The contents of this file are covered under the licence agreement in the
    5 // file "LICENCE" distributed with Cforall.
    6 //
    7 // channel.hfa -- LIBCFATHREAD
    8 // Runtime locks that used with the runtime thread system.
    9 //
    10 // Author           : Colby Alexander Parsons
    11 // Created On       : Thu Jan 21 19:46:50 2022
    12 // Last Modified By :
    13 // Last Modified On :
    14 // Update Count     :
    15 //
    16 
    171#pragma once
    182
    193#include <locks.hfa>
    204#include <list.hfa>
    21 #include "select.hfa"
     5#include <mutex_stmt.hfa>
     6
     7// link field used for threads waiting on channel
     8struct wait_link {
     9    // used to put wait_link on a dl queue
     10    inline dlink(wait_link);
     11
     12    // waiting thread
     13    struct thread$ * t;
     14
     15    // shadow field
     16    void * elem;
     17};
     18P9_EMBEDDED( wait_link, dlink(wait_link) )
     19
     20static inline void ?{}( wait_link & this, thread$ * t, void * elem ) {
     21    this.t = t;
     22    this.elem = elem;
     23}
     24
     25// wake one thread from the list
     26static inline void wake_one( dlist( wait_link ) & queue ) {
     27    wait_link & popped = try_pop_front( queue );
     28    unpark( popped.t );
     29}
    2230
    2331// returns true if woken due to shutdown
    2432// blocks thread on list and releases passed lock
    25 static inline bool block( dlist( select_node ) & queue, void * elem_ptr, go_mutex & lock ) {
    26     select_node sn{ active_thread(), elem_ptr };
    27     insert_last( queue, sn );
     33static inline bool block( dlist( wait_link ) & queue, void * elem_ptr, go_mutex & lock ) {
     34    wait_link w{ active_thread(), elem_ptr };
     35    insert_last( queue, w );
    2836    unlock( lock );
    2937    park();
    30     return sn.extra == 0p;
    31 }
    32 
    33 // Waituntil support (un)register_select helper routine
    34 // Sets select node avail if not special OR case and then unlocks
    35 static inline void __set_avail_then_unlock( select_node & node, go_mutex & mutex_lock ) {
    36     if ( node.park_counter ) __make_select_node_available( node );
    37     unlock( mutex_lock );
     38    return w.elem == 0p;
    3839}
    3940
     
    5859    size_t size, front, back, count;
    5960    T * buffer;
    60     dlist( select_node ) prods, cons; // lists of blocked threads
    61     go_mutex mutex_lock;              // MX lock
    62     bool closed;                      // indicates channel close/open
    63     #ifdef CHAN_STATS
    64     size_t p_blocks, p_ops, c_blocks, c_ops;      // counts total ops and ops resulting in a blocked thd
     61    dlist( wait_link ) prods, cons; // lists of blocked threads
     62    go_mutex mutex_lock;            // MX lock
     63    bool closed;                    // indicates channel close/open
     64    #ifdef CHAN_STATS
     65    size_t blocks, operations;      // counts total ops and ops resulting in a blocked thd
    6566    #endif
    6667};
     
    6970    size = _size;
    7071    front = back = count = 0;
    71     if ( size != 0 ) buffer = aalloc( size );
     72    buffer = aalloc( size );
    7273    prods{};
    7374    cons{};
     
    7576    closed = false;
    7677    #ifdef CHAN_STATS
    77     p_blocks = 0;
    78     p_ops = 0;
    79     c_blocks = 0;
    80     c_ops = 0;
     78    blocks = 0;
     79    operations = 0;
    8180    #endif
    8281}
     
    8584static inline void ^?{}( channel(T) &c ) with(c) {
    8685    #ifdef CHAN_STATS
    87     printf("Channel %p Blocks: %lu,\t\tOperations: %lu,\t%.2f%% of ops blocked\n", &c, p_blocks + c_blocks, p_ops + c_ops, ((double)p_blocks + c_blocks)/(p_ops + c_ops) * 100);
    88     printf("Channel %p Consumer Blocks: %lu,\tConsumer Ops: %lu,\t%.2f%% of Consumer ops blocked\n", &c, p_blocks, p_ops, ((double)p_blocks)/p_ops * 100);
    89     printf("Channel %p Producer Blocks: %lu,\tProducer Ops: %lu,\t%.2f%% of Producer ops blocked\n", &c, c_blocks, c_ops, ((double)c_blocks)/c_ops * 100);
    90     #endif
    91     verifyf( __handle_waituntil_OR( cons ) || __handle_waituntil_OR( prods ) || cons`isEmpty && prods`isEmpty,
    92         "Attempted to delete channel with waiting threads (Deadlock).\n" );
    93     if ( size != 0 ) delete( buffer );
    94 }
    95 static inline size_t get_count( channel(T) & chan ) with(chan) { return __atomic_load_n( &count, __ATOMIC_RELAXED ); }
    96 static inline size_t get_size( channel(T) & chan ) with(chan) { return __atomic_load_n( &size, __ATOMIC_RELAXED ); }
     86    printf("Channel %p Blocks: %lu, Operations: %lu, %.2f%% of ops blocked\n", &c, blocks, operations, ((double)blocks)/operations * 100);
     87    #endif
     88    verifyf( cons`isEmpty && prods`isEmpty, "Attempted to delete channel with waiting threads (Deadlock).\n" );
     89    delete( buffer );
     90}
     91static inline size_t get_count( channel(T) & chan ) with(chan) { return count; }
     92static inline size_t get_size( channel(T) & chan ) with(chan) { return size; }
    9793static inline bool has_waiters( channel(T) & chan ) with(chan) { return !cons`isEmpty || !prods`isEmpty; }
    9894static inline bool has_waiting_consumers( channel(T) & chan ) with(chan) { return !cons`isEmpty; }
     
    106102    // flush waiting consumers and producers
    107103    while ( has_waiting_consumers( chan ) ) {
    108         if( !__handle_waituntil_OR( cons ) ) // ensure we only signal special OR case threads when they win the race
    109             break;  // if __handle_waituntil_OR returns false cons is empty so break
    110         cons`first.extra = 0p;
     104        cons`first.elem = 0p;
    111105        wake_one( cons );
    112106    }
    113107    while ( has_waiting_producers( chan ) ) {
    114         if( !__handle_waituntil_OR( prods ) ) // ensure we only signal special OR case threads when they win the race
    115             break;  // if __handle_waituntil_OR returns false prods is empty so break
    116         prods`first.extra = 0p;
     108        prods`first.elem = 0p;
    117109        wake_one( prods );
    118110    }
     
    122114static inline void is_closed( channel(T) & chan ) with(chan) { return closed; }
    123115
    124 // used to hand an element to a blocked consumer and signal it
    125 static inline void __cons_handoff( channel(T) & chan, T & elem ) with(chan) {
    126     memcpy( cons`first.extra, (void *)&elem, sizeof(T) ); // do waiting consumer work
    127     wake_one( cons );
    128 }
    129 
    130 // used to hand an element to a blocked producer and signal it
    131 static inline void __prods_handoff( channel(T) & chan, T & retval ) with(chan) {
    132     memcpy( (void *)&retval, prods`first.extra, sizeof(T) );
    133     wake_one( prods );
    134 }
    135 
    136116static inline void flush( channel(T) & chan, T elem ) with(chan) {
    137117    lock( mutex_lock );
    138118    while ( count == 0 && !cons`isEmpty ) {
    139         __cons_handoff( chan, elem );
     119        memcpy(cons`first.elem, (void *)&elem, sizeof(T)); // do waiting consumer work
     120        wake_one( cons );
    140121    }
    141122    unlock( mutex_lock );
     
    144125// handles buffer insert
    145126static inline void __buf_insert( channel(T) & chan, T & elem ) with(chan) {
    146     memcpy( (void *)&buffer[back], (void *)&elem, sizeof(T) );
     127    memcpy((void *)&buffer[back], (void *)&elem, sizeof(T));
    147128    count += 1;
    148129    back++;
     
    150131}
    151132
     133// does the buffer insert or hands elem directly to consumer if one is waiting
     134static inline void __do_insert( channel(T) & chan, T & elem ) with(chan) {
     135    if ( count == 0 && !cons`isEmpty ) {
     136        memcpy(cons`first.elem, (void *)&elem, sizeof(T)); // do waiting consumer work
     137        wake_one( cons );
     138    } else __buf_insert( chan, elem );
     139}
     140
    152141// needed to avoid an extra copy in closed case
    153142static inline bool __internal_try_insert( channel(T) & chan, T & elem ) with(chan) {
    154143    lock( mutex_lock );
    155144    #ifdef CHAN_STATS
    156     p_ops++;
    157     #endif
    158 
    159     ConsEmpty: if ( !cons`isEmpty ) {
    160         if ( !__handle_waituntil_OR( cons ) ) break ConsEmpty;
    161         __cons_handoff( chan, elem );
    162         unlock( mutex_lock );
    163         return true;
    164     }
    165 
     145    operations++;
     146    #endif
    166147    if ( count == size ) { unlock( mutex_lock ); return false; }
    167 
    168     __buf_insert( chan, elem );
     148    __do_insert( chan, elem );
    169149    unlock( mutex_lock );
    170150    return true;
     
    177157// handles closed case of insert routine
    178158static inline void __closed_insert( channel(T) & chan, T & elem ) with(chan) {
    179     channel_closed except{ &channel_closed_vt, &elem, &chan };
     159    channel_closed except{&channel_closed_vt, &elem, &chan };
    180160    throwResume except; // throw closed resumption
    181161    if ( !__internal_try_insert( chan, elem ) ) throw except; // if try to insert fails (would block), throw termination
     
    192172
    193173    #ifdef CHAN_STATS
    194     if ( !closed ) p_ops++;
     174    if ( !closed ) operations++;
    195175    #endif
    196176
     
    202182    }
    203183
    204     // buffer count must be zero if cons are blocked (also handles zero-size case)
    205     ConsEmpty: if ( !cons`isEmpty ) {
    206         if ( !__handle_waituntil_OR( cons ) ) break ConsEmpty;
    207         __cons_handoff( chan, elem );
     184    // have to check for the zero size channel case
     185    if ( size == 0 && !cons`isEmpty ) {
     186        memcpy(cons`first.elem, (void *)&elem, sizeof(T));
     187        wake_one( cons );
    208188        unlock( mutex_lock );
    209         return;
     189        return true;
    210190    }
    211191
     
    213193    if ( count == size ) {
    214194        #ifdef CHAN_STATS
    215         p_blocks++;
     195        blocks++;
    216196        #endif
    217197
     
    222202    } // if
    223203
    224     __buf_insert( chan, elem );
    225     unlock( mutex_lock );
     204    if ( count == 0 && !cons`isEmpty ) {
     205        memcpy(cons`first.elem, (void *)&elem, sizeof(T)); // do waiting consumer work
     206        wake_one( cons );
     207    } else __buf_insert( chan, elem );
     208   
     209    unlock( mutex_lock );
     210    return;
     211}
     212
     213// handles buffer remove
     214static inline void __buf_remove( channel(T) & chan, T & retval ) with(chan) {
     215    memcpy((void *)&retval, (void *)&buffer[front], sizeof(T));
     216    count -= 1;
     217    front = (front + 1) % size;
    226218}
    227219
    228220// does the buffer remove and potentially does waiting producer work
    229221static inline void __do_remove( channel(T) & chan, T & retval ) with(chan) {
    230     memcpy( (void *)&retval, (void *)&buffer[front], sizeof(T) );
    231     count -= 1;
    232     front = (front + 1) % size;
     222    __buf_remove( chan, retval );
    233223    if (count == size - 1 && !prods`isEmpty ) {
    234         if ( !__handle_waituntil_OR( prods ) ) return;
    235         __buf_insert( chan, *(T *)prods`first.extra );  // do waiting producer work
     224        __buf_insert( chan, *(T *)prods`first.elem );  // do waiting producer work
    236225        wake_one( prods );
    237226    }
     
    242231    lock( mutex_lock );
    243232    #ifdef CHAN_STATS
    244     c_ops++;
    245     #endif
    246 
    247     ZeroSize: if ( size == 0 && !prods`isEmpty ) {
    248         if ( !__handle_waituntil_OR( prods ) ) break ZeroSize;
    249         __prods_handoff( chan, retval );
    250         unlock( mutex_lock );
    251         return true;
    252     }
    253 
     233    operations++;
     234    #endif
    254235    if ( count == 0 ) { unlock( mutex_lock ); return false; }
    255 
    256236    __do_remove( chan, retval );
    257237    unlock( mutex_lock );
     
    264244static inline [T, bool] try_remove( channel(T) & chan ) {
    265245    T retval;
    266     bool success = __internal_try_remove( chan, retval );
    267     return [ retval, success ];
    268 }
    269 
    270 static inline T try_remove( channel(T) & chan ) {
     246    return [ retval, __internal_try_remove( chan, retval ) ];
     247}
     248
     249static inline T try_remove( channel(T) & chan, T elem ) {
    271250    T retval;
    272251    __internal_try_remove( chan, retval );
     
    276255// handles closed case of insert routine
    277256static inline void __closed_remove( channel(T) & chan, T & retval ) with(chan) {
    278     channel_closed except{ &channel_closed_vt, 0p, &chan };
     257    channel_closed except{&channel_closed_vt, 0p, &chan };
    279258    throwResume except; // throw resumption
    280259    if ( !__internal_try_remove( chan, retval ) ) throw except; // if try to remove fails (would block), throw termination
     
    290269
    291270    #ifdef CHAN_STATS
    292     if ( !closed ) c_ops++;
     271    if ( !closed ) operations++;
    293272    #endif
    294273
     
    300279
    301280    // have to check for the zero size channel case
    302     ZeroSize: if ( size == 0 && !prods`isEmpty ) {
    303         if ( !__handle_waituntil_OR( prods ) ) break ZeroSize;
    304         __prods_handoff( chan, retval );
     281    if ( size == 0 && !prods`isEmpty ) {
     282        memcpy((void *)&retval, (void *)prods`first.elem, sizeof(T));
     283        wake_one( prods );
    305284        unlock( mutex_lock );
    306285        return retval;
     
    308287
    309288    // wait if buffer is empty, work will be completed by someone else
    310     if ( count == 0 ) {
     289    if (count == 0) {
    311290        #ifdef CHAN_STATS
    312         c_blocks++;
     291        blocks++;
    313292        #endif
    314293        // check for if woken due to close
     
    320299    // Remove from buffer
    321300    __do_remove( chan, retval );
     301
    322302    unlock( mutex_lock );
    323303    return retval;
    324304}
    325 
    326 ///////////////////////////////////////////////////////////////////////////////////////////
    327 // The following is support for waituntil (select) statements
    328 ///////////////////////////////////////////////////////////////////////////////////////////
    329 static inline bool unregister_chan( channel(T) & chan, select_node & node ) with(chan) {
    330     if ( !node`isListed && !node.park_counter ) return false; // handle special OR case
    331     lock( mutex_lock );
    332     if ( node`isListed ) { // op wasn't performed
    333         remove( node );
    334         unlock( mutex_lock );
    335         return false;
    336     }
    337     unlock( mutex_lock );
    338 
    339     // only return true when not special OR case, not exceptional calse and status is SAT
    340     return ( node.extra == 0p || !node.park_counter ) ? false : *node.clause_status == __SELECT_SAT;
    341 }
    342 
    343 // type used by select statement to capture a chan read as the selected operation
    344 struct chan_read {
    345     T & ret;
    346     channel(T) & chan;
    347 };
    348 
    349 static inline void ?{}( chan_read(T) & cr, channel(T) & chan, T & ret ) {
    350     &cr.chan = &chan;
    351     &cr.ret = &ret;
    352 }
    353 static inline chan_read(T) ?<<?( T & ret, channel(T) & chan ) { chan_read(T) cr{ chan, ret }; return cr; }
    354 
    355 static inline void __handle_select_closed_read( chan_read(T) & this, select_node & node ) with(this.chan, this) {
    356     __closed_remove( chan, ret );
    357     // if we get here then the insert succeeded
    358     __make_select_node_available( node );
    359 }
    360 
    361 static inline bool register_select( chan_read(T) & this, select_node & node ) with(this.chan, this) {
    362     lock( mutex_lock );
    363     node.extra = &ret; // set .extra so that if it == 0p later in on_selected it is due to channel close
    364 
    365     #ifdef CHAN_STATS
    366     if ( !closed ) c_ops++;
    367     #endif
    368 
    369     if ( !node.park_counter ) {
    370         // are we special case OR and front of cons is also special case OR
    371         if ( !unlikely(closed) && !prods`isEmpty && prods`first.clause_status && !prods`first.park_counter ) {
    372             if ( !__make_select_node_pending( node ) ) {
    373                 unlock( mutex_lock );
    374                 return false;
    375             }
    376            
    377             if ( __handle_waituntil_OR( prods ) ) {
    378                 __prods_handoff( chan, ret );
    379                 __make_select_node_sat( node ); // need to to mark SAT now that we know operation is done or else threads could get stuck in __mark_select_node
    380                 unlock( mutex_lock );
    381                 return true;
    382             }
    383             __make_select_node_unsat( node );
    384         }
    385         // check if we can complete operation. If so race to establish winner in special OR case
    386         if ( count != 0 || !prods`isEmpty || unlikely(closed) ) {
    387             if ( !__make_select_node_available( node ) ) { // we didn't win the race so give up on registering
    388                 unlock( mutex_lock );
    389                 return false;
    390             }
    391         }
    392     }
    393 
    394     if ( unlikely(closed) ) {
    395         unlock( mutex_lock );
    396         __handle_select_closed_read( this, node );
    397         return true;
    398     }
    399 
    400     // have to check for the zero size channel case
    401     ZeroSize: if ( size == 0 && !prods`isEmpty ) {
    402         if ( !__handle_waituntil_OR( prods ) ) break ZeroSize;
    403         __prods_handoff( chan, ret );
    404         __set_avail_then_unlock( node, mutex_lock );
    405         return true;
    406     }
    407 
    408     // wait if buffer is empty, work will be completed by someone else
    409     if ( count == 0 ) {
    410         #ifdef CHAN_STATS
    411         c_blocks++;
    412         #endif
    413        
    414         insert_last( cons, node );
    415         unlock( mutex_lock );
    416         return false;
    417     }
    418 
    419     // Remove from buffer
    420     __do_remove( chan, ret );
    421     __set_avail_then_unlock( node, mutex_lock );
    422     return true;
    423 }
    424 static inline bool unregister_select( chan_read(T) & this, select_node & node ) { return unregister_chan( this.chan, node ); }
    425 static inline bool on_selected( chan_read(T) & this, select_node & node ) with(this) {
    426     if ( node.extra == 0p ) // check if woken up due to closed channel
    427         __closed_remove( chan, ret );
    428     // This is only reachable if not closed or closed exception was handled
    429     return true;
    430 }
    431 
    432 // type used by select statement to capture a chan write as the selected operation
    433 struct chan_write {
    434     T elem;
    435     channel(T) & chan;
    436 };
    437 
    438 static inline void ?{}( chan_write(T) & cw, channel(T) & chan, T elem ) {
    439     &cw.chan = &chan;
    440     memcpy( (void *)&cw.elem, (void *)&elem, sizeof(T) );
    441 }
    442 static inline chan_write(T) ?>>?( T elem, channel(T) & chan ) { chan_write(T) cw{ chan, elem }; return cw; }
    443 
    444 static inline void __handle_select_closed_write( chan_write(T) & this, select_node & node ) with(this.chan, this) {
    445     __closed_insert( chan, elem );
    446     // if we get here then the insert succeeded
    447     __make_select_node_available( node );
    448 }
    449 
    450 static inline bool register_select( chan_write(T) & this, select_node & node ) with(this.chan, this) {
    451     lock( mutex_lock );
    452     node.extra = &elem; // set .extra so that if it == 0p later in on_selected it is due to channel close
    453 
    454     #ifdef CHAN_STATS
    455     if ( !closed ) p_ops++;
    456     #endif
    457 
    458     // special OR case handling
    459     if ( !node.park_counter ) {
    460         // are we special case OR and front of cons is also special case OR
    461         if ( !unlikely(closed) && !cons`isEmpty && cons`first.clause_status && !cons`first.park_counter ) {
    462             if ( !__make_select_node_pending( node ) ) {
    463                 unlock( mutex_lock );
    464                 return false;
    465             }
    466            
    467             if ( __handle_waituntil_OR( cons ) ) {
    468                 __cons_handoff( chan, elem );
    469                 __make_select_node_sat( node ); // need to to mark SAT now that we know operation is done or else threads could get stuck in __mark_select_node
    470                 unlock( mutex_lock );
    471                 return true;
    472             }
    473             __make_select_node_unsat( node );
    474         }
    475         // check if we can complete operation. If so race to establish winner in special OR case
    476         if ( count != size || !cons`isEmpty || unlikely(closed) ) {
    477             if ( !__make_select_node_available( node ) ) { // we didn't win the race so give up on registering
    478                 unlock( mutex_lock );
    479                 return false;
    480             }
    481         }
    482     }
    483 
    484     // if closed handle
    485     if ( unlikely(closed) ) {
    486         unlock( mutex_lock );
    487         __handle_select_closed_write( this, node );
    488         return true;
    489     }
    490 
    491     // handle blocked consumer case via handoff (buffer is implicitly empty)
    492     ConsEmpty: if ( !cons`isEmpty ) {
    493         if ( !__handle_waituntil_OR( cons ) ) break ConsEmpty;
    494         __cons_handoff( chan, elem );
    495         __set_avail_then_unlock( node, mutex_lock );
    496         return true;
    497     }
    498 
    499     // insert node in list if buffer is full, work will be completed by someone else
    500     if ( count == size ) {
    501         #ifdef CHAN_STATS
    502         p_blocks++;
    503         #endif
    504 
    505         insert_last( prods, node );
    506         unlock( mutex_lock );
    507         return false;
    508     } // if
    509 
    510     // otherwise carry out write either via normal insert
    511     __buf_insert( chan, elem );
    512     __set_avail_then_unlock( node, mutex_lock );
    513     return true;
    514 }
    515 static inline bool unregister_select( chan_write(T) & this, select_node & node ) { return unregister_chan( this.chan, node ); }
    516 
    517 static inline bool on_selected( chan_write(T) & this, select_node & node ) with(this) {
    518     if ( node.extra == 0p ) // check if woken up due to closed channel
    519         __closed_insert( chan, elem );
    520 
    521     // This is only reachable if not closed or closed exception was handled
    522     return true;
    523 }
    524 
    525305} // forall( T )
    526 
    527 
  • libcfa/src/concurrency/future.hfa

    r044ae62 r3a513d89  
    1919#include "monitor.hfa"
    2020#include "select.hfa"
    21 #include "locks.hfa"
    2221
    2322//----------------------------------------------------------------------------
     
    2726//  future_t is lockfree and uses atomics which aren't needed given we use locks here
    2827forall( T ) {
    29     // enum { FUTURE_EMPTY = 0, FUTURE_FULFILLED = 1 }; // Enums seem to be broken so feel free to add this back afterwards
     28    // enum(int) { FUTURE_EMPTY = 0, FUTURE_FULFILLED = 1 }; // Enums seem to be broken so feel free to add this back afterwards
    3029
    3130    // temporary enum replacement
     
    4544    };
    4645
     46    // C_TODO: perhaps allow exceptions to be inserted like uC++?
     47
    4748        static inline {
    4849
     
    5253        }
    5354
    54         void ?{}( future(T) & this ) {
     55        void ?{}(future(T) & this) {
    5556                        this.waiters{};
    5657            this.state = FUTURE_EMPTY;
     
    5960
    6061                // Reset future back to original state
    61                 void reset( future(T) & this ) with(this)
     62                void reset(future(T) & this) with(this)
    6263        {
    6364            lock( lock );
     
    8182        void _internal_flush( future(T) & this ) with(this) {
    8283            while( ! waiters`isEmpty ) {
    83                 if ( !__handle_waituntil_OR( waiters ) ) // handle special waituntil OR case
    84                     break; // if handle_OR returns false then waiters is empty so break
    8584                select_node &s = try_pop_front( waiters );
    8685
    87                 if ( s.clause_status == 0p ) // poke in result so that woken threads do not need to reacquire any locks
     86                if ( s.race_flag == 0p )
     87                    // poke in result so that woken threads do not need to reacquire any locks
     88                    // *(((future_node(T) &)s).my_result) = result;
    8889                    copy_T( result, *(((future_node(T) &)s).my_result) );
     90                else if ( !install_select_winner( s, &this ) ) continue;
    8991               
    90                 wake_one( waiters, s );
     92                // only unpark if future is not selected
     93                // or if it is selected we only unpark if we win the race
     94                unpark( s.blocked_thread );
    9195            }
    9296        }
    9397
    9498                // Fulfil the future, returns whether or not someone was unblocked
    95                 bool fulfil( future(T) & this, T val ) with(this) {
     99                bool fulfil( future(T) & this, T & val ) with(this) {
    96100            lock( lock );
    97101            if( state != FUTURE_EMPTY )
     
    149153        }
    150154
    151         bool register_select( future(T) & this, select_node & s ) with(this) {
    152             lock( lock );
    153 
    154             // check if we can complete operation. If so race to establish winner in special OR case
    155             if ( !s.park_counter && state != FUTURE_EMPTY ) {
    156                 if ( !__make_select_node_available( s ) ) { // we didn't win the race so give up on registering
    157                     unlock( lock );
    158                     return false;
    159                 }
    160             }
    161 
    162             // future not ready -> insert select node and return
     155        void * register_select( future(T) & this, select_node & s ) with(this) {
     156            lock( lock );
     157
     158            // future not ready -> insert select node and return 0p
    163159            if( state == FUTURE_EMPTY ) {
    164160                insert_last( waiters, s );
    165161                unlock( lock );
    166                 return false;
    167             }
    168 
    169             __make_select_node_available( s );
    170             unlock( lock );
    171             return true;
    172         }
    173 
    174         bool unregister_select( future(T) & this, select_node & s ) with(this) {
    175             if ( ! s`isListed ) return false;
     162                return 0p;
     163            }
     164
     165            // future ready and we won race to install it as the select winner return 1p
     166            if ( install_select_winner( s, &this ) ) {
     167                unlock( lock );
     168                return 1p;
     169            }
     170
     171            unlock( lock );
     172            // future ready and we lost race to install it as the select winner
     173            return 2p;
     174        }
     175
     176        void unregister_select( future(T) & this, select_node & s ) with(this) {
    176177            lock( lock );
    177178            if ( s`isListed ) remove( s );
    178179            unlock( lock );
    179             return false;
    180180        }
    181181               
    182         bool on_selected( future(T) & this, select_node & node ) { return true; }
    183182        }
    184183}
     
    187186// These futures below do not support select statements so they may not be as useful as 'future'
    188187//  however the 'single_future' is cheap and cheerful and is most likely more performant than 'future'
    189 //  since it uses raw atomics and no locks
     188//  since it uses raw atomics and no locks afaik
    190189//
    191190// As far as 'multi_future' goes I can't see many use cases as it will be less performant than 'future'
  • libcfa/src/concurrency/invoke.h

    r044ae62 r3a513d89  
    217217                struct __thread_user_link cltr_link;
    218218
     219                // used to point to this thd's current clh node
     220                volatile bool * clh_node;
     221
    219222                struct processor * last_proc;
    220 
    221         // ptr used during handover between blocking lists to allow for stack allocation of intrusive nodes
    222         // main use case is wait-morphing to allow a different node to be used to block on condvar vs lock
    223         void * link_node;
    224223
    225224                PRNG_STATE_T random_state;                                              // fast random numbers
  • libcfa/src/concurrency/locks.cfa

    r044ae62 r3a513d89  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // locks.cfa -- LIBCFATHREAD
     7// locks.hfa -- LIBCFATHREAD
    88// Runtime locks that used with the runtime thread system.
    99//
     
    7979        // lock is held by some other thread
    8080        if ( owner != 0p && owner != thrd ) {
    81         select_node node;
    82                 insert_last( blocked_threads, node );
     81                insert_last( blocked_threads, *thrd );
    8382                wait_count++;
    8483                unlock( lock );
    8584                park( );
    86         return;
    87         } else if ( owner == thrd && multi_acquisition ) { // multi acquisition lock is held by current thread
     85        }
     86        // multi acquisition lock is held by current thread
     87        else if ( owner == thrd && multi_acquisition ) {
    8888                recursion_count++;
    89         } else {  // lock isn't held
     89                unlock( lock );
     90        }
     91        // lock isn't held
     92        else {
    9093                owner = thrd;
    9194                recursion_count = 1;
    92         }
    93     unlock( lock );
     95                unlock( lock );
     96        }
    9497}
    9598
     
    114117}
    115118
    116 static inline void pop_node( blocking_lock & this ) with( this ) {
    117     __handle_waituntil_OR( blocked_threads );
    118     select_node * node = &try_pop_front( blocked_threads );
    119     if ( node ) {
    120         wait_count--;
    121         owner = node->blocked_thread;
    122         recursion_count = 1;
    123         // if ( !node->clause_status || __make_select_node_available( *node ) ) unpark( node->blocked_thread );
    124         wake_one( blocked_threads, *node );
    125     } else {
    126         owner = 0p;
    127         recursion_count = 0;
    128     }
     119static void pop_and_set_new_owner( blocking_lock & this ) with( this ) {
     120        thread$ * t = &try_pop_front( blocked_threads );
     121        owner = t;
     122        recursion_count = ( t ? 1 : 0 );
     123        if ( t ) wait_count--;
     124        unpark( t );
    129125}
    130126
     
    138134        recursion_count--;
    139135        if ( recursion_count == 0 ) {
    140                 pop_node( this );
     136                pop_and_set_new_owner( this );
    141137        }
    142138        unlock( lock );
     
    151147        // lock held
    152148        if ( owner != 0p ) {
    153                 insert_last( blocked_threads, *(select_node *)t->link_node );
     149                insert_last( blocked_threads, *t );
    154150                wait_count++;
     151                unlock( lock );
    155152        }
    156153        // lock not held
     
    159156                recursion_count = 1;
    160157                unpark( t );
    161         }
    162     unlock( lock );
    163 }
    164 
    165 size_t on_wait( blocking_lock & this, __cfa_pre_park pp_fn, void * pp_datum ) with( this ) {
     158                unlock( lock );
     159        }
     160}
     161
     162size_t on_wait( blocking_lock & this ) with( this ) {
    166163        lock( lock __cfaabi_dbg_ctx2 );
    167164        /* paranoid */ verifyf( owner != 0p, "Attempt to release lock %p that isn't held", &this );
     
    170167        size_t ret = recursion_count;
    171168
    172         pop_node( this );
    173 
    174     select_node node;
    175     active_thread()->link_node = (void *)&node;
     169        pop_and_set_new_owner( this );
    176170        unlock( lock );
    177 
    178     pre_park_then_park( pp_fn, pp_datum );
    179 
    180171        return ret;
    181172}
     
    184175        recursion_count = recursion;
    185176}
    186 
    187 // waituntil() support
    188 bool register_select( blocking_lock & this, select_node & node ) with(this) {
    189     lock( lock __cfaabi_dbg_ctx2 );
    190         thread$ * thrd = active_thread();
    191 
    192         // single acquisition lock is held by current thread
    193         /* paranoid */ verifyf( owner != thrd || multi_acquisition, "Single acquisition lock holder (%p) attempted to reacquire the lock %p resulting in a deadlock.", owner, &this );
    194 
    195     if ( !node.park_counter && ( (owner == thrd && multi_acquisition) || owner == 0p ) ) { // OR special case
    196         if ( !__make_select_node_available( node ) ) { // we didn't win the race so give up on registering
    197            unlock( lock );
    198            return false;
    199         }
    200     }
    201 
    202         // lock is held by some other thread
    203         if ( owner != 0p && owner != thrd ) {
    204                 insert_last( blocked_threads, node );
    205                 wait_count++;
    206                 unlock( lock );
    207         return false;
    208         } else if ( owner == thrd && multi_acquisition ) { // multi acquisition lock is held by current thread
    209                 recursion_count++;
    210         } else {  // lock isn't held
    211                 owner = thrd;
    212                 recursion_count = 1;
    213         }
    214 
    215     if ( node.park_counter ) __make_select_node_available( node );
    216     unlock( lock );
    217     return true;
    218 }
    219 
    220 bool unregister_select( blocking_lock & this, select_node & node ) with(this) {
    221     lock( lock __cfaabi_dbg_ctx2 );
    222     if ( node`isListed ) {
    223         remove( node );
    224         wait_count--;
    225         unlock( lock );
    226         return false;
    227     }
    228    
    229     if ( owner == active_thread() ) {
    230         /* paranoid */ verifyf( recursion_count == 1 || multi_acquisition, "Thread %p attempted to unlock owner lock %p in waituntil unregister, which is not recursive but has a recursive count of %zu", active_thread(), &this, recursion_count );
    231         // if recursion count is zero release lock and set new owner if one is waiting
    232         recursion_count--;
    233         if ( recursion_count == 0 ) {
    234             pop_node( this );
    235         }
    236     }
    237         unlock( lock );
    238     return false;
    239 }
    240 
    241 bool on_selected( blocking_lock & this, select_node & node ) { return true; }
    242177
    243178//-----------------------------------------------------------------------------
     
    376311        int counter( condition_variable(L) & this ) with(this) { return count; }
    377312
    378         static void enqueue_thread( condition_variable(L) & this, info_thread(L) * i ) with(this) {
     313        static size_t queue_and_get_recursion( condition_variable(L) & this, info_thread(L) * i ) with(this) {
    379314                // add info_thread to waiting queue
    380315                insert_last( blocked_threads, *i );
    381316                count++;
    382         }
    383 
    384     static size_t block_and_get_recursion( info_thread(L) & i, __cfa_pre_park pp_fn, void * pp_datum ) {
    385         size_t recursion_count = 0;
    386                 if ( i.lock ) // if lock was passed get recursion count to reset to after waking thread
    387                         recursion_count = on_wait( *i.lock, pp_fn, pp_datum ); // this call blocks
    388                 else
    389             pre_park_then_park( pp_fn, pp_datum );
    390         return recursion_count;
    391     }
    392     static size_t block_and_get_recursion( info_thread(L) & i ) { return block_and_get_recursion( i, pre_park_noop, 0p ); }
     317                size_t recursion_count = 0;
     318                if (i->lock) {
     319                        // if lock was passed get recursion count to reset to after waking thread
     320                        recursion_count = on_wait( *i->lock );
     321                }
     322                return recursion_count;
     323        }
    393324
    394325        // helper for wait()'s' with no timeout
    395326        static void queue_info_thread( condition_variable(L) & this, info_thread(L) & i ) with(this) {
    396327                lock( lock __cfaabi_dbg_ctx2 );
    397         enqueue_thread( this, &i );
     328                size_t recursion_count = queue_and_get_recursion(this, &i);
    398329                unlock( lock );
    399330
    400331                // blocks here
    401         size_t recursion_count = block_and_get_recursion( i );
     332                park( );
    402333
    403334                // resets recursion count here after waking
    404                 if ( i.lock ) on_wakeup( *i.lock, recursion_count );
     335                if (i.lock) on_wakeup(*i.lock, recursion_count);
    405336        }
    406337
     
    409340                queue_info_thread( this, i );
    410341
    411     static void cond_alarm_register( void * node_ptr ) { register_self( (alarm_node_t *)node_ptr ); }
    412 
    413342        // helper for wait()'s' with a timeout
    414343        static void queue_info_thread_timeout( condition_variable(L) & this, info_thread(L) & info, Duration t, Alarm_Callback callback ) with(this) {
    415344                lock( lock __cfaabi_dbg_ctx2 );
    416         enqueue_thread( this, &info );
     345                size_t recursion_count = queue_and_get_recursion(this, &info);
    417346                alarm_node_wrap(L) node_wrap = { t, 0`s, callback, &this, &info };
    418347                unlock( lock );
    419348
    420                 // blocks here and registers alarm node before blocking after releasing locks to avoid deadlock
    421         size_t recursion_count = block_and_get_recursion( info, cond_alarm_register, (void *)(&node_wrap.alarm_node) );
    422                 // park();
     349                // registers alarm outside cond lock to avoid deadlock
     350                register_self( &node_wrap.alarm_node );
     351
     352                // blocks here
     353                park();
    423354
    424355                // unregisters alarm so it doesn't go off if this happens first
     
    426357
    427358                // resets recursion count here after waking
    428                 if ( info.lock ) on_wakeup( *info.lock, recursion_count );
     359                if (info.lock) on_wakeup(*info.lock, recursion_count);
    429360        }
    430361
     
    486417                info_thread( L ) i = { active_thread(), info, &l };
    487418                insert_last( blocked_threads, i );
    488                 size_t recursion_count = on_wait( *i.lock, pre_park_noop, 0p ); // blocks here
    489                 // park( );
     419                size_t recursion_count = on_wait( *i.lock );
     420                park( );
    490421                on_wakeup(*i.lock, recursion_count);
    491422        }
     
    528459        bool empty ( pthread_cond_var(L) & this ) with(this) { return blocked_threads`isEmpty; }
    529460
     461        static size_t queue_and_get_recursion( pthread_cond_var(L) & this, info_thread(L) * i ) with(this) {
     462                // add info_thread to waiting queue
     463                insert_last( blocked_threads, *i );
     464                size_t recursion_count = 0;
     465                recursion_count = on_wait( *i->lock );
     466                return recursion_count;
     467        }
     468       
    530469        static void queue_info_thread_timeout( pthread_cond_var(L) & this, info_thread(L) & info, Duration t, Alarm_Callback callback ) with(this) {
    531470                lock( lock __cfaabi_dbg_ctx2 );
    532         insert_last( blocked_threads, info );
     471                size_t recursion_count = queue_and_get_recursion(this, &info);
    533472                pthread_alarm_node_wrap(L) node_wrap = { t, 0`s, callback, &this, &info };
    534473                unlock( lock );
    535474
    536                 // blocks here and registers alarm node before blocking after releasing locks to avoid deadlock
    537         size_t recursion_count = block_and_get_recursion( info, cond_alarm_register, (void *)(&node_wrap.alarm_node) );
    538 
    539                 // unregisters alarm so it doesn't go off if signal happens first
     475                // registers alarm outside cond lock to avoid deadlock
     476                register_self( &node_wrap.alarm_node );
     477
     478                // blocks here
     479                park();
     480
     481                // unregisters alarm so it doesn't go off if this happens first
    540482                unregister_self( &node_wrap.alarm_node );
    541483
    542484                // resets recursion count here after waking
    543                 if ( info.lock ) on_wakeup( *info.lock, recursion_count );
     485                if (info.lock) on_wakeup(*info.lock, recursion_count);
    544486        }
    545487
     
    551493                lock( lock __cfaabi_dbg_ctx2 );
    552494                info_thread( L ) i = { active_thread(), info, &l };
    553         insert_last( blocked_threads, i );
    554                 unlock( lock );
    555 
    556         // blocks here
    557                 size_t recursion_count = block_and_get_recursion( i );
    558 
    559                 on_wakeup( *i.lock, recursion_count );
     495                size_t recursion_count = queue_and_get_recursion(this, &i);
     496                unlock( lock );
     497                park( );
     498                on_wakeup(*i.lock, recursion_count);
    560499        }
    561500
     
    645584        return thrd != 0p;
    646585}
    647 
  • libcfa/src/concurrency/locks.hfa

    r044ae62 r3a513d89  
    3030#include "time.hfa"
    3131
    32 #include "select.hfa"
    33 
    3432#include <fstream.hfa>
    3533
     
    3937#include <unistd.h>
    4038
    41 typedef void (*__cfa_pre_park)( void * );
    42 
    43 static inline void pre_park_noop( void * ) {}
    44 
    45 //-----------------------------------------------------------------------------
    46 // is_blocking_lock
    47 forall( L & | sized(L) )
    48 trait is_blocking_lock {
    49         // For synchronization locks to use when acquiring
    50         void on_notify( L &, struct thread$ * );
    51 
    52         // For synchronization locks to use when releasing
    53         size_t on_wait( L &, __cfa_pre_park pp_fn, void * pp_datum );
    54 
    55         // to set recursion count after getting signalled;
    56         void on_wakeup( L &, size_t recursion );
    57 };
    58 
    59 static inline void pre_park_then_park( __cfa_pre_park pp_fn, void * pp_datum ) {
    60     pp_fn( pp_datum );
    61     park();
    62 }
    63 
    64 // macros for default routine impls for is_blocking_lock trait that do not wait-morph
    65 
    66 #define DEFAULT_ON_NOTIFY( lock_type ) \
    67     static inline void on_notify( lock_type & this, thread$ * t ){ unpark(t); }
    68 
    69 #define DEFAULT_ON_WAIT( lock_type ) \
    70     static inline size_t on_wait( lock_type & this, __cfa_pre_park pp_fn, void * pp_datum ) { \
    71         unlock( this ); \
    72         pre_park_then_park( pp_fn, pp_datum ); \
    73         return 0; \
    74     }
    75 
    76 // on_wakeup impl if lock should be reacquired after waking up
    77 #define DEFAULT_ON_WAKEUP_REACQ( lock_type ) \
    78     static inline void on_wakeup( lock_type & this, size_t recursion ) { lock( this ); }
    79 
    80 // on_wakeup impl if lock will not be reacquired after waking up
    81 #define DEFAULT_ON_WAKEUP_NO_REACQ( lock_type ) \
    82     static inline void on_wakeup( lock_type & this, size_t recursion ) {}
    83 
    84 
     39// C_TODO: cleanup this and locks.cfa
     40// - appropriate separation of interface and impl
     41// - clean up unused/unneeded locks
     42// - change messy big blocking lock from inheritance to composition to remove need for flags
    8543
    8644//-----------------------------------------------------------------------------
     
    10967static inline bool   try_lock ( single_acquisition_lock & this ) { return try_lock( (blocking_lock &)this ); }
    11068static inline void   unlock   ( single_acquisition_lock & this ) { unlock  ( (blocking_lock &)this ); }
    111 static inline size_t on_wait  ( single_acquisition_lock & this, __cfa_pre_park pp_fn, void * pp_datum ) { return on_wait ( (blocking_lock &)this, pp_fn, pp_datum ); }
     69static inline size_t on_wait  ( single_acquisition_lock & this ) { return on_wait ( (blocking_lock &)this ); }
    11270static inline void   on_wakeup( single_acquisition_lock & this, size_t v ) { on_wakeup ( (blocking_lock &)this, v ); }
    11371static inline void   on_notify( single_acquisition_lock & this, struct thread$ * t ) { on_notify( (blocking_lock &)this, t ); }
    114 static inline bool   register_select( single_acquisition_lock & this, select_node & node ) { return register_select( (blocking_lock &)this, node ); }
    115 static inline bool   unregister_select( single_acquisition_lock & this, select_node & node ) { return unregister_select( (blocking_lock &)this, node ); }
    116 static inline bool   on_selected( single_acquisition_lock & this, select_node & node ) { return on_selected( (blocking_lock &)this, node ); }
    11772
    11873//----------
     
    12681static inline bool   try_lock ( owner_lock & this ) { return try_lock( (blocking_lock &)this ); }
    12782static inline void   unlock   ( owner_lock & this ) { unlock  ( (blocking_lock &)this ); }
    128 static inline size_t on_wait  ( owner_lock & this, __cfa_pre_park pp_fn, void * pp_datum ) { return on_wait ( (blocking_lock &)this, pp_fn, pp_datum ); }
     83static inline size_t on_wait  ( owner_lock & this ) { return on_wait ( (blocking_lock &)this ); }
    12984static inline void   on_wakeup( owner_lock & this, size_t v ) { on_wakeup ( (blocking_lock &)this, v ); }
    13085static inline void   on_notify( owner_lock & this, struct thread$ * t ) { on_notify( (blocking_lock &)this, t ); }
    131 static inline bool   register_select( owner_lock & this, select_node & node ) { return register_select( (blocking_lock &)this, node ); }
    132 static inline bool   unregister_select( owner_lock & this, select_node & node ) { return unregister_select( (blocking_lock &)this, node ); }
    133 static inline bool   on_selected( owner_lock & this, select_node & node ) { return on_selected( (blocking_lock &)this, node ); }
    13486
    13587//-----------------------------------------------------------------------------
     
    176128static inline void ?{}(mcs_spin_node & this) { this.next = 0p; this.locked = true; }
    177129
     130static inline mcs_spin_node * volatile & ?`next ( mcs_spin_node * node ) {
     131        return node->next;
     132}
     133
    178134struct mcs_spin_lock {
    179135        mcs_spin_queue queue;
     
    181137
    182138static inline void lock(mcs_spin_lock & l, mcs_spin_node & n) {
    183     n.locked = true;
    184139        mcs_spin_node * prev = __atomic_exchange_n(&l.queue.tail, &n, __ATOMIC_SEQ_CST);
    185         if( prev == 0p ) return;
     140        n.locked = true;
     141        if(prev == 0p) return;
    186142        prev->next = &n;
    187         while( __atomic_load_n(&n.locked, __ATOMIC_RELAXED) ) Pause();
     143        while(__atomic_load_n(&n.locked, __ATOMIC_RELAXED)) Pause();
    188144}
    189145
     
    191147        mcs_spin_node * n_ptr = &n;
    192148        if (__atomic_compare_exchange_n(&l.queue.tail, &n_ptr, 0p, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)) return;
    193         while (__atomic_load_n(&n.next, __ATOMIC_RELAXED) == 0p) Pause();
     149        while (__atomic_load_n(&n.next, __ATOMIC_RELAXED) == 0p) {}
    194150        n.next->locked = false;
    195151}
     
    200156// - Kernel thd blocking alternative to the spinlock
    201157// - No ownership (will deadlock on reacq)
    202 // - no reacq on wakeup
    203158struct futex_mutex {
    204159        // lock state any state other than UNLOCKED is locked
     
    214169}
    215170
    216 static inline void ?{}( futex_mutex & this ) with(this) { val = 0; }
    217 
    218 static inline bool internal_try_lock( futex_mutex & this, int & compare_val) with(this) {
     171static inline void  ?{}( futex_mutex & this ) with(this) { val = 0; }
     172
     173static inline bool internal_try_lock(futex_mutex & this, int & compare_val) with(this) {
    219174        return __atomic_compare_exchange_n((int*)&val, (int*)&compare_val, 1, false, __ATOMIC_ACQUIRE, __ATOMIC_ACQUIRE);
    220175}
    221176
    222 static inline int internal_exchange( futex_mutex & this ) with(this) {
     177static inline int internal_exchange(futex_mutex & this) with(this) {
    223178        return __atomic_exchange_n((int*)&val, 2, __ATOMIC_ACQUIRE);
    224179}
    225180
    226181// if this is called recursively IT WILL DEADLOCK!!!!!
    227 static inline void lock( futex_mutex & this ) with(this) {
     182static inline void lock(futex_mutex & this) with(this) {
    228183        int state;
    229184
     
    235190                for (int i = 0; i < spin; i++) Pause();
    236191        }
     192
     193        // // no contention try to acquire
     194        // if (internal_try_lock(this, state)) return;
    237195       
    238196        // if not in contended state, set to be in contended state
     
    254212}
    255213
    256 DEFAULT_ON_NOTIFY( futex_mutex )
    257 DEFAULT_ON_WAIT( futex_mutex )
    258 DEFAULT_ON_WAKEUP_NO_REACQ( futex_mutex )
     214static inline void on_notify( futex_mutex & f, thread$ * t){ unpark(t); }
     215static inline size_t on_wait( futex_mutex & f ) {unlock(f); return 0;}
     216
     217// to set recursion count after getting signalled;
     218static inline void on_wakeup( futex_mutex & f, size_t recursion ) {}
    259219
    260220//-----------------------------------------------------------------------------
     
    272232        int val;
    273233};
     234
    274235static inline void  ?{}( go_mutex & this ) with(this) { val = 0; }
    275 // static inline void ?{}( go_mutex & this, go_mutex this2 ) = void; // these don't compile correctly at the moment so they should be omitted
    276 // static inline void ?=?( go_mutex & this, go_mutex this2 ) = void;
    277236
    278237static inline bool internal_try_lock(go_mutex & this, int & compare_val, int new_val ) with(this) {
     
    285244
    286245// if this is called recursively IT WILL DEADLOCK!!!!!
    287 static inline void lock( go_mutex & this ) with( this ) {
     246static inline void lock(go_mutex & this) with(this) {
    288247        int state, init_state;
    289248
     
    296255            while( !val ) { // lock unlocked
    297256                state = 0;
    298                 if ( internal_try_lock( this, state, init_state ) ) return;
     257                if (internal_try_lock(this, state, init_state)) return;
    299258            }
    300259            for (int i = 0; i < 30; i++) Pause();
     
    303262        while( !val ) { // lock unlocked
    304263            state = 0;
    305             if ( internal_try_lock( this, state, init_state ) ) return;
     264            if (internal_try_lock(this, state, init_state)) return;
    306265        }
    307266        sched_yield();
    308267       
    309268        // if not in contended state, set to be in contended state
    310         state = internal_exchange( this, 2 );
     269        state = internal_exchange(this, 2);
    311270        if ( !state ) return; // state == 0
    312271        init_state = 2;
    313         futex( (int*)&val, FUTEX_WAIT, 2 ); // if val is not 2 this returns with EWOULDBLOCK
     272        futex((int*)&val, FUTEX_WAIT, 2); // if val is not 2 this returns with EWOULDBLOCK
    314273    }
    315274}
     
    317276static inline void unlock( go_mutex & this ) with(this) {
    318277        // if uncontended do atomic unlock and then return
    319     if ( __atomic_exchange_n(&val, 0, __ATOMIC_RELEASE) == 1 ) return;
     278    if (__atomic_exchange_n(&val, 0, __ATOMIC_RELEASE) == 1) return;
    320279       
    321280        // otherwise threads are blocked so we must wake one
    322         futex( (int *)&val, FUTEX_WAKE, 1 );
    323 }
    324 
    325 DEFAULT_ON_NOTIFY( go_mutex )
    326 DEFAULT_ON_WAIT( go_mutex )
    327 DEFAULT_ON_WAKEUP_NO_REACQ( go_mutex )
     281        futex((int *)&val, FUTEX_WAKE, 1);
     282}
     283
     284static inline void on_notify( go_mutex & f, thread$ * t){ unpark(t); }
     285static inline size_t on_wait( go_mutex & f ) {unlock(f); return 0;}
     286static inline void on_wakeup( go_mutex & f, size_t recursion ) {}
     287
     288//-----------------------------------------------------------------------------
     289// CLH Spinlock
     290// - No recursive acquisition
     291// - Needs to be released by owner
     292
     293struct clh_lock {
     294        volatile bool * volatile tail;
     295    volatile bool * volatile head;
     296};
     297
     298static inline void  ?{}( clh_lock & this ) { this.tail = malloc(); *this.tail = true; }
     299static inline void ^?{}( clh_lock & this ) { free(this.tail); }
     300
     301static inline void lock(clh_lock & l) {
     302        thread$ * curr_thd = active_thread();
     303        *(curr_thd->clh_node) = false;
     304        volatile bool * prev = __atomic_exchange_n((bool **)(&l.tail), (bool *)(curr_thd->clh_node), __ATOMIC_SEQ_CST);
     305        while(!__atomic_load_n(prev, __ATOMIC_SEQ_CST)) Pause();
     306    __atomic_store_n((bool **)(&l.head), (bool *)curr_thd->clh_node, __ATOMIC_SEQ_CST);
     307    curr_thd->clh_node = prev;
     308}
     309
     310static inline void unlock(clh_lock & l) {
     311        __atomic_store_n((bool *)(l.head), true, __ATOMIC_SEQ_CST);
     312}
     313
     314static inline void on_notify(clh_lock & this, struct thread$ * t ) { unpark(t); }
     315static inline size_t on_wait(clh_lock & this) { unlock(this); return 0; }
     316static inline void on_wakeup(clh_lock & this, size_t recursion ) { lock(this); }
    328317
    329318//-----------------------------------------------------------------------------
     
    345334        this.lock_value = 0;
    346335}
    347 static inline void ?{}( exp_backoff_then_block_lock & this, exp_backoff_then_block_lock this2 ) = void;
    348 static inline void ?=?( exp_backoff_then_block_lock & this, exp_backoff_then_block_lock this2 ) = void;
    349336
    350337static inline void  ^?{}( exp_backoff_then_block_lock & this ){}
    351338
    352 static inline bool internal_try_lock( exp_backoff_then_block_lock & this, size_t & compare_val ) with(this) {
     339static inline bool internal_try_lock(exp_backoff_then_block_lock & this, size_t & compare_val) with(this) {
    353340        return __atomic_compare_exchange_n(&lock_value, &compare_val, 1, false, __ATOMIC_ACQUIRE, __ATOMIC_RELAXED);
    354341}
    355342
    356 static inline bool try_lock( exp_backoff_then_block_lock & this ) { size_t compare_val = 0; return internal_try_lock( this, compare_val ); }
    357 
    358 static inline bool try_lock_contention( exp_backoff_then_block_lock & this ) with(this) {
    359         return !__atomic_exchange_n( &lock_value, 2, __ATOMIC_ACQUIRE );
    360 }
    361 
    362 static inline bool block( exp_backoff_then_block_lock & this ) with(this) {
     343static inline bool try_lock(exp_backoff_then_block_lock & this) { size_t compare_val = 0; return internal_try_lock(this, compare_val); }
     344
     345static inline bool try_lock_contention(exp_backoff_then_block_lock & this) with(this) {
     346        return !__atomic_exchange_n(&lock_value, 2, __ATOMIC_ACQUIRE);
     347}
     348
     349static inline bool block(exp_backoff_then_block_lock & this) with(this) {
    363350    lock( spinlock __cfaabi_dbg_ctx2 );
    364351    if (__atomic_load_n( &lock_value, __ATOMIC_SEQ_CST) != 2) {
     
    372359}
    373360
    374 static inline void lock( exp_backoff_then_block_lock & this ) with(this) {
     361static inline void lock(exp_backoff_then_block_lock & this) with(this) {
    375362        size_t compare_val = 0;
    376363        int spin = 4;
     
    391378}
    392379
    393 static inline void unlock( exp_backoff_then_block_lock & this ) with(this) {
     380static inline void unlock(exp_backoff_then_block_lock & this) with(this) {
    394381    if (__atomic_exchange_n(&lock_value, 0, __ATOMIC_RELEASE) == 1) return;
    395382    lock( spinlock __cfaabi_dbg_ctx2 );
     
    399386}
    400387
    401 DEFAULT_ON_NOTIFY( exp_backoff_then_block_lock )
    402 DEFAULT_ON_WAIT( exp_backoff_then_block_lock )
    403 DEFAULT_ON_WAKEUP_REACQ( exp_backoff_then_block_lock )
     388static inline void on_notify(exp_backoff_then_block_lock & this, struct thread$ * t ) { unpark(t); }
     389static inline size_t on_wait(exp_backoff_then_block_lock & this) { unlock(this); return 0; }
     390static inline void on_wakeup(exp_backoff_then_block_lock & this, size_t recursion ) { lock(this); }
    404391
    405392//-----------------------------------------------------------------------------
     
    431418
    432419// if this is called recursively IT WILL DEADLOCK!!!!!
    433 static inline void lock( fast_block_lock & this ) with(this) {
     420static inline void lock(fast_block_lock & this) with(this) {
    434421        lock( lock __cfaabi_dbg_ctx2 );
    435422        if ( held ) {
     
    443430}
    444431
    445 static inline void unlock( fast_block_lock & this ) with(this) {
     432static inline void unlock(fast_block_lock & this) with(this) {
    446433        lock( lock __cfaabi_dbg_ctx2 );
    447434        /* paranoid */ verifyf( held != false, "Attempt to release lock %p that isn't held", &this );
     
    452439}
    453440
    454 static inline void on_notify( fast_block_lock & this, struct thread$ * t ) with(this) {
     441static inline void on_notify(fast_block_lock & this, struct thread$ * t ) with(this) {
    455442    lock( lock __cfaabi_dbg_ctx2 );
    456443    insert_last( blocked_threads, *t );
    457444    unlock( lock );
    458445}
    459 DEFAULT_ON_WAIT( fast_block_lock )
    460 DEFAULT_ON_WAKEUP_NO_REACQ( fast_block_lock )
     446static inline size_t on_wait(fast_block_lock & this) { unlock(this); return 0; }
     447static inline void on_wakeup(fast_block_lock & this, size_t recursion ) { }
    461448
    462449//-----------------------------------------------------------------------------
     
    469456struct simple_owner_lock {
    470457        // List of blocked threads
    471         dlist( select_node ) blocked_threads;
     458        dlist( thread$ ) blocked_threads;
    472459
    473460        // Spin lock used for mutual exclusion
     
    490477static inline void ?=?( simple_owner_lock & this, simple_owner_lock this2 ) = void;
    491478
    492 static inline void lock( simple_owner_lock & this ) with(this) {
    493         if ( owner == active_thread() ) {
     479static inline void lock(simple_owner_lock & this) with(this) {
     480        if (owner == active_thread()) {
    494481                recursion_count++;
    495482                return;
     
    497484        lock( lock __cfaabi_dbg_ctx2 );
    498485
    499         if ( owner != 0p ) {
    500         select_node node;
    501                 insert_last( blocked_threads, node );
     486        if (owner != 0p) {
     487                insert_last( blocked_threads, *active_thread() );
    502488                unlock( lock );
    503489                park( );
     
    509495}
    510496
    511 static inline void pop_node( simple_owner_lock & this ) with(this) {
    512     __handle_waituntil_OR( blocked_threads );
    513     select_node * node = &try_pop_front( blocked_threads );
    514     if ( node ) {
    515         owner = node->blocked_thread;
    516         recursion_count = 1;
    517         // if ( !node->clause_status || __make_select_node_available( *node ) ) unpark( node->blocked_thread );
    518         wake_one( blocked_threads, *node );
    519     } else {
    520         owner = 0p;
    521         recursion_count = 0;
    522     }
    523 }
    524 
    525 static inline void unlock( simple_owner_lock & this ) with(this) {
     497// TODO: fix duplicate def issue and bring this back
     498// void pop_and_set_new_owner( simple_owner_lock & this ) with( this ) {
     499        // thread$ * t = &try_pop_front( blocked_threads );
     500        // owner = t;
     501        // recursion_count = ( t ? 1 : 0 );
     502        // unpark( t );
     503// }
     504
     505static inline void unlock(simple_owner_lock & this) with(this) {
    526506        lock( lock __cfaabi_dbg_ctx2 );
    527507        /* paranoid */ verifyf( owner != 0p, "Attempt to release lock %p that isn't held", &this );
     
    530510        recursion_count--;
    531511        if ( recursion_count == 0 ) {
    532                 pop_node( this );
     512                // pop_and_set_new_owner( this );
     513                thread$ * t = &try_pop_front( blocked_threads );
     514                owner = t;
     515                recursion_count = ( t ? 1 : 0 );
     516                unpark( t );
    533517        }
    534518        unlock( lock );
    535519}
    536520
    537 static inline void on_notify( simple_owner_lock & this, thread$ * t ) with(this) {
     521static inline void on_notify(simple_owner_lock & this, struct thread$ * t ) with(this) {
    538522        lock( lock __cfaabi_dbg_ctx2 );
    539523        // lock held
    540524        if ( owner != 0p ) {
    541                 insert_last( blocked_threads, *(select_node *)t->link_node );
     525                insert_last( blocked_threads, *t );
    542526        }
    543527        // lock not held
     
    550534}
    551535
    552 static inline size_t on_wait( simple_owner_lock & this, __cfa_pre_park pp_fn, void * pp_datum ) with(this) {
     536static inline size_t on_wait(simple_owner_lock & this) with(this) {
    553537        lock( lock __cfaabi_dbg_ctx2 );
    554538        /* paranoid */ verifyf( owner != 0p, "Attempt to release lock %p that isn't held", &this );
     
    557541        size_t ret = recursion_count;
    558542
    559         pop_node( this );
    560 
    561     select_node node;
    562     active_thread()->link_node = (void *)&node;
     543        // pop_and_set_new_owner( this );
     544
     545        thread$ * t = &try_pop_front( blocked_threads );
     546        owner = t;
     547        recursion_count = ( t ? 1 : 0 );
     548        unpark( t );
     549
    563550        unlock( lock );
    564 
    565     pre_park_then_park( pp_fn, pp_datum );
    566 
    567551        return ret;
    568552}
    569553
    570 static inline void on_wakeup( simple_owner_lock & this, size_t recursion ) with(this) { recursion_count = recursion; }
    571 
    572 // waituntil() support
    573 static inline bool register_select( simple_owner_lock & this, select_node & node ) with(this) {
    574     lock( lock __cfaabi_dbg_ctx2 );
    575 
    576     // check if we can complete operation. If so race to establish winner in special OR case
    577     if ( !node.park_counter && ( owner == active_thread() || owner == 0p ) ) {
    578         if ( !__make_select_node_available( node ) ) { // we didn't win the race so give up on registering
    579            unlock( lock );
    580            return false;
    581         }
    582     }
    583 
    584     if ( owner == active_thread() ) {
    585                 recursion_count++;
    586         if ( node.park_counter ) __make_select_node_available( node );
    587         unlock( lock );
    588                 return true;
    589         }
    590 
    591     if ( owner != 0p ) {
    592                 insert_last( blocked_threads, node );
    593                 unlock( lock );
    594                 return false;
    595         }
    596    
    597         owner = active_thread();
    598         recursion_count = 1;
    599 
    600     if ( node.park_counter ) __make_select_node_available( node );
    601     unlock( lock );
    602     return true;
    603 }
    604 
    605 static inline bool unregister_select( simple_owner_lock & this, select_node & node ) with(this) {
    606     lock( lock __cfaabi_dbg_ctx2 );
    607     if ( node`isListed ) {
    608         remove( node );
    609         unlock( lock );
    610         return false;
    611     }
    612 
    613     if ( owner == active_thread() ) {
    614         recursion_count--;
    615         if ( recursion_count == 0 ) {
    616             pop_node( this );
    617         }
    618     }
    619     unlock( lock );
    620     return false;
    621 }
    622 
    623 static inline bool on_selected( simple_owner_lock & this, select_node & node ) { return true; }
    624 
     554static inline void on_wakeup(simple_owner_lock & this, size_t recursion ) with(this) { recursion_count = recursion; }
    625555
    626556//-----------------------------------------------------------------------------
     
    648578
    649579// if this is called recursively IT WILL DEADLOCK!
    650 static inline void lock( spin_queue_lock & this ) with(this) {
     580static inline void lock(spin_queue_lock & this) with(this) {
    651581        mcs_spin_node node;
    652582        lock( lock, node );
     
    656586}
    657587
    658 static inline void unlock( spin_queue_lock & this ) with(this) {
     588static inline void unlock(spin_queue_lock & this) with(this) {
    659589        __atomic_store_n(&held, false, __ATOMIC_RELEASE);
    660590}
    661591
    662 DEFAULT_ON_NOTIFY( spin_queue_lock )
    663 DEFAULT_ON_WAIT( spin_queue_lock )
    664 DEFAULT_ON_WAKEUP_REACQ( spin_queue_lock )
     592static inline void on_notify(spin_queue_lock & this, struct thread$ * t ) {
     593        unpark(t);
     594}
     595static inline size_t on_wait(spin_queue_lock & this) { unlock(this); return 0; }
     596static inline void on_wakeup(spin_queue_lock & this, size_t recursion ) { lock(this); }
     597
    665598
    666599//-----------------------------------------------------------------------------
     
    688621
    689622// if this is called recursively IT WILL DEADLOCK!!!!!
    690 static inline void lock( mcs_block_spin_lock & this ) with(this) {
     623static inline void lock(mcs_block_spin_lock & this) with(this) {
    691624        mcs_node node;
    692625        lock( lock, node );
     
    700633}
    701634
    702 DEFAULT_ON_NOTIFY( mcs_block_spin_lock )
    703 DEFAULT_ON_WAIT( mcs_block_spin_lock )
    704 DEFAULT_ON_WAKEUP_REACQ( mcs_block_spin_lock )
     635static inline void on_notify(mcs_block_spin_lock & this, struct thread$ * t ) { unpark(t); }
     636static inline size_t on_wait(mcs_block_spin_lock & this) { unlock(this); return 0; }
     637static inline void on_wakeup(mcs_block_spin_lock & this, size_t recursion ) {lock(this); }
    705638
    706639//-----------------------------------------------------------------------------
     
    728661
    729662// if this is called recursively IT WILL DEADLOCK!!!!!
    730 static inline void lock( block_spin_lock & this ) with(this) {
     663static inline void lock(block_spin_lock & this) with(this) {
    731664        lock( lock );
    732665        while(__atomic_load_n(&held, __ATOMIC_SEQ_CST)) Pause();
     
    735668}
    736669
    737 static inline void unlock( block_spin_lock & this ) with(this) {
     670static inline void unlock(block_spin_lock & this) with(this) {
    738671        __atomic_store_n(&held, false, __ATOMIC_RELEASE);
    739672}
    740673
    741 static inline void on_notify( block_spin_lock & this, struct thread$ * t ) with(this.lock) {
     674static inline void on_notify(block_spin_lock & this, struct thread$ * t ) with(this.lock) {
    742675        // first we acquire internal fast_block_lock
    743676        lock( lock __cfaabi_dbg_ctx2 );
     
    753686        unpark(t);
    754687}
    755 DEFAULT_ON_WAIT( block_spin_lock )
    756 static inline void on_wakeup( block_spin_lock & this, size_t recursion ) with(this) {
     688static inline size_t on_wait(block_spin_lock & this) { unlock(this); return 0; }
     689static inline void on_wakeup(block_spin_lock & this, size_t recursion ) with(this) {
    757690        // now we acquire the entire block_spin_lock upon waking up
    758691        while(__atomic_load_n(&held, __ATOMIC_SEQ_CST)) Pause();
     
    760693        unlock( lock ); // Now we release the internal fast_spin_lock
    761694}
     695
     696//-----------------------------------------------------------------------------
     697// is_blocking_lock
     698forall( L & | sized(L) )
     699trait is_blocking_lock {
     700        // For synchronization locks to use when acquiring
     701        void on_notify( L &, struct thread$ * );
     702
     703        // For synchronization locks to use when releasing
     704        size_t on_wait( L & );
     705
     706        // to set recursion count after getting signalled;
     707        void on_wakeup( L &, size_t recursion );
     708};
    762709
    763710//-----------------------------------------------------------------------------
     
    767714forall(L & | is_blocking_lock(L)) {
    768715        struct info_thread;
     716
     717        // // for use by sequence
     718        // info_thread(L) *& Back( info_thread(L) * this );
     719        // info_thread(L) *& Next( info_thread(L) * this );
    769720}
    770721
  • libcfa/src/concurrency/mutex_stmt.hfa

    r044ae62 r3a513d89  
    1515};
    1616
     17
    1718struct __mutex_stmt_lock_guard {
    1819    void ** lockarr;
     
    2930
    3031forall(L & | is_lock(L)) {
    31     static inline void * __get_mutexstmt_lock_ptr( L & this ) { return &this; }
    32     static inline L __get_mutexstmt_lock_type( L & this ) {}
    33     static inline L __get_mutexstmt_lock_type( L * this ) {}
     32
     33    struct scoped_lock {
     34        L * internal_lock;
     35    };
     36
     37    static inline void ?{}( scoped_lock(L) & this, L & internal_lock ) {
     38        this.internal_lock = &internal_lock;
     39        lock(internal_lock);
     40    }
     41   
     42    static inline void ^?{}( scoped_lock(L) & this ) with(this) {
     43        unlock(*internal_lock);
     44    }
     45
     46    static inline void * __get_mutexstmt_lock_ptr( L & this ) {
     47        return &this;
     48    }
     49
     50    static inline L __get_mutexstmt_lock_type( L & this );
     51
     52    static inline L __get_mutexstmt_lock_type( L * this );
    3453}
  • libcfa/src/concurrency/preemption.cfa

    r044ae62 r3a513d89  
    117117                __cfadbg_print_buffer_decl( preemption, " KERNEL: preemption tick %lu\n", currtime.tn);
    118118                Duration period = node->period;
    119                 if( period == 0 ) {
     119                if( period == 0) {
    120120                        node->set = false;                  // Node is one-shot, just mark it as not pending
    121121                }
  • libcfa/src/concurrency/select.hfa

    r044ae62 r3a513d89  
    1 //
    2 // Cforall Version 1.0.0 Copyright (C) 2021 University of Waterloo
    3 //
    4 // The contents of this file are covered under the licence agreement in the
    5 // file "LICENCE" distributed with Cforall.
    6 //
    7 // channel.hfa -- LIBCFATHREAD
    8 // Runtime locks that used with the runtime thread system.
    9 //
    10 // Author           : Colby Alexander Parsons
    11 // Created On       : Thu Jan 21 19:46:50 2023
    12 // Last Modified By :
    13 // Last Modified On :
    14 // Update Count     :
    15 //
    16 
    171#pragma once
    182
    193#include "containers/list.hfa"
    20 #include "alarm.hfa"
    21 #include "kernel.hfa"
    22 #include "time.hfa"
     4#include <stdint.h>
     5#include <kernel.hfa>
     6#include <locks.hfa>
    237
    24 struct select_node;
    25 
    26 // node status
    27 static const unsigned long int __SELECT_UNSAT = 0;
    28 static const unsigned long int __SELECT_PENDING = 1; // used only by special OR case
    29 static const unsigned long int __SELECT_SAT = 2;
    30 static const unsigned long int __SELECT_RUN = 3;
    31 
    32 // these are used inside the compiler to aid in code generation
    33 static inline bool __CFA_has_clause_run( unsigned long int status ) { return status == __SELECT_RUN; }
    34 static inline void __CFA_maybe_park( int * park_counter ) {
    35     if ( __atomic_sub_fetch( park_counter, 1, __ATOMIC_SEQ_CST) < 0 )
    36         park();
    37 }
    38 
    39 // node used for coordinating waituntil synchronization
    408struct select_node {
    41     int * park_counter;                 // If this is 0p then the node is in a special OR case waituntil
    42     unsigned long int * clause_status;  // needs to point at ptr sized location, if this is 0p then node is not part of a waituntil
    43 
    44     void * extra;                       // used to store arbitrary data needed by some primitives
    45 
    469    thread$ * blocked_thread;
     10    void ** race_flag;
    4711    inline dlink(select_node);
    4812};
    4913P9_EMBEDDED( select_node, dlink(select_node) )
    5014
    51 static inline void ?{}( select_node & this ) {
    52     this.blocked_thread = active_thread();
    53     this.clause_status = 0p;
    54     this.park_counter = 0p;
    55     this.extra = 0p;
     15void ?{}( select_node & this ) {
     16    this.blocked_thread = 0p;
     17    this.race_flag = 0p;
    5618}
    5719
    58 static inline void ?{}( select_node & this, thread$ * blocked_thread ) {
     20void ?{}( select_node & this, thread$ * blocked_thread ) {
    5921    this.blocked_thread = blocked_thread;
    60     this.clause_status = 0p;
    61     this.park_counter = 0p;
    62     this.extra = 0p;
     22    this.race_flag = 0p;
    6323}
    6424
    65 static inline void ?{}( select_node & this, thread$ * blocked_thread, void * extra ) {
     25void ?{}( select_node & this, thread$ * blocked_thread, void ** race_flag ) {
    6626    this.blocked_thread = blocked_thread;
    67     this.clause_status = 0p;
    68     this.park_counter = 0p;
    69     this.extra = extra;
     27    this.race_flag = race_flag;
    7028}
    71 static inline void ^?{}( select_node & this ) {}
    7229
    73 // this is used inside the compiler to aid in code generation
    74 static inline unsigned long int * __get_clause_status( select_node & s ) { return s.clause_status; }
     30void ^?{}( select_node & this ) {}
    7531
    76 // this is used inside the compiler to attempt to establish an else clause as a winner in the OR special case race
    77 static inline bool __select_node_else_race( select_node & this ) with( this ) {
    78     unsigned long int cmp_status = __SELECT_UNSAT;
    79     return *clause_status == 0
    80             && __atomic_compare_exchange_n( clause_status, &cmp_status, __SELECT_SAT, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST );
    81 }
    8232
    8333//-----------------------------------------------------------------------------
    8434// is_selectable
    85 forall(T & | sized(T))
    86 trait is_selectable {
    87     // For registering a select stmt on a selectable concurrency primitive
    88     // Returns bool that indicates if operation is already SAT
    89     bool register_select( T &, select_node & );
     35trait is_selectable(T & | sized(T)) {
     36    // For registering a select on a selectable concurrency primitive
     37    // return 0p if primitive not accessible yet
     38    // return 1p if primitive gets acquired
     39    // return 2p if primitive is accessible but some other primitive won the race
     40    // C_TODO: add enum for return values
     41    void * register_select( T &, select_node & );
    9042
    91     // For unregistering a select stmt on a selectable concurrency primitive
    92     // If true is returned then the corresponding code block is run (only in non-special OR case and only if node status is not RUN)
    93     bool unregister_select( T &, select_node &  );
    94 
    95     // This routine is run on the selecting thread prior to executing the statement corresponding to the select_node
    96     //    passed as an arg to this routine
    97     // If on_selected returns false, the statement is not run, if it returns true it is run.
    98     bool on_selected( T &, select_node & );
     43    void unregister_select( T &, select_node &  );
    9944};
    10045
    101 //=============================================================================================
    102 // Waituntil Helpers
    103 //=============================================================================================
    104 
    105 // used for the 2-stage avail needed by the special OR case
    106 static inline bool __mark_select_node( select_node & this, unsigned long int val ) with( this ) {
    107     /* paranoid */ verify( park_counter == 0p );
    108     /* paranoid */ verify( clause_status != 0p );
    109 
    110     unsigned long int cmp_status = __SELECT_UNSAT;
    111     while( !__atomic_compare_exchange_n( clause_status, &cmp_status, val, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST ) ) {
    112         if ( cmp_status != __SELECT_PENDING ) return false;
    113         cmp_status = __SELECT_UNSAT;
    114     }
    115     return true;
     46static inline bool install_select_winner( select_node & this, void * primitive_ptr ) with(this) {
     47    // temporary needed for atomic instruction
     48    void * cmp_flag = 0p;
     49   
     50    // if we dont win the selector race we need to potentially
     51    //   ignore this node and move to the next one so we return accordingly
     52    if ( *race_flag != 0p ||
     53        !__atomic_compare_exchange_n(
     54            race_flag,
     55            &cmp_flag,
     56            primitive_ptr,
     57            false,
     58            __ATOMIC_SEQ_CST,
     59            __ATOMIC_SEQ_CST
     60        )
     61    ) return false; // lost race and some other node triggered select
     62    return true; // won race so this node is what the select proceeds with
    11663}
    117 
    118 static inline void __make_select_node_unsat( select_node & this ) with( this ) {
    119     __atomic_store_n( clause_status, __SELECT_UNSAT, __ATOMIC_SEQ_CST );
    120 }
    121 static inline void __make_select_node_sat( select_node & this ) with( this ) {
    122     __atomic_store_n( clause_status, __SELECT_SAT, __ATOMIC_SEQ_CST );
    123 }
    124 
    125 static inline bool __make_select_node_pending( select_node & this ) with( this ) {
    126     return __mark_select_node( this, __SELECT_PENDING );
    127 }
    128 
    129 // when a primitive becomes available it calls the following routine on it's node to update the select state:
    130 // return true if we want to unpark the thd
    131 static inline bool __make_select_node_available( select_node & this ) with( this ) {
    132     /* paranoid */ verify( clause_status != 0p );
    133     if( !park_counter )
    134         return __mark_select_node( this, (unsigned long int)&this );
    135 
    136     unsigned long int cmp_status = __SELECT_UNSAT;
    137 
    138     return *clause_status == 0 // C_TODO might not need a cmp_xchg in non special OR case
    139         && __atomic_compare_exchange_n( clause_status, &cmp_status, __SELECT_SAT, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST ) // can maybe just use atomic write
    140         && !__atomic_add_fetch( park_counter, 1, __ATOMIC_SEQ_CST);
    141 }
    142 
    143 // Handles the special OR case of the waituntil statement
    144 // Since only one select node can win in the OR case, we need to race to set the node available BEFORE
    145 //    performing the operation since if we lose the race the operation should not be performed as it will be lost
    146 // Returns true if execution can continue normally and false if the queue has now been drained
    147 static inline bool __handle_waituntil_OR( dlist( select_node ) & queue ) {
    148     if ( queue`isEmpty ) return false;
    149     if ( queue`first.clause_status && !queue`first.park_counter ) {
    150         while ( !queue`isEmpty ) {
    151             // if node not a special OR case or if we win the special OR case race break
    152             if ( !queue`first.clause_status || queue`first.park_counter || __make_select_node_available( queue`first ) )
    153                 return true;
    154             // otherwise we lost the special OR race so discard node
    155             try_pop_front( queue );
    156         }
    157         return false;
    158     }
    159     return true;
    160 }
    161 
    162 // wake one thread from the list
    163 static inline void wake_one( dlist( select_node ) & queue, select_node & popped ) {
    164     if ( !popped.clause_status                              // normal case, node is not a select node
    165         || ( popped.clause_status && !popped.park_counter ) // If popped link is special case OR selecting unpark but don't call __make_select_node_available
    166         || __make_select_node_available( popped ) )         // check if popped link belongs to a selecting thread
    167         unpark( popped.blocked_thread );
    168 }
    169 
    170 static inline void wake_one( dlist( select_node ) & queue ) { wake_one( queue, try_pop_front( queue ) ); }
    171 
    172 static inline void setup_clause( select_node & this, unsigned long int * clause_status, int * park_counter ) {
    173     this.blocked_thread = active_thread();
    174     this.clause_status = clause_status;
    175     this.park_counter = park_counter;
    176 }
    177 
    178 // waituntil ( timeout( ... ) ) support
    179 struct select_timeout_node {
    180     alarm_node_t a_node;
    181     select_node * s_node;
    182 };
    183 void ?{}( select_timeout_node & this, Duration duration, Alarm_Callback callback );
    184 void ^?{}( select_timeout_node & this );
    185 void timeout_handler_select_cast( alarm_node_t & node );
    186 
    187 // Selectable trait routines
    188 bool register_select( select_timeout_node & this, select_node & node );
    189 bool unregister_select( select_timeout_node & this, select_node & node );
    190 bool on_selected( select_timeout_node & this, select_node & node );
    191 
    192 // Gateway routines to waituntil on duration
    193 select_timeout_node timeout( Duration duration );
    194 select_timeout_node sleep( Duration duration );
  • libcfa/src/concurrency/thread.cfa

    r044ae62 r3a513d89  
    5353        preferred = ready_queue_new_preferred();
    5454        last_proc = 0p;
    55     link_node = 0p;
    5655        PRNG_SET_SEED( random_state, __global_random_mask ? __global_random_prime : __global_random_prime ^ rdtscl() );
    5756        #if defined( __CFA_WITH_VERIFY__ )
     
    6059        #endif
    6160
     61        clh_node = malloc( );
     62        *clh_node = false;
     63
    6264        doregister(curr_cluster, this);
    6365        monitors{ &self_mon_p, 1, (fptr_t)0 };
     
    6870                canary = 0xDEADDEADDEADDEADp;
    6971        #endif
     72        free(clh_node);
    7073        unregister(curr_cluster, this);
    7174        ^self_cor{};
  • src/AST/Convert.cpp

    r044ae62 r3a513d89  
    585585        }
    586586
    587     const ast::WhenClause * visit( const ast::WhenClause * node ) override final {
    588                 // There is no old-AST WhenClause, so this should never be called.
    589                 assert( !node );
    590                 return nullptr;
    591         }
    592 
    593587        const ast::Stmt * visit( const ast::WaitForStmt * node ) override final {
    594588                if ( inCache( node ) ) return nullptr;
     
    597591                for ( auto clause : node->clauses ) {
    598592                        stmt->clauses.push_back({{
    599                                         get<Expression>().accept1( clause->target ),
     593                                        get<Expression>().accept1( clause->target_func ),
    600594                                        get<Expression>().acceptL( clause->target_args ),
    601595                                },
    602596                                get<Statement>().accept1( clause->stmt ),
    603                                 get<Expression>().accept1( clause->when_cond ),
     597                                get<Expression>().accept1( clause->cond ),
    604598                        });
    605599                }
     
    618612        const ast::WaitForClause * visit( const ast::WaitForClause * node ) override final {
    619613                // There is no old-AST WaitForClause, so this should never be called.
    620                 assert( !node );
    621                 return nullptr;
    622         }
    623 
    624     const ast::Stmt * visit( const ast::WaitUntilStmt * node ) override final {
    625         // There is no old-AST WaitUntilStmt, so this should never be called.
    626614                assert( !node );
    627615                return nullptr;
     
    22112199                        auto clause = new ast::WaitForClause( old->location );
    22122200
    2213                         clause->target = GET_ACCEPT_1(clauses[i].target.function, Expr);
     2201                        clause->target_func = GET_ACCEPT_1(clauses[i].target.function, Expr);
    22142202                        clause->target_args = GET_ACCEPT_V(clauses[i].target.arguments, Expr);
    22152203                        clause->stmt = GET_ACCEPT_1(clauses[i].statement, Stmt);
    2216                         clause->when_cond = GET_ACCEPT_1(clauses[i].condition, Expr);
     2204                        clause->cond = GET_ACCEPT_1(clauses[i].condition, Expr);
    22172205
    22182206                        stmt->clauses.push_back( clause );
  • src/AST/Fwd.hpp

    r044ae62 r3a513d89  
    5959class FinallyClause;
    6060class SuspendStmt;
    61 class WhenClause;
    6261class WaitForStmt;
    6362class WaitForClause;
    64 class WaitUntilStmt;
    6563class WithStmt;
    6664class DeclStmt;
  • src/AST/Node.cpp

    r044ae62 r3a513d89  
    176176template class ast::ptr_base< ast::FinallyClause, ast::Node::ref_type::weak >;
    177177template class ast::ptr_base< ast::FinallyClause, ast::Node::ref_type::strong >;
    178 template class ast::ptr_base< ast::WhenClause, ast::Node::ref_type::weak >;
    179 template class ast::ptr_base< ast::WhenClause, ast::Node::ref_type::strong >;
    180178template class ast::ptr_base< ast::WaitForStmt, ast::Node::ref_type::weak >;
    181179template class ast::ptr_base< ast::WaitForStmt, ast::Node::ref_type::strong >;
    182180template class ast::ptr_base< ast::WaitForClause, ast::Node::ref_type::weak >;
    183181template class ast::ptr_base< ast::WaitForClause, ast::Node::ref_type::strong >;
    184 template class ast::ptr_base< ast::WaitUntilStmt, ast::Node::ref_type::weak >;
    185 template class ast::ptr_base< ast::WaitUntilStmt, ast::Node::ref_type::strong >;
    186182template class ast::ptr_base< ast::WithStmt, ast::Node::ref_type::weak >;
    187183template class ast::ptr_base< ast::WithStmt, ast::Node::ref_type::strong >;
  • src/AST/Pass.hpp

    r044ae62 r3a513d89  
    163163        const ast::FinallyClause *    visit( const ast::FinallyClause        * ) override final;
    164164        const ast::Stmt *             visit( const ast::SuspendStmt          * ) override final;
    165     const ast::WhenClause *       visit( const ast::WhenClause           * ) override final;
    166165        const ast::Stmt *             visit( const ast::WaitForStmt          * ) override final;
    167166        const ast::WaitForClause *    visit( const ast::WaitForClause        * ) override final;
    168     const ast::Stmt *             visit( const ast::WaitUntilStmt        * ) override final;
    169167        const ast::Decl *             visit( const ast::WithStmt             * ) override final;
    170168        const ast::NullStmt *         visit( const ast::NullStmt             * ) override final;
  • src/AST/Pass.impl.hpp

    r044ae62 r3a513d89  
    2222#include "AST/TranslationUnit.hpp"
    2323#include "AST/TypeSubstitution.hpp"
     24#include "Common/Iterate.hpp"
    2425
    2526#define VISIT_START( node ) \
     
    126127        }
    127128
     129        template< typename node_t >
     130        template< typename object_t, typename super_t, typename field_t >
     131        void __pass::result1< node_t >::apply( object_t * object, field_t super_t::* field ) {
     132                object->*field = value;
     133        }
     134
    128135        template< typename core_t >
    129136        template< typename node_t >
     
    227234
    228235                return {true, compound};
     236        }
     237
     238        template< template <class...> class container_t >
     239        template< typename object_t, typename super_t, typename field_t >
     240        void __pass::resultNstmt<container_t>::apply(object_t * object, field_t super_t::* field) {
     241                auto & container = object->*field;
     242                __pedantic_pass_assert( container.size() <= values.size() );
     243
     244                auto cit = enumerate(container).begin();
     245
     246                container_t<ptr<Stmt>> nvals;
     247                for (delta & d : values) {
     248                        if ( d.is_old ) {
     249                                __pedantic_pass_assert( cit.idx <= d.old_idx );
     250                                std::advance( cit, d.old_idx - cit.idx );
     251                                nvals.push_back( std::move( (*cit).val) );
     252                        } else {
     253                                nvals.push_back( std::move(d.new_val) );
     254                        }
     255                }
     256
     257                container = std::move(nvals);
     258        }
     259
     260        template< template <class...> class container_t >
     261        template< template <class...> class incontainer_t >
     262        void __pass::resultNstmt< container_t >::take_all( incontainer_t<ptr<Stmt>> * stmts ) {
     263                if (!stmts || stmts->empty()) return;
     264
     265                std::transform(stmts->begin(), stmts->end(), std::back_inserter( values ),
     266                        [](ast::ptr<ast::Stmt>& stmt) -> delta {
     267                                return delta( stmt.release(), -1, false );
     268                        });
     269                stmts->clear();
     270                differs = true;
     271        }
     272
     273        template< template<class...> class container_t >
     274        template< template<class...> class incontainer_t >
     275        void __pass::resultNstmt< container_t >::take_all( incontainer_t<ptr<Decl>> * decls ) {
     276                if (!decls || decls->empty()) return;
     277
     278                std::transform(decls->begin(), decls->end(), std::back_inserter( values ),
     279                        [](ast::ptr<ast::Decl>& decl) -> delta {
     280                                auto loc = decl->location;
     281                                auto stmt = new DeclStmt( loc, decl.release() );
     282                                return delta( stmt, -1, false );
     283                        });
     284                decls->clear();
     285                differs = true;
    229286        }
    230287
     
    296353
    297354                return new_kids;
     355        }
     356
     357        template< template <class...> class container_t, typename node_t >
     358        template< typename object_t, typename super_t, typename field_t >
     359        void __pass::resultN<container_t, node_t>::apply(object_t * object, field_t super_t::* field) {
     360                auto & container = object->*field;
     361                __pedantic_pass_assert( container.size() == values.size() );
     362
     363                for(size_t i = 0; i < container.size(); i++) {
     364                        // Take all the elements that are different in 'values'
     365                        // and swap them into 'container'
     366                        if( values[i] != nullptr ) swap(container[i], values[i]);
     367                }
     368
     369                // Now the original containers should still have the unchanged values
     370                // but also contain the new values
    298371        }
    299372
     
    10241097
    10251098//--------------------------------------------------------------------------
    1026 // WhenClause
    1027 template< typename core_t >
    1028 const ast::WhenClause * ast::Pass< core_t >::visit( const ast::WhenClause * node ) {
    1029         VISIT_START( node );
    1030 
    1031         if ( __visit_children() ) {
    1032                 maybe_accept( node, &WhenClause::target );
    1033                 maybe_accept( node, &WhenClause::stmt );
    1034                 maybe_accept( node, &WhenClause::when_cond );
    1035         }
    1036 
    1037         VISIT_END( WhenClause, node );
    1038 }
    1039 
    1040 //--------------------------------------------------------------------------
    10411099// WaitForStmt
    10421100template< typename core_t >
     
    10631121
    10641122        if ( __visit_children() ) {
    1065                 maybe_accept( node, &WaitForClause::target );
     1123                maybe_accept( node, &WaitForClause::target_func );
    10661124                maybe_accept( node, &WaitForClause::target_args );
    10671125                maybe_accept( node, &WaitForClause::stmt );
    1068                 maybe_accept( node, &WaitForClause::when_cond );
     1126                maybe_accept( node, &WaitForClause::cond );
    10691127        }
    10701128
    10711129        VISIT_END( WaitForClause, node );
    1072 }
    1073 
    1074 //--------------------------------------------------------------------------
    1075 // WaitUntilStmt
    1076 template< typename core_t >
    1077 const ast::Stmt * ast::Pass< core_t >::visit( const ast::WaitUntilStmt * node ) {
    1078         VISIT_START( node );
    1079 
    1080         if ( __visit_children() ) {
    1081                 maybe_accept( node, &WaitUntilStmt::clauses );
    1082                 maybe_accept( node, &WaitUntilStmt::timeout_time );
    1083                 maybe_accept( node, &WaitUntilStmt::timeout_stmt );
    1084                 maybe_accept( node, &WaitUntilStmt::timeout_cond );
    1085                 maybe_accept( node, &WaitUntilStmt::else_stmt );
    1086                 maybe_accept( node, &WaitUntilStmt::else_cond );
    1087         }
    1088 
    1089         VISIT_END( Stmt, node );
    10901130}
    10911131
     
    21942234}
    21952235
    2196 #undef __pedantic_pass_assertf
    2197 #undef __pedantic_pass_assert
    21982236#undef VISIT_START
    21992237#undef VISIT_END
  • src/AST/Pass.proto.hpp

    r044ae62 r3a513d89  
    1717// IWYU pragma: private, include "Pass.hpp"
    1818
    19 #include "Common/Iterate.hpp"
    2019#include "Common/Stats/Heap.h"
    2120namespace ast {
     
    2524        template<typename node_t> node_t * deepCopy( const node_t * );
    2625}
    27 
    28 #ifdef PEDANTIC_PASS_ASSERT
    29 #define __pedantic_pass_assert(...) assert (__VA_ARGS__)
    30 #define __pedantic_pass_assertf(...) assertf(__VA_ARGS__)
    31 #else
    32 #define __pedantic_pass_assert(...)
    33 #define __pedantic_pass_assertf(...)
    34 #endif
    3526
    3627namespace ast::__pass {
     
    139130
    140131        template< typename object_t, typename super_t, typename field_t >
    141         void apply( object_t * object, field_t super_t::* field ) {
    142                 object->*field = value;
    143         }
     132        void apply( object_t *, field_t super_t::* field );
    144133};
    145134
     
    161150
    162151        template< typename object_t, typename super_t, typename field_t >
    163         void apply( object_t * object, field_t super_t::* field ) {
    164                 field_t & container = object->*field;
    165                 __pedantic_pass_assert( container.size() <= values.size() );
    166 
    167                 auto cit = enumerate(container).begin();
    168 
    169                 container_t<ptr<Stmt>> nvals;
    170                 for ( delta & d : values ) {
    171                         if ( d.is_old ) {
    172                                 __pedantic_pass_assert( cit.idx <= d.old_idx );
    173                                 std::advance( cit, d.old_idx - cit.idx );
    174                                 nvals.push_back( std::move( (*cit).val ) );
    175                         } else {
    176                                 nvals.push_back( std::move( d.new_val ) );
    177                         }
    178                 }
    179 
    180                 container = std::move(nvals);
    181         }
     152        void apply( object_t *, field_t super_t::* field );
    182153
    183154        template< template<class...> class incontainer_t >
    184         void take_all( incontainer_t<ptr<Stmt>> * stmts ) {
    185                 if ( !stmts || stmts->empty() ) return;
    186 
    187                 std::transform( stmts->begin(), stmts->end(), std::back_inserter( values ),
    188                         [](ast::ptr<ast::Stmt>& stmt) -> delta {
    189                                 return delta( stmt.release(), -1, false );
    190                         });
    191                 stmts->clear();
    192                 differs = true;
    193         }
     155        void take_all( incontainer_t<ptr<Stmt>> * stmts );
    194156
    195157        template< template<class...> class incontainer_t >
    196         void take_all( incontainer_t<ptr<Decl>> * decls ) {
    197                 if ( !decls || decls->empty() ) return;
    198 
    199                 std::transform( decls->begin(), decls->end(), std::back_inserter( values ),
    200                         [](ast::ptr<ast::Decl>& decl) -> delta {
    201                                 ast::Decl const * d = decl.release();
    202                                 return delta( new DeclStmt( d->location, d ), -1, false );
    203                         });
    204                 decls->clear();
    205                 differs = true;
    206         }
     158        void take_all( incontainer_t<ptr<Decl>> * decls );
    207159};
    208160
     
    214166
    215167        template< typename object_t, typename super_t, typename field_t >
    216         void apply( object_t * object, field_t super_t::* field ) {
    217                 field_t & container = object->*field;
    218                 __pedantic_pass_assert( container.size() == values.size() );
    219 
    220                 for ( size_t i = 0; i < container.size(); ++i ) {
    221                         // Take all the elements that are different in 'values'
    222                         // and swap them into 'container'
    223                         if ( values[i] != nullptr ) swap(container[i], values[i]);
    224                 }
    225                 // Now the original containers should still have the unchanged values
    226                 // but also contain the new values.
    227         }
     168        void apply( object_t *, field_t super_t::* field );
    228169};
    229170
     
    593534
    594535} // namespace ast::__pass
    595 
    596 #undef __pedantic_pass_assertf
    597 #undef __pedantic_pass_assert
  • src/AST/Print.cpp

    r044ae62 r3a513d89  
    208208        }
    209209
    210     void print( const ast::WaitStmt * node ) {
    211                 if ( node->timeout_time ) {
    212                         os << indent-1 << "timeout of:" << endl;
    213                         node->timeout_time->accept( *this );
    214 
    215                         if ( node->timeout_stmt ) {
    216                                 os << indent-1 << "... with statment:" << endl;
    217                                 node->timeout_stmt->accept( *this );
    218                         }
    219 
    220                         if ( node->timeout_cond ) {
    221                                 os << indent-1 << "... with condition:" << endl;
    222                                 node->timeout_cond->accept( *this );
    223                         }
    224                 }
    225 
    226                 if ( node->else_stmt ) {
    227                         os << indent-1 << "else:" << endl;
    228                         node->else_stmt->accept( *this );
    229 
    230                         if ( node->else_cond ) {
    231                                 os << indent-1 << "... with condition:" << endl;
    232                                 node->else_cond->accept( *this );
    233                         }
    234                 }
    235         }
    236 
    237210        void preprint( const ast::NamedTypeDecl * node ) {
    238211                if ( ! node->name.empty() ) {
     
    788761        }
    789762
    790         virtual const ast::WhenClause * visit( const ast::WhenClause * node ) override final {
    791                 os << indent-1 << "target: ";
    792                 safe_print( node->target );
    793 
    794                 if ( node->stmt ) {
    795                         os << indent-1 << "... with statment:" << endl;
    796                         node->stmt->accept( *this );
    797                 }
    798 
    799                 if ( node->when_cond ) {
    800                         os << indent-1 << "... with when condition:" << endl;
    801                         node->when_cond->accept( *this );
    802                 }
    803 
    804                 return node;
    805         }
    806 
    807763        virtual const ast::Stmt * visit( const ast::WaitForStmt * node ) override final {
    808764                os << "Waitfor Statement" << endl;
     
    842798        virtual const ast::WaitForClause * visit( const ast::WaitForClause * node ) override final {
    843799                os << indent-1 << "target function: ";
    844                 safe_print( node->target );
     800                safe_print( node->target_func );
    845801
    846802                if ( !node->target_args.empty() ) {
     
    856812                }
    857813
    858                 if ( node->when_cond ) {
     814                if ( node->cond ) {
    859815                        os << indent-1 << "... with condition:" << endl;
    860                         node->when_cond->accept( *this );
    861                 }
    862 
    863                 return node;
    864         }
    865 
    866     virtual const ast::Stmt * visit( const ast::WaitUntilStmt * node ) override final {
    867                 os << "Waituntil Statement" << endl;
    868                 indent += 2;
    869                 for( const auto & clause : node->clauses ) {
    870                         clause->accept( *this );
    871                 }
    872         print(node);    // calls print( const ast::WaitStmt * node )
     816                        node->cond->accept( *this );
     817                }
     818
    873819                return node;
    874820        }
  • src/AST/Stmt.hpp

    r044ae62 r3a513d89  
    378378};
    379379
    380 // Base class of WaitFor/WaitUntil statements
    381 // form: KEYWORD(...) ... timeout(...) ... else ...
    382 class WaitStmt : public Stmt {
    383   public:
    384     ptr<Expr> timeout_time;
     380// Waitfor statement: when (...) waitfor (... , ...) ... timeout(...) ... else ...
     381class WaitForStmt final : public Stmt {
     382  public:
     383        std::vector<ptr<WaitForClause>> clauses;
     384        ptr<Expr> timeout_time;
    385385        ptr<Stmt> timeout_stmt;
    386386        ptr<Expr> timeout_cond;
     
    388388        ptr<Expr> else_cond;
    389389
    390     WaitStmt( const CodeLocation & loc, const std::vector<Label> && labels = {} )
     390        WaitForStmt( const CodeLocation & loc, const std::vector<Label> && labels = {} )
    391391                : Stmt(loc, std::move(labels)) {}
    392392
    393   private:
    394     WaitStmt * clone() const override = 0;
    395         MUTATE_FRIEND
    396 };
    397 
    398 // Base class for WaitFor/WaitUntil clauses
    399 // form: when( when_cond ) KEYWORD( target ) stmt
    400 class WhenClause : public StmtClause {
    401   public:
    402         ptr<Expr> target;
     393        const Stmt * accept( Visitor & v ) const override { return v.visit( this ); }
     394  private:
     395        WaitForStmt * clone() const override { return new WaitForStmt{ *this }; }
     396        MUTATE_FRIEND
     397};
     398
     399// Clause in a waitfor statement: waitfor (..., ...) ...
     400class WaitForClause final : public StmtClause {
     401  public:
     402        ptr<Expr> target_func;
     403        std::vector<ptr<Expr>> target_args;
    403404        ptr<Stmt> stmt;
    404         ptr<Expr> when_cond;
    405 
    406         WhenClause( const CodeLocation & loc )
     405        ptr<Expr> cond;
     406
     407        WaitForClause( const CodeLocation & loc )
    407408                : StmtClause( loc ) {}
    408409
    409         const WhenClause * accept( Visitor & v ) const override { return v.visit( this ); }
    410   private:
    411         WhenClause * clone() const override { return new WhenClause{ *this }; }
    412         MUTATE_FRIEND
    413 };
    414 
    415 // Waitfor statement: when (...) waitfor (... , ...) ... timeout(...) ... else ...
    416 class WaitForStmt final : public WaitStmt {
    417   public:
    418         std::vector<ptr<WaitForClause>> clauses;
    419 
    420         WaitForStmt( const CodeLocation & loc, const std::vector<Label> && labels = {} )
    421                 : WaitStmt(loc, std::move(labels)) {}
    422 
    423         const Stmt * accept( Visitor & v ) const override { return v.visit( this ); }
    424   private:
    425         WaitForStmt * clone() const override { return new WaitForStmt{ *this }; }
    426         MUTATE_FRIEND
    427 };
    428 
    429 // Clause in a waitfor statement: waitfor (..., ...) ...
    430 class WaitForClause final : public WhenClause {
    431   public:
    432         std::vector<ptr<Expr>> target_args;
    433 
    434         WaitForClause( const CodeLocation & loc )
    435                 : WhenClause( loc ) {}
    436 
    437410        const WaitForClause * accept( Visitor & v ) const override { return v.visit( this ); }
    438411  private:
    439412        WaitForClause * clone() const override { return new WaitForClause{ *this }; }
    440         MUTATE_FRIEND
    441 };
    442 
    443 // waituntil statement: when (...) waituntil (...) ... timeout(...) ... else ...
    444 class WaitUntilStmt final : public WaitStmt {
    445   public:
    446     // Non-ast node used during compilation to store data needed to generate predicates
    447     //    and set initial status values for clauses
    448     // Used to create a tree corresponding to the structure of the clauses in a WaitUntil
    449     struct ClauseNode {
    450         enum Op { AND, OR, LEFT_OR, LEAF, ELSE, TIMEOUT } op; // operation/type tag
    451         // LEFT_OR used with TIMEOUT/ELSE to indicate that we ignore right hand side after parsing
    452 
    453         ClauseNode * left;
    454         ClauseNode * right;
    455         WhenClause * leaf;  // only set if this node is a leaf (points into vector of clauses)
    456 
    457         bool ambiguousWhen; // used to paint nodes of predicate tree based on when() clauses
    458         bool whenState;     // used to track if when_cond is toggled on or off for generating init values
    459         bool childOfAnd;      // true on leaf nodes that are children of AND, false otherwise
    460 
    461         ClauseNode( Op op, ClauseNode * left, ClauseNode * right )
    462             : op(op), left(left), right(right), leaf(nullptr),
    463             ambiguousWhen(false), whenState(true), childOfAnd(false) {}
    464         ClauseNode( Op op, WhenClause * leaf )
    465             : op(op), left(nullptr), right(nullptr), leaf(leaf),
    466             ambiguousWhen(false), whenState(true), childOfAnd(false) {}
    467         ClauseNode( WhenClause * leaf ) : ClauseNode(LEAF, leaf) {}
    468        
    469         ~ClauseNode() {
    470             if ( left ) delete left;
    471             if ( right ) delete right;
    472         }
    473     };
    474 
    475         std::vector<ptr<WhenClause>> clauses;
    476     ClauseNode * predicateTree;
    477 
    478         WaitUntilStmt( const CodeLocation & loc, const std::vector<Label> && labels = {} )
    479                 : WaitStmt(loc, std::move(labels)) {}
    480 
    481     ~WaitUntilStmt() { delete predicateTree; }
    482 
    483         const Stmt * accept( Visitor & v ) const override { return v.visit( this ); }
    484   private:
    485         WaitUntilStmt * clone() const override { return new WaitUntilStmt{ *this }; }
    486413        MUTATE_FRIEND
    487414};
  • src/AST/Visitor.hpp

    r044ae62 r3a513d89  
    5151    virtual const ast::FinallyClause *    visit( const ast::FinallyClause        * ) = 0;
    5252    virtual const ast::Stmt *             visit( const ast::SuspendStmt          * ) = 0;
    53     virtual const ast::WhenClause *       visit( const ast::WhenClause           * ) = 0;
    5453    virtual const ast::Stmt *             visit( const ast::WaitForStmt          * ) = 0;
    5554    virtual const ast::WaitForClause *    visit( const ast::WaitForClause        * ) = 0;
    56     virtual const ast::Stmt *             visit( const ast::WaitUntilStmt        * ) = 0;
    5755    virtual const ast::Decl *             visit( const ast::WithStmt             * ) = 0;
    5856    virtual const ast::NullStmt *         visit( const ast::NullStmt             * ) = 0;
  • src/Common/CodeLocationTools.cpp

    r044ae62 r3a513d89  
    129129    macro(FinallyClause, FinallyClause) \
    130130    macro(SuspendStmt, Stmt) \
    131     macro(WhenClause, WhenClause) \
    132131    macro(WaitForStmt, Stmt) \
    133132    macro(WaitForClause, WaitForClause) \
    134     macro(WaitUntilStmt, Stmt) \
    135133    macro(WithStmt, Decl) \
    136134    macro(NullStmt, NullStmt) \
  • src/Concurrency/WaitforNew.cpp

    r044ae62 r3a513d89  
    305305
    306306        const ast::VariableExpr * variableExpr =
    307                 clause->target.as<ast::VariableExpr>();
     307                clause->target_func.as<ast::VariableExpr>();
    308308        ast::Expr * castExpr = new ast::CastExpr(
    309309                location,
    310310                new ast::CastExpr(
    311311                        location,
    312                         clause->target,
     312                        clause->target_func,
    313313                        ast::deepCopy( variableExpr->result.get() ),
    314314                        ast::GeneratedCast ),
     
    325325
    326326        ResolveContext context{ symtab, transUnit().global };
    327         out->push_back( maybeCond( location, clause->when_cond.get(), {
     327        out->push_back( maybeCond( location, clause->cond.get(), {
    328328                makeAccStmt( location, acceptables, index, "is_dtor",
    329                         detectIsDtor( location, clause->target ), context ),
     329                        detectIsDtor( location, clause->target_func ), context ),
    330330                makeAccStmt( location, acceptables, index, "func",
    331331                        funcExpr, context ),
  • src/Concurrency/module.mk

    r044ae62 r3a513d89  
    2323        Concurrency/WaitforNew.cpp \
    2424        Concurrency/Waitfor.cc \
    25         Concurrency/Waitfor.h \
    26         Concurrency/Waituntil.cpp \
    27         Concurrency/Waituntil.hpp
     25        Concurrency/Waitfor.h
  • src/Parser/StatementNode.cc

    r044ae62 r3a513d89  
    328328ast::WaitForStmt * build_waitfor( const CodeLocation & location, ast::WaitForStmt * existing, ExpressionNode * when, ExpressionNode * targetExpr, StatementNode * stmt ) {
    329329        auto clause = new ast::WaitForClause( location );
    330         clause->target = maybeBuild( targetExpr );
     330        clause->target_func = maybeBuild( targetExpr );
    331331        clause->stmt = maybeMoveBuild( stmt );
    332         clause->when_cond = notZeroExpr( maybeMoveBuild( when ) );
     332        clause->cond = notZeroExpr( maybeMoveBuild( when ) );
    333333
    334334        ExpressionNode * next = dynamic_cast<ExpressionNode *>( targetExpr->get_next() );
     
    359359        return existing;
    360360} // build_waitfor_timeout
    361 
    362 ast::WaitUntilStmt::ClauseNode * build_waituntil_clause( const CodeLocation & loc, ExpressionNode * when, ExpressionNode * targetExpr, StatementNode * stmt ) {
    363     ast::WhenClause * clause = new ast::WhenClause( loc );
    364     clause->when_cond = notZeroExpr( maybeMoveBuild( when ) );
    365     clause->stmt = maybeMoveBuild( stmt );
    366     clause->target = maybeMoveBuild( targetExpr );
    367     return new ast::WaitUntilStmt::ClauseNode( clause );
    368 }
    369 ast::WaitUntilStmt::ClauseNode * build_waituntil_else( const CodeLocation & loc, ExpressionNode * when, StatementNode * stmt ) {
    370     ast::WhenClause * clause = new ast::WhenClause( loc );
    371     clause->when_cond = notZeroExpr( maybeMoveBuild( when ) );
    372     clause->stmt = maybeMoveBuild( stmt );
    373     return new ast::WaitUntilStmt::ClauseNode( ast::WaitUntilStmt::ClauseNode::Op::ELSE, clause );
    374 }
    375 ast::WaitUntilStmt::ClauseNode * build_waituntil_timeout( const CodeLocation & loc, ExpressionNode * when, ExpressionNode * timeout, StatementNode * stmt ) {
    376     ast::WhenClause * clause = new ast::WhenClause( loc );
    377     clause->when_cond = notZeroExpr( maybeMoveBuild( when ) );
    378     clause->stmt = maybeMoveBuild( stmt );
    379     clause->target = maybeMoveBuild( timeout );
    380     return new ast::WaitUntilStmt::ClauseNode( ast::WaitUntilStmt::ClauseNode::Op::TIMEOUT, clause );
    381 }
    382 
    383 ast::WaitUntilStmt * build_waituntil_stmt( const CodeLocation & loc, ast::WaitUntilStmt::ClauseNode * root ) {
    384     ast::WaitUntilStmt * retStmt = new ast::WaitUntilStmt( loc );
    385     retStmt->predicateTree = root;
    386    
    387     // iterative tree traversal
    388     std::vector<ast::WaitUntilStmt::ClauseNode *> nodeStack; // stack needed for iterative traversal
    389     ast::WaitUntilStmt::ClauseNode * currNode = nullptr;
    390     ast::WaitUntilStmt::ClauseNode * lastInternalNode = nullptr;
    391     ast::WaitUntilStmt::ClauseNode * cleanup = nullptr; // used to cleanup removed else/timeout
    392     nodeStack.push_back(root);
    393 
    394     do {
    395         currNode = nodeStack.back();
    396         nodeStack.pop_back(); // remove node since it will be processed
    397 
    398         switch (currNode->op) {
    399             case ast::WaitUntilStmt::ClauseNode::LEAF:
    400                 retStmt->clauses.push_back(currNode->leaf);
    401                 break;
    402             case ast::WaitUntilStmt::ClauseNode::ELSE:
    403                 retStmt->else_stmt = currNode->leaf->stmt
    404                     ? ast::deepCopy( currNode->leaf->stmt )
    405                     : nullptr;
    406                
    407                 retStmt->else_cond = currNode->leaf->when_cond
    408                     ? ast::deepCopy( currNode->leaf->when_cond )
    409                     : nullptr;
    410 
    411                 delete currNode->leaf;
    412                 break;
    413             case ast::WaitUntilStmt::ClauseNode::TIMEOUT:
    414                 retStmt->timeout_time = currNode->leaf->target
    415                     ? ast::deepCopy( currNode->leaf->target )
    416                     : nullptr;
    417                 retStmt->timeout_stmt = currNode->leaf->stmt
    418                     ? ast::deepCopy( currNode->leaf->stmt )
    419                     : nullptr;
    420                 retStmt->timeout_cond = currNode->leaf->when_cond
    421                     ? ast::deepCopy( currNode->leaf->when_cond )
    422                     : nullptr;
    423 
    424                 delete currNode->leaf;
    425                 break;
    426             default:
    427                 nodeStack.push_back( currNode->right ); // process right after left
    428                 nodeStack.push_back( currNode->left );
    429 
    430                 // Cut else/timeout out of the tree
    431                 if ( currNode->op == ast::WaitUntilStmt::ClauseNode::LEFT_OR ) {
    432                     if ( lastInternalNode )
    433                         lastInternalNode->right = currNode->left;
    434                     else    // if not set then root is LEFT_OR
    435                         retStmt->predicateTree = currNode->left;
    436    
    437                     currNode->left = nullptr;
    438                     cleanup = currNode;
    439                 }
    440                
    441                 lastInternalNode = currNode;
    442                 break;
    443         }
    444     } while ( !nodeStack.empty() );
    445 
    446     if ( cleanup ) delete cleanup;
    447 
    448     return retStmt;
    449 }
    450361
    451362ast::Stmt * build_with( const CodeLocation & location, ExpressionNode * exprs, StatementNode * stmt ) {
  • src/Parser/StatementNode.h

    r044ae62 r3a513d89  
    100100ast::WaitForStmt * build_waitfor_else( const CodeLocation &, ast::WaitForStmt * existing, ExpressionNode * when, StatementNode * stmt );
    101101ast::WaitForStmt * build_waitfor_timeout( const CodeLocation &, ast::WaitForStmt * existing, ExpressionNode * when, ExpressionNode * timeout, StatementNode * stmt );
    102 ast::WaitUntilStmt::ClauseNode * build_waituntil_clause( const CodeLocation &, ExpressionNode * when, ExpressionNode * targetExpr, StatementNode * stmt );
    103 ast::WaitUntilStmt::ClauseNode * build_waituntil_else( const CodeLocation &, ExpressionNode * when, StatementNode * stmt );
    104 ast::WaitUntilStmt::ClauseNode * build_waituntil_timeout( const CodeLocation &, ExpressionNode * when, ExpressionNode * timeout, StatementNode * stmt );
    105 ast::WaitUntilStmt * build_waituntil_stmt( const CodeLocation &, ast::WaitUntilStmt::ClauseNode * root );
    106102ast::Stmt * build_with( const CodeLocation &, ExpressionNode * exprs, StatementNode * stmt );
    107103ast::Stmt * build_mutex( const CodeLocation &, ExpressionNode * exprs, StatementNode * stmt );
  • src/Parser/lex.ll

    r044ae62 r3a513d89  
    1010 * Created On       : Sat Sep 22 08:58:10 2001
    1111 * Last Modified By : Peter A. Buhr
    12  * Last Modified On : Tue May  2 08:45:21 2023
    13  * Update Count     : 769
     12 * Last Modified On : Sat Mar 25 08:09:03 2023
     13 * Update Count     : 768
    1414 */
    1515
     
    258258enable                  { KEYWORD_RETURN(ENABLE); }                             // CFA
    259259enum                    { KEYWORD_RETURN(ENUM); }
     260__extension__   { KEYWORD_RETURN(EXTENSION); }                  // GCC
    260261exception               { KEYWORD_RETURN(EXCEPTION); }                  // CFA
    261 __extension__   { KEYWORD_RETURN(EXTENSION); }                  // GCC
    262262extern                  { KEYWORD_RETURN(EXTERN); }
    263263fallthrough             { KEYWORD_RETURN(FALLTHROUGH); }                // CFA
  • src/Parser/parser.yy

    r044ae62 r3a513d89  
    99// Author           : Peter A. Buhr
    1010// Created On       : Sat Sep  1 20:22:55 2001
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Apr 26 16:45:37 2023
    13 // Update Count     : 6330
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Tue Apr  4 14:02:00 2023
     13// Update Count     : 6329
    1414//
    1515
     
    307307        ClauseNode * clause;
    308308        ast::WaitForStmt * wfs;
    309     ast::WaitUntilStmt::ClauseNode * wucn;
    310309        CondCtl * ifctl;
    311310        ForCtrl * forctl;
     
    428427%type<expr> when_clause                                 when_clause_opt                         waitfor         waituntil               timeout
    429428%type<stmt> waitfor_statement                           waituntil_statement
    430 %type<wfs> wor_waitfor_clause
    431 %type<wucn> waituntil_clause                    wand_waituntil_clause       wor_waituntil_clause
     429%type<wfs> wor_waitfor_clause                   waituntil_clause                        wand_waituntil_clause   wor_waituntil_clause
    432430
    433431// declarations
     
    16841682
    16851683waituntil:
    1686         WAITUNTIL '(' comma_expression ')'
     1684        WAITUNTIL '(' cast_expression ')'
    16871685                { $$ = $3; }
    16881686        ;
     
    16901688waituntil_clause:
    16911689        when_clause_opt waituntil statement
    1692                 { $$ = build_waituntil_clause( yylloc, $1, $2, maybe_build_compound( yylloc, $3 ) ); }
     1690                { printf( "waituntil_clause 1\n" ); $$ = nullptr; }
    16931691        | '(' wor_waituntil_clause ')'
    1694                 { $$ = $2; }
     1692                { printf( "waituntil_clause 2\n" ); $$ = nullptr; }
    16951693        ;
    16961694
    16971695wand_waituntil_clause:
    16981696        waituntil_clause                                                                        %prec THEN
    1699                 { $$ = $1; }
     1697                { printf( "wand_waituntil_clause 1\n" ); $$ = nullptr; }
    17001698        | waituntil_clause wand wand_waituntil_clause
    1701                 { $$ = new ast::WaitUntilStmt::ClauseNode( ast::WaitUntilStmt::ClauseNode::Op::AND, $1, $3 ); }
     1699                { printf( "wand_waituntil_clause 2\n" ); $$ = nullptr; }
    17021700        ;
    17031701
    17041702wor_waituntil_clause:
    17051703        wand_waituntil_clause
    1706                 { $$ = $1; }
     1704                { printf( "wor_waituntil_clause 1\n" ); $$ = nullptr; }
    17071705        | wor_waituntil_clause wor wand_waituntil_clause
    1708                 { $$ = new ast::WaitUntilStmt::ClauseNode( ast::WaitUntilStmt::ClauseNode::Op::OR, $1, $3 ); }
     1706                { printf( "wor_waituntil_clause 2\n" ); $$ = nullptr; }
    17091707        | wor_waituntil_clause wor when_clause_opt ELSE statement
    1710                 { $$ = new ast::WaitUntilStmt::ClauseNode( ast::WaitUntilStmt::ClauseNode::Op::LEFT_OR, $1, build_waituntil_else( yylloc, $3, maybe_build_compound( yylloc, $5 ) ) ); }
     1708                { printf( "wor_waituntil_clause 3\n" ); $$ = nullptr; }
    17111709        | wor_waituntil_clause wor when_clause_opt timeout statement    %prec THEN
    1712                 { $$ = new ast::WaitUntilStmt::ClauseNode( ast::WaitUntilStmt::ClauseNode::Op::LEFT_OR, $1, build_waituntil_timeout( yylloc, $3, $4, maybe_build_compound( yylloc, $5 ) ) ); }
     1710                { printf( "wor_waituntil_clause 4\n" ); $$ = nullptr; }
    17131711        // "else" must be conditional after timeout or timeout is never triggered (i.e., it is meaningless)
    17141712        | wor_waituntil_clause wor when_clause_opt timeout statement wor ELSE statement // syntax error
    17151713                { SemanticError( yylloc, "else clause must be conditional after timeout or timeout never triggered." ); $$ = nullptr; }
    17161714        | wor_waituntil_clause wor when_clause_opt timeout statement wor when_clause ELSE statement
    1717                 { $$ = new ast::WaitUntilStmt::ClauseNode( ast::WaitUntilStmt::ClauseNode::Op::LEFT_OR, $1,
    1718                 new ast::WaitUntilStmt::ClauseNode( ast::WaitUntilStmt::ClauseNode::Op::OR,
    1719                     build_waituntil_timeout( yylloc, $3, $4, maybe_build_compound( yylloc, $5 ) ),
    1720                     build_waituntil_else( yylloc, $7, maybe_build_compound( yylloc, $9 ) ) ) ); }
     1715                { printf( "wor_waituntil_clause 6\n" ); $$ = nullptr; }
    17211716        ;
    17221717
     
    17241719        wor_waituntil_clause                                                            %prec THEN
    17251720                // SKULLDUGGERY: create an empty compound statement to test parsing of waituntil statement.
    1726                 {
    1727             $$ = new StatementNode( build_waituntil_stmt( yylloc, $1 ) );
    1728             // $$ = new StatementNode( build_compound( yylloc, nullptr ) );
    1729         }
     1721                { $$ = new StatementNode( build_compound( yylloc, nullptr ) ); }
    17301722        ;
    17311723
  • src/ResolvExpr/Resolver.cc

    r044ae62 r3a513d89  
    17301730
    17311731                        // Find all candidates for a function in canonical form
    1732                         funcFinder.find( clause.target, ResolvMode::withAdjustment() );
     1732                        funcFinder.find( clause.target_func, ResolvMode::withAdjustment() );
    17331733
    17341734                        if ( funcFinder.candidates.empty() ) {
    17351735                                stringstream ss;
    17361736                                ss << "Use of undeclared indentifier '";
    1737                                 ss << clause.target.strict_as< ast::NameExpr >()->name;
     1737                                ss << clause.target_func.strict_as< ast::NameExpr >()->name;
    17381738                                ss << "' in call to waitfor";
    17391739                                SemanticError( stmt->location, ss.str() );
     
    19221922                        auto clause2 = new ast::WaitForClause( clause.location );
    19231923
    1924                         clause2->target = funcCandidates.front()->expr;
     1924                        clause2->target_func = funcCandidates.front()->expr;
    19251925
    19261926                        clause2->target_args.reserve( clause.target_args.size() );
     
    19451945
    19461946                        // Resolve the conditions as if it were an IfStmt, statements normally
    1947                         clause2->when_cond = findSingleExpression( clause.when_cond, context );
     1947                        clause2->cond = findSingleExpression( clause.cond, context );
    19481948                        clause2->stmt = clause.stmt->accept( *visitor );
    19491949
  • src/main.cc

    r044ae62 r3a513d89  
    4848#include "Concurrency/Keywords.h"           // for implementMutex, implement...
    4949#include "Concurrency/Waitfor.h"            // for generateWaitfor
    50 #include "Concurrency/Waituntil.hpp"        // for generateWaitUntil
    5150#include "ControlStruct/ExceptDecl.h"       // for translateExcept
    5251#include "ControlStruct/ExceptTranslate.h"  // for translateThrows, translat...
     
    341340                PASS( "Implement Concurrent Keywords", Concurrency::implementKeywords, transUnit );
    342341                PASS( "Forall Pointer Decay", Validate::decayForallPointers, transUnit );
    343         PASS( "Implement Waituntil", Concurrency::generateWaitUntil, transUnit  );
    344342                PASS( "Hoist Control Declarations", ControlStruct::hoistControlDecls, transUnit );
    345343
  • tests/Makefile.am

    r044ae62 r3a513d89  
    1111## Created On       : Sun May 31 09:08:15 2015
    1212## Last Modified By : Peter A. Buhr
    13 ## Last Modified On : Tue May 16 09:27:48 2023
    14 ## Update Count     : 178
     13## Last Modified On : Mon Apr 10 23:24:02 2023
     14## Update Count     : 96
    1515###############################################################################
    1616
     
    2222DEFAULT_INCLUDES = -I${abs_srcdir}
    2323
    24 debug ?= yes
    25 installed ?= no
    26 ARCH = ${if ${arch},"--arch=${arch}"}
    27 arch_support = "x86/x64/arm"
    28 DEBUG_FLAGS = -debug -g -O0
    29 
    30 quick_test = avl_test operators numericConstants expression enum array typeof cast raii/dtor-early-exit raii/init_once attributes meta/dumpable
    31 
     24debug=yes
     25installed=no
    3226archiveerrors=
     27
     28DEBUG_FLAGS=-debug -g -O0
     29
     30quick_test=avl_test operators numericConstants expression enum array typeof cast raii/dtor-early-exit raii/init_once attributes meta/dumpable
     31
    3332concurrent=
    3433timeouts=
     
    3837# applies to both programs
    3938# since automake doesn't have support for CFA we have to
    40 AM_CFLAGS = ${if ${test}, 2> ${test}, } \
    41         -fdebug-prefix-map=${abspath ${abs_srcdir}}= \
     39AM_CFLAGS = $(if $(test), 2> $(test), ) \
     40        -fdebug-prefix-map=$(abspath ${abs_srcdir})= \
    4241        -fdebug-prefix-map=/tmp= \
    4342        -fno-diagnostics-show-caret \
     
    5251
    5352# get the desired cfa to test
    54 TARGET_CFA = ${if ${filter ${installed},yes}, @CFACC_INSTALL@, @CFACC@}
     53TARGET_CFA = $(if $(filter $(installed),yes), @CFACC_INSTALL@, @CFACC@)
    5554
    5655# adjust CC to current flags
    57 CC = LC_ALL=C ${if ${DISTCC_CFA_PATH},distcc ${DISTCC_CFA_PATH} ${ARCH_FLAGS} ,${TARGET_CFA} ${DEBUG_FLAGS} ${ARCH_FLAGS}}
    58 CFACC = ${CC}
     56CC = LC_ALL=C $(if $(DISTCC_CFA_PATH),distcc $(DISTCC_CFA_PATH) ${ARCH_FLAGS} ,$(TARGET_CFA) ${DEBUG_FLAGS} ${ARCH_FLAGS})
     57CFACC = $(CC)
    5958
    6059# get local binary for depedencies
     
    6261
    6362# adjusted CC but without the actual distcc call
    64 CFACCLOCAL = ${if ${DISTCC_CFA_PATH},${DISTCC_CFA_PATH} ${ARCH_FLAGS} ,${TARGET_CFA} ${DEBUG_FLAGS} ${ARCH_FLAGS}}
    65 CFACCLINK = ${CFACCLOCAL} -quiet ${if ${test}, 2> ${test}, } ${${shell echo "${@}_FLAGSLD" | sed 's/-\|\//_/g'}}
    66 
    67 PRETTY_PATH = mkdir -p ${dir ${abspath ${@}}} && cd ${srcdir} &&
    68 
    69 .PHONY : list .validate .test_makeflags
    70 .INTERMEDIATE : .validate .validate.cfa .test_makeflags
     63CFACCLOCAL = $(if $(DISTCC_CFA_PATH),$(DISTCC_CFA_PATH) ${ARCH_FLAGS} ,$(TARGET_CFA) ${DEBUG_FLAGS} ${ARCH_FLAGS})
     64CFACCLINK = $(CFACCLOCAL) -quiet $(if $(test), 2> $(test), ) $($(shell echo "${@}_FLAGSLD" | sed 's/-\|\//_/g'))
     65
     66PRETTY_PATH=mkdir -p $(dir $(abspath ${@})) && cd ${srcdir} &&
     67
     68.PHONY: list .validate .test_makeflags
     69.INTERMEDIATE: .validate .validate.cfa .test_makeflags
    7170EXTRA_PROGRAMS = avl_test linkonce linking/mangling/anon .dummy_hack # build but do not install
    7271EXTRA_DIST = test.py \
     
    9695        for file in `${TEST_PY} --list-dist`; do \
    9796                if test -f ${srcdir}/$${file}; then \
    98                         ${MKDIR_P} $$(dirname ${distdir}/$${file}); \
     97                        $(MKDIR_P) $$(dirname ${distdir}/$${file}); \
    9998                        cp -df ${srcdir}/$${file} ${distdir}/$${file}; \
    10099                fi; \
     
    108107
    109108#----------------------------------------------------------------------------------------------------------------
    110 
    111 all-local : # This name is important to automake and implies the default build target.
    112         @+${TEST_PY} --debug=${debug} --install=${installed} --invariant --archive-errors=${archiveerrors} ${concurrent} ${timeouts} ${ARCH} --all # '@' => do not echo command (SILENT), '+' => allows recursive make from within python program
    113 
    114 install : all-local # PAB only
    115 
    116 tests : all-local
    117 
    118 quick :
    119         @+${TEST_PY} --debug=${debug} --install=${installed} --archive-errors=${archiveerrors} ${concurrent} ${timeouts} ${ARCH} ${quick_test}
    120 
    121 concurrency :
    122         @+${TEST_PY} --debug=${debug} --install=${installed} ${ARCH} -Iconcurrent
    123 
    124 list :
    125         @+${TEST_PY} --list ${concurrent}
    126 
    127 help :
    128         @echo "user targets:"
    129         @echo "    Run the complete test suite."
    130         @echo "    $$ make (null) / tests [debug=yes/no] [installed=yes/no] [arch=${arch_support}]"
    131         @echo ""
    132         @echo "    Run the short (quick) test suite."
    133         @echo "    $$ make quick [debug=yes/no] [installed=yes/no] [arch=${arch_support}]"
    134         @echo ""
    135         @echo "    Run the concurrent test suite."
    136         @echo "    $$ make concurrency [debug=yes/no] [installed=yes/no] [arch=${arch_support}]"
    137         @echo ""
    138         @echo "    List all tests in the test suite."
    139         @echo "    $$ make list"
     109all-local :
     110        @+${TEST_PY} --debug=${debug} --install=${installed} --archive-errors=${archiveerrors} ${concurrent} ${timeouts} ${quick_test}
     111
     112all-tests :
     113        @+${TEST_PY} --debug=${debug} --install=${installed} --archive-errors=${archiveerrors} ${concurrent} ${timeouts} --all # '@' => do not echo command (SILENT), '+' => allows recursive make from within python program
    140114
    141115mostlyclean-local :
     
    149123        find ${builddir} -path '*.Po' -delete
    150124
     125list :
     126        @+${TEST_PY} --list ${concurrent}
     127
    151128.test_makeflags:
    152129        @echo "${MAKEFLAGS}"
    153130
    154131.validate: .validate.cfa
    155         ${CFACOMPILE} .validate.cfa -fsyntax-only -Wall -Wextra -Werror
     132        $(CFACOMPILE) .validate.cfa -fsyntax-only -Wall -Wextra -Werror
    156133
    157134.validate.cfa:
     
    165142        @echo "int bar() { return 0; }" > ${@}
    166143
     144concurrency :
     145        @+${TEST_PY} --debug=${debug}  --install=${installed} -Iconcurrent
     146
    167147#----------------------------------------------------------------------------------------------------------------
    168148
    169149# Use for all tests, make sure the path are correct and all flags are added
    170 CFACOMPILETEST=${PRETTY_PATH} ${CFACOMPILE} ${shell realpath --relative-to=${srcdir} ${<}} ${${shell echo "${@}_FLAGSCFA" | sed 's/-\|\//_/g'}}
     150CFACOMPILETEST=$(PRETTY_PATH) $(CFACOMPILE) $(shell realpath --relative-to=${srcdir} ${<}) $($(shell echo "${@}_FLAGSCFA" | sed 's/-\|\//_/g'))
    171151
    172152#----------------------------------------------------------------------------------------------------------------
     
    175155# split into two steps to support compiling remotely using distcc
    176156# don't use distcc to do the linking because distcc doesn't do linking
    177 % : %.cfa ${CFACCBIN}
    178         ${CFACOMPILETEST} -c -o ${abspath ${@}}.o -DIN_DIR="${abspath ${dir ${<}}}/.in/"
    179         ${CFACCLINK} ${@}.o -o ${abspath ${@}}
    180         rm ${abspath ${@}}.o
     157% : %.cfa $(CFACCBIN)
     158        $(CFACOMPILETEST) -c -o $(abspath ${@}).o -DIN_DIR="$(abspath $(dir ${<}))/.in/"
     159        $(CFACCLINK) ${@}.o -o $(abspath ${@})
     160        rm $(abspath ${@}).o
    181161
    182162# implicit rule for c++ test
    183163# convient for testing the testsuite itself but not actuall used
    184164% : %.cpp
    185         ${PRETTY_PATH} ${CXXCOMPILE} ${shell realpath --relative-to=${srcdir} ${<}} -o ${abspath ${@}}
     165        $(PRETTY_PATH) $(CXXCOMPILE) $(shell realpath --relative-to=${srcdir} ${<}) -o $(abspath ${@})
    186166
    187167#------------------------------------------------------------------------------
     
    194174# Generated code
    195175GENERATED_CODE = declarationSpecifier gccExtensions extension attributes functions KRfunctions
    196 ${GENERATED_CODE} : % : %.cfa ${CFACCBIN}
    197         ${CFACOMPILETEST} -CFA -XCFA -p -c -fsyntax-only -o ${abspath ${@}}
     176$(GENERATED_CODE): % : %.cfa $(CFACCBIN)
     177        $(CFACOMPILETEST) -CFA -XCFA -p -c -fsyntax-only -o $(abspath ${@})
    198178
    199179#------------------------------------------------------------------------------
     
    201181#------------------------------------------------------------------------------
    202182# tests that just validate syntax and compiler output should be compared to stderr
    203 CFACOMPILE_SYNTAX = ${CFACOMPILETEST} -Wno-unused-variable -Wno-unused-label -c -fsyntax-only -o ${abspath ${@}}
     183CFACOMPILE_SYNTAX = $(CFACOMPILETEST) -Wno-unused-variable -Wno-unused-label -c -fsyntax-only -o $(abspath ${@})
    204184
    205185SYNTAX_ONLY_CODE = expression typedefRedef variableDeclarator switch numericConstants identFuncDeclarator \
    206186        init1 limits nested-types cast labelledExit array quasiKeyword include/stdincludes include/includes builtins/sync warnings/self-assignment concurrent/waitfor/parse
    207 ${SYNTAX_ONLY_CODE} : % : %.cfa ${CFACCBIN}
    208         ${CFACOMPILE_SYNTAX}
    209         ${if ${test}, cp ${test} ${abspath ${@}}, }
     187$(SYNTAX_ONLY_CODE): % : %.cfa $(CFACCBIN)
     188        $(CFACOMPILE_SYNTAX)
     189        $(if $(test), cp $(test) $(abspath ${@}), )
    210190
    211191# expected failures
    212192# use custom target since they require a custom define *and* have a name that doesn't match the file
    213 alloc-ERROR : alloc.cfa ${CFACCBIN}
    214         ${CFACOMPILE_SYNTAX} -DERR1
    215         -cp ${test} ${abspath ${@}}
    216 
    217 init1-ERROR : init1.cfa ${CFACCBIN}
    218         ${CFACOMPILE_SYNTAX} -DERR1
    219         -cp ${test} ${abspath ${@}}
    220 
    221 typedefRedef-ERR1 : typedefRedef.cfa ${CFACCBIN}
    222         ${CFACOMPILE_SYNTAX} -DERR1
    223         -cp ${test} ${abspath ${@}}
    224 
    225 nested-types-ERR1 : nested-types.cfa ${CFACCBIN}
    226         ${CFACOMPILE_SYNTAX} -DERR1
    227         -cp ${test} ${abspath ${@}}
    228 
    229 nested-types-ERR2 : nested-types.cfa ${CFACCBIN}
    230         ${CFACOMPILE_SYNTAX} -DERR2
    231         -cp ${test} ${abspath ${@}}
    232 
    233 raii/memberCtors-ERR1 : raii/memberCtors.cfa ${CFACCBIN}
    234         ${CFACOMPILE_SYNTAX} -DERR1
    235         -cp ${test} ${abspath ${@}}
    236 
    237 raii/ctor-autogen-ERR1 : raii/ctor-autogen.cfa ${CFACCBIN}
    238         ${CFACOMPILE_SYNTAX} -DERR1
    239         -cp ${test} ${abspath ${@}}
    240 
    241 raii/dtor-early-exit-ERR1 : raii/dtor-early-exit.cfa ${CFACCBIN}
    242         ${CFACOMPILE_SYNTAX} -DERR1
    243         -cp ${test} ${abspath ${@}}
    244 
    245 raii/dtor-early-exit-ERR2 : raii/dtor-early-exit.cfa ${CFACCBIN}
    246         ${CFACOMPILE_SYNTAX} -DERR2
    247         -cp ${test} ${abspath ${@}}
     193alloc-ERROR : alloc.cfa $(CFACCBIN)
     194        $(CFACOMPILE_SYNTAX) -DERR1
     195        -cp $(test) $(abspath ${@})
     196
     197init1-ERROR : init1.cfa $(CFACCBIN)
     198        $(CFACOMPILE_SYNTAX) -DERR1
     199        -cp $(test) $(abspath ${@})
     200
     201typedefRedef-ERR1 : typedefRedef.cfa $(CFACCBIN)
     202        $(CFACOMPILE_SYNTAX) -DERR1
     203        -cp $(test) $(abspath ${@})
     204
     205nested-types-ERR1 : nested-types.cfa $(CFACCBIN)
     206        $(CFACOMPILE_SYNTAX) -DERR1
     207        -cp $(test) $(abspath ${@})
     208
     209nested-types-ERR2 : nested-types.cfa $(CFACCBIN)
     210        $(CFACOMPILE_SYNTAX) -DERR2
     211        -cp $(test) $(abspath ${@})
     212
     213raii/memberCtors-ERR1 : raii/memberCtors.cfa $(CFACCBIN)
     214        $(CFACOMPILE_SYNTAX) -DERR1
     215        -cp $(test) $(abspath ${@})
     216
     217raii/ctor-autogen-ERR1 : raii/ctor-autogen.cfa $(CFACCBIN)
     218        $(CFACOMPILE_SYNTAX) -DERR1
     219        -cp $(test) $(abspath ${@})
     220
     221raii/dtor-early-exit-ERR1 : raii/dtor-early-exit.cfa $(CFACCBIN)
     222        $(CFACOMPILE_SYNTAX) -DERR1
     223        -cp $(test) $(abspath ${@})
     224
     225raii/dtor-early-exit-ERR2 : raii/dtor-early-exit.cfa $(CFACCBIN)
     226        $(CFACOMPILE_SYNTAX) -DERR2
     227        -cp $(test) $(abspath ${@})
    248228
    249229# Exception Tests
    250230# Test with libcfathread; it changes how storage works.
    251231
    252 exceptions/%-threads : exceptions/%.cfa ${CFACCBIN}
    253         ${CFACOMPILETEST} -include exceptions/with-threads.hfa -c -o ${abspath ${@}}.o
    254         ${CFACCLOCAL} ${${shell echo "${@}_FLAGSLD" | sed 's/-\|\//_/g'}} ${abspath ${@}}.o -o ${abspath ${@}}
     232exceptions/%-threads : exceptions/%.cfa $(CFACCBIN)
     233        $(CFACOMPILETEST) -include exceptions/with-threads.hfa -c -o $(abspath ${@}).o
     234        $(CFACCLOCAL) $($(shell echo "${@}_FLAGSLD" | sed 's/-\|\//_/g')) $(abspath ${@}).o -o $(abspath ${@})
    255235
    256236# Linking tests
    257237# Meta tests to make sure we see linking errors (can't compile with -O2 since it may multiply number of calls)
    258 linking/linkerror : linking/linkerror.cfa ${CFACCBIN}
    259         ${CFACOMPILETEST} -O0 -c -o ${abspath ${@}}.o
    260         ${CFACCLINK}  -O0 ${@}.o -o ${abspath ${@}}
    261         rm ${abspath ${@}}.o
     238linking/linkerror : linking/linkerror.cfa $(CFACCBIN)
     239        $(CFACOMPILETEST) -O0 -c -o $(abspath ${@}).o
     240        $(CFACCLINK)  -O0 ${@}.o -o $(abspath ${@})
     241        rm $(abspath ${@}).o
    262242
    263243#------------------------------------------------------------------------------
  • tests/PRNG.cfa

    r044ae62 r3a513d89  
    88// Created On       : Wed Dec 29 09:38:12 2021
    99// Last Modified By : Peter A. Buhr
    10 // Last Modified On : Sun Apr 23 22:02:09 2023
    11 // Update Count     : 420
     10// Last Modified On : Sat Apr 15 16:44:31 2023
     11// Update Count     : 419
    1212//
    1313
     
    123123
    124124int main() {
    125         // setlocale( LC_NUMERIC, getenv( "LANG" ) );           // causes leaked storage message
    126 
    127         // only works on the current pthread thread
     125        // causes leaked storage message
     126        // setlocale( LC_NUMERIC, getenv( "LANG" ) );                   // print digit separator
    128127        // locale_t loc = newlocale( LC_NUMERIC_MASK, getenv( "LANG" ), (locale_t)0p );
    129128        // if ( loc == (locale_t)0p ) abort( "newlocale" );
  • tests/concurrent/futures/select_future.cfa

    r044ae62 r3a513d89  
    196196    delete( shared_future );
    197197        printf( "done 3\n" );
    198 }
     198
     199    // C_TODO: add test for select statement once it is implemented
     200}
Note: See TracChangeset for help on using the changeset viewer.