Changeset 044ae62


Ignore:
Timestamp:
May 29, 2023, 11:44:29 AM (2 years ago)
Author:
JiadaL <j82liang@…>
Branches:
ADT
Children:
fa2c005
Parents:
3a513d89 (diff), 2b78949 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge branch 'master' into ADT

Files:
306 added
8 deleted
68 edited

Legend:

Unmodified
Added
Removed
  • Jenkins/FullBuild

    r3a513d89 r044ae62  
    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 ) },
    2223                                        gcc_10_x64_new: { trigger_build( 'gcc-10',  'x64', false ) },
    2324                                        gcc_09_x64_new: { trigger_build( 'gcc-9',   'x64', false ) },
    2425                                        gcc_08_x64_new: { trigger_build( 'gcc-8',   'x64', false ) },
    2526                                        gcc_07_x64_new: { trigger_build( 'gcc-7',   'x64', false ) },
    26                                         gcc_06_x64_new: { trigger_build( 'gcc-6',   'x64', false ) },
     27                                        // gcc_06_x64_new: { trigger_build( 'gcc-6',   'x64', false ) },
    2728                                        clang_x64_new:  { trigger_build( 'clang',   'x64', true  ) },
    2829                                )
     
    4142        }
    4243
    43         //If an exception is caught we need to change the status and remember to
    44         //attach the build log to the email
     44        // If an exception is caught we need to change the status and remember to
     45        // attach the build log to the email
    4546        catch (Exception caughtError) {
    4647                echo('error caught')
     
    7374        // Run the build
    7475        // Don't propagate, it doesn't play nice with our email setup
    75         def result = build job: 'Cforall/master',               \
     76        def result = build job: 'Cforall/master',                       \
    7677                parameters: [                                           \
    7778                        [$class: 'StringParameterValue',                \
     
    8384                        [$class: 'BooleanParameterValue',               \
    8485                          name: 'NewAST',                               \
    85                           value: true],                                         \
     86                          value: true],                                 \
    8687                        [$class: 'BooleanParameterValue',               \
    8788                          name: 'RunAllTests',                          \
    88                           value: true],                                         \
     89                          value: true],                                 \
    8990                        [$class: 'BooleanParameterValue',               \
    9091                          name: 'RunBenchmark',                         \
    91                           value: true],                                         \
     92                          value: true],                                 \
    9293                        [$class: 'BooleanParameterValue',               \
    93                           name: 'BuildDocumentation',           \
     94                          name: 'BuildDocumentation',                   \
    9495                          value: doc],                                  \
    9596                        [$class: 'BooleanParameterValue',               \
    9697                          name: 'Publish',                              \
    97                           value: true],                                         \
     98                          value: true],                                 \
    9899                        [$class: 'BooleanParameterValue',               \
    99100                          name: 'Silent',                               \
    100                           value: true],                                         \
    101                 ],                                                              \
     101                          value: true],                                 \
     102                ],                                                      \
    102103                propagate: false
    103104
     
    111112
    112113def trigger_dist(String commitId, String buildNum) {
    113         def result = build job: 'Cforall_Distribute_Ref',       \
     114        def result = build job: 'Cforall_Distribute_Ref',               \
    114115                parameters: [                                           \
    115116                        string(name: 'GitRef', value: commitId),        \
    116                         string(name: 'Build' , value: buildNum) \
    117                 ],                                                              \
     117                        string(name: 'Build' , value: buildNum)         \
     118                ],                                                      \
    118119                propagate: false
    119120
  • Jenkinsfile

    r3a513d89 r044ae62  
    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" all-tests debug=yes archiveerrors=${BuildDir}/tests/crashes/full-debug"""
     157                                sh """make ${jopt} --no-print-directory -C tests timeouts="--timeout=600 --global-timeout=14400" 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" all-tests debug=no archiveerrors=${BuildDir}/tests/crashes/full-nodebug"""
     164                                sh """make ${jopt} --no-print-directory -C tests timeouts="--timeout=600 --global-timeout=14400" 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\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',                                                  \
     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',                          \
    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',
    409411
    410412        // It's unfortunate but it looks like we need to checkout the entire repo just to get
  • Makefile.am

    r3a513d89 r044ae62  
    1111## Created On       : Sun May 31 22:14:18 2015
    1212## Last Modified By : Peter A. Buhr
    13 ## Last Modified On : Sat Feb  2 16:54:42 2019
    14 ## Update Count     : 21
     13## Last Modified On : Wed May 17 11:02:34 2023
     14## Update Count     : 56
    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 check:
    41         $(MAKE) -C tests all-tests installed=no debug=${debug}
     39debug ?= yes
     40installed ?= no
     41ARCH = ${if ${arch},"arch=${arch}"}
     42arch_support = "x86/x64/arm"
    4243
    43 installcheck:
    44         $(MAKE) -C tests all-tests installed=yes debug=${debug}
     44# target "all" created by automake
    4545
    46 configure-libcfa: @LIBCFA_TARGET_MAKEFILES@
    47         @true
     46check :
     47        ${MAKE} -C tests tests installed=${installed} debug=${debug} ${ARCH}
    4848
    49 status: @LIBCFA_TARGET_MAKEFILES@
     49tests : check # synonym
     50
     51installcheck :
     52        ${MAKE} -C tests tests installed=yes debug=${debug} ${ARCH}
     53
     54installtest : installcheck # synonym
     55
     56status : @LIBCFA_TARGET_MAKEFILES@
    5057        @echo -ne "translator\n\t"
    5158        @./config.status --config | sed "s/ /\n\t/g; s/\t'/\t/g; s/'\n/\n/g; s/^'//g; s/'$$//g"
    5259        @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"
    5360
    54 @LIBCFA_TARGET_DIRS@::
    55         $(MAKE) -C $@ $(MAKECMDGOALS)
     61help :
     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"
    5674
    57 mostlyclean clean distclean maintainer-clean: @LIBCFA_TARGET_DIRS@
     75configure-libcfa : @LIBCFA_TARGET_MAKEFILES@
     76        @true
     77
     78@LIBCFA_TARGET_DIRS@ ::
     79        ${MAKE} -C ${@} ${MAKECMDGOALS}
     80
     81mostlyclean clean distclean maintainer-clean : @LIBCFA_TARGET_DIRS@
  • configure.ac

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

    r3a513d89 r044ae62  
    88%% Created On       : Sat May 13 16:34:42 2017
    99%% Last Modified By : Peter A. Buhr
    10 %% Last Modified On : Mon May 31 08:20:41 2021
    11 %% Update Count     : 28
     10%% Last Modified On : Tue May  2 08:52:35 2023
     11%% Update Count     : 30
    1212%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    1313
     
    112112\lstdefinelanguage{CFA}[ANSI]{C}{
    113113        morekeywords={
    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,
     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,
    122123    },
    123124        moredirectives={defined,include_next}%
  • doc/bibliography/pl.bib

    r3a513d89 r044ae62  
    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
    200215@misc{ActorBenchmarks,
    201     keywords    = {Actors, microbenchmarks, uC++. CAF, AkkaC, AkkaT, ProtoActor},
     216    keywords    = {Actors, microbenchmarks, uC++. CAF, ProtoActor, AkkaC, AkkaT},
    202217    contributer = {pabuhr@plg},
    203218    key         = {ActorBenchmarks},
     
    215230    publisher   = {MIT Press, Cambridge},
    216231    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},
    217254}
    218255
     
    303340
    304341@article{Agrawal08,
    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},
     342    keywords    = {Adaptive scheduling, multiprocessing, processor allocation, randomized algorithm, space sharing, thread scheduling, two-level scheduling, work-stealing},
    306343    author      = {Agrawal, Kunal and Leiserson, Charles E. and He, Yuxiong and Hsu, Wen Jing},
    307344    title       = {Adaptive Work-stealing with Parallelism Feedback},
     
    435472    month       = sep,
    436473    year        = 2016,
    437     note        = {\href{http://doc.akka.io/docs/akka/2.4/AkkaScala.pdf}{http://\-doc.akka.io/\-docs/\-akka/\-2.4/\-AkkaScala.pdf}},
     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,
    438484}
    439485
     
    443489    title       = {Akka Futures},
    444490    author      = {{Lightbend}},
    445     howpublished= {\href{https://doc.akka.io/docs/akka/2.5/futures.html}{https://\-doc.akka.io/\-docs/\-akka/\-2.5/\-futures.html}},
     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}},
    446501    year        = 2022,
    447502}
     
    11181173@inproceedings{CAF,
    11191174    keywords    = {performance measurement, actor model, c++, message-oriented middleware, distributed debugging},
     1175    contributer = {pabuhr@plg},
    11201176    author      = {Charousset, Dominik and Hiesgen, Raphael and Schmidt, Thomas C.},
    1121     title       = {{CAF} - the {C}++ Actor Framework for Scalable and Resource-Efficient Applications},
     1177    title       = {{CAF} -- the {C}++ Actor Framework for Scalable and Resource-Efficient Applications},
    11221178    publisher   = {ACM},
    11231179    address     = {New York, NY, USA},
    11241180    organization= {Proceedings of the 4th International Workshop on Programming Based on Actors Agents \& Decentralized Control},
    11251181    pages       = {15-28},
    1126     numpages    = {14},
     1182    numpages    = 14,
    11271183    location    = {Portland, Oregon, USA},
    11281184    series      = {AGERE'14},
    1129     year        = {2014},
     1185    year        = 2014,
    11301186}
    11311187
     
    31023158    year        = 2016,
    31033159    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}},
    31043170}
    31053171
     
    53365402}
    53375403
     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
    53385414@article{multilisp,
    53395415    keywords    = {futures, scheme},
     
    66186694}
    66196695
     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
    66206712@book{PowerPC,
    66216713    key         = {PowerPC processor},
     
    66796771    title       = {Programming Languages -- {C}},
    66806772    organization= {International Standard ISO/IEC 9899:1999 (E)},
    6681     publisher   = {American National Standards Institute},
     6773    publisher   = {American National Standards Institute},
    66826774    address     = {www.ansi.org},
    66836775    year        = 1999,
     
    66906782    title       = {{C}{\kern-.1em\hbox{\large\texttt{+\kern-.25em+}}} Programming Language ISO/IEC 14882:1998},
    66916783    edition     = {1st},
    6692     organization  = {International Standard Organization},
     6784    organization= {International Standard Organization},
    66936785    address     = {Geneva, Switzerland},
    66946786    year        = 1998,
     
    69817073}
    69827074
     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
    69837084@misc{Pthreads,
    69847085    keywords    = {pthreads, C concurrency},
     
    74587559    title       = {The Semantics of a Simple Language for Parallel Programming},
    74597560    author      = {Gilles Kahn},
    7460     booktitle   = {IFIP Congress},
     7561    organization= {IFIP Congress},
    74617562    year        = 1974,
    74627563}
     
    81738274
    81748275@article{SysVABI,
    8175     keywords    =  {System V ABI},
    8176     contributer =  {a3moss@uwaterloo.ca},
     8276    keywords    = {System V ABI},
     8277    contributer = {a3moss@uwaterloo.ca},
    81778278    title       = {System {V} application binary interface},
    81788279    author      = {Matz, Michael and Hubicka, Jan and Jaeger, Andreas and Mitchell, Mark},
     
    81808281    volume      = {99},
    81818282    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}
    81828295}
    81838296
     
    82068319    journal     = jcss,
    82078320    year        = 1978,
    8208     volume      = 17, pages = {348-375}
     8321    volume      = 17,
     8322    pages       = {348-375},
    82098323}
    82108324
  • doc/theses/colby_parsons_MMAth/Makefile

    r3a513d89 r044ae62  
    1313## Define the text source files.
    1414
    15 SOURCES = ${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                           \
     15SOURCES = ${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 \
    2325}
    2426
    25 FIGURES = ${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  \
     27FIGURES = ${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 \
    4850        figures/nasus_Channel_Contention \
    4951        figures/pyke_Channel_Contention \
    5052}
    5153
    52 DATA =  data/pykeSendStatic             \
    53                 data/pykeSendDynamic    \
    54                 data/pykeExecutorMem    \
    55                 data/nasusSendStatic    \
    56                 data/nasusSendDynamic   \
    57                 data/pykeExecutorMem    \
     54DATA =  data/pykeSendStatic \
     55        data/pykeSendDynamic\
     56        data/pykeExecutorMem\
     57        data/nasusSendStatic\
     58        data/nasusSendDynamic\
     59        data/pykeExecutorMem\
    5860
    59 PICTURES = ${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            \
     61PICTURES = ${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 \
    6769}
    6870
     
    105107        # Make index from *.aux entries and input index at end of document
    106108        makeglossaries -q -s ${Build}/${basename $@}.ist ${Build}/${basename $@}
    107         -version.sh
    108109        # Run again to finish citations
    109110        ${LaTeX} ${basename $@}.tex
    110        
    111111
    112112## Define the default recipes.
  • doc/theses/colby_parsons_MMAth/benchmarks/actors/data/nasus_CFA.txt

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

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

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

    r3a513d89 r044ae62  
    22import sys
    33import time
     4import itertools
    45import matplotlib.pyplot as plt
    56import matplotlib.ticker as ticks
     
    1718    'text.usetex': True,
    1819    'pgf.rcfonts': False,
     20    'font.size': 16
    1921})
     22marker = itertools.cycle(('o', 's', 'D', 'x', 'p', '^', 'h', '*', 'v' ))
    2023
    2124readfile = open(sys.argv[1], "r")
     
    7073    if currBench == Bench.Unset:
    7174        if line == "contend:":
    72             name = "Contend"
     75            name = "Channel Contention"
    7376            currBench = Bench.Contend
    7477        elif line == "zero:":
     
    126129                plt.xlabel("Cores")
    127130                for idx, arr in enumerate(data):
    128                     plt.errorbar( procs, arr, [bars[idx][0], bars[idx][1]], capsize=2, marker='o' )
     131                    plt.errorbar( procs, arr, [bars[idx][0], bars[idx][1]], capsize=2, marker=next(marker) )
    129132               
    130133                plt.yscale("log")
  • doc/theses/colby_parsons_MMAth/benchmarks/mutex_stmt/plotData.py

    r3a513d89 r044ae62  
    22import sys
    33import time
     4import itertools
    45import matplotlib.pyplot as plt
    56import matplotlib.ticker as ticks
     
    1718    'text.usetex': True,
    1819    'pgf.rcfonts': False,
     20    'font.size': 16
    1921})
     22marker = itertools.cycle(('o', 's', 'D', 'x', 'p', '^', 'h', '*', 'v' ))
    2023
    2124readfile = open(sys.argv[1], "r")
     
    99102                plt.xlabel("Cores")
    100103                for idx, arr in enumerate(data):
    101                     plt.errorbar( procs, arr, [bars[idx][0], bars[idx][1]], capsize=2, marker='o' )
     104                    plt.errorbar( procs, arr, [bars[idx][0], bars[idx][1]], capsize=2, marker=next(marker) )
    102105                plt.yscale("log")
    103106                plt.xticks(procs)
  • doc/theses/colby_parsons_MMAth/benchmarks/mutex_stmt/run

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

    r3a513d89 r044ae62  
    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
    5 static inline work_queue * try_swap_queues( worker & this, unsigned int victim_idx, unsigned int my_idx ) with(this) {
     1// sequential equivalent swap
     2void swap( uint victim_idx, uint my_idx  ) {
     3    // Step 0:
    64    work_queue * my_queue = request_queues[my_idx];
    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;
     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;
    2612}
    2713
     
    3521
    3622bool 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
    3725    work_queue * my_queue = request_queues[my_idx];
    3826    work_queue * vic_queue = request_queues[victim_idx];
    3927
     28    // Step 1:
    4029    // If either queue is 0p then they are in the process of being stolen
    4130    // 0p is CForAll's equivalent of C++'s nullptr
    42     if ( vic_queue == 0p || my_queue == 0p ) return false;
     31    if ( vic_queue == 0p ) return false;
    4332
    44     // Try to set our queue ptr to be 0p.
    45     // If this CAS fails someone moved our queue so return false
     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
    4636    if ( !CAS( &request_queues[my_idx], &my_queue, 0p ) )
    4737        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
     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
    5142    if ( !CAS( &request_queues[victim_idx], &vic_queue, my_queue ) ) {
    5243        request_queues[my_idx] = my_queue; // reset queue ptr back to prev val
     
    5445    }
    5546
     47    // Step 4:
    5648    // Successfully swapped.
    57     // Our queue is 0p so no one will touch it so write back without CAS is safe
     49    // Thief's ptr is 0p so no one will touch it
     50    // Write back without CAS is safe
    5851    request_queues[my_idx] = vic_queue;
    5952    return true;
  • doc/theses/colby_parsons_MMAth/figures/nasus_Aggregate_Lock_2.pgf

    r3a513d89 r044ae62  
    7777\pgfsetstrokecolor{textcolor}%
    7878\pgfsetfillcolor{textcolor}%
    79 \pgftext[x=1.025455in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 2\)}%
     79\pgftext[x=1.025455in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\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{10.000000}{12.000000}\selectfont \(\displaystyle 4\)}%
     104\pgftext[x=1.326061in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\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{10.000000}{12.000000}\selectfont \(\displaystyle 8\)}%
     129\pgftext[x=1.927273in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\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{10.000000}{12.000000}\selectfont \(\displaystyle 16\)}%
     154\pgftext[x=3.129697in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\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{10.000000}{12.000000}\selectfont \(\displaystyle 24\)}%
     179\pgftext[x=4.332121in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\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{10.000000}{12.000000}\selectfont \(\displaystyle 32\)}%
     204\pgftext[x=5.534545in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 32\)}%
    205205\end{pgfscope}%
    206206\begin{pgfscope}%
     
    208208\pgfsetstrokecolor{textcolor}%
    209209\pgfsetfillcolor{textcolor}%
    210 \pgftext[x=3.280000in,y=0.251766in,,top]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont Cores}%
     210\pgftext[x=3.280000in,y=0.161874in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont Cores}%
    211211\end{pgfscope}%
    212212\begin{pgfscope}%
     
    233233\pgfsetstrokecolor{textcolor}%
    234234\pgfsetfillcolor{textcolor}%
    235 \pgftext[x=0.501581in,y=1.092918in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 10^{5}\)}%
     235\pgftext[x=0.399655in,y=1.057810in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 10^{5}\)}%
    236236\end{pgfscope}%
    237237\begin{pgfscope}%
     
    258258\pgfsetstrokecolor{textcolor}%
    259259\pgfsetfillcolor{textcolor}%
    260 \pgftext[x=0.501581in,y=2.054062in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 10^{6}\)}%
     260\pgftext[x=0.399655in,y=2.018954in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 10^{6}\)}%
    261261\end{pgfscope}%
    262262\begin{pgfscope}%
     
    283283\pgfsetstrokecolor{textcolor}%
    284284\pgfsetfillcolor{textcolor}%
    285 \pgftext[x=0.501581in,y=3.015207in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 10^{7}\)}%
     285\pgftext[x=0.399655in,y=2.980099in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 10^{7}\)}%
    286286\end{pgfscope}%
    287287\begin{pgfscope}%
     
    308308\pgfsetstrokecolor{textcolor}%
    309309\pgfsetfillcolor{textcolor}%
    310 \pgftext[x=0.501581in,y=3.976351in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 10^{8}\)}%
     310\pgftext[x=0.399655in,y=3.941243in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 10^{8}\)}%
    311311\end{pgfscope}%
    312312\begin{pgfscope}%
     
    903903\pgfsetstrokecolor{textcolor}%
    904904\pgfsetfillcolor{textcolor}%
    905 \pgftext[x=0.446026in,y=2.376000in,,bottom,rotate=90.000000]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont Throughput (entries)}%
     905\pgftext[x=0.344100in,y=2.376000in,,bottom,rotate=90.000000]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont Throughput (entries)}%
    906906\end{pgfscope}%
    907907\begin{pgfscope}%
     
    14921492\end{pgfscope}%
    14931493\begin{pgfscope}%
    1494 \pgfsys@transformshift{3.129697in}{0in}%
     1494\pgfsys@transformshift{3.129697in}{-3.129697in}%
    14951495\pgfsys@useobject{currentmarker}{}%
    14961496\end{pgfscope}%
     
    16321632\pgfusepath{clip}%
    16331633\pgfsetbuttcap%
    1634 \pgfsetroundjoin%
     1634\pgfsetmiterjoin%
    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}%
    16391935\pgfsetstrokecolor{currentstroke}%
    16401936\pgfsetdash{}{0pt}%
     
    16531949}%
    16541950\begin{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}%
     1951\pgfsys@transformshift{3.869368in}{2.880475in}%
     1952\pgfsys@useobject{currentmarker}{}%
     1953\end{pgfscope}%
    18541954\end{pgfscope}%
    18551955\begin{pgfscope}%
     
    18571957\pgfsetstrokecolor{textcolor}%
    18581958\pgfsetfillcolor{textcolor}%
    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}%
     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}%
    19021979\pgfsetstrokecolor{currentstroke}%
    19031980\pgfsetdash{}{0pt}%
     
    19081985}%
    19091986\begin{pgfscope}%
    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}%
     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}%
    19211998\pgfsetstrokecolor{currentstroke}%
    19221999\pgfsetdash{}{0pt}%
     
    19272004}%
    19282005\begin{pgfscope}%
    1929 \pgfsys@transformshift{4.570184in}{2.749457in}%
     2006\pgfsys@transformshift{3.869368in}{2.667126in}%
    19302007\pgfsys@useobject{currentmarker}{}%
    19312008\end{pgfscope}%
     
    19352012\pgfsetroundjoin%
    19362013\pgfsetlinewidth{1.505625pt}%
    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}%
     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}%
    19512028\pgfsetstrokecolor{currentstroke}%
    19522029\pgfsetdash{}{0pt}%
    19532030\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.041667in}{-0.041667in}}{\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}}%
     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}}%
    19632035\pgfpathclose%
    19642036\pgfusepath{stroke,fill}%
    19652037}%
    19662038\begin{pgfscope}%
    1967 \pgfsys@transformshift{4.570184in}{2.680012in}%
     2039\pgfsys@transformshift{3.869368in}{2.556015in}%
    19682040\pgfsys@useobject{currentmarker}{}%
    19692041\end{pgfscope}%
     
    19732045\pgfsetstrokecolor{textcolor}%
    19742046\pgfsetfillcolor{textcolor}%
    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}%
     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}%
    19952067\pgfsetstrokecolor{currentstroke}%
    19962068\pgfsetdash{}{0pt}%
     
    20012073}%
    20022074\begin{pgfscope}%
    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}%
     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}%
    20142086\pgfsetstrokecolor{currentstroke}%
    20152087\pgfsetdash{}{0pt}%
     
    20202092}%
    20212093\begin{pgfscope}%
    2022 \pgfsys@transformshift{4.570184in}{2.555784in}%
     2094\pgfsys@transformshift{3.869368in}{2.342667in}%
    20232095\pgfsys@useobject{currentmarker}{}%
    20242096\end{pgfscope}%
     
    20282100\pgfsetroundjoin%
    20292101\pgfsetlinewidth{1.505625pt}%
    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}}%
     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}}%
    20562123\pgfpathclose%
    20572124\pgfusepath{stroke,fill}%
    20582125}%
    20592126\begin{pgfscope}%
    2060 \pgfsys@transformshift{4.570184in}{2.486339in}%
     2127\pgfsys@transformshift{3.869368in}{2.231556in}%
    20612128\pgfsys@useobject{currentmarker}{}%
    20622129\end{pgfscope}%
     
    20662133\pgfsetstrokecolor{textcolor}%
    20672134\pgfsetfillcolor{textcolor}%
    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}%
     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}%
    20882155\pgfsetstrokecolor{currentstroke}%
    20892156\pgfsetdash{}{0pt}%
     
    20942161}%
    20952162\begin{pgfscope}%
    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}%
     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}%
    21072174\pgfsetstrokecolor{currentstroke}%
    21082175\pgfsetdash{}{0pt}%
     
    21132180}%
    21142181\begin{pgfscope}%
    2115 \pgfsys@transformshift{4.570184in}{2.362111in}%
     2182\pgfsys@transformshift{3.869368in}{2.018207in}%
    21162183\pgfsys@useobject{currentmarker}{}%
    21172184\end{pgfscope}%
     
    21212188\pgfsetroundjoin%
    21222189\pgfsetlinewidth{1.505625pt}%
    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}%
     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}%
    21372204\pgfsetstrokecolor{currentstroke}%
    21382205\pgfsetdash{}{0pt}%
    21392206\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.041667in}{-0.041667in}}{\pgfqpoint{0.041667in}{0.041667in}}{%
    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}%
     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}%
    21542215\pgfsys@useobject{currentmarker}{}%
    21552216\end{pgfscope}%
     
    21592220\pgfsetstrokecolor{textcolor}%
    21602221\pgfsetfillcolor{textcolor}%
    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}%
     2222\pgftext[x=4.269368in,y=1.829318in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont CPP-rand}%
    22552223\end{pgfscope}%
    22562224\end{pgfpicture}%
  • doc/theses/colby_parsons_MMAth/figures/nasus_Aggregate_Lock_4.pgf

    r3a513d89 r044ae62  
    7777\pgfsetstrokecolor{textcolor}%
    7878\pgfsetfillcolor{textcolor}%
    79 \pgftext[x=1.025455in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 2\)}%
     79\pgftext[x=1.025455in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\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{10.000000}{12.000000}\selectfont \(\displaystyle 4\)}%
     104\pgftext[x=1.326061in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\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{10.000000}{12.000000}\selectfont \(\displaystyle 8\)}%
     129\pgftext[x=1.927273in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\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{10.000000}{12.000000}\selectfont \(\displaystyle 16\)}%
     154\pgftext[x=3.129697in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\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{10.000000}{12.000000}\selectfont \(\displaystyle 24\)}%
     179\pgftext[x=4.332121in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\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{10.000000}{12.000000}\selectfont \(\displaystyle 32\)}%
     204\pgftext[x=5.534545in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 32\)}%
    205205\end{pgfscope}%
    206206\begin{pgfscope}%
     
    208208\pgfsetstrokecolor{textcolor}%
    209209\pgfsetfillcolor{textcolor}%
    210 \pgftext[x=3.280000in,y=0.251766in,,top]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont Cores}%
     210\pgftext[x=3.280000in,y=0.161874in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont Cores}%
    211211\end{pgfscope}%
    212212\begin{pgfscope}%
     
    233233\pgfsetstrokecolor{textcolor}%
    234234\pgfsetfillcolor{textcolor}%
    235 \pgftext[x=0.501581in,y=0.732645in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 10^{3}\)}%
     235\pgftext[x=0.399655in,y=0.697537in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 10^{3}\)}%
    236236\end{pgfscope}%
    237237\begin{pgfscope}%
     
    258258\pgfsetstrokecolor{textcolor}%
    259259\pgfsetfillcolor{textcolor}%
    260 \pgftext[x=0.501581in,y=1.427374in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 10^{4}\)}%
     260\pgftext[x=0.399655in,y=1.392266in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 10^{4}\)}%
    261261\end{pgfscope}%
    262262\begin{pgfscope}%
     
    283283\pgfsetstrokecolor{textcolor}%
    284284\pgfsetfillcolor{textcolor}%
    285 \pgftext[x=0.501581in,y=2.122103in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 10^{5}\)}%
     285\pgftext[x=0.399655in,y=2.086994in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 10^{5}\)}%
    286286\end{pgfscope}%
    287287\begin{pgfscope}%
     
    308308\pgfsetstrokecolor{textcolor}%
    309309\pgfsetfillcolor{textcolor}%
    310 \pgftext[x=0.501581in,y=2.816831in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 10^{6}\)}%
     310\pgftext[x=0.399655in,y=2.781723in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 10^{6}\)}%
    311311\end{pgfscope}%
    312312\begin{pgfscope}%
     
    333333\pgfsetstrokecolor{textcolor}%
    334334\pgfsetfillcolor{textcolor}%
    335 \pgftext[x=0.501581in,y=3.511560in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 10^{7}\)}%
     335\pgftext[x=0.399655in,y=3.476452in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 10^{7}\)}%
    336336\end{pgfscope}%
    337337\begin{pgfscope}%
     
    11941194\pgfsetstrokecolor{textcolor}%
    11951195\pgfsetfillcolor{textcolor}%
    1196 \pgftext[x=0.446026in,y=2.376000in,,bottom,rotate=90.000000]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont Throughput (entries)}%
     1196\pgftext[x=0.344100in,y=2.376000in,,bottom,rotate=90.000000]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont Throughput (entries)}%
    11971197\end{pgfscope}%
    11981198\begin{pgfscope}%
     
    18571857\pgfusepath{clip}%
    18581858\pgfsetbuttcap%
    1859 \pgfsetroundjoin%
     1859\pgfsetmiterjoin%
    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.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}}%
     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}}%
    18761872\pgfpathclose%
    18771873\pgfusepath{stroke,fill}%
     
    19231919\pgfusepath{clip}%
    19241920\pgfsetbuttcap%
    1925 \pgfsetroundjoin%
     1921\pgfsetmiterjoin%
    19261922\definecolor{currentfill}{rgb}{1.000000,0.498039,0.054902}%
    19271923\pgfsetfillcolor{currentfill}%
     
    19311927\pgfsetdash{}{0pt}%
    19321928\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.041667in}{-0.041667in}}{\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}}%
     1929\pgfpathmoveto{\pgfqpoint{0.000000in}{0.041667in}}%
     1930\pgfpathlineto{\pgfqpoint{-0.041667in}{-0.041667in}}%
     1931\pgfpathlineto{\pgfqpoint{0.041667in}{-0.041667in}}%
    19421932\pgfpathclose%
    19431933\pgfusepath{stroke,fill}%
     
    19891979\pgfusepath{clip}%
    19901980\pgfsetbuttcap%
    1991 \pgfsetroundjoin%
     1981\pgfsetmiterjoin%
    19921982\definecolor{currentfill}{rgb}{0.172549,0.627451,0.172549}%
    19931983\pgfsetfillcolor{currentfill}%
     
    19961986\pgfsetstrokecolor{currentstroke}%
    19971987\pgfsetdash{}{0pt}%
    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}}%
     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}}%
    20081995\pgfpathclose%
    20091996\pgfusepath{stroke,fill}%
     
    20552042\pgfusepath{clip}%
    20562043\pgfsetbuttcap%
    2057 \pgfsetroundjoin%
     2044\pgfsetbeveljoin%
    20582045\definecolor{currentfill}{rgb}{0.839216,0.152941,0.156863}%
    20592046\pgfsetfillcolor{currentfill}%
     
    20622049\pgfsetstrokecolor{currentstroke}%
    20632050\pgfsetdash{}{0pt}%
    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}}%
     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}}%
    20742062\pgfpathclose%
    20752063\pgfusepath{stroke,fill}%
     
    21482136\pgfsetstrokecolor{textcolor}%
    21492137\pgfsetfillcolor{textcolor}%
    2150 \pgftext[x=3.280000in,y=4.307333in,,base]{\color{textcolor}\rmfamily\fontsize{12.000000}{14.400000}\selectfont Aggregate Lock Benchmark: 4 Locks}%
     2138\pgftext[x=3.280000in,y=4.307333in,,base]{\color{textcolor}\rmfamily\fontsize{19.200000}{23.040000}\selectfont Aggregate Lock Benchmark: 4 Locks}%
    21512139\end{pgfscope}%
    21522140\begin{pgfscope}%
     
    21612149\pgfsetstrokeopacity{0.800000}%
    21622150\pgfsetdash{}{0pt}%
    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}}%
     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}}%
    21722160\pgfpathclose%
    21732161\pgfusepath{stroke,fill}%
     
    21802168\pgfsetstrokecolor{currentstroke}%
    21812169\pgfsetdash{}{0pt}%
    2182 \pgfpathmoveto{\pgfqpoint{1.063889in}{1.240191in}}%
    2183 \pgfpathlineto{\pgfqpoint{1.063889in}{1.379080in}}%
     2170\pgfpathmoveto{\pgfqpoint{3.869368in}{2.769364in}}%
     2171\pgfpathlineto{\pgfqpoint{3.869368in}{2.991586in}}%
    21842172\pgfusepath{stroke}%
    21852173\end{pgfscope}%
     
    21992187}%
    22002188\begin{pgfscope}%
    2201 \pgfsys@transformshift{1.063889in}{1.240191in}%
     2189\pgfsys@transformshift{3.869368in}{2.769364in}%
    22022190\pgfsys@useobject{currentmarker}{}%
    22032191\end{pgfscope}%
     
    22182206}%
    22192207\begin{pgfscope}%
    2220 \pgfsys@transformshift{1.063889in}{1.379080in}%
     2208\pgfsys@transformshift{3.869368in}{2.991586in}%
    22212209\pgfsys@useobject{currentmarker}{}%
    22222210\end{pgfscope}%
     
    22292217\pgfsetstrokecolor{currentstroke}%
    22302218\pgfsetdash{}{0pt}%
    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%
     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%
    22382226\definecolor{currentfill}{rgb}{0.121569,0.466667,0.705882}%
    22392227\pgfsetfillcolor{currentfill}%
     
    22422230\pgfsetstrokecolor{currentstroke}%
    22432231\pgfsetdash{}{0pt}%
    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}}%
     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}}%
    22542238\pgfpathclose%
    22552239\pgfusepath{stroke,fill}%
    22562240}%
    22572241\begin{pgfscope}%
    2258 \pgfsys@transformshift{1.063889in}{1.309636in}%
     2242\pgfsys@transformshift{3.869368in}{2.880475in}%
    22592243\pgfsys@useobject{currentmarker}{}%
    22602244\end{pgfscope}%
     
    22642248\pgfsetstrokecolor{textcolor}%
    22652249\pgfsetfillcolor{textcolor}%
    2266 \pgftext[x=1.313889in,y=1.261024in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont CFA-baseline}%
     2250\pgftext[x=4.269368in,y=2.802697in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont CFA-baseline}%
    22672251\end{pgfscope}%
    22682252\begin{pgfscope}%
     
    22732257\pgfsetstrokecolor{currentstroke}%
    22742258\pgfsetdash{}{0pt}%
    2275 \pgfpathmoveto{\pgfqpoint{1.063889in}{1.046518in}}%
    2276 \pgfpathlineto{\pgfqpoint{1.063889in}{1.185407in}}%
     2259\pgfpathmoveto{\pgfqpoint{3.869368in}{2.444904in}}%
     2260\pgfpathlineto{\pgfqpoint{3.869368in}{2.667126in}}%
    22772261\pgfusepath{stroke}%
    22782262\end{pgfscope}%
     
    22922276}%
    22932277\begin{pgfscope}%
    2294 \pgfsys@transformshift{1.063889in}{1.046518in}%
     2278\pgfsys@transformshift{3.869368in}{2.444904in}%
    22952279\pgfsys@useobject{currentmarker}{}%
    22962280\end{pgfscope}%
     
    23112295}%
    23122296\begin{pgfscope}%
    2313 \pgfsys@transformshift{1.063889in}{1.185407in}%
     2297\pgfsys@transformshift{3.869368in}{2.667126in}%
    23142298\pgfsys@useobject{currentmarker}{}%
    23152299\end{pgfscope}%
     
    23222306\pgfsetstrokecolor{currentstroke}%
    23232307\pgfsetdash{}{0pt}%
    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%
     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%
    23312315\definecolor{currentfill}{rgb}{1.000000,0.498039,0.054902}%
    23322316\pgfsetfillcolor{currentfill}%
     
    23362320\pgfsetdash{}{0pt}%
    23372321\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.041667in}{-0.041667in}}{\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}}%
     2322\pgfpathmoveto{\pgfqpoint{0.000000in}{0.041667in}}%
     2323\pgfpathlineto{\pgfqpoint{-0.041667in}{-0.041667in}}%
     2324\pgfpathlineto{\pgfqpoint{0.041667in}{-0.041667in}}%
    23472325\pgfpathclose%
    23482326\pgfusepath{stroke,fill}%
    23492327}%
    23502328\begin{pgfscope}%
    2351 \pgfsys@transformshift{1.063889in}{1.115963in}%
     2329\pgfsys@transformshift{3.869368in}{2.556015in}%
    23522330\pgfsys@useobject{currentmarker}{}%
    23532331\end{pgfscope}%
     
    23572335\pgfsetstrokecolor{textcolor}%
    23582336\pgfsetfillcolor{textcolor}%
    2359 \pgftext[x=1.313889in,y=1.067352in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont CPP-baseline}%
     2337\pgftext[x=4.269368in,y=2.478238in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont CPP-baseline}%
    23602338\end{pgfscope}%
    23612339\begin{pgfscope}%
     
    23662344\pgfsetstrokecolor{currentstroke}%
    23672345\pgfsetdash{}{0pt}%
    2368 \pgfpathmoveto{\pgfqpoint{1.063889in}{0.852846in}}%
    2369 \pgfpathlineto{\pgfqpoint{1.063889in}{0.991734in}}%
     2346\pgfpathmoveto{\pgfqpoint{3.869368in}{2.120444in}}%
     2347\pgfpathlineto{\pgfqpoint{3.869368in}{2.342667in}}%
    23702348\pgfusepath{stroke}%
    23712349\end{pgfscope}%
     
    23852363}%
    23862364\begin{pgfscope}%
    2387 \pgfsys@transformshift{1.063889in}{0.852846in}%
     2365\pgfsys@transformshift{3.869368in}{2.120444in}%
    23882366\pgfsys@useobject{currentmarker}{}%
    23892367\end{pgfscope}%
     
    24042382}%
    24052383\begin{pgfscope}%
    2406 \pgfsys@transformshift{1.063889in}{0.991734in}%
     2384\pgfsys@transformshift{3.869368in}{2.342667in}%
    24072385\pgfsys@useobject{currentmarker}{}%
    24082386\end{pgfscope}%
     
    24152393\pgfsetstrokecolor{currentstroke}%
    24162394\pgfsetdash{}{0pt}%
    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%
     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%
    24242402\definecolor{currentfill}{rgb}{0.172549,0.627451,0.172549}%
    24252403\pgfsetfillcolor{currentfill}%
     
    24282406\pgfsetstrokecolor{currentstroke}%
    24292407\pgfsetdash{}{0pt}%
    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}}%
     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}}%
    24402415\pgfpathclose%
    24412416\pgfusepath{stroke,fill}%
    24422417}%
    24432418\begin{pgfscope}%
    2444 \pgfsys@transformshift{1.063889in}{0.922290in}%
     2419\pgfsys@transformshift{3.869368in}{2.231556in}%
    24452420\pgfsys@useobject{currentmarker}{}%
    24462421\end{pgfscope}%
     
    24502425\pgfsetstrokecolor{textcolor}%
    24512426\pgfsetfillcolor{textcolor}%
    2452 \pgftext[x=1.313889in,y=0.873679in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont CFA-rand}%
     2427\pgftext[x=4.269368in,y=2.153778in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont CFA-rand}%
    24532428\end{pgfscope}%
    24542429\begin{pgfscope}%
     
    24592434\pgfsetstrokecolor{currentstroke}%
    24602435\pgfsetdash{}{0pt}%
    2461 \pgfpathmoveto{\pgfqpoint{1.063889in}{0.659173in}}%
    2462 \pgfpathlineto{\pgfqpoint{1.063889in}{0.798062in}}%
     2436\pgfpathmoveto{\pgfqpoint{3.869368in}{1.795985in}}%
     2437\pgfpathlineto{\pgfqpoint{3.869368in}{2.018207in}}%
    24632438\pgfusepath{stroke}%
    24642439\end{pgfscope}%
     
    24782453}%
    24792454\begin{pgfscope}%
    2480 \pgfsys@transformshift{1.063889in}{0.659173in}%
     2455\pgfsys@transformshift{3.869368in}{1.795985in}%
    24812456\pgfsys@useobject{currentmarker}{}%
    24822457\end{pgfscope}%
     
    24972472}%
    24982473\begin{pgfscope}%
    2499 \pgfsys@transformshift{1.063889in}{0.798062in}%
     2474\pgfsys@transformshift{3.869368in}{2.018207in}%
    25002475\pgfsys@useobject{currentmarker}{}%
    25012476\end{pgfscope}%
     
    25082483\pgfsetstrokecolor{currentstroke}%
    25092484\pgfsetdash{}{0pt}%
    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%
     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%
    25172492\definecolor{currentfill}{rgb}{0.839216,0.152941,0.156863}%
    25182493\pgfsetfillcolor{currentfill}%
     
    25212496\pgfsetstrokecolor{currentstroke}%
    25222497\pgfsetdash{}{0pt}%
    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}}%
     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}}%
    25332509\pgfpathclose%
    25342510\pgfusepath{stroke,fill}%
    25352511}%
    25362512\begin{pgfscope}%
    2537 \pgfsys@transformshift{1.063889in}{0.728617in}%
     2513\pgfsys@transformshift{3.869368in}{1.907096in}%
    25382514\pgfsys@useobject{currentmarker}{}%
    25392515\end{pgfscope}%
     
    25432519\pgfsetstrokecolor{textcolor}%
    25442520\pgfsetfillcolor{textcolor}%
    2545 \pgftext[x=1.313889in,y=0.680006in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont CPP-rand}%
     2521\pgftext[x=4.269368in,y=1.829318in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont CPP-rand}%
    25462522\end{pgfscope}%
    25472523\end{pgfpicture}%
  • doc/theses/colby_parsons_MMAth/figures/nasus_Aggregate_Lock_8.pgf

    r3a513d89 r044ae62  
    7777\pgfsetstrokecolor{textcolor}%
    7878\pgfsetfillcolor{textcolor}%
    79 \pgftext[x=1.025455in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 2\)}%
     79\pgftext[x=1.025455in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\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{10.000000}{12.000000}\selectfont \(\displaystyle 4\)}%
     104\pgftext[x=1.326061in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\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{10.000000}{12.000000}\selectfont \(\displaystyle 8\)}%
     129\pgftext[x=1.927273in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\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{10.000000}{12.000000}\selectfont \(\displaystyle 16\)}%
     154\pgftext[x=3.129697in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\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{10.000000}{12.000000}\selectfont \(\displaystyle 24\)}%
     179\pgftext[x=4.332121in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\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{10.000000}{12.000000}\selectfont \(\displaystyle 32\)}%
     204\pgftext[x=5.534545in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 32\)}%
    205205\end{pgfscope}%
    206206\begin{pgfscope}%
     
    208208\pgfsetstrokecolor{textcolor}%
    209209\pgfsetfillcolor{textcolor}%
    210 \pgftext[x=3.280000in,y=0.251766in,,top]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont Cores}%
     210\pgftext[x=3.280000in,y=0.161874in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont Cores}%
    211211\end{pgfscope}%
    212212\begin{pgfscope}%
     
    233233\pgfsetstrokecolor{textcolor}%
    234234\pgfsetfillcolor{textcolor}%
    235 \pgftext[x=0.501581in,y=0.735604in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 10^{3}\)}%
     235\pgftext[x=0.399655in,y=0.700496in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 10^{3}\)}%
    236236\end{pgfscope}%
    237237\begin{pgfscope}%
     
    258258\pgfsetstrokecolor{textcolor}%
    259259\pgfsetfillcolor{textcolor}%
    260 \pgftext[x=0.501581in,y=1.378869in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 10^{4}\)}%
     260\pgftext[x=0.399655in,y=1.343761in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 10^{4}\)}%
    261261\end{pgfscope}%
    262262\begin{pgfscope}%
     
    283283\pgfsetstrokecolor{textcolor}%
    284284\pgfsetfillcolor{textcolor}%
    285 \pgftext[x=0.501581in,y=2.022134in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 10^{5}\)}%
     285\pgftext[x=0.399655in,y=1.987026in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 10^{5}\)}%
    286286\end{pgfscope}%
    287287\begin{pgfscope}%
     
    308308\pgfsetstrokecolor{textcolor}%
    309309\pgfsetfillcolor{textcolor}%
    310 \pgftext[x=0.501581in,y=2.665399in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 10^{6}\)}%
     310\pgftext[x=0.399655in,y=2.630291in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 10^{6}\)}%
    311311\end{pgfscope}%
    312312\begin{pgfscope}%
     
    333333\pgfsetstrokecolor{textcolor}%
    334334\pgfsetfillcolor{textcolor}%
    335 \pgftext[x=0.501581in,y=3.308663in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 10^{7}\)}%
     335\pgftext[x=0.399655in,y=3.273555in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 10^{7}\)}%
    336336\end{pgfscope}%
    337337\begin{pgfscope}%
     
    358358\pgfsetstrokecolor{textcolor}%
    359359\pgfsetfillcolor{textcolor}%
    360 \pgftext[x=0.501581in,y=3.951928in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 10^{8}\)}%
     360\pgftext[x=0.399655in,y=3.916820in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 10^{8}\)}%
    361361\end{pgfscope}%
    362362\begin{pgfscope}%
     
    12381238\pgfsetstrokecolor{textcolor}%
    12391239\pgfsetfillcolor{textcolor}%
    1240 \pgftext[x=0.446026in,y=2.376000in,,bottom,rotate=90.000000]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont Throughput (entries)}%
     1240\pgftext[x=0.344100in,y=2.376000in,,bottom,rotate=90.000000]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont Throughput (entries)}%
    12411241\end{pgfscope}%
    12421242\begin{pgfscope}%
     
    19011901\pgfusepath{clip}%
    19021902\pgfsetbuttcap%
    1903 \pgfsetroundjoin%
     1903\pgfsetmiterjoin%
    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}%
    19081968\pgfsetstrokecolor{currentstroke}%
    19091969\pgfsetdash{}{0pt}%
     
    19221982}%
    19231983\begin{pgfscope}%
    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}%
     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}%
    19452005\pgfsys@useobject{currentmarker}{}%
    19462006\end{pgfscope}%
     
    19522012\pgfsetroundjoin%
    19532013\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}%
    19542294\definecolor{currentstroke}{rgb}{1.000000,0.498039,0.054902}%
    19552295\pgfsetstrokecolor{currentstroke}%
    19562296\pgfsetdash{}{0pt}%
    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}%
     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}%
    19682351\pgfsetbuttcap%
    19692352\pgfsetroundjoin%
     
    19882371}%
    19892372\begin{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}%
     2373\pgfsys@transformshift{3.869368in}{2.556015in}%
     2374\pgfsys@useobject{currentmarker}{}%
     2375\end{pgfscope}%
    21892376\end{pgfscope}%
    21902377\begin{pgfscope}%
     
    21922379\pgfsetstrokecolor{textcolor}%
    21932380\pgfsetfillcolor{textcolor}%
    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}%
     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}%
    22022399\pgfsetlinewidth{1.003750pt}%
    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}%
     2400\definecolor{currentstroke}{rgb}{0.172549,0.627451,0.172549}%
    22372401\pgfsetstrokecolor{currentstroke}%
    22382402\pgfsetdash{}{0pt}%
     
    22432407}%
    22442408\begin{pgfscope}%
    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}%
     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}%
    22532417\pgfsetfillcolor{currentfill}%
    22542418\pgfsetlinewidth{1.003750pt}%
    2255 \definecolor{currentstroke}{rgb}{0.121569,0.466667,0.705882}%
     2419\definecolor{currentstroke}{rgb}{0.172549,0.627451,0.172549}%
    22562420\pgfsetstrokecolor{currentstroke}%
    22572421\pgfsetdash{}{0pt}%
     
    22622426}%
    22632427\begin{pgfscope}%
    2264 \pgfsys@transformshift{4.570184in}{2.749457in}%
     2428\pgfsys@transformshift{3.869368in}{2.342667in}%
    22652429\pgfsys@useobject{currentmarker}{}%
    22662430\end{pgfscope}%
     
    22702434\pgfsetroundjoin%
    22712435\pgfsetlinewidth{1.505625pt}%
    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}%
     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}%
    22832447\pgfsetfillcolor{currentfill}%
    22842448\pgfsetlinewidth{1.003750pt}%
    2285 \definecolor{currentstroke}{rgb}{0.121569,0.466667,0.705882}%
     2449\definecolor{currentstroke}{rgb}{0.172549,0.627451,0.172549}%
    22862450\pgfsetstrokecolor{currentstroke}%
    22872451\pgfsetdash{}{0pt}%
    22882452\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.041667in}{-0.041667in}}{\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}}%
     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}}%
    22982457\pgfpathclose%
    22992458\pgfusepath{stroke,fill}%
    23002459}%
    23012460\begin{pgfscope}%
    2302 \pgfsys@transformshift{4.570184in}{2.680012in}%
     2461\pgfsys@transformshift{3.869368in}{2.231556in}%
    23032462\pgfsys@useobject{currentmarker}{}%
    23042463\end{pgfscope}%
     
    23082467\pgfsetstrokecolor{textcolor}%
    23092468\pgfsetfillcolor{textcolor}%
    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}%
     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}%
    23272486\pgfsetfillcolor{currentfill}%
    23282487\pgfsetlinewidth{1.003750pt}%
    2329 \definecolor{currentstroke}{rgb}{1.000000,0.498039,0.054902}%
     2488\definecolor{currentstroke}{rgb}{0.839216,0.152941,0.156863}%
    23302489\pgfsetstrokecolor{currentstroke}%
    23312490\pgfsetdash{}{0pt}%
     
    23362495}%
    23372496\begin{pgfscope}%
    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}%
     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}%
    23462505\pgfsetfillcolor{currentfill}%
    23472506\pgfsetlinewidth{1.003750pt}%
    2348 \definecolor{currentstroke}{rgb}{1.000000,0.498039,0.054902}%
     2507\definecolor{currentstroke}{rgb}{0.839216,0.152941,0.156863}%
    23492508\pgfsetstrokecolor{currentstroke}%
    23502509\pgfsetdash{}{0pt}%
     
    23552514}%
    23562515\begin{pgfscope}%
    2357 \pgfsys@transformshift{4.570184in}{2.555784in}%
     2516\pgfsys@transformshift{3.869368in}{2.018207in}%
    23582517\pgfsys@useobject{currentmarker}{}%
    23592518\end{pgfscope}%
     
    23632522\pgfsetroundjoin%
    23642523\pgfsetlinewidth{1.505625pt}%
    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}%
     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}%
    23762535\pgfsetfillcolor{currentfill}%
    23772536\pgfsetlinewidth{1.003750pt}%
    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}}%
     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}}%
    23912545\pgfpathclose%
    23922546\pgfusepath{stroke,fill}%
    23932547}%
    23942548\begin{pgfscope}%
    2395 \pgfsys@transformshift{4.570184in}{2.486339in}%
     2549\pgfsys@transformshift{3.869368in}{1.907096in}%
    23962550\pgfsys@useobject{currentmarker}{}%
    23972551\end{pgfscope}%
     
    24012555\pgfsetstrokecolor{textcolor}%
    24022556\pgfsetfillcolor{textcolor}%
    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}%
     2557\pgftext[x=4.269368in,y=1.829318in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont CPP-rand}%
    25902558\end{pgfscope}%
    25912559\end{pgfpicture}%
  • doc/theses/colby_parsons_MMAth/figures/nasus_Channel_Contention.pgf

    r3a513d89 r044ae62  
    7777\pgfsetstrokecolor{textcolor}%
    7878\pgfsetfillcolor{textcolor}%
    79 \pgftext[x=1.025455in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 2\)}%
     79\pgftext[x=1.025455in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\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{10.000000}{12.000000}\selectfont \(\displaystyle 4\)}%
     104\pgftext[x=1.326061in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\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{10.000000}{12.000000}\selectfont \(\displaystyle 8\)}%
     129\pgftext[x=1.927273in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\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{10.000000}{12.000000}\selectfont \(\displaystyle 16\)}%
     154\pgftext[x=3.129697in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\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{10.000000}{12.000000}\selectfont \(\displaystyle 24\)}%
     179\pgftext[x=4.332121in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\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{10.000000}{12.000000}\selectfont \(\displaystyle 32\)}%
     204\pgftext[x=5.534545in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 32\)}%
    205205\end{pgfscope}%
    206206\begin{pgfscope}%
     
    208208\pgfsetstrokecolor{textcolor}%
    209209\pgfsetfillcolor{textcolor}%
    210 \pgftext[x=3.280000in,y=0.251766in,,top]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont Cores}%
     210\pgftext[x=3.280000in,y=0.161874in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont Cores}%
    211211\end{pgfscope}%
    212212\begin{pgfscope}%
     
    233233\pgfsetstrokecolor{textcolor}%
    234234\pgfsetfillcolor{textcolor}%
    235 \pgftext[x=0.501581in,y=2.047723in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 10^{8}\)}%
     235\pgftext[x=0.399655in,y=2.012615in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 10^{8}\)}%
    236236\end{pgfscope}%
    237237\begin{pgfscope}%
     
    467467\pgfsetstrokecolor{textcolor}%
    468468\pgfsetfillcolor{textcolor}%
    469 \pgftext[x=0.446026in,y=2.376000in,,bottom,rotate=90.000000]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont Throughput (channel operations)}%
     469\pgftext[x=0.344100in,y=2.376000in,,bottom,rotate=90.000000]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont Throughput (channel operations)}%
    470470\end{pgfscope}%
    471471\begin{pgfscope}%
     
    876876\pgfusepath{clip}%
    877877\pgfsetbuttcap%
    878 \pgfsetroundjoin%
     878\pgfsetmiterjoin%
    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}%
    8831058\pgfsetstrokecolor{currentstroke}%
    8841059\pgfsetdash{}{0pt}%
     
    8971072}%
    8981073\begin{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}%
     1074\pgfsys@transformshift{4.713959in}{3.935111in}%
     1075\pgfsys@useobject{currentmarker}{}%
     1076\end{pgfscope}%
    9661077\end{pgfscope}%
    9671078\begin{pgfscope}%
     
    9691080\pgfsetstrokecolor{textcolor}%
    9701081\pgfsetfillcolor{textcolor}%
    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}%
     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}%
    10141102\pgfsetstrokecolor{currentstroke}%
    10151103\pgfsetdash{}{0pt}%
     
    10201108}%
    10211109\begin{pgfscope}%
    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}%
     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}%
    10331121\pgfsetstrokecolor{currentstroke}%
    10341122\pgfsetdash{}{0pt}%
     
    10391127}%
    10401128\begin{pgfscope}%
    1041 \pgfsys@transformshift{5.105293in}{4.119833in}%
     1129\pgfsys@transformshift{4.713959in}{3.721763in}%
    10421130\pgfsys@useobject{currentmarker}{}%
    10431131\end{pgfscope}%
     
    10471135\pgfsetroundjoin%
    10481136\pgfsetlinewidth{1.505625pt}%
    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}%
     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}%
    10631151\pgfsetstrokecolor{currentstroke}%
    10641152\pgfsetdash{}{0pt}%
    10651153\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.041667in}{-0.041667in}}{\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}}%
     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}}%
    10751158\pgfpathclose%
    10761159\pgfusepath{stroke,fill}%
    10771160}%
    10781161\begin{pgfscope}%
    1079 \pgfsys@transformshift{5.105293in}{4.050389in}%
     1162\pgfsys@transformshift{4.713959in}{3.610651in}%
    10801163\pgfsys@useobject{currentmarker}{}%
    10811164\end{pgfscope}%
     
    10851168\pgfsetstrokecolor{textcolor}%
    10861169\pgfsetfillcolor{textcolor}%
    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}%
     1170\pgftext[x=5.113959in,y=3.532874in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont Go}%
    11811171\end{pgfscope}%
    11821172\end{pgfpicture}%
  • doc/theses/colby_parsons_MMAth/figures/pyke_Aggregate_Lock_2.pgf

    r3a513d89 r044ae62  
    7777\pgfsetstrokecolor{textcolor}%
    7878\pgfsetfillcolor{textcolor}%
    79 \pgftext[x=1.025455in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 2\)}%
     79\pgftext[x=1.025455in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\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{10.000000}{12.000000}\selectfont \(\displaystyle 4\)}%
     104\pgftext[x=1.326061in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\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{10.000000}{12.000000}\selectfont \(\displaystyle 8\)}%
     129\pgftext[x=1.927273in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\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{10.000000}{12.000000}\selectfont \(\displaystyle 16\)}%
     154\pgftext[x=3.129697in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\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{10.000000}{12.000000}\selectfont \(\displaystyle 24\)}%
     179\pgftext[x=4.332121in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\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{10.000000}{12.000000}\selectfont \(\displaystyle 32\)}%
     204\pgftext[x=5.534545in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 32\)}%
    205205\end{pgfscope}%
    206206\begin{pgfscope}%
     
    208208\pgfsetstrokecolor{textcolor}%
    209209\pgfsetfillcolor{textcolor}%
    210 \pgftext[x=3.280000in,y=0.251766in,,top]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont Cores}%
     210\pgftext[x=3.280000in,y=0.161874in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont Cores}%
    211211\end{pgfscope}%
    212212\begin{pgfscope}%
     
    233233\pgfsetstrokecolor{textcolor}%
    234234\pgfsetfillcolor{textcolor}%
    235 \pgftext[x=0.501581in,y=0.963915in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 10^{6}\)}%
     235\pgftext[x=0.399655in,y=0.928807in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 10^{6}\)}%
    236236\end{pgfscope}%
    237237\begin{pgfscope}%
     
    258258\pgfsetstrokecolor{textcolor}%
    259259\pgfsetfillcolor{textcolor}%
    260 \pgftext[x=0.501581in,y=2.355276in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 10^{7}\)}%
     260\pgftext[x=0.399655in,y=2.320168in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 10^{7}\)}%
    261261\end{pgfscope}%
    262262\begin{pgfscope}%
     
    283283\pgfsetstrokecolor{textcolor}%
    284284\pgfsetfillcolor{textcolor}%
    285 \pgftext[x=0.501581in,y=3.746636in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 10^{8}\)}%
     285\pgftext[x=0.399655in,y=3.711528in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 10^{8}\)}%
    286286\end{pgfscope}%
    287287\begin{pgfscope}%
     
    707707\pgfsetstrokecolor{textcolor}%
    708708\pgfsetfillcolor{textcolor}%
    709 \pgftext[x=0.446026in,y=2.376000in,,bottom,rotate=90.000000]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont Throughput (entries)}%
     709\pgftext[x=0.344100in,y=2.376000in,,bottom,rotate=90.000000]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont Throughput (entries)}%
    710710\end{pgfscope}%
    711711\begin{pgfscope}%
     
    14361436\pgfusepath{clip}%
    14371437\pgfsetbuttcap%
    1438 \pgfsetroundjoin%
     1438\pgfsetmiterjoin%
    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}%
    14431739\pgfsetstrokecolor{currentstroke}%
    14441740\pgfsetdash{}{0pt}%
     
    14571753}%
    14581754\begin{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}%
     1755\pgfsys@transformshift{1.222222in}{1.825839in}%
     1756\pgfsys@useobject{currentmarker}{}%
     1757\end{pgfscope}%
    16581758\end{pgfscope}%
    16591759\begin{pgfscope}%
     
    16611761\pgfsetstrokecolor{textcolor}%
    16621762\pgfsetfillcolor{textcolor}%
    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}%
     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}%
    17061783\pgfsetstrokecolor{currentstroke}%
    17071784\pgfsetdash{}{0pt}%
     
    17121789}%
    17131790\begin{pgfscope}%
    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}%
     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}%
    17251802\pgfsetstrokecolor{currentstroke}%
    17261803\pgfsetdash{}{0pt}%
     
    17311808}%
    17321809\begin{pgfscope}%
    1733 \pgfsys@transformshift{4.570184in}{4.119833in}%
     1810\pgfsys@transformshift{1.222222in}{1.612490in}%
    17341811\pgfsys@useobject{currentmarker}{}%
    17351812\end{pgfscope}%
     
    17391816\pgfsetroundjoin%
    17401817\pgfsetlinewidth{1.505625pt}%
    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}%
     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}%
    17551832\pgfsetstrokecolor{currentstroke}%
    17561833\pgfsetdash{}{0pt}%
    17571834\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.041667in}{-0.041667in}}{\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}}%
     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}}%
    17671839\pgfpathclose%
    17681840\pgfusepath{stroke,fill}%
    17691841}%
    17701842\begin{pgfscope}%
    1771 \pgfsys@transformshift{4.570184in}{4.050389in}%
     1843\pgfsys@transformshift{1.222222in}{1.501379in}%
    17721844\pgfsys@useobject{currentmarker}{}%
    17731845\end{pgfscope}%
     
    17771849\pgfsetstrokecolor{textcolor}%
    17781850\pgfsetfillcolor{textcolor}%
    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}%
     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}%
    17991871\pgfsetstrokecolor{currentstroke}%
    18001872\pgfsetdash{}{0pt}%
     
    18051877}%
    18061878\begin{pgfscope}%
    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}%
     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}%
    18181890\pgfsetstrokecolor{currentstroke}%
    18191891\pgfsetdash{}{0pt}%
     
    18241896}%
    18251897\begin{pgfscope}%
    1826 \pgfsys@transformshift{4.570184in}{3.926161in}%
     1898\pgfsys@transformshift{1.222222in}{1.288031in}%
    18271899\pgfsys@useobject{currentmarker}{}%
    18281900\end{pgfscope}%
     
    18321904\pgfsetroundjoin%
    18331905\pgfsetlinewidth{1.505625pt}%
    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}}%
     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}}%
    18601927\pgfpathclose%
    18611928\pgfusepath{stroke,fill}%
    18621929}%
    18631930\begin{pgfscope}%
    1864 \pgfsys@transformshift{4.570184in}{3.856716in}%
     1931\pgfsys@transformshift{1.222222in}{1.176919in}%
    18651932\pgfsys@useobject{currentmarker}{}%
    18661933\end{pgfscope}%
     
    18701937\pgfsetstrokecolor{textcolor}%
    18711938\pgfsetfillcolor{textcolor}%
    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}%
     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}%
    18921959\pgfsetstrokecolor{currentstroke}%
    18931960\pgfsetdash{}{0pt}%
     
    18981965}%
    18991966\begin{pgfscope}%
    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}%
     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}%
    19111978\pgfsetstrokecolor{currentstroke}%
    19121979\pgfsetdash{}{0pt}%
     
    19171984}%
    19181985\begin{pgfscope}%
    1919 \pgfsys@transformshift{4.570184in}{3.732488in}%
     1986\pgfsys@transformshift{1.222222in}{0.963571in}%
    19201987\pgfsys@useobject{currentmarker}{}%
    19211988\end{pgfscope}%
     
    19251992\pgfsetroundjoin%
    19261993\pgfsetlinewidth{1.505625pt}%
    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}%
     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}%
    19412008\pgfsetstrokecolor{currentstroke}%
    19422009\pgfsetdash{}{0pt}%
    19432010\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.041667in}{-0.041667in}}{\pgfqpoint{0.041667in}{0.041667in}}{%
    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}%
     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}%
    19582019\pgfsys@useobject{currentmarker}{}%
    19592020\end{pgfscope}%
     
    19632024\pgfsetstrokecolor{textcolor}%
    19642025\pgfsetfillcolor{textcolor}%
    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}%
     2026\pgftext[x=1.622222in,y=0.774682in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont CPP-rand}%
    20592027\end{pgfscope}%
    20602028\end{pgfpicture}%
  • doc/theses/colby_parsons_MMAth/figures/pyke_Aggregate_Lock_4.pgf

    r3a513d89 r044ae62  
    7777\pgfsetstrokecolor{textcolor}%
    7878\pgfsetfillcolor{textcolor}%
    79 \pgftext[x=1.025455in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 2\)}%
     79\pgftext[x=1.025455in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\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{10.000000}{12.000000}\selectfont \(\displaystyle 4\)}%
     104\pgftext[x=1.326061in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\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{10.000000}{12.000000}\selectfont \(\displaystyle 8\)}%
     129\pgftext[x=1.927273in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\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{10.000000}{12.000000}\selectfont \(\displaystyle 16\)}%
     154\pgftext[x=3.129697in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\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{10.000000}{12.000000}\selectfont \(\displaystyle 24\)}%
     179\pgftext[x=4.332121in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\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{10.000000}{12.000000}\selectfont \(\displaystyle 32\)}%
     204\pgftext[x=5.534545in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 32\)}%
    205205\end{pgfscope}%
    206206\begin{pgfscope}%
     
    208208\pgfsetstrokecolor{textcolor}%
    209209\pgfsetfillcolor{textcolor}%
    210 \pgftext[x=3.280000in,y=0.251766in,,top]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont Cores}%
     210\pgftext[x=3.280000in,y=0.161874in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont Cores}%
    211211\end{pgfscope}%
    212212\begin{pgfscope}%
     
    233233\pgfsetstrokecolor{textcolor}%
    234234\pgfsetfillcolor{textcolor}%
    235 \pgftext[x=0.501581in,y=0.627700in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 10^{3}\)}%
     235\pgftext[x=0.399655in,y=0.592592in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 10^{3}\)}%
    236236\end{pgfscope}%
    237237\begin{pgfscope}%
     
    258258\pgfsetstrokecolor{textcolor}%
    259259\pgfsetfillcolor{textcolor}%
    260 \pgftext[x=0.501581in,y=1.310712in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 10^{4}\)}%
     260\pgftext[x=0.399655in,y=1.275604in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 10^{4}\)}%
    261261\end{pgfscope}%
    262262\begin{pgfscope}%
     
    283283\pgfsetstrokecolor{textcolor}%
    284284\pgfsetfillcolor{textcolor}%
    285 \pgftext[x=0.501581in,y=1.993723in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 10^{5}\)}%
     285\pgftext[x=0.399655in,y=1.958615in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 10^{5}\)}%
    286286\end{pgfscope}%
    287287\begin{pgfscope}%
     
    308308\pgfsetstrokecolor{textcolor}%
    309309\pgfsetfillcolor{textcolor}%
    310 \pgftext[x=0.501581in,y=2.676735in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 10^{6}\)}%
     310\pgftext[x=0.399655in,y=2.641627in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 10^{6}\)}%
    311311\end{pgfscope}%
    312312\begin{pgfscope}%
     
    333333\pgfsetstrokecolor{textcolor}%
    334334\pgfsetfillcolor{textcolor}%
    335 \pgftext[x=0.501581in,y=3.359746in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 10^{7}\)}%
     335\pgftext[x=0.399655in,y=3.324638in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 10^{7}\)}%
    336336\end{pgfscope}%
    337337\begin{pgfscope}%
     
    358358\pgfsetstrokecolor{textcolor}%
    359359\pgfsetfillcolor{textcolor}%
    360 \pgftext[x=0.501581in,y=4.042757in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 10^{8}\)}%
     360\pgftext[x=0.399655in,y=4.007649in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 10^{8}\)}%
    361361\end{pgfscope}%
    362362\begin{pgfscope}%
     
    11811181\pgfsetstrokecolor{textcolor}%
    11821182\pgfsetfillcolor{textcolor}%
    1183 \pgftext[x=0.446026in,y=2.376000in,,bottom,rotate=90.000000]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont Throughput (entries)}%
     1183\pgftext[x=0.344100in,y=2.376000in,,bottom,rotate=90.000000]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont Throughput (entries)}%
    11841184\end{pgfscope}%
    11851185\begin{pgfscope}%
     
    18441844\pgfusepath{clip}%
    18451845\pgfsetbuttcap%
    1846 \pgfsetroundjoin%
     1846\pgfsetmiterjoin%
    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.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}}%
     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}}%
    18631859\pgfpathclose%
    18641860\pgfusepath{stroke,fill}%
     
    19101906\pgfusepath{clip}%
    19111907\pgfsetbuttcap%
    1912 \pgfsetroundjoin%
     1908\pgfsetmiterjoin%
    19131909\definecolor{currentfill}{rgb}{1.000000,0.498039,0.054902}%
    19141910\pgfsetfillcolor{currentfill}%
     
    19181914\pgfsetdash{}{0pt}%
    19191915\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.041667in}{-0.041667in}}{\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}}%
     1916\pgfpathmoveto{\pgfqpoint{0.000000in}{0.041667in}}%
     1917\pgfpathlineto{\pgfqpoint{-0.041667in}{-0.041667in}}%
     1918\pgfpathlineto{\pgfqpoint{0.041667in}{-0.041667in}}%
    19291919\pgfpathclose%
    19301920\pgfusepath{stroke,fill}%
     
    19761966\pgfusepath{clip}%
    19771967\pgfsetbuttcap%
    1978 \pgfsetroundjoin%
     1968\pgfsetmiterjoin%
    19791969\definecolor{currentfill}{rgb}{0.172549,0.627451,0.172549}%
    19801970\pgfsetfillcolor{currentfill}%
     
    19831973\pgfsetstrokecolor{currentstroke}%
    19841974\pgfsetdash{}{0pt}%
    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}}%
     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}}%
    19951982\pgfpathclose%
    19961983\pgfusepath{stroke,fill}%
     
    20422029\pgfusepath{clip}%
    20432030\pgfsetbuttcap%
    2044 \pgfsetroundjoin%
     2031\pgfsetbeveljoin%
    20452032\definecolor{currentfill}{rgb}{0.839216,0.152941,0.156863}%
    20462033\pgfsetfillcolor{currentfill}%
     
    20492036\pgfsetstrokecolor{currentstroke}%
    20502037\pgfsetdash{}{0pt}%
    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}}%
     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}}%
    20612049\pgfpathclose%
    20622050\pgfusepath{stroke,fill}%
     
    21352123\pgfsetstrokecolor{textcolor}%
    21362124\pgfsetfillcolor{textcolor}%
    2137 \pgftext[x=3.280000in,y=4.307333in,,base]{\color{textcolor}\rmfamily\fontsize{12.000000}{14.400000}\selectfont Aggregate Lock Benchmark: 4 Locks}%
     2125\pgftext[x=3.280000in,y=4.307333in,,base]{\color{textcolor}\rmfamily\fontsize{19.200000}{23.040000}\selectfont Aggregate Lock Benchmark: 4 Locks}%
    21382126\end{pgfscope}%
    21392127\begin{pgfscope}%
     
    21482136\pgfsetstrokeopacity{0.800000}%
    21492137\pgfsetdash{}{0pt}%
    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}}%
     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}}%
    21592147\pgfpathclose%
    21602148\pgfusepath{stroke,fill}%
     
    21672155\pgfsetstrokecolor{currentstroke}%
    21682156\pgfsetdash{}{0pt}%
    2169 \pgfpathmoveto{\pgfqpoint{1.063889in}{1.240191in}}%
    2170 \pgfpathlineto{\pgfqpoint{1.063889in}{1.379080in}}%
     2157\pgfpathmoveto{\pgfqpoint{3.869368in}{2.769364in}}%
     2158\pgfpathlineto{\pgfqpoint{3.869368in}{2.991586in}}%
    21712159\pgfusepath{stroke}%
    21722160\end{pgfscope}%
     
    21862174}%
    21872175\begin{pgfscope}%
    2188 \pgfsys@transformshift{1.063889in}{1.240191in}%
     2176\pgfsys@transformshift{3.869368in}{2.769364in}%
    21892177\pgfsys@useobject{currentmarker}{}%
    21902178\end{pgfscope}%
     
    22052193}%
    22062194\begin{pgfscope}%
    2207 \pgfsys@transformshift{1.063889in}{1.379080in}%
     2195\pgfsys@transformshift{3.869368in}{2.991586in}%
    22082196\pgfsys@useobject{currentmarker}{}%
    22092197\end{pgfscope}%
     
    22162204\pgfsetstrokecolor{currentstroke}%
    22172205\pgfsetdash{}{0pt}%
    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%
     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%
    22252213\definecolor{currentfill}{rgb}{0.121569,0.466667,0.705882}%
    22262214\pgfsetfillcolor{currentfill}%
     
    22292217\pgfsetstrokecolor{currentstroke}%
    22302218\pgfsetdash{}{0pt}%
    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}}%
     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}}%
    22412225\pgfpathclose%
    22422226\pgfusepath{stroke,fill}%
    22432227}%
    22442228\begin{pgfscope}%
    2245 \pgfsys@transformshift{1.063889in}{1.309636in}%
     2229\pgfsys@transformshift{3.869368in}{2.880475in}%
    22462230\pgfsys@useobject{currentmarker}{}%
    22472231\end{pgfscope}%
     
    22512235\pgfsetstrokecolor{textcolor}%
    22522236\pgfsetfillcolor{textcolor}%
    2253 \pgftext[x=1.313889in,y=1.261024in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont CFA-baseline}%
     2237\pgftext[x=4.269368in,y=2.802697in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont CFA-baseline}%
    22542238\end{pgfscope}%
    22552239\begin{pgfscope}%
     
    22602244\pgfsetstrokecolor{currentstroke}%
    22612245\pgfsetdash{}{0pt}%
    2262 \pgfpathmoveto{\pgfqpoint{1.063889in}{1.046518in}}%
    2263 \pgfpathlineto{\pgfqpoint{1.063889in}{1.185407in}}%
     2246\pgfpathmoveto{\pgfqpoint{3.869368in}{2.444904in}}%
     2247\pgfpathlineto{\pgfqpoint{3.869368in}{2.667126in}}%
    22642248\pgfusepath{stroke}%
    22652249\end{pgfscope}%
     
    22792263}%
    22802264\begin{pgfscope}%
    2281 \pgfsys@transformshift{1.063889in}{1.046518in}%
     2265\pgfsys@transformshift{3.869368in}{2.444904in}%
    22822266\pgfsys@useobject{currentmarker}{}%
    22832267\end{pgfscope}%
     
    22982282}%
    22992283\begin{pgfscope}%
    2300 \pgfsys@transformshift{1.063889in}{1.185407in}%
     2284\pgfsys@transformshift{3.869368in}{2.667126in}%
    23012285\pgfsys@useobject{currentmarker}{}%
    23022286\end{pgfscope}%
     
    23092293\pgfsetstrokecolor{currentstroke}%
    23102294\pgfsetdash{}{0pt}%
    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%
     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%
    23182302\definecolor{currentfill}{rgb}{1.000000,0.498039,0.054902}%
    23192303\pgfsetfillcolor{currentfill}%
     
    23232307\pgfsetdash{}{0pt}%
    23242308\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.041667in}{-0.041667in}}{\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}}%
     2309\pgfpathmoveto{\pgfqpoint{0.000000in}{0.041667in}}%
     2310\pgfpathlineto{\pgfqpoint{-0.041667in}{-0.041667in}}%
     2311\pgfpathlineto{\pgfqpoint{0.041667in}{-0.041667in}}%
    23342312\pgfpathclose%
    23352313\pgfusepath{stroke,fill}%
    23362314}%
    23372315\begin{pgfscope}%
    2338 \pgfsys@transformshift{1.063889in}{1.115963in}%
     2316\pgfsys@transformshift{3.869368in}{2.556015in}%
    23392317\pgfsys@useobject{currentmarker}{}%
    23402318\end{pgfscope}%
     
    23442322\pgfsetstrokecolor{textcolor}%
    23452323\pgfsetfillcolor{textcolor}%
    2346 \pgftext[x=1.313889in,y=1.067352in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont CPP-baseline}%
     2324\pgftext[x=4.269368in,y=2.478238in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont CPP-baseline}%
    23472325\end{pgfscope}%
    23482326\begin{pgfscope}%
     
    23532331\pgfsetstrokecolor{currentstroke}%
    23542332\pgfsetdash{}{0pt}%
    2355 \pgfpathmoveto{\pgfqpoint{1.063889in}{0.852846in}}%
    2356 \pgfpathlineto{\pgfqpoint{1.063889in}{0.991734in}}%
     2333\pgfpathmoveto{\pgfqpoint{3.869368in}{2.120444in}}%
     2334\pgfpathlineto{\pgfqpoint{3.869368in}{2.342667in}}%
    23572335\pgfusepath{stroke}%
    23582336\end{pgfscope}%
     
    23722350}%
    23732351\begin{pgfscope}%
    2374 \pgfsys@transformshift{1.063889in}{0.852846in}%
     2352\pgfsys@transformshift{3.869368in}{2.120444in}%
    23752353\pgfsys@useobject{currentmarker}{}%
    23762354\end{pgfscope}%
     
    23912369}%
    23922370\begin{pgfscope}%
    2393 \pgfsys@transformshift{1.063889in}{0.991734in}%
     2371\pgfsys@transformshift{3.869368in}{2.342667in}%
    23942372\pgfsys@useobject{currentmarker}{}%
    23952373\end{pgfscope}%
     
    24022380\pgfsetstrokecolor{currentstroke}%
    24032381\pgfsetdash{}{0pt}%
    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%
     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%
    24112389\definecolor{currentfill}{rgb}{0.172549,0.627451,0.172549}%
    24122390\pgfsetfillcolor{currentfill}%
     
    24152393\pgfsetstrokecolor{currentstroke}%
    24162394\pgfsetdash{}{0pt}%
    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}}%
     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}}%
    24272402\pgfpathclose%
    24282403\pgfusepath{stroke,fill}%
    24292404}%
    24302405\begin{pgfscope}%
    2431 \pgfsys@transformshift{1.063889in}{0.922290in}%
     2406\pgfsys@transformshift{3.869368in}{2.231556in}%
    24322407\pgfsys@useobject{currentmarker}{}%
    24332408\end{pgfscope}%
     
    24372412\pgfsetstrokecolor{textcolor}%
    24382413\pgfsetfillcolor{textcolor}%
    2439 \pgftext[x=1.313889in,y=0.873679in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont CFA-rand}%
     2414\pgftext[x=4.269368in,y=2.153778in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont CFA-rand}%
    24402415\end{pgfscope}%
    24412416\begin{pgfscope}%
     
    24462421\pgfsetstrokecolor{currentstroke}%
    24472422\pgfsetdash{}{0pt}%
    2448 \pgfpathmoveto{\pgfqpoint{1.063889in}{0.659173in}}%
    2449 \pgfpathlineto{\pgfqpoint{1.063889in}{0.798062in}}%
     2423\pgfpathmoveto{\pgfqpoint{3.869368in}{1.795985in}}%
     2424\pgfpathlineto{\pgfqpoint{3.869368in}{2.018207in}}%
    24502425\pgfusepath{stroke}%
    24512426\end{pgfscope}%
     
    24652440}%
    24662441\begin{pgfscope}%
    2467 \pgfsys@transformshift{1.063889in}{0.659173in}%
     2442\pgfsys@transformshift{3.869368in}{1.795985in}%
    24682443\pgfsys@useobject{currentmarker}{}%
    24692444\end{pgfscope}%
     
    24842459}%
    24852460\begin{pgfscope}%
    2486 \pgfsys@transformshift{1.063889in}{0.798062in}%
     2461\pgfsys@transformshift{3.869368in}{2.018207in}%
    24872462\pgfsys@useobject{currentmarker}{}%
    24882463\end{pgfscope}%
     
    24952470\pgfsetstrokecolor{currentstroke}%
    24962471\pgfsetdash{}{0pt}%
    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%
     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%
    25042479\definecolor{currentfill}{rgb}{0.839216,0.152941,0.156863}%
    25052480\pgfsetfillcolor{currentfill}%
     
    25082483\pgfsetstrokecolor{currentstroke}%
    25092484\pgfsetdash{}{0pt}%
    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}}%
     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}}%
    25202496\pgfpathclose%
    25212497\pgfusepath{stroke,fill}%
    25222498}%
    25232499\begin{pgfscope}%
    2524 \pgfsys@transformshift{1.063889in}{0.728617in}%
     2500\pgfsys@transformshift{3.869368in}{1.907096in}%
    25252501\pgfsys@useobject{currentmarker}{}%
    25262502\end{pgfscope}%
     
    25302506\pgfsetstrokecolor{textcolor}%
    25312507\pgfsetfillcolor{textcolor}%
    2532 \pgftext[x=1.313889in,y=0.680006in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont CPP-rand}%
     2508\pgftext[x=4.269368in,y=1.829318in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont CPP-rand}%
    25332509\end{pgfscope}%
    25342510\end{pgfpicture}%
  • doc/theses/colby_parsons_MMAth/figures/pyke_Aggregate_Lock_8.pgf

    r3a513d89 r044ae62  
    7777\pgfsetstrokecolor{textcolor}%
    7878\pgfsetfillcolor{textcolor}%
    79 \pgftext[x=1.025455in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 2\)}%
     79\pgftext[x=1.025455in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\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{10.000000}{12.000000}\selectfont \(\displaystyle 4\)}%
     104\pgftext[x=1.326061in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\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{10.000000}{12.000000}\selectfont \(\displaystyle 8\)}%
     129\pgftext[x=1.927273in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\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{10.000000}{12.000000}\selectfont \(\displaystyle 16\)}%
     154\pgftext[x=3.129697in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\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{10.000000}{12.000000}\selectfont \(\displaystyle 24\)}%
     179\pgftext[x=4.332121in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\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{10.000000}{12.000000}\selectfont \(\displaystyle 32\)}%
     204\pgftext[x=5.534545in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 32\)}%
    205205\end{pgfscope}%
    206206\begin{pgfscope}%
     
    208208\pgfsetstrokecolor{textcolor}%
    209209\pgfsetfillcolor{textcolor}%
    210 \pgftext[x=3.280000in,y=0.251766in,,top]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont Cores}%
     210\pgftext[x=3.280000in,y=0.161874in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont Cores}%
    211211\end{pgfscope}%
    212212\begin{pgfscope}%
     
    233233\pgfsetstrokecolor{textcolor}%
    234234\pgfsetfillcolor{textcolor}%
    235 \pgftext[x=0.501581in,y=0.610874in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 10^{2}\)}%
     235\pgftext[x=0.399655in,y=0.575766in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 10^{2}\)}%
    236236\end{pgfscope}%
    237237\begin{pgfscope}%
     
    258258\pgfsetstrokecolor{textcolor}%
    259259\pgfsetfillcolor{textcolor}%
    260 \pgftext[x=0.501581in,y=1.216962in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 10^{3}\)}%
     260\pgftext[x=0.399655in,y=1.181854in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 10^{3}\)}%
    261261\end{pgfscope}%
    262262\begin{pgfscope}%
     
    283283\pgfsetstrokecolor{textcolor}%
    284284\pgfsetfillcolor{textcolor}%
    285 \pgftext[x=0.501581in,y=1.823050in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 10^{4}\)}%
     285\pgftext[x=0.399655in,y=1.787942in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 10^{4}\)}%
    286286\end{pgfscope}%
    287287\begin{pgfscope}%
     
    308308\pgfsetstrokecolor{textcolor}%
    309309\pgfsetfillcolor{textcolor}%
    310 \pgftext[x=0.501581in,y=2.429138in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 10^{5}\)}%
     310\pgftext[x=0.399655in,y=2.394030in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 10^{5}\)}%
    311311\end{pgfscope}%
    312312\begin{pgfscope}%
     
    333333\pgfsetstrokecolor{textcolor}%
    334334\pgfsetfillcolor{textcolor}%
    335 \pgftext[x=0.501581in,y=3.035227in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 10^{6}\)}%
     335\pgftext[x=0.399655in,y=3.000119in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 10^{6}\)}%
    336336\end{pgfscope}%
    337337\begin{pgfscope}%
     
    358358\pgfsetstrokecolor{textcolor}%
    359359\pgfsetfillcolor{textcolor}%
    360 \pgftext[x=0.501581in,y=3.641315in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 10^{7}\)}%
     360\pgftext[x=0.399655in,y=3.606207in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 10^{7}\)}%
    361361\end{pgfscope}%
    362362\begin{pgfscope}%
     
    12951295\pgfsetstrokecolor{textcolor}%
    12961296\pgfsetfillcolor{textcolor}%
    1297 \pgftext[x=0.446026in,y=2.376000in,,bottom,rotate=90.000000]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont Throughput (entries)}%
     1297\pgftext[x=0.344100in,y=2.376000in,,bottom,rotate=90.000000]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont Throughput (entries)}%
    12981298\end{pgfscope}%
    12991299\begin{pgfscope}%
     
    19581958\pgfusepath{clip}%
    19591959\pgfsetbuttcap%
    1960 \pgfsetroundjoin%
     1960\pgfsetmiterjoin%
    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}%
    19652025\pgfsetstrokecolor{currentstroke}%
    19662026\pgfsetdash{}{0pt}%
     
    19792039}%
    19802040\begin{pgfscope}%
    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}%
     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}%
    20022062\pgfsys@useobject{currentmarker}{}%
    20032063\end{pgfscope}%
     
    20092069\pgfsetroundjoin%
    20102070\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}%
    20112351\definecolor{currentstroke}{rgb}{1.000000,0.498039,0.054902}%
    20122352\pgfsetstrokecolor{currentstroke}%
    20132353\pgfsetdash{}{0pt}%
    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}%
     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}%
    20252408\pgfsetbuttcap%
    20262409\pgfsetroundjoin%
     
    20452428}%
    20462429\begin{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}%
     2430\pgfsys@transformshift{3.869368in}{2.556015in}%
     2431\pgfsys@useobject{currentmarker}{}%
     2432\end{pgfscope}%
    22462433\end{pgfscope}%
    22472434\begin{pgfscope}%
     
    22492436\pgfsetstrokecolor{textcolor}%
    22502437\pgfsetfillcolor{textcolor}%
    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}%
     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}%
    22592456\pgfsetlinewidth{1.003750pt}%
    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}%
     2457\definecolor{currentstroke}{rgb}{0.172549,0.627451,0.172549}%
    22942458\pgfsetstrokecolor{currentstroke}%
    22952459\pgfsetdash{}{0pt}%
     
    23002464}%
    23012465\begin{pgfscope}%
    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}%
     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}%
    23102474\pgfsetfillcolor{currentfill}%
    23112475\pgfsetlinewidth{1.003750pt}%
    2312 \definecolor{currentstroke}{rgb}{0.121569,0.466667,0.705882}%
     2476\definecolor{currentstroke}{rgb}{0.172549,0.627451,0.172549}%
    23132477\pgfsetstrokecolor{currentstroke}%
    23142478\pgfsetdash{}{0pt}%
     
    23192483}%
    23202484\begin{pgfscope}%
    2321 \pgfsys@transformshift{1.063889in}{1.379080in}%
     2485\pgfsys@transformshift{3.869368in}{2.342667in}%
    23222486\pgfsys@useobject{currentmarker}{}%
    23232487\end{pgfscope}%
     
    23272491\pgfsetroundjoin%
    23282492\pgfsetlinewidth{1.505625pt}%
    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}%
     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}%
    23402504\pgfsetfillcolor{currentfill}%
    23412505\pgfsetlinewidth{1.003750pt}%
    2342 \definecolor{currentstroke}{rgb}{0.121569,0.466667,0.705882}%
     2506\definecolor{currentstroke}{rgb}{0.172549,0.627451,0.172549}%
    23432507\pgfsetstrokecolor{currentstroke}%
    23442508\pgfsetdash{}{0pt}%
    23452509\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.041667in}{-0.041667in}}{\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}}%
     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}}%
    23552514\pgfpathclose%
    23562515\pgfusepath{stroke,fill}%
    23572516}%
    23582517\begin{pgfscope}%
    2359 \pgfsys@transformshift{1.063889in}{1.309636in}%
     2518\pgfsys@transformshift{3.869368in}{2.231556in}%
    23602519\pgfsys@useobject{currentmarker}{}%
    23612520\end{pgfscope}%
     
    23652524\pgfsetstrokecolor{textcolor}%
    23662525\pgfsetfillcolor{textcolor}%
    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}%
     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}%
    23842543\pgfsetfillcolor{currentfill}%
    23852544\pgfsetlinewidth{1.003750pt}%
    2386 \definecolor{currentstroke}{rgb}{1.000000,0.498039,0.054902}%
     2545\definecolor{currentstroke}{rgb}{0.839216,0.152941,0.156863}%
    23872546\pgfsetstrokecolor{currentstroke}%
    23882547\pgfsetdash{}{0pt}%
     
    23932552}%
    23942553\begin{pgfscope}%
    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}%
     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}%
    24032562\pgfsetfillcolor{currentfill}%
    24042563\pgfsetlinewidth{1.003750pt}%
    2405 \definecolor{currentstroke}{rgb}{1.000000,0.498039,0.054902}%
     2564\definecolor{currentstroke}{rgb}{0.839216,0.152941,0.156863}%
    24062565\pgfsetstrokecolor{currentstroke}%
    24072566\pgfsetdash{}{0pt}%
     
    24122571}%
    24132572\begin{pgfscope}%
    2414 \pgfsys@transformshift{1.063889in}{1.185407in}%
     2573\pgfsys@transformshift{3.869368in}{2.018207in}%
    24152574\pgfsys@useobject{currentmarker}{}%
    24162575\end{pgfscope}%
     
    24202579\pgfsetroundjoin%
    24212580\pgfsetlinewidth{1.505625pt}%
    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}%
     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}%
    24332592\pgfsetfillcolor{currentfill}%
    24342593\pgfsetlinewidth{1.003750pt}%
    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}}%
     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}}%
    24482602\pgfpathclose%
    24492603\pgfusepath{stroke,fill}%
    24502604}%
    24512605\begin{pgfscope}%
    2452 \pgfsys@transformshift{1.063889in}{1.115963in}%
     2606\pgfsys@transformshift{3.869368in}{1.907096in}%
    24532607\pgfsys@useobject{currentmarker}{}%
    24542608\end{pgfscope}%
     
    24582612\pgfsetstrokecolor{textcolor}%
    24592613\pgfsetfillcolor{textcolor}%
    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}%
     2614\pgftext[x=4.269368in,y=1.829318in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont CPP-rand}%
    26472615\end{pgfscope}%
    26482616\end{pgfpicture}%
  • doc/theses/colby_parsons_MMAth/figures/pyke_Channel_Contention.pgf

    r3a513d89 r044ae62  
    7777\pgfsetstrokecolor{textcolor}%
    7878\pgfsetfillcolor{textcolor}%
    79 \pgftext[x=1.025455in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 2\)}%
     79\pgftext[x=1.025455in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\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{10.000000}{12.000000}\selectfont \(\displaystyle 4\)}%
     104\pgftext[x=1.326061in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\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{10.000000}{12.000000}\selectfont \(\displaystyle 8\)}%
     129\pgftext[x=1.927273in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\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{10.000000}{12.000000}\selectfont \(\displaystyle 16\)}%
     154\pgftext[x=3.129697in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\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{10.000000}{12.000000}\selectfont \(\displaystyle 24\)}%
     179\pgftext[x=4.332121in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\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{10.000000}{12.000000}\selectfont \(\displaystyle 32\)}%
     204\pgftext[x=5.534545in,y=0.430778in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 32\)}%
    205205\end{pgfscope}%
    206206\begin{pgfscope}%
     
    208208\pgfsetstrokecolor{textcolor}%
    209209\pgfsetfillcolor{textcolor}%
    210 \pgftext[x=3.280000in,y=0.251766in,,top]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont Cores}%
     210\pgftext[x=3.280000in,y=0.161874in,,top]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont Cores}%
    211211\end{pgfscope}%
    212212\begin{pgfscope}%
     
    233233\pgfsetstrokecolor{textcolor}%
    234234\pgfsetfillcolor{textcolor}%
    235 \pgftext[x=0.501581in,y=2.276306in,left,base]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 10^{8}\)}%
     235\pgftext[x=0.399655in,y=2.241198in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont \(\displaystyle 10^{8}\)}%
    236236\end{pgfscope}%
    237237\begin{pgfscope}%
     
    429429\pgfsetstrokecolor{textcolor}%
    430430\pgfsetfillcolor{textcolor}%
    431 \pgftext[x=0.446026in,y=2.376000in,,bottom,rotate=90.000000]{\color{textcolor}\rmfamily\fontsize{10.000000}{12.000000}\selectfont Throughput (channel operations)}%
     431\pgftext[x=0.344100in,y=2.376000in,,bottom,rotate=90.000000]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont Throughput (channel operations)}%
    432432\end{pgfscope}%
    433433\begin{pgfscope}%
     
    838838\pgfusepath{clip}%
    839839\pgfsetbuttcap%
    840 \pgfsetroundjoin%
     840\pgfsetmiterjoin%
    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}%
    8451020\pgfsetstrokecolor{currentstroke}%
    8461021\pgfsetdash{}{0pt}%
     
    8591034}%
    8601035\begin{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}%
     1036\pgfsys@transformshift{4.713959in}{3.935111in}%
     1037\pgfsys@useobject{currentmarker}{}%
     1038\end{pgfscope}%
    9281039\end{pgfscope}%
    9291040\begin{pgfscope}%
     
    9311042\pgfsetstrokecolor{textcolor}%
    9321043\pgfsetfillcolor{textcolor}%
    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}%
     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}%
    9761064\pgfsetstrokecolor{currentstroke}%
    9771065\pgfsetdash{}{0pt}%
     
    9821070}%
    9831071\begin{pgfscope}%
    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}%
     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}%
    9951083\pgfsetstrokecolor{currentstroke}%
    9961084\pgfsetdash{}{0pt}%
     
    10011089}%
    10021090\begin{pgfscope}%
    1003 \pgfsys@transformshift{5.105293in}{4.119833in}%
     1091\pgfsys@transformshift{4.713959in}{3.721763in}%
    10041092\pgfsys@useobject{currentmarker}{}%
    10051093\end{pgfscope}%
     
    10091097\pgfsetroundjoin%
    10101098\pgfsetlinewidth{1.505625pt}%
    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}%
     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}%
    10251113\pgfsetstrokecolor{currentstroke}%
    10261114\pgfsetdash{}{0pt}%
    10271115\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.041667in}{-0.041667in}}{\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}}%
     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}}%
    10371120\pgfpathclose%
    10381121\pgfusepath{stroke,fill}%
    10391122}%
    10401123\begin{pgfscope}%
    1041 \pgfsys@transformshift{5.105293in}{4.050389in}%
     1124\pgfsys@transformshift{4.713959in}{3.610651in}%
    10421125\pgfsys@useobject{currentmarker}{}%
    10431126\end{pgfscope}%
     
    10471130\pgfsetstrokecolor{textcolor}%
    10481131\pgfsetfillcolor{textcolor}%
    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}%
     1132\pgftext[x=5.113959in,y=3.532874in,left,base]{\color{textcolor}\rmfamily\fontsize{16.000000}{19.200000}\selectfont Go}%
    11431133\end{pgfscope}%
    11441134\end{pgfpicture}%
  • doc/theses/colby_parsons_MMAth/glossary.tex

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

    r3a513d89 r044ae62  
    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

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

    r3a513d89 r044ae62  
    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 instancing a @processor@ structure.
     9Kernel threads are created by declaring 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 deallocated, either implicitly at block exit for stack allocation or explicitly at @delete@ for heap allocation.
     32A thread is implicitly joined at deallocation, 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

    r3a513d89 r044ae62  
    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 containment 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 nominal 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 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 \emph{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{With Statement}
     62\section{\lstinline{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 nominal inheritance.
     130\CFA extends C with generalized overloading polymorphism (see \VRef{s:Overloading}), as well as, parametric polymorphism and limited 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 containment inheritance.
    183 In \CFA, @struct@s can @inline@ another struct type to gain its fields and masquerade as that type. 
    184 Examples 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}]
     182Inheritance in \CFA is taken from Plan-9 C's nominal inheritance.
     183In \CFA, @struct@s can @inline@ another struct type to gain its fields and masquerade as that type.
     184Examples 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}]
    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

    r3a513d89 r044ae62  
    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.}
    675676The performance of \CFA's actor system is tested using a suite of microbenchmarks, and compared with other actor systems.
    676677Most of the benchmarks are the same as those presented in \ref{}, with a few additions.
  • doc/theses/colby_parsons_MMAth/text/channels.tex

    r3a513d89 r044ae62  
    55% ======================================================================
    66
    7 Channels 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.
    8 This model is an alternative to shared-memory concurrency, where threads can communicate directly by changing shared state.
    97Most modern concurrent programming languages do not subscribe to just one style of communication among threads and provide features that support multiple approaches.
     8Channels 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).
     9This 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 ...
    16 Channels 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.
    17 Go's restrictions are ...
    18 \CFA channels do not have these restrictions.
     15Hoare'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.
     16These channel semantics remove the ability to have an anonymous sender or receiver.
     17Additionally all channel operations in CSP are synchronous (no buffering).
     18Advanced 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.
     19It was the popularity of Go channels that lead to their implemention in \CFA.
     20Neither Go nor \CFA channels have the restrictions of the early channel-based concurrent systems.
    1921
    2022\section{Producer-Consumer Problem}
    21 Most channels in modern programming languages are built on top of a shared memory buffer.
    22 While 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.
    23 This 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 in his book Cooperating Sequential Processes\cite{Dijkstra65}.
    25 In 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.
    26 The buffer needs to be protected from concurrent access since each item in the buffer should only be produced and consumed once.
    27 Additionally, a consumer can only remove from a non-empty buffer and a producer can only insert into a non-full buffer.
     23A channel is an abstraction for a shared-memory buffer, which 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~\cite[\S~4.1]{Dijkstra65}.
     25In 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.
     26In 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).
     27As 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}
     30Channels come in three flavours of buffers:
     31\begin{enumerate}
     32\item
     33Zero 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
     35Fixed 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
     37Infinite sized (unbounded) implies the communication is asynchronous, \ie the producer never waits but the consumer waits when the buffer is empty.
     38Since memory is finite, all unbounded buffers are ultimately bounded;
     39this restriction must be part of its implementation.
     40\end{enumerate}
     41
     42In general, the order values are processed by the consumer does not affect the correctness of the producer-consumer problem.
     43For example, the buffer can be LIFO, FIFO, or prioritized with respect to insertion and removal.
     44However, like MX, a buffer should ensure every value is eventually removed after some reasonable bounded time (no long-term starvation).
     45The simplest way to prevent starvation is to implement the buffer as a queue, either with a cyclic array or linked nodes.
    2846
    2947\section{First-Come First-Served}
    30 The channel implementations that will be discussed are \gls{fcfs}.
    31 This term was defined by Lamport~\cite{Lamport74}.
     48As pointed out, a bounded buffer requires MX among multiple producers or consumers.
     49This MX should be fair among threads, independent of the FIFO buffer being fair among values.
     50Fairness among threads is called \gls{fcfs} and was defined by Lamport~\cite[p.~454]{Lamport74}.
    3251\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.
    33 Given 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.
    35 Implementing 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.
    36 As such algorithms that are not \gls{fcfs} may be more performant but that performance comes with the downside of likely introducing starvation and unfairness.
     52Given this doorway, a CS is said to be \gls{fcfs}, if threads access the shared resource in the order they proceed through the doorway.
     53A 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.
     56Implementing 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.
     57An 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).
     58As such, algorithms that are not \gls{fcfs} (barging) can be more performant by skipping the wait for the CS and entering directly;
     59however, this performance gain comes by introducing unfairness with possible starvation for waiting threads.
    3760
    3861\section{Channel Implementation}
    39 The channel implementation in \CFA is a near carbon copy of the Go implementation.
    40 Experimentation was conducted that varied the producer-consumer problem algorithm and lock type used inside the channel.
    41 With 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.
     62Currently, only the Go programming language provides user-level threading where the primary communication mechanism is channels.
     63Experiments were conducted that varied the producer-consumer problem algorithm and lock type used inside the channel.
     64With 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.
     65Performance of channels can be improved by sharding the underlying buffer \cite{Dice11}.
     66In doing so the FIFO property is lost, which is undesireable for user-facing channels.
     67Therefore, the low-level channel implementation in \CFA is largely copied from the Go implementation, but adapted to the \CFA type and runtime systems.
    4268As such the research contributions added by \CFA's channel implementation lie in the realm of safety and productivity features.
     69
     70The Go channel implementation utilitizes cooperation between threads to achieve good performance~\cite{go:chan}.
     71The cooperation between threads only occurs when producers or consumers need to block due to the buffer being full or empty.
     72In these cases the blocking thread stores their relevant data in a shared location and the signalling thread will complete their operation before waking them.
     73This helps improve performance in a few ways.
     74First, each thread interacting with the channel with only acquire and release the internal channel lock exactly once.
     75This decreases contention on the internal lock, as only entering threads will compete for the lock since signalled threads never reacquire the lock.
     76The other advantage of the cooperation approach is that it eliminates the potential bottleneck of waiting for signalled threads.
     77The property of acquiring/releasing the lock only once can be achieved without cooperation by \Newterm{baton passing} the lock.
     78Baton 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.
     79While 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
     81In this work, all channel sizes \see{Sections~\ref{s:ChannelSize}} are implemented with bounded buffers.
     82However, only non-zero-sized buffers are analysed because of their complexity and higher usage.
    4383
    4484\section{Safety and Productivity}
     
    4787
    4888\begin{itemize}
    49 \item Toggle-able statistic collection on channel behaviour that counts channel operations, and the number of the operations that block.
    50 Tracking 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.
    52 If 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.
    54 Programmers can use this to easily to broadcast data to multiple consumers.
    55 Additionally, 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.
     89\item Toggle-able statistic collection on channel behaviour that count channel and blocking operations.
     90Tracking 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.
     93If 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.
     96Programmers use this mechanism to broadcast a sentinel value to multiple consumers.
     97Additionally, 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.
    5698\end{itemize}
    5799
    58 The other safety and productivity feature of \CFA channels deals with concurrent termination.
     100\subsection{Toggle-able Statistics}
     101As discussed, a channel is a concurrent layer over a bounded buffer.
     102To achieve efficient buffering users should aim for as few blocking operations on a channel as possible.
     103Often to achieve this users may change the buffer size, shard a channel into multiple channels, or tweak the number of producer and consumer threads.
     104Fo users to be able to make informed decisions when tuning channel usage, toggle-able channel statistics are provided.
     105The statistics are toggled at compile time via the @CHAN_STATS@ macro to ensure that they are entirely elided when not used.
     106When statistics are turned on, four counters are maintained per channel, two for producers and two for consumers.
     107The two counters per type of operation track the number of blocking operations and total operations.
     108In the channel destructor the counters are printed out aggregated and also per type of operation.
     109An example use case of the counters follows.
     110A user is buffering information between producer and consumer threads and wants to analyze channel performance.
     111Via the statistics they see that producers block for a large percentage of their operations while consumers do not block often.
     112They 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}
     115The deadlock detection in the \CFA channels is fairly basic.
     116It only detects the case where threads are blocked on the channel during deallocation.
     117This case is guaranteed to deadlock since the list holding the blocked thread is internal to the channel and will be deallocated.
     118If 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.
     119More 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}
    59122Terminating concurrent programs is often one of the most difficult parts of writing concurrent code, particularly if graceful termination is needed.
    60 The difficulty of graceful termination often arises from the usage of synchronization primitives which need to be handled carefully during shutdown.
     123The difficulty of graceful termination often arises from the usage of synchronization primitives that need to be handled carefully during shutdown.
    61124It is easy to deadlock during termination if threads are left behind on synchronization primitives.
    62125Additionally, 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.
    63126\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.
    64 Channels are a particularly hard synchronization primitive to terminate since both sending and receiving off a channel can block.
     127Channels are a particularly hard synchronization primitive to terminate since both sending and receiving to/from a channel can block.
    65128Thus, 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.
    66129
    67 % C_TODO: add reference to select chapter, add citation to go channels info
    68 Go channels provide a set of tools to help with concurrent shutdown.
    69 Channels in Go have a \code{close} operation and a \code{select} statement that both can be used to help threads terminate.
    70 The \code{select} statement will be discussed in \ref{}, where \CFA's \code{waituntil} statement will be compared with the Go \code{select} statement.
    71 The \code{close} operation on a channel in Go changes the state of the channel.
    72 When a channel is closed, sends to the channel will panic and additional calls to \code{close} will panic.
    73 Receives are handled differently where receivers will never block on a closed channel and will continue to remove elements from the channel.
    74 Once a channel is empty, receivers can continue to remove elements, but will receive the zero-value version of the element type.
    75 To aid in avoiding unwanted zero-value elements, Go provides the ability to iterate over a closed channel to remove the remaining elements.
    76 These 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.
     130\paragraph{Go channels} provide a set of tools to help with concurrent shutdown~\cite{go:chan}.
     131Channels in Go have a @close@ operation and a \Go{select} statement that both can be used to help threads terminate.
     132The \Go{select} statement is discussed in \ref{s:waituntil}, where \CFA's @waituntil@ statement is compared with the Go \Go{select} statement.
     133
     134The @close@ operation on a channel in Go changes the state of the channel.
     135When a channel is closed, sends to the channel panic along with additional calls to @close@.
     136Receives are handled differently.
     137Receivers (consumers) never block on a closed channel and continue to remove elements from the channel.
     138Once a channel is empty, receivers can continue to remove elements, but receive the zero-value version of the element type.
     139To avoid unwanted zero-value elements, Go provides the ability to iterate over a closed channel to remove the remaining elements.
     140These 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.
    77141These 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.
    78 If errors need to occur in Go, return codes are used to pass error information where they are needed.
    79 Note that panics in Go can be caught, but it is not considered an idiomatic way to write Go programs.
     142If errors need to occur in Go, return codes are used to pass error information up call levels.
     143Note, panics in Go can be caught, but it is not the idiomatic way to write Go programs.
    80144
    81145While 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.
    82 Since 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.
    83 However, 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.
    84 This 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.
    85 To 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.
     146Since 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.
     147However, 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.
     148This 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.
     149To 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.
    86150Due to Go's asymmetric approach to channel shutdown, separate synchronization between producers and consumers of a channel has to occur during shutdown.
    87151
    88 In \CFA, exception handling is an encouraged paradigm and has full language support \cite{Beach21}.
    89 As 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.
    90 Resumption exceptions are a style of exception that when caught run the corresponding catch block in the same way that termination exceptions do.
    91 The difference between the exception handling mechanisms arises after the exception is handled.
    92 In termination handling, the control flow continues into the code following the catch after the exception is handled.
    93 In resumption handling, the control flow returns to the site of the \code{throw}, allowing the control to continue where it left off.
    94 Note that in resumption, since control can return to the point of error propagation, the stack is not unwound during resumption propagation.
    95 In \CFA if a resumption is not handled, it is reraised as a termination.
    96 This mechanism can be used to create a flexible and robust termination system for channels.
    97 
    98 When a channel in \CFA is closed, all subsequent calls to the channel will throw a resumption exception at the caller.
    99 If the resumption is handled, then the caller will proceed to attempt to complete their operation.
    100 If the resumption is not handled it is then rethrown as a termination exception.
    101 Or, if the resumption is handled, but the subsequent attempt at an operation would block, a termination exception is thrown.
    102 These termination exceptions allow for non-local transfer that can be used to great effect to eagerly and gracefully shut down a thread.
     152\paragraph{\CFA channels} have access to an extensive exception handling mechanism~\cite{Beach21}.
     153As such \CFA uses an exception-based approach to channel shutdown that is symmetric for both producers and consumers, and supports graceful shutdown.
     154
     155Exceptions 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.
     158In \CFA, if a resumption exception is not handled, it is reraised as a termination exception.
     159This mechanism is used to create a flexible and robust termination system for channels.
     160
     161When a channel in \CFA is closed, all subsequent calls to the channel raise a resumption exception at the caller.
     162If the resumption is handled, the caller attempts to complete the channel operation.
     163However, if channel operation would block, a termination exception is thrown.
     164If the resumption is not handled, the exception is rethrown as a termination.
     165These termination exceptions allow for non-local transfer that is used to great effect to eagerly and gracefully shut down a thread.
    103166When 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.
    104 The resumption exception, \code{channel_closed}, has a couple fields to aid in handling the exception.
     167The resumption exception, @channel_closed@, has a couple fields to aid in handling the exception.
    105168The exception contains a pointer to the channel it was thrown from, and a pointer to an element.
    106169In exceptions thrown from remove the element pointer will be null.
     
    112175This 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.
    113176
    114 To highlight the differences between \CFA's and Go's close semantics, an example program is presented.
    115 The program is a barrier implemented using two channels shown in Listings~\ref{l:cfa_chan_bar} and \ref{l:go_chan_bar}.
     177\section{\CFA / Go channel Examples}
     178To highlight the differences between \CFA's and Go's close semantics, three examples will be presented.
     179The first example is a simple shutdown case, where there are producer threads and consumer threads operating on a channel for a fixed duration.
     180Once the duration ends, producers and consumers terminate without worrying about any leftover values in the channel.
     181The second example extends the first example by requiring the channel to be empty upon shutdown.
     182Both the first and second example are shown in Figure~\ref{f:ChannelTermination}.
     183
     184
     185First the Go solutions to these examples shown in Figure~\ref{l:go_chan_term} are discussed.
     186Since some of the elements being passed through the channel are zero-valued, closing the channel in Go does not aid in communicating shutdown.
     187Instead, a different mechanism to communicate with the consumers and producers needs to be used.
     188This 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.
     189In this example, a flag is used to communicate with producers and another flag is used for consumers.
     190Producers 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.
     191The producer flag is set first, then after producers terminate the consumer flag is set and the channel is closed.
     192In 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
     195In the \CFA solutions in Figure~\ref{l:cfa_chan_term}, shutdown is communicated directly to both producers and consumers via the @close@ call.
     196In 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.
     197The second \CFA example where all values must be consumed highlights how resumption is used with channel shutdown.
     198The @Producer@ thread-main knows to stop producing when the @insert@ call on a closed channel raises exception @channel_closed@.
     199The @Consumer@ thread-main knows to stop consuming after all elements of a closed channel are removed and the call to @remove@ would block.
     200Hence, 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.
     201Only when the buffer is drained and the call to @remove@ would block, a termination exception is raised to stop consuming.
     202The \CFA semantics allow users to communicate channel shutdown directly through the channel, without having to share extra state between threads.
     203Additionally, 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.
     204If 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]
     211channel( size_t ) Channel{ ChannelSize };
     212
     213thread Consumer {};
     214void 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
     225thread Producer {};
     226void 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
     236int 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]
     248var cons_done, prod_done bool = false, false;
     249var prodJoin chan int = make(chan int, Producers)
     250var consJoin chan int = make(chan int, Consumers)
     251
     252func consumer( channel chan uint64 ) {
     253    for {
     254        if cons_done { break }
     255        <-channel
     256    }
     257    consJoin <- 0 // synch with main thd
     258}
     259
     260func 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
     269func 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
     303The final shutdown example uses channels to implement a barrier.
     304It is shown in Figure~\ref{f:ChannelBarrierTermination}.
     305The 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.
     306As 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.
    116307Both of these examples are implemented using \CFA syntax so that they can be easily compared.
    117 Listing~\ref{l:go_chan_bar} uses go-style channel close semantics and Listing~\ref{l:cfa_chan_bar} uses \CFA close semantics.
    118 In 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.
    119 As 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.
     308Figure~\ref{l:cfa_chan_bar} uses \CFA-style channel close semantics and Figure~\ref{l:go_chan_bar} uses Go-style close semantics.
     309In 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.
     310As 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.
    120311This sentinel value has to be checked at two points.
    121 Furthermore, an additional flag \code{done} is needed to communicate to threads once they have left the barrier that they are done.
    122 This 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.
     312Furthermore, an additional flag @done@ is needed to communicate to threads once they have left the barrier that they are done.
     313
    123314In 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.
    124315This 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.
    125316Also 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.
    126317
    127 \begin{cfa}[caption={\CFA channel barrier termination},label={l:cfa_chan_bar}]
     318\begin{figure}
     319\centering
     320
     321\begin{lrbox}{\myboxA}
     322\begin{cfa}[aboveskip=0pt,belowskip=0pt]
    128323struct barrier {
    129         channel( int ) barWait;
    130         channel( int ) entryWait;
     324        channel( int ) barWait, entryWait;
    131325        int size;
    132 }
    133 void ?{}(barrier & this, int size) with(this) {
    134         barWait{size};
    135         entryWait{size};
     326};
     327void ?{}( barrier & this, int size ) with(this) {
     328        barWait{size};   entryWait{size};
    136329        this.size = size;
    137         for ( j; size )
    138                 insert( *entryWait, j );
    139 }
    140 
     330        for ( i; size )
     331                insert( entryWait, i );
     332}
     333void wait( barrier & this ) with(this) {
     334        int ticket = remove( entryWait );
     335
     336        if ( ticket == size - 1 ) {
     337                for ( i; size - 1 )
     338                        insert( barWait, i );
     339                return;
     340        }
     341        ticket = remove( barWait );
     342
     343        if ( size == 1 || ticket == size - 2 ) { // last ?
     344                for ( i; size )
     345                        insert( entryWait, i );
     346        }
     347}
    141348void flush(barrier & this) with(this) {
    142         close(barWait);
    143         close(entryWait);
    144 }
    145 void wait(barrier & this) with(this) {
    146         int ticket = remove( *entryWait );
     349        @close( barWait );   close( entryWait );@
     350}
     351enum { Threads = 4 };
     352barrier b{Threads};
     353
     354thread Thread {};
     355void main( Thread & this ) {
     356        @try {@
     357                for ()
     358                        wait( b );
     359        @} catch ( channel_closed * ) {}@
     360}
     361int main() {
     362        Thread t[Threads];
     363        sleep(10`s);
     364
     365        flush( b );
     366} // wait for threads to terminate
     367\end{cfa}
     368\end{lrbox}
     369
     370\begin{lrbox}{\myboxB}
     371\begin{cfa}[aboveskip=0pt,belowskip=0pt]
     372struct barrier {
     373        channel( int ) barWait, entryWait;
     374        int size;
     375};
     376void ?{}( 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}
     382void wait( barrier & this ) with(this) {
     383        int ticket = remove( entryWait );
     384        @if ( ticket == -1 ) { insert( entryWait, -1 ); return; }@
    147385        if ( ticket == size - 1 ) {
    148                 for ( j; size - 1 )
    149                         insert( *barWait, j );
     386                for ( i; size - 1 )
     387                        insert( barWait, i );
    150388                return;
    151389        }
    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 }
    160 barrier b{Tasks};
    161 
    162 // thread main
    163 void main(Task & this) {
    164         try {
    165                 for ( ;; ) {
    166                         wait( b );
    167                 }
    168         } catch ( channel_closed * e ) {}
    169 }
    170 
     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}
     397void flush(barrier & this) with(this) {
     398        @insert( entryWait, -1 );   insert( barWait, -1 );@
     399}
     400enum { Threads = 4 };
     401barrier b{Threads};
     402@bool done = false;@
     403thread Thread {};
     404void main( Thread & this ) {
     405        for () {
     406          @if ( done ) break;@
     407                wait( b );
     408        }
     409}
    171410int main() {
    172         {
    173                 Task t[Tasks];
    174 
    175                 sleep(10`s);
    176                 flush( b );
    177         } // wait for tasks to terminate
    178         return 0;
    179 }
     411        Thread t[Threads];
     412        sleep(10`s);
     413        done = true;
     414        flush( b );
     415} // wait for threads to terminate
    180416\end{cfa}
    181 
    182 \begin{cfa}[caption={Go channel barrier termination},label={l:go_chan_bar}]
    183 
    184 struct barrier {
    185         channel( int ) barWait;
    186         channel( int ) entryWait;
    187         int size;
    188 }
    189 void ?{}(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 
    197 void flush(barrier & this) with(this) {
    198         insert( *entryWait, -1 );
    199         insert( *barWait, -1 );
    200 }
    201 void 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 }
    224 barrier b;
    225 
    226 bool done = false;
    227 // thread main
    228 void main(Task & this) {
    229         for ( ;; ) {
    230                 if ( done ) break;
    231                 wait( b );
    232         }
    233 }
    234 
    235 int main() {
    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 }
    246 \end{cfa}
    247 
    248 In Listing~\ref{l:cfa_resume} an example of channel closing with resumption is used.
    249 This program uses resumption in the \code{Consumer} thread main to ensure that all elements in the channel are removed before the consumer thread terminates.
    250 The 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.
    251 If 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}]
    254 channel( int ) chan{ 128 };
    255 
    256 // Consumer thread main
    257 void 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
    268 void main(Producer & this) {
    269         int j = 0;
    270         try {
    271                 for ( ;;j++ ) {
    272                         insert( chan, j );
    273                 }
    274         } catch ( channel_closed * e ) {}
    275 }
    276 
    277 int 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 }
    289 \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}
    290427
    291428\section{Performance}
    292429
    293 Given 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.
    294 One microbenchmark is conducted to compare Go and \CFA.
    295 The benchmark is a ten second experiment where producers and consumers operate on a channel in parallel and throughput is measured.
     430Given 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.
     431The 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.
     432The processors are divided equally between producers and consumers, with one producer or consumer owning each core.
    296433The number of cores is varied to measure how throughput scales.
    297 The cores are divided equally between producers and consumers, with one producer or consumer owning each core.
     434
    298435The results of the benchmark are shown in Figure~\ref{f:chanPerf}.
    299436The performance of Go and \CFA channels on this microbenchmark is comparable.
    300 Note, 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 
     437Note, 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.
    302438
    303439\begin{figure}
  • doc/theses/colby_parsons_MMAth/text/frontpgs.tex

    r3a513d89 r044ae62  
    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. \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.
     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.
     83\CFA is a non-object-oriented programming language that extends C.
     84The foundation for concurrency in \CFA was laid by Thierry Delisle~\cite{Delisle18}, who implemented coroutines, user-level threads, and monitors.
     85This thesis builds upon that work and introduces a suite of new concurrent features as its main contribution.
     86The 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.
     87The root ideas behind these features are not new, but the \CFA implementations extends the original ideas in performance, productivity, and safety.
    8388
    8489\cleardoublepage
  • doc/theses/colby_parsons_MMAth/text/intro.tex

    r3a513d89 r044ae62  
    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 This thesis presents a set of concurrent features implemented in the new programming-language \CFA.
     10
     11This thesis presents a suite of high-level concurrent-language features implemented in the new programming-language \CFA.
    1112These 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.
    1213The groundwork for concurrent features in \CFA was implemented by Thierry Delisle~\cite{Delisle18}, who contributed the threading system, coroutines, monitors and other tools.
    1314This thesis builds on top of that foundation by providing a suite of high-level concurrent features.
    14 These features include mutex statements, channels, an actor system and a waituntil statement.
     15The features include a @mutex@ statement, channels and a @waituntil@ statement, and an actor system.
    1516All 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

    r3a513d89 r044ae62  
    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, efficient, high-level mechanisms for 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}, 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 and efficient abstraction for providing 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}.
     30Several 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}.
    3031In 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.
    3132
    3233Figure~\ref{f:AtomicCounter} shows a \CFA and Java monitor implementing an atomic counter.
    3334A \Newterm{monitor} is a programming technique that implicitly binds mutual exclusion to static function scope by call and return.
    34 Lock mutual exclusion, defined by acquire/release calls, is independent of lexical context (analogous to block versus heap storage allocation).
     35In contrast, lock mutual exclusion, defined by acquire/release calls, is independent of lexical context (analogous to block versus heap storage allocation).
    3536Restricting acquire and release points in a monitor eases programming, comprehension, and maintenance, at a slight cost in flexibility and efficiency.
    3637Ultimately, a monitor is implemented using a combination of basic locks and atomic instructions.
     
    110111To increase locking flexibility, some languages introduce a mutex statement.
    111112\VRef[Figure]{f:ReadersWriter} shows the outline of a reader/writer lock written as a \CFA monitor and mutex statements.
    112 (The exact lock implement is irrelevant.)
     113(The exact lock implementation is irrelevant.)
    113114The @read@ and @write@ functions are called with a reader/write lock and any arguments to perform reading or writing.
    114115The @read@ function is not MX because multiple readers can read simultaneously.
     
    271272The @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.
    272273This repeats after selecting a new starting point in a cyclic manner until all locks are acquired successfully.
    273 This deadlock avoidance algorithm is shown in Listing~\ref{l:cc_deadlock_avoid}.
     274This deadlock avoidance algorithm is shown in Figure~\ref{f:cc_deadlock_avoid}.
    274275The algorithm is taken directly from the source code of the @<mutex>@ header, with some renaming and comments for clarity.
    275276
    276 \begin{cfa}[caption={\CC \lstinline{scoped_lock} deadlock avoidance algorithm},label={l:cc_deadlock_avoid}]
     277\begin{figure}
     278\begin{cfa}
    277279int first = 0;  // first lock to attempt to lock
    278280do {
     
    291293} while ( ! locks[first].owns_lock() );  $\C{// is first lock held?}$
    292294\end{cfa}
    293 
    294 While the algorithm in \ref{l:cc_deadlock_avoid} successfully avoids deadlock, there is a livelock scenario.
     295\caption{\CC \lstinline{scoped_lock} deadlock avoidance algorithm}
     296\label{f:cc_deadlock_avoid}
     297\end{figure}
     298
     299While this algorithm successfully avoids deadlock, there is a livelock scenario.
    295300Assume two threads, $A$ and $B$, create a @scoped_lock@ accessing two locks, $L1$ and $L2$.
    296301A livelock can form as follows.
     
    335340\end{cquote}
    336341Comparatively, 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.
    337 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.
     342The 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.
    338343
    339344\section{Performance}
     
    345350
    346351The benchmark used to evaluate the avoidance algorithms repeatedly acquires a fixed number of locks in a random order and then releases them.
    347 The pseudo code for the deadlock avoidance benchmark is shown in \VRef[Listing]{l:deadlock_avoid_pseudo}.
     352The pseudocode for the deadlock avoidance benchmark is shown in \VRef[Listing]{l:deadlock_avoid_pseudo}.
    348353To 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.
    349354The benchmarks are run for a fixed duration of 10 seconds and then terminate.
     
    352357The median is calculated and is plotted alongside the 95\% confidence intervals for each point.
    353358
    354 \begin{cfa}[caption={Deadlock avoidance bendchmark pseudo code},label={l:deadlock_avoid_pseudo}]
    355 
    356 
    357 
    358 $\PAB{// add pseudo code}$
    359 
    360 
     359\begin{cfa}[caption={Deadlock avoidance benchmark pseudocode},label={l:deadlock_avoid_pseudo}]
     360
     361size_t n_locks; $\C{// number of locks}$
     362size_t n_thds; $\C{// number of threads}$
     363size_t n_gens; $\C{// number of random orderings (default 100)}$
     364size_t total = 0; $\C{// global throughput aggregator}$
     365volatile bool done = false; $\C{// termination flag}$
     366
     367test_spinlock locks[n_locks];
     368size_t rands[n_thds][n_locks * n_gens]; $\C{// random ordering per thread}$
     369
     370void 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
     380int 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}
    361389
    362390\end{cfa}
     
    374402
    375403Figure~\ref{f:mutex_bench} shows the results of the benchmark experiments.
    376 \PAB{Make the points in the graphs for each line different.
    377 Also, make the text in the graphs larger.}
    378404The 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.
    379405The avoidance result for both languages is significantly different, where \CFA's mutex statement achieves throughput that is magnitudes higher than \CC's @scoped_lock@.
     
    383409For 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.
    384410It 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.
    385 In Figures~\ref{f:mutex_bench8_AMD} and \ref{f:mutex_bench8_Intel} the mutex statement performs better than the baseline.
    386 At 7 locks and above the mutex statement switches from a hard coded sort to insertion sort.
    387 It 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.
     411In 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.
     412At 7 locks and above the mutex statement switches from a hard coded sort to insertion sort, which should decrease performance.
     413It 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.
    388414
    389415\begin{figure}
  • doc/theses/colby_parsons_MMAth/thesis.tex

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

    r3a513d89 r044ae62  
    1010// Created On       : Tue Aug 20 13:44:49 2002
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Mon Apr 10 21:16:00 2023
    13 // Update Count     : 476
     12// Last Modified On : Tue May 23 16:22:47 2023
     13// Update Count     : 477
    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
    331335        #ifdef __DEBUG_H__
    332336        cerr << "args:";
  • libcfa/src/Makefile.am

    r3a513d89 r044ae62  
    115115        concurrency/kernel/fwd.hfa \
    116116        concurrency/mutex_stmt.hfa \
    117     concurrency/select.hfa \
    118117    concurrency/channel.hfa \
    119118    concurrency/actor.hfa
     
    128127        concurrency/monitor.hfa \
    129128        concurrency/mutex.hfa \
     129    concurrency/select.hfa \
    130130        concurrency/thread.hfa
    131131
  • libcfa/src/bits/weakso_locks.cfa

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

    r3a513d89 r044ae62  
    2323#include "containers/list.hfa"
    2424
    25 struct thread$;
     25struct select_node;
    2626
    2727//-----------------------------------------------------------------------------
     
    3232
    3333        // List of blocked threads
    34         dlist( thread$ ) blocked_threads;
     34        dlist( select_node ) 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 ) OPTIONAL_THREAD;
     59size_t on_wait( blocking_lock & this, void (*pp_fn)( void * ), void * pp_datum ) OPTIONAL_THREAD;
    6060void on_wakeup( blocking_lock & this, size_t ) OPTIONAL_THREAD;
    6161size_t wait_count( blocking_lock & this ) OPTIONAL_THREAD;
     62bool register_select( blocking_lock & this, select_node & node ) OPTIONAL_THREAD;
     63bool unregister_select( blocking_lock & this, select_node & node ) OPTIONAL_THREAD;
     64bool on_selected( blocking_lock & this, select_node & node ) OPTIONAL_THREAD;
    6265
    6366//----------
     
    7275static inline bool   try_lock ( multiple_acquisition_lock & this ) { return try_lock( (blocking_lock &)this ); }
    7376static inline void   unlock   ( multiple_acquisition_lock & this ) { unlock  ( (blocking_lock &)this ); }
    74 static inline size_t on_wait  ( multiple_acquisition_lock & this ) { return on_wait ( (blocking_lock &)this ); }
     77static 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 ); }
    7578static inline void   on_wakeup( multiple_acquisition_lock & this, size_t v ) { on_wakeup ( (blocking_lock &)this, v ); }
    7679static inline void   on_notify( multiple_acquisition_lock & this, struct thread$ * t ){ on_notify( (blocking_lock &)this, t ); }
     80static inline bool   register_select( multiple_acquisition_lock & this, select_node & node ) { return register_select( (blocking_lock &)this, node ); }
     81static inline bool   unregister_select( multiple_acquisition_lock & this, select_node & node ) { return unregister_select( (blocking_lock &)this, node ); }
     82static inline bool   on_selected( multiple_acquisition_lock & this, select_node & node ) { return on_selected( (blocking_lock &)this, node ); }
  • libcfa/src/concurrency/channel.hfa

    r3a513d89 r044ae62  
     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
    117#pragma once
    218
    319#include <locks.hfa>
    420#include <list.hfa>
    5 #include <mutex_stmt.hfa>
    6 
    7 // link field used for threads waiting on channel
    8 struct 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 };
    18 P9_EMBEDDED( wait_link, dlink(wait_link) )
    19 
    20 static 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
    26 static inline void wake_one( dlist( wait_link ) & queue ) {
    27     wait_link & popped = try_pop_front( queue );
    28     unpark( popped.t );
    29 }
     21#include "select.hfa"
    3022
    3123// returns true if woken due to shutdown
    3224// blocks thread on list and releases passed lock
    33 static 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 );
     25static 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 );
    3628    unlock( lock );
    3729    park();
    38     return w.elem == 0p;
     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
     35static 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 );
    3938}
    4039
     
    5958    size_t size, front, back, count;
    6059    T * buffer;
    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
     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
    6665    #endif
    6766};
     
    7069    size = _size;
    7170    front = back = count = 0;
    72     buffer = aalloc( size );
     71    if ( size != 0 ) buffer = aalloc( size );
    7372    prods{};
    7473    cons{};
     
    7675    closed = false;
    7776    #ifdef CHAN_STATS
    78     blocks = 0;
    79     operations = 0;
     77    p_blocks = 0;
     78    p_ops = 0;
     79    c_blocks = 0;
     80    c_ops = 0;
    8081    #endif
    8182}
     
    8485static inline void ^?{}( channel(T) &c ) with(c) {
    8586    #ifdef CHAN_STATS
    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 }
    91 static inline size_t get_count( channel(T) & chan ) with(chan) { return count; }
    92 static inline size_t get_size( channel(T) & chan ) with(chan) { return size; }
     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}
     95static inline size_t get_count( channel(T) & chan ) with(chan) { return __atomic_load_n( &count, __ATOMIC_RELAXED ); }
     96static inline size_t get_size( channel(T) & chan ) with(chan) { return __atomic_load_n( &size, __ATOMIC_RELAXED ); }
    9397static inline bool has_waiters( channel(T) & chan ) with(chan) { return !cons`isEmpty || !prods`isEmpty; }
    9498static inline bool has_waiting_consumers( channel(T) & chan ) with(chan) { return !cons`isEmpty; }
     
    102106    // flush waiting consumers and producers
    103107    while ( has_waiting_consumers( chan ) ) {
    104         cons`first.elem = 0p;
     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;
    105111        wake_one( cons );
    106112    }
    107113    while ( has_waiting_producers( chan ) ) {
    108         prods`first.elem = 0p;
     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;
    109117        wake_one( prods );
    110118    }
     
    114122static inline void is_closed( channel(T) & chan ) with(chan) { return closed; }
    115123
     124// used to hand an element to a blocked consumer and signal it
     125static 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
     131static 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
    116136static inline void flush( channel(T) & chan, T elem ) with(chan) {
    117137    lock( mutex_lock );
    118138    while ( count == 0 && !cons`isEmpty ) {
    119         memcpy(cons`first.elem, (void *)&elem, sizeof(T)); // do waiting consumer work
    120         wake_one( cons );
     139        __cons_handoff( chan, elem );
    121140    }
    122141    unlock( mutex_lock );
     
    125144// handles buffer insert
    126145static inline void __buf_insert( channel(T) & chan, T & elem ) with(chan) {
    127     memcpy((void *)&buffer[back], (void *)&elem, sizeof(T));
     146    memcpy( (void *)&buffer[back], (void *)&elem, sizeof(T) );
    128147    count += 1;
    129148    back++;
     
    131150}
    132151
    133 // does the buffer insert or hands elem directly to consumer if one is waiting
    134 static 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 
    141152// needed to avoid an extra copy in closed case
    142153static inline bool __internal_try_insert( channel(T) & chan, T & elem ) with(chan) {
    143154    lock( mutex_lock );
    144155    #ifdef CHAN_STATS
    145     operations++;
    146     #endif
     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
    147166    if ( count == size ) { unlock( mutex_lock ); return false; }
    148     __do_insert( chan, elem );
     167
     168    __buf_insert( chan, elem );
    149169    unlock( mutex_lock );
    150170    return true;
     
    157177// handles closed case of insert routine
    158178static inline void __closed_insert( channel(T) & chan, T & elem ) with(chan) {
    159     channel_closed except{&channel_closed_vt, &elem, &chan };
     179    channel_closed except{ &channel_closed_vt, &elem, &chan };
    160180    throwResume except; // throw closed resumption
    161181    if ( !__internal_try_insert( chan, elem ) ) throw except; // if try to insert fails (would block), throw termination
     
    172192
    173193    #ifdef CHAN_STATS
    174     if ( !closed ) operations++;
     194    if ( !closed ) p_ops++;
    175195    #endif
    176196
     
    182202    }
    183203
    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 );
    188         unlock( mutex_lock );
    189         return true;
     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 );
     208        unlock( mutex_lock );
     209        return;
    190210    }
    191211
     
    193213    if ( count == size ) {
    194214        #ifdef CHAN_STATS
    195         blocks++;
     215        p_blocks++;
    196216        #endif
    197217
     
    202222    } // if
    203223
    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
    214 static inline void __buf_remove( channel(T) & chan, T & retval ) with(chan) {
    215     memcpy((void *)&retval, (void *)&buffer[front], sizeof(T));
     224    __buf_insert( chan, elem );
     225    unlock( mutex_lock );
     226}
     227
     228// does the buffer remove and potentially does waiting producer work
     229static inline void __do_remove( channel(T) & chan, T & retval ) with(chan) {
     230    memcpy( (void *)&retval, (void *)&buffer[front], sizeof(T) );
    216231    count -= 1;
    217232    front = (front + 1) % size;
    218 }
    219 
    220 // does the buffer remove and potentially does waiting producer work
    221 static inline void __do_remove( channel(T) & chan, T & retval ) with(chan) {
    222     __buf_remove( chan, retval );
    223233    if (count == size - 1 && !prods`isEmpty ) {
    224         __buf_insert( chan, *(T *)prods`first.elem );  // do waiting producer work
     234        if ( !__handle_waituntil_OR( prods ) ) return;
     235        __buf_insert( chan, *(T *)prods`first.extra );  // do waiting producer work
    225236        wake_one( prods );
    226237    }
     
    231242    lock( mutex_lock );
    232243    #ifdef CHAN_STATS
    233     operations++;
    234     #endif
     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
    235254    if ( count == 0 ) { unlock( mutex_lock ); return false; }
     255
    236256    __do_remove( chan, retval );
    237257    unlock( mutex_lock );
     
    244264static inline [T, bool] try_remove( channel(T) & chan ) {
    245265    T retval;
    246     return [ retval, __internal_try_remove( chan, retval ) ];
    247 }
    248 
    249 static inline T try_remove( channel(T) & chan, T elem ) {
     266    bool success = __internal_try_remove( chan, retval );
     267    return [ retval, success ];
     268}
     269
     270static inline T try_remove( channel(T) & chan ) {
    250271    T retval;
    251272    __internal_try_remove( chan, retval );
     
    255276// handles closed case of insert routine
    256277static inline void __closed_remove( channel(T) & chan, T & retval ) with(chan) {
    257     channel_closed except{&channel_closed_vt, 0p, &chan };
     278    channel_closed except{ &channel_closed_vt, 0p, &chan };
    258279    throwResume except; // throw resumption
    259280    if ( !__internal_try_remove( chan, retval ) ) throw except; // if try to remove fails (would block), throw termination
     
    269290
    270291    #ifdef CHAN_STATS
    271     if ( !closed ) operations++;
     292    if ( !closed ) c_ops++;
    272293    #endif
    273294
     
    279300
    280301    // have to check for the zero size channel case
    281     if ( size == 0 && !prods`isEmpty ) {
    282         memcpy((void *)&retval, (void *)prods`first.elem, sizeof(T));
    283         wake_one( prods );
     302    ZeroSize: if ( size == 0 && !prods`isEmpty ) {
     303        if ( !__handle_waituntil_OR( prods ) ) break ZeroSize;
     304        __prods_handoff( chan, retval );
    284305        unlock( mutex_lock );
    285306        return retval;
     
    287308
    288309    // wait if buffer is empty, work will be completed by someone else
    289     if (count == 0) {
     310    if ( count == 0 ) {
    290311        #ifdef CHAN_STATS
    291         blocks++;
     312        c_blocks++;
    292313        #endif
    293314        // check for if woken due to close
     
    299320    // Remove from buffer
    300321    __do_remove( chan, retval );
    301 
    302322    unlock( mutex_lock );
    303323    return retval;
    304324}
     325
     326///////////////////////////////////////////////////////////////////////////////////////////
     327// The following is support for waituntil (select) statements
     328///////////////////////////////////////////////////////////////////////////////////////////
     329static 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
     344struct chan_read {
     345    T & ret;
     346    channel(T) & chan;
     347};
     348
     349static inline void ?{}( chan_read(T) & cr, channel(T) & chan, T & ret ) {
     350    &cr.chan = &chan;
     351    &cr.ret = &ret;
     352}
     353static inline chan_read(T) ?<<?( T & ret, channel(T) & chan ) { chan_read(T) cr{ chan, ret }; return cr; }
     354
     355static 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
     361static 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}
     424static inline bool unregister_select( chan_read(T) & this, select_node & node ) { return unregister_chan( this.chan, node ); }
     425static 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
     433struct chan_write {
     434    T elem;
     435    channel(T) & chan;
     436};
     437
     438static 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}
     442static inline chan_write(T) ?>>?( T elem, channel(T) & chan ) { chan_write(T) cw{ chan, elem }; return cw; }
     443
     444static 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
     450static 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}
     515static inline bool unregister_select( chan_write(T) & this, select_node & node ) { return unregister_chan( this.chan, node ); }
     516
     517static 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
    305525} // forall( T )
     526
     527
  • libcfa/src/concurrency/future.hfa

    r3a513d89 r044ae62  
    1919#include "monitor.hfa"
    2020#include "select.hfa"
     21#include "locks.hfa"
    2122
    2223//----------------------------------------------------------------------------
     
    2627//  future_t is lockfree and uses atomics which aren't needed given we use locks here
    2728forall( T ) {
    28     // enum(int) { FUTURE_EMPTY = 0, FUTURE_FULFILLED = 1 }; // Enums seem to be broken so feel free to add this back afterwards
     29    // enum { FUTURE_EMPTY = 0, FUTURE_FULFILLED = 1 }; // Enums seem to be broken so feel free to add this back afterwards
    2930
    3031    // temporary enum replacement
     
    4445    };
    4546
    46     // C_TODO: perhaps allow exceptions to be inserted like uC++?
    47 
    4847        static inline {
    4948
     
    5352        }
    5453
    55         void ?{}(future(T) & this) {
     54        void ?{}( future(T) & this ) {
    5655                        this.waiters{};
    5756            this.state = FUTURE_EMPTY;
     
    6059
    6160                // Reset future back to original state
    62                 void reset(future(T) & this) with(this)
     61                void reset( future(T) & this ) with(this)
    6362        {
    6463            lock( lock );
     
    8281        void _internal_flush( future(T) & this ) with(this) {
    8382            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
    8485                select_node &s = try_pop_front( waiters );
    8586
    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;
     87                if ( s.clause_status == 0p ) // poke in result so that woken threads do not need to reacquire any locks
    8988                    copy_T( result, *(((future_node(T) &)s).my_result) );
    90                 else if ( !install_select_winner( s, &this ) ) continue;
    9189               
    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 );
     90                wake_one( waiters, s );
    9591            }
    9692        }
    9793
    9894                // Fulfil the future, returns whether or not someone was unblocked
    99                 bool fulfil( future(T) & this, T & val ) with(this) {
     95                bool fulfil( future(T) & this, T val ) with(this) {
    10096            lock( lock );
    10197            if( state != FUTURE_EMPTY )
     
    153149        }
    154150
    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
     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
    159163            if( state == FUTURE_EMPTY ) {
    160164                insert_last( waiters, s );
    161165                unlock( lock );
    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) {
     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;
    177176            lock( lock );
    178177            if ( s`isListed ) remove( s );
    179178            unlock( lock );
     179            return false;
    180180        }
    181181               
     182        bool on_selected( future(T) & this, select_node & node ) { return true; }
    182183        }
    183184}
     
    186187// These futures below do not support select statements so they may not be as useful as 'future'
    187188//  however the 'single_future' is cheap and cheerful and is most likely more performant than 'future'
    188 //  since it uses raw atomics and no locks afaik
     189//  since it uses raw atomics and no locks
    189190//
    190191// 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

    r3a513d89 r044ae62  
    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 
    222219                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;
    223224
    224225                PRNG_STATE_T random_state;                                              // fast random numbers
  • libcfa/src/concurrency/locks.cfa

    r3a513d89 r044ae62  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // locks.hfa -- LIBCFATHREAD
     7// locks.cfa -- 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                 insert_last( blocked_threads, *thrd );
     81        select_node node;
     82                insert_last( blocked_threads, node );
    8283                wait_count++;
    8384                unlock( lock );
    8485                park( );
    85         }
    86         // multi acquisition lock is held by current thread
    87         else if ( owner == thrd && multi_acquisition ) {
     86        return;
     87        } else if ( owner == thrd && multi_acquisition ) { // multi acquisition lock is held by current thread
    8888                recursion_count++;
    89                 unlock( lock );
    90         }
    91         // lock isn't held
    92         else {
     89        } else {  // lock isn't held
    9390                owner = thrd;
    9491                recursion_count = 1;
    95                 unlock( lock );
    96         }
     92        }
     93    unlock( lock );
    9794}
    9895
     
    117114}
    118115
    119 static 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 );
     116static 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    }
    125129}
    126130
     
    134138        recursion_count--;
    135139        if ( recursion_count == 0 ) {
    136                 pop_and_set_new_owner( this );
     140                pop_node( this );
    137141        }
    138142        unlock( lock );
     
    147151        // lock held
    148152        if ( owner != 0p ) {
    149                 insert_last( blocked_threads, *t );
     153                insert_last( blocked_threads, *(select_node *)t->link_node );
    150154                wait_count++;
    151                 unlock( lock );
    152155        }
    153156        // lock not held
     
    156159                recursion_count = 1;
    157160                unpark( t );
    158                 unlock( lock );
    159         }
    160 }
    161 
    162 size_t on_wait( blocking_lock & this ) with( this ) {
     161        }
     162    unlock( lock );
     163}
     164
     165size_t on_wait( blocking_lock & this, __cfa_pre_park pp_fn, void * pp_datum ) with( this ) {
    163166        lock( lock __cfaabi_dbg_ctx2 );
    164167        /* paranoid */ verifyf( owner != 0p, "Attempt to release lock %p that isn't held", &this );
     
    167170        size_t ret = recursion_count;
    168171
    169         pop_and_set_new_owner( this );
     172        pop_node( this );
     173
     174    select_node node;
     175    active_thread()->link_node = (void *)&node;
    170176        unlock( lock );
     177
     178    pre_park_then_park( pp_fn, pp_datum );
     179
    171180        return ret;
    172181}
     
    175184        recursion_count = recursion;
    176185}
     186
     187// waituntil() support
     188bool 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
     220bool 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
     241bool on_selected( blocking_lock & this, select_node & node ) { return true; }
    177242
    178243//-----------------------------------------------------------------------------
     
    311376        int counter( condition_variable(L) & this ) with(this) { return count; }
    312377
    313         static size_t queue_and_get_recursion( condition_variable(L) & this, info_thread(L) * i ) with(this) {
     378        static void enqueue_thread( condition_variable(L) & this, info_thread(L) * i ) with(this) {
    314379                // add info_thread to waiting queue
    315380                insert_last( blocked_threads, *i );
    316381                count++;
    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         }
     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 ); }
    324393
    325394        // helper for wait()'s' with no timeout
    326395        static void queue_info_thread( condition_variable(L) & this, info_thread(L) & i ) with(this) {
    327396                lock( lock __cfaabi_dbg_ctx2 );
    328                 size_t recursion_count = queue_and_get_recursion(this, &i);
     397        enqueue_thread( this, &i );
    329398                unlock( lock );
    330399
    331400                // blocks here
    332                 park( );
     401        size_t recursion_count = block_and_get_recursion( i );
    333402
    334403                // resets recursion count here after waking
    335                 if (i.lock) on_wakeup(*i.lock, recursion_count);
     404                if ( i.lock ) on_wakeup( *i.lock, recursion_count );
    336405        }
    337406
     
    340409                queue_info_thread( this, i );
    341410
     411    static void cond_alarm_register( void * node_ptr ) { register_self( (alarm_node_t *)node_ptr ); }
     412
    342413        // helper for wait()'s' with a timeout
    343414        static void queue_info_thread_timeout( condition_variable(L) & this, info_thread(L) & info, Duration t, Alarm_Callback callback ) with(this) {
    344415                lock( lock __cfaabi_dbg_ctx2 );
    345                 size_t recursion_count = queue_and_get_recursion(this, &info);
     416        enqueue_thread( this, &info );
    346417                alarm_node_wrap(L) node_wrap = { t, 0`s, callback, &this, &info };
    347418                unlock( lock );
    348419
    349                 // registers alarm outside cond lock to avoid deadlock
    350                 register_self( &node_wrap.alarm_node );
    351 
    352                 // blocks here
    353                 park();
     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();
    354423
    355424                // unregisters alarm so it doesn't go off if this happens first
     
    357426
    358427                // resets recursion count here after waking
    359                 if (info.lock) on_wakeup(*info.lock, recursion_count);
     428                if ( info.lock ) on_wakeup( *info.lock, recursion_count );
    360429        }
    361430
     
    417486                info_thread( L ) i = { active_thread(), info, &l };
    418487                insert_last( blocked_threads, i );
    419                 size_t recursion_count = on_wait( *i.lock );
    420                 park( );
     488                size_t recursion_count = on_wait( *i.lock, pre_park_noop, 0p ); // blocks here
     489                // park( );
    421490                on_wakeup(*i.lock, recursion_count);
    422491        }
     
    459528        bool empty ( pthread_cond_var(L) & this ) with(this) { return blocked_threads`isEmpty; }
    460529
    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        
    469530        static void queue_info_thread_timeout( pthread_cond_var(L) & this, info_thread(L) & info, Duration t, Alarm_Callback callback ) with(this) {
    470531                lock( lock __cfaabi_dbg_ctx2 );
    471                 size_t recursion_count = queue_and_get_recursion(this, &info);
     532        insert_last( blocked_threads, info );
    472533                pthread_alarm_node_wrap(L) node_wrap = { t, 0`s, callback, &this, &info };
    473534                unlock( lock );
    474535
    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
     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
    482540                unregister_self( &node_wrap.alarm_node );
    483541
    484542                // resets recursion count here after waking
    485                 if (info.lock) on_wakeup(*info.lock, recursion_count);
     543                if ( info.lock ) on_wakeup( *info.lock, recursion_count );
    486544        }
    487545
     
    493551                lock( lock __cfaabi_dbg_ctx2 );
    494552                info_thread( L ) i = { active_thread(), info, &l };
    495                 size_t recursion_count = queue_and_get_recursion(this, &i);
    496                 unlock( lock );
    497                 park( );
    498                 on_wakeup(*i.lock, recursion_count);
     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 );
    499560        }
    500561
     
    584645        return thrd != 0p;
    585646}
     647
  • libcfa/src/concurrency/locks.hfa

    r3a513d89 r044ae62  
    3030#include "time.hfa"
    3131
     32#include "select.hfa"
     33
    3234#include <fstream.hfa>
    3335
     
    3739#include <unistd.h>
    3840
    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
     41typedef void (*__cfa_pre_park)( void * );
     42
     43static inline void pre_park_noop( void * ) {}
     44
     45//-----------------------------------------------------------------------------
     46// is_blocking_lock
     47forall( L & | sized(L) )
     48trait 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
     59static 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
    4385
    4486//-----------------------------------------------------------------------------
     
    67109static inline bool   try_lock ( single_acquisition_lock & this ) { return try_lock( (blocking_lock &)this ); }
    68110static inline void   unlock   ( single_acquisition_lock & this ) { unlock  ( (blocking_lock &)this ); }
    69 static inline size_t on_wait  ( single_acquisition_lock & this ) { return on_wait ( (blocking_lock &)this ); }
     111static 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 ); }
    70112static inline void   on_wakeup( single_acquisition_lock & this, size_t v ) { on_wakeup ( (blocking_lock &)this, v ); }
    71113static inline void   on_notify( single_acquisition_lock & this, struct thread$ * t ) { on_notify( (blocking_lock &)this, t ); }
     114static inline bool   register_select( single_acquisition_lock & this, select_node & node ) { return register_select( (blocking_lock &)this, node ); }
     115static inline bool   unregister_select( single_acquisition_lock & this, select_node & node ) { return unregister_select( (blocking_lock &)this, node ); }
     116static inline bool   on_selected( single_acquisition_lock & this, select_node & node ) { return on_selected( (blocking_lock &)this, node ); }
    72117
    73118//----------
     
    81126static inline bool   try_lock ( owner_lock & this ) { return try_lock( (blocking_lock &)this ); }
    82127static inline void   unlock   ( owner_lock & this ) { unlock  ( (blocking_lock &)this ); }
    83 static inline size_t on_wait  ( owner_lock & this ) { return on_wait ( (blocking_lock &)this ); }
     128static 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 ); }
    84129static inline void   on_wakeup( owner_lock & this, size_t v ) { on_wakeup ( (blocking_lock &)this, v ); }
    85130static inline void   on_notify( owner_lock & this, struct thread$ * t ) { on_notify( (blocking_lock &)this, t ); }
     131static inline bool   register_select( owner_lock & this, select_node & node ) { return register_select( (blocking_lock &)this, node ); }
     132static inline bool   unregister_select( owner_lock & this, select_node & node ) { return unregister_select( (blocking_lock &)this, node ); }
     133static inline bool   on_selected( owner_lock & this, select_node & node ) { return on_selected( (blocking_lock &)this, node ); }
    86134
    87135//-----------------------------------------------------------------------------
     
    128176static inline void ?{}(mcs_spin_node & this) { this.next = 0p; this.locked = true; }
    129177
    130 static inline mcs_spin_node * volatile & ?`next ( mcs_spin_node * node ) {
    131         return node->next;
    132 }
    133 
    134178struct mcs_spin_lock {
    135179        mcs_spin_queue queue;
     
    137181
    138182static inline void lock(mcs_spin_lock & l, mcs_spin_node & n) {
     183    n.locked = true;
    139184        mcs_spin_node * prev = __atomic_exchange_n(&l.queue.tail, &n, __ATOMIC_SEQ_CST);
    140         n.locked = true;
    141         if(prev == 0p) return;
     185        if( prev == 0p ) return;
    142186        prev->next = &n;
    143         while(__atomic_load_n(&n.locked, __ATOMIC_RELAXED)) Pause();
     187        while( __atomic_load_n(&n.locked, __ATOMIC_RELAXED) ) Pause();
    144188}
    145189
     
    147191        mcs_spin_node * n_ptr = &n;
    148192        if (__atomic_compare_exchange_n(&l.queue.tail, &n_ptr, 0p, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)) return;
    149         while (__atomic_load_n(&n.next, __ATOMIC_RELAXED) == 0p) {}
     193        while (__atomic_load_n(&n.next, __ATOMIC_RELAXED) == 0p) Pause();
    150194        n.next->locked = false;
    151195}
     
    156200// - Kernel thd blocking alternative to the spinlock
    157201// - No ownership (will deadlock on reacq)
     202// - no reacq on wakeup
    158203struct futex_mutex {
    159204        // lock state any state other than UNLOCKED is locked
     
    169214}
    170215
    171 static inline void  ?{}( futex_mutex & this ) with(this) { val = 0; }
    172 
    173 static inline bool internal_try_lock(futex_mutex & this, int & compare_val) with(this) {
     216static inline void ?{}( futex_mutex & this ) with(this) { val = 0; }
     217
     218static inline bool internal_try_lock( futex_mutex & this, int & compare_val) with(this) {
    174219        return __atomic_compare_exchange_n((int*)&val, (int*)&compare_val, 1, false, __ATOMIC_ACQUIRE, __ATOMIC_ACQUIRE);
    175220}
    176221
    177 static inline int internal_exchange(futex_mutex & this) with(this) {
     222static inline int internal_exchange( futex_mutex & this ) with(this) {
    178223        return __atomic_exchange_n((int*)&val, 2, __ATOMIC_ACQUIRE);
    179224}
    180225
    181226// if this is called recursively IT WILL DEADLOCK!!!!!
    182 static inline void lock(futex_mutex & this) with(this) {
     227static inline void lock( futex_mutex & this ) with(this) {
    183228        int state;
    184229
     
    190235                for (int i = 0; i < spin; i++) Pause();
    191236        }
    192 
    193         // // no contention try to acquire
    194         // if (internal_try_lock(this, state)) return;
    195237       
    196238        // if not in contended state, set to be in contended state
     
    212254}
    213255
    214 static inline void on_notify( futex_mutex & f, thread$ * t){ unpark(t); }
    215 static inline size_t on_wait( futex_mutex & f ) {unlock(f); return 0;}
    216 
    217 // to set recursion count after getting signalled;
    218 static inline void on_wakeup( futex_mutex & f, size_t recursion ) {}
     256DEFAULT_ON_NOTIFY( futex_mutex )
     257DEFAULT_ON_WAIT( futex_mutex )
     258DEFAULT_ON_WAKEUP_NO_REACQ( futex_mutex )
    219259
    220260//-----------------------------------------------------------------------------
     
    232272        int val;
    233273};
    234 
    235274static 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;
    236277
    237278static inline bool internal_try_lock(go_mutex & this, int & compare_val, int new_val ) with(this) {
     
    244285
    245286// if this is called recursively IT WILL DEADLOCK!!!!!
    246 static inline void lock(go_mutex & this) with(this) {
     287static inline void lock( go_mutex & this ) with( this ) {
    247288        int state, init_state;
    248289
     
    255296            while( !val ) { // lock unlocked
    256297                state = 0;
    257                 if (internal_try_lock(this, state, init_state)) return;
     298                if ( internal_try_lock( this, state, init_state ) ) return;
    258299            }
    259300            for (int i = 0; i < 30; i++) Pause();
     
    262303        while( !val ) { // lock unlocked
    263304            state = 0;
    264             if (internal_try_lock(this, state, init_state)) return;
     305            if ( internal_try_lock( this, state, init_state ) ) return;
    265306        }
    266307        sched_yield();
    267308       
    268309        // if not in contended state, set to be in contended state
    269         state = internal_exchange(this, 2);
     310        state = internal_exchange( this, 2 );
    270311        if ( !state ) return; // state == 0
    271312        init_state = 2;
    272         futex((int*)&val, FUTEX_WAIT, 2); // if val is not 2 this returns with EWOULDBLOCK
     313        futex( (int*)&val, FUTEX_WAIT, 2 ); // if val is not 2 this returns with EWOULDBLOCK
    273314    }
    274315}
     
    276317static inline void unlock( go_mutex & this ) with(this) {
    277318        // if uncontended do atomic unlock and then return
    278     if (__atomic_exchange_n(&val, 0, __ATOMIC_RELEASE) == 1) return;
     319    if ( __atomic_exchange_n(&val, 0, __ATOMIC_RELEASE) == 1 ) return;
    279320       
    280321        // otherwise threads are blocked so we must wake one
    281         futex((int *)&val, FUTEX_WAKE, 1);
    282 }
    283 
    284 static inline void on_notify( go_mutex & f, thread$ * t){ unpark(t); }
    285 static inline size_t on_wait( go_mutex & f ) {unlock(f); return 0;}
    286 static 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 
    293 struct clh_lock {
    294         volatile bool * volatile tail;
    295     volatile bool * volatile head;
    296 };
    297 
    298 static inline void  ?{}( clh_lock & this ) { this.tail = malloc(); *this.tail = true; }
    299 static inline void ^?{}( clh_lock & this ) { free(this.tail); }
    300 
    301 static 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 
    310 static inline void unlock(clh_lock & l) {
    311         __atomic_store_n((bool *)(l.head), true, __ATOMIC_SEQ_CST);
    312 }
    313 
    314 static inline void on_notify(clh_lock & this, struct thread$ * t ) { unpark(t); }
    315 static inline size_t on_wait(clh_lock & this) { unlock(this); return 0; }
    316 static inline void on_wakeup(clh_lock & this, size_t recursion ) { lock(this); }
     322        futex( (int *)&val, FUTEX_WAKE, 1 );
     323}
     324
     325DEFAULT_ON_NOTIFY( go_mutex )
     326DEFAULT_ON_WAIT( go_mutex )
     327DEFAULT_ON_WAKEUP_NO_REACQ( go_mutex )
    317328
    318329//-----------------------------------------------------------------------------
     
    334345        this.lock_value = 0;
    335346}
     347static inline void ?{}( exp_backoff_then_block_lock & this, exp_backoff_then_block_lock this2 ) = void;
     348static inline void ?=?( exp_backoff_then_block_lock & this, exp_backoff_then_block_lock this2 ) = void;
    336349
    337350static inline void  ^?{}( exp_backoff_then_block_lock & this ){}
    338351
    339 static inline bool internal_try_lock(exp_backoff_then_block_lock & this, size_t & compare_val) with(this) {
     352static inline bool internal_try_lock( exp_backoff_then_block_lock & this, size_t & compare_val ) with(this) {
    340353        return __atomic_compare_exchange_n(&lock_value, &compare_val, 1, false, __ATOMIC_ACQUIRE, __ATOMIC_RELAXED);
    341354}
    342355
    343 static inline bool try_lock(exp_backoff_then_block_lock & this) { size_t compare_val = 0; return internal_try_lock(this, compare_val); }
    344 
    345 static 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 
    349 static inline bool block(exp_backoff_then_block_lock & this) with(this) {
     356static inline bool try_lock( exp_backoff_then_block_lock & this ) { size_t compare_val = 0; return internal_try_lock( this, compare_val ); }
     357
     358static 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
     362static inline bool block( exp_backoff_then_block_lock & this ) with(this) {
    350363    lock( spinlock __cfaabi_dbg_ctx2 );
    351364    if (__atomic_load_n( &lock_value, __ATOMIC_SEQ_CST) != 2) {
     
    359372}
    360373
    361 static inline void lock(exp_backoff_then_block_lock & this) with(this) {
     374static inline void lock( exp_backoff_then_block_lock & this ) with(this) {
    362375        size_t compare_val = 0;
    363376        int spin = 4;
     
    378391}
    379392
    380 static inline void unlock(exp_backoff_then_block_lock & this) with(this) {
     393static inline void unlock( exp_backoff_then_block_lock & this ) with(this) {
    381394    if (__atomic_exchange_n(&lock_value, 0, __ATOMIC_RELEASE) == 1) return;
    382395    lock( spinlock __cfaabi_dbg_ctx2 );
     
    386399}
    387400
    388 static inline void on_notify(exp_backoff_then_block_lock & this, struct thread$ * t ) { unpark(t); }
    389 static inline size_t on_wait(exp_backoff_then_block_lock & this) { unlock(this); return 0; }
    390 static inline void on_wakeup(exp_backoff_then_block_lock & this, size_t recursion ) { lock(this); }
     401DEFAULT_ON_NOTIFY( exp_backoff_then_block_lock )
     402DEFAULT_ON_WAIT( exp_backoff_then_block_lock )
     403DEFAULT_ON_WAKEUP_REACQ( exp_backoff_then_block_lock )
    391404
    392405//-----------------------------------------------------------------------------
     
    418431
    419432// if this is called recursively IT WILL DEADLOCK!!!!!
    420 static inline void lock(fast_block_lock & this) with(this) {
     433static inline void lock( fast_block_lock & this ) with(this) {
    421434        lock( lock __cfaabi_dbg_ctx2 );
    422435        if ( held ) {
     
    430443}
    431444
    432 static inline void unlock(fast_block_lock & this) with(this) {
     445static inline void unlock( fast_block_lock & this ) with(this) {
    433446        lock( lock __cfaabi_dbg_ctx2 );
    434447        /* paranoid */ verifyf( held != false, "Attempt to release lock %p that isn't held", &this );
     
    439452}
    440453
    441 static inline void on_notify(fast_block_lock & this, struct thread$ * t ) with(this) {
     454static inline void on_notify( fast_block_lock & this, struct thread$ * t ) with(this) {
    442455    lock( lock __cfaabi_dbg_ctx2 );
    443456    insert_last( blocked_threads, *t );
    444457    unlock( lock );
    445458}
    446 static inline size_t on_wait(fast_block_lock & this) { unlock(this); return 0; }
    447 static inline void on_wakeup(fast_block_lock & this, size_t recursion ) { }
     459DEFAULT_ON_WAIT( fast_block_lock )
     460DEFAULT_ON_WAKEUP_NO_REACQ( fast_block_lock )
    448461
    449462//-----------------------------------------------------------------------------
     
    456469struct simple_owner_lock {
    457470        // List of blocked threads
    458         dlist( thread$ ) blocked_threads;
     471        dlist( select_node ) blocked_threads;
    459472
    460473        // Spin lock used for mutual exclusion
     
    477490static inline void ?=?( simple_owner_lock & this, simple_owner_lock this2 ) = void;
    478491
    479 static inline void lock(simple_owner_lock & this) with(this) {
    480         if (owner == active_thread()) {
     492static inline void lock( simple_owner_lock & this ) with(this) {
     493        if ( owner == active_thread() ) {
    481494                recursion_count++;
    482495                return;
     
    484497        lock( lock __cfaabi_dbg_ctx2 );
    485498
    486         if (owner != 0p) {
    487                 insert_last( blocked_threads, *active_thread() );
     499        if ( owner != 0p ) {
     500        select_node node;
     501                insert_last( blocked_threads, node );
    488502                unlock( lock );
    489503                park( );
     
    495509}
    496510
    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 
    505 static inline void unlock(simple_owner_lock & this) with(this) {
     511static 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
     525static inline void unlock( simple_owner_lock & this ) with(this) {
    506526        lock( lock __cfaabi_dbg_ctx2 );
    507527        /* paranoid */ verifyf( owner != 0p, "Attempt to release lock %p that isn't held", &this );
     
    510530        recursion_count--;
    511531        if ( recursion_count == 0 ) {
    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 );
     532                pop_node( this );
    517533        }
    518534        unlock( lock );
    519535}
    520536
    521 static inline void on_notify(simple_owner_lock & this, struct thread$ * t ) with(this) {
     537static inline void on_notify( simple_owner_lock & this, thread$ * t ) with(this) {
    522538        lock( lock __cfaabi_dbg_ctx2 );
    523539        // lock held
    524540        if ( owner != 0p ) {
    525                 insert_last( blocked_threads, *t );
     541                insert_last( blocked_threads, *(select_node *)t->link_node );
    526542        }
    527543        // lock not held
     
    534550}
    535551
    536 static inline size_t on_wait(simple_owner_lock & this) with(this) {
     552static inline size_t on_wait( simple_owner_lock & this, __cfa_pre_park pp_fn, void * pp_datum ) with(this) {
    537553        lock( lock __cfaabi_dbg_ctx2 );
    538554        /* paranoid */ verifyf( owner != 0p, "Attempt to release lock %p that isn't held", &this );
     
    541557        size_t ret = recursion_count;
    542558
    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 
     559        pop_node( this );
     560
     561    select_node node;
     562    active_thread()->link_node = (void *)&node;
    550563        unlock( lock );
     564
     565    pre_park_then_park( pp_fn, pp_datum );
     566
    551567        return ret;
    552568}
    553569
    554 static inline void on_wakeup(simple_owner_lock & this, size_t recursion ) with(this) { recursion_count = recursion; }
     570static inline void on_wakeup( simple_owner_lock & this, size_t recursion ) with(this) { recursion_count = recursion; }
     571
     572// waituntil() support
     573static 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
     605static 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
     623static inline bool on_selected( simple_owner_lock & this, select_node & node ) { return true; }
     624
    555625
    556626//-----------------------------------------------------------------------------
     
    578648
    579649// if this is called recursively IT WILL DEADLOCK!
    580 static inline void lock(spin_queue_lock & this) with(this) {
     650static inline void lock( spin_queue_lock & this ) with(this) {
    581651        mcs_spin_node node;
    582652        lock( lock, node );
     
    586656}
    587657
    588 static inline void unlock(spin_queue_lock & this) with(this) {
     658static inline void unlock( spin_queue_lock & this ) with(this) {
    589659        __atomic_store_n(&held, false, __ATOMIC_RELEASE);
    590660}
    591661
    592 static inline void on_notify(spin_queue_lock & this, struct thread$ * t ) {
    593         unpark(t);
    594 }
    595 static inline size_t on_wait(spin_queue_lock & this) { unlock(this); return 0; }
    596 static inline void on_wakeup(spin_queue_lock & this, size_t recursion ) { lock(this); }
    597 
     662DEFAULT_ON_NOTIFY( spin_queue_lock )
     663DEFAULT_ON_WAIT( spin_queue_lock )
     664DEFAULT_ON_WAKEUP_REACQ( spin_queue_lock )
    598665
    599666//-----------------------------------------------------------------------------
     
    621688
    622689// if this is called recursively IT WILL DEADLOCK!!!!!
    623 static inline void lock(mcs_block_spin_lock & this) with(this) {
     690static inline void lock( mcs_block_spin_lock & this ) with(this) {
    624691        mcs_node node;
    625692        lock( lock, node );
     
    633700}
    634701
    635 static inline void on_notify(mcs_block_spin_lock & this, struct thread$ * t ) { unpark(t); }
    636 static inline size_t on_wait(mcs_block_spin_lock & this) { unlock(this); return 0; }
    637 static inline void on_wakeup(mcs_block_spin_lock & this, size_t recursion ) {lock(this); }
     702DEFAULT_ON_NOTIFY( mcs_block_spin_lock )
     703DEFAULT_ON_WAIT( mcs_block_spin_lock )
     704DEFAULT_ON_WAKEUP_REACQ( mcs_block_spin_lock )
    638705
    639706//-----------------------------------------------------------------------------
     
    661728
    662729// if this is called recursively IT WILL DEADLOCK!!!!!
    663 static inline void lock(block_spin_lock & this) with(this) {
     730static inline void lock( block_spin_lock & this ) with(this) {
    664731        lock( lock );
    665732        while(__atomic_load_n(&held, __ATOMIC_SEQ_CST)) Pause();
     
    668735}
    669736
    670 static inline void unlock(block_spin_lock & this) with(this) {
     737static inline void unlock( block_spin_lock & this ) with(this) {
    671738        __atomic_store_n(&held, false, __ATOMIC_RELEASE);
    672739}
    673740
    674 static inline void on_notify(block_spin_lock & this, struct thread$ * t ) with(this.lock) {
     741static inline void on_notify( block_spin_lock & this, struct thread$ * t ) with(this.lock) {
    675742        // first we acquire internal fast_block_lock
    676743        lock( lock __cfaabi_dbg_ctx2 );
     
    686753        unpark(t);
    687754}
    688 static inline size_t on_wait(block_spin_lock & this) { unlock(this); return 0; }
    689 static inline void on_wakeup(block_spin_lock & this, size_t recursion ) with(this) {
     755DEFAULT_ON_WAIT( block_spin_lock )
     756static inline void on_wakeup( block_spin_lock & this, size_t recursion ) with(this) {
    690757        // now we acquire the entire block_spin_lock upon waking up
    691758        while(__atomic_load_n(&held, __ATOMIC_SEQ_CST)) Pause();
     
    693760        unlock( lock ); // Now we release the internal fast_spin_lock
    694761}
    695 
    696 //-----------------------------------------------------------------------------
    697 // is_blocking_lock
    698 forall( L & | sized(L) )
    699 trait 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 };
    709762
    710763//-----------------------------------------------------------------------------
     
    714767forall(L & | is_blocking_lock(L)) {
    715768        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 );
    720769}
    721770
  • libcfa/src/concurrency/mutex_stmt.hfa

    r3a513d89 r044ae62  
    1515};
    1616
    17 
    1817struct __mutex_stmt_lock_guard {
    1918    void ** lockarr;
     
    3029
    3130forall(L & | is_lock(L)) {
    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 );
     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 ) {}
    5334}
  • libcfa/src/concurrency/preemption.cfa

    r3a513d89 r044ae62  
    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

    r3a513d89 r044ae62  
     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
    117#pragma once
    218
    319#include "containers/list.hfa"
    4 #include <stdint.h>
    5 #include <kernel.hfa>
    6 #include <locks.hfa>
     20#include "alarm.hfa"
     21#include "kernel.hfa"
     22#include "time.hfa"
    723
     24struct select_node;
     25
     26// node status
     27static const unsigned long int __SELECT_UNSAT = 0;
     28static const unsigned long int __SELECT_PENDING = 1; // used only by special OR case
     29static const unsigned long int __SELECT_SAT = 2;
     30static const unsigned long int __SELECT_RUN = 3;
     31
     32// these are used inside the compiler to aid in code generation
     33static inline bool __CFA_has_clause_run( unsigned long int status ) { return status == __SELECT_RUN; }
     34static 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
    840struct 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
    946    thread$ * blocked_thread;
    10     void ** race_flag;
    1147    inline dlink(select_node);
    1248};
    1349P9_EMBEDDED( select_node, dlink(select_node) )
    1450
    15 void ?{}( select_node & this ) {
    16     this.blocked_thread = 0p;
    17     this.race_flag = 0p;
     51static 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;
    1856}
    1957
    20 void ?{}( select_node & this, thread$ * blocked_thread ) {
     58static inline void ?{}( select_node & this, thread$ * blocked_thread ) {
    2159    this.blocked_thread = blocked_thread;
    22     this.race_flag = 0p;
     60    this.clause_status = 0p;
     61    this.park_counter = 0p;
     62    this.extra = 0p;
    2363}
    2464
    25 void ?{}( select_node & this, thread$ * blocked_thread, void ** race_flag ) {
     65static inline void ?{}( select_node & this, thread$ * blocked_thread, void * extra ) {
    2666    this.blocked_thread = blocked_thread;
    27     this.race_flag = race_flag;
     67    this.clause_status = 0p;
     68    this.park_counter = 0p;
     69    this.extra = extra;
    2870}
     71static inline void ^?{}( select_node & this ) {}
    2972
    30 void ^?{}( select_node & this ) {}
     73// this is used inside the compiler to aid in code generation
     74static inline unsigned long int * __get_clause_status( select_node & s ) { return s.clause_status; }
    3175
     76// this is used inside the compiler to attempt to establish an else clause as a winner in the OR special case race
     77static 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}
    3282
    3383//-----------------------------------------------------------------------------
    3484// is_selectable
    35 trait 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 & );
     85forall(T & | sized(T))
     86trait 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 & );
    4290
    43     void unregister_select( T &, select_node &  );
     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 & );
    4499};
    45100
    46 static 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
     101//=============================================================================================
     102// Waituntil Helpers
     103//=============================================================================================
     104
     105// used for the 2-stage avail needed by the special OR case
     106static 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;
    63116}
     117
     118static inline void __make_select_node_unsat( select_node & this ) with( this ) {
     119    __atomic_store_n( clause_status, __SELECT_UNSAT, __ATOMIC_SEQ_CST );
     120}
     121static inline void __make_select_node_sat( select_node & this ) with( this ) {
     122    __atomic_store_n( clause_status, __SELECT_SAT, __ATOMIC_SEQ_CST );
     123}
     124
     125static 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
     131static 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
     147static 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
     163static 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
     170static inline void wake_one( dlist( select_node ) & queue ) { wake_one( queue, try_pop_front( queue ) ); }
     171
     172static 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
     179struct select_timeout_node {
     180    alarm_node_t a_node;
     181    select_node * s_node;
     182};
     183void ?{}( select_timeout_node & this, Duration duration, Alarm_Callback callback );
     184void ^?{}( select_timeout_node & this );
     185void timeout_handler_select_cast( alarm_node_t & node );
     186
     187// Selectable trait routines
     188bool register_select( select_timeout_node & this, select_node & node );
     189bool unregister_select( select_timeout_node & this, select_node & node );
     190bool on_selected( select_timeout_node & this, select_node & node );
     191
     192// Gateway routines to waituntil on duration
     193select_timeout_node timeout( Duration duration );
     194select_timeout_node sleep( Duration duration );
  • libcfa/src/concurrency/thread.cfa

    r3a513d89 r044ae62  
    5353        preferred = ready_queue_new_preferred();
    5454        last_proc = 0p;
     55    link_node = 0p;
    5556        PRNG_SET_SEED( random_state, __global_random_mask ? __global_random_prime : __global_random_prime ^ rdtscl() );
    5657        #if defined( __CFA_WITH_VERIFY__ )
     
    5960        #endif
    6061
    61         clh_node = malloc( );
    62         *clh_node = false;
    63 
    6462        doregister(curr_cluster, this);
    6563        monitors{ &self_mon_p, 1, (fptr_t)0 };
     
    7068                canary = 0xDEADDEADDEADDEADp;
    7169        #endif
    72         free(clh_node);
    7370        unregister(curr_cluster, this);
    7471        ^self_cor{};
  • src/AST/Convert.cpp

    r3a513d89 r044ae62  
    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
    587593        const ast::Stmt * visit( const ast::WaitForStmt * node ) override final {
    588594                if ( inCache( node ) ) return nullptr;
     
    591597                for ( auto clause : node->clauses ) {
    592598                        stmt->clauses.push_back({{
    593                                         get<Expression>().accept1( clause->target_func ),
     599                                        get<Expression>().accept1( clause->target ),
    594600                                        get<Expression>().acceptL( clause->target_args ),
    595601                                },
    596602                                get<Statement>().accept1( clause->stmt ),
    597                                 get<Expression>().accept1( clause->cond ),
     603                                get<Expression>().accept1( clause->when_cond ),
    598604                        });
    599605                }
     
    612618        const ast::WaitForClause * visit( const ast::WaitForClause * node ) override final {
    613619                // 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.
    614626                assert( !node );
    615627                return nullptr;
     
    21992211                        auto clause = new ast::WaitForClause( old->location );
    22002212
    2201                         clause->target_func = GET_ACCEPT_1(clauses[i].target.function, Expr);
     2213                        clause->target = GET_ACCEPT_1(clauses[i].target.function, Expr);
    22022214                        clause->target_args = GET_ACCEPT_V(clauses[i].target.arguments, Expr);
    22032215                        clause->stmt = GET_ACCEPT_1(clauses[i].statement, Stmt);
    2204                         clause->cond = GET_ACCEPT_1(clauses[i].condition, Expr);
     2216                        clause->when_cond = GET_ACCEPT_1(clauses[i].condition, Expr);
    22052217
    22062218                        stmt->clauses.push_back( clause );
  • src/AST/Fwd.hpp

    r3a513d89 r044ae62  
    5959class FinallyClause;
    6060class SuspendStmt;
     61class WhenClause;
    6162class WaitForStmt;
    6263class WaitForClause;
     64class WaitUntilStmt;
    6365class WithStmt;
    6466class DeclStmt;
  • src/AST/Node.cpp

    r3a513d89 r044ae62  
    176176template class ast::ptr_base< ast::FinallyClause, ast::Node::ref_type::weak >;
    177177template class ast::ptr_base< ast::FinallyClause, ast::Node::ref_type::strong >;
     178template class ast::ptr_base< ast::WhenClause, ast::Node::ref_type::weak >;
     179template class ast::ptr_base< ast::WhenClause, ast::Node::ref_type::strong >;
    178180template class ast::ptr_base< ast::WaitForStmt, ast::Node::ref_type::weak >;
    179181template class ast::ptr_base< ast::WaitForStmt, ast::Node::ref_type::strong >;
    180182template class ast::ptr_base< ast::WaitForClause, ast::Node::ref_type::weak >;
    181183template class ast::ptr_base< ast::WaitForClause, ast::Node::ref_type::strong >;
     184template class ast::ptr_base< ast::WaitUntilStmt, ast::Node::ref_type::weak >;
     185template class ast::ptr_base< ast::WaitUntilStmt, ast::Node::ref_type::strong >;
    182186template class ast::ptr_base< ast::WithStmt, ast::Node::ref_type::weak >;
    183187template class ast::ptr_base< ast::WithStmt, ast::Node::ref_type::strong >;
  • src/AST/Pass.hpp

    r3a513d89 r044ae62  
    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;
    165166        const ast::Stmt *             visit( const ast::WaitForStmt          * ) override final;
    166167        const ast::WaitForClause *    visit( const ast::WaitForClause        * ) override final;
     168    const ast::Stmt *             visit( const ast::WaitUntilStmt        * ) override final;
    167169        const ast::Decl *             visit( const ast::WithStmt             * ) override final;
    168170        const ast::NullStmt *         visit( const ast::NullStmt             * ) override final;
  • src/AST/Pass.impl.hpp

    r3a513d89 r044ae62  
    2222#include "AST/TranslationUnit.hpp"
    2323#include "AST/TypeSubstitution.hpp"
    24 #include "Common/Iterate.hpp"
    2524
    2625#define VISIT_START( node ) \
     
    127126        }
    128127
    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 
    135128        template< typename core_t >
    136129        template< typename node_t >
     
    234227
    235228                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;
    286229        }
    287230
     
    353296
    354297                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
    371298        }
    372299
     
    10971024
    10981025//--------------------------------------------------------------------------
     1026// WhenClause
     1027template< typename core_t >
     1028const 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//--------------------------------------------------------------------------
    10991041// WaitForStmt
    11001042template< typename core_t >
     
    11211063
    11221064        if ( __visit_children() ) {
    1123                 maybe_accept( node, &WaitForClause::target_func );
     1065                maybe_accept( node, &WaitForClause::target );
    11241066                maybe_accept( node, &WaitForClause::target_args );
    11251067                maybe_accept( node, &WaitForClause::stmt );
    1126                 maybe_accept( node, &WaitForClause::cond );
     1068                maybe_accept( node, &WaitForClause::when_cond );
    11271069        }
    11281070
    11291071        VISIT_END( WaitForClause, node );
     1072}
     1073
     1074//--------------------------------------------------------------------------
     1075// WaitUntilStmt
     1076template< typename core_t >
     1077const 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 );
    11301090}
    11311091
     
    22342194}
    22352195
     2196#undef __pedantic_pass_assertf
     2197#undef __pedantic_pass_assert
    22362198#undef VISIT_START
    22372199#undef VISIT_END
  • src/AST/Pass.proto.hpp

    r3a513d89 r044ae62  
    1717// IWYU pragma: private, include "Pass.hpp"
    1818
     19#include "Common/Iterate.hpp"
    1920#include "Common/Stats/Heap.h"
    2021namespace ast {
     
    2425        template<typename node_t> node_t * deepCopy( const node_t * );
    2526}
     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
    2635
    2736namespace ast::__pass {
     
    130139
    131140        template< typename object_t, typename super_t, typename field_t >
    132         void apply( object_t *, field_t super_t::* field );
     141        void apply( object_t * object, field_t super_t::* field ) {
     142                object->*field = value;
     143        }
    133144};
    134145
     
    150161
    151162        template< typename object_t, typename super_t, typename field_t >
    152         void apply( object_t *, field_t super_t::* field );
     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        }
    153182
    154183        template< template<class...> class incontainer_t >
    155         void take_all( incontainer_t<ptr<Stmt>> * stmts );
     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        }
    156194
    157195        template< template<class...> class incontainer_t >
    158         void take_all( incontainer_t<ptr<Decl>> * decls );
     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        }
    159207};
    160208
     
    166214
    167215        template< typename object_t, typename super_t, typename field_t >
    168         void apply( object_t *, field_t super_t::* field );
     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        }
    169228};
    170229
     
    534593
    535594} // namespace ast::__pass
     595
     596#undef __pedantic_pass_assertf
     597#undef __pedantic_pass_assert
  • src/AST/Print.cpp

    r3a513d89 r044ae62  
    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
    210237        void preprint( const ast::NamedTypeDecl * node ) {
    211238                if ( ! node->name.empty() ) {
     
    761788        }
    762789
     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
    763807        virtual const ast::Stmt * visit( const ast::WaitForStmt * node ) override final {
    764808                os << "Waitfor Statement" << endl;
     
    798842        virtual const ast::WaitForClause * visit( const ast::WaitForClause * node ) override final {
    799843                os << indent-1 << "target function: ";
    800                 safe_print( node->target_func );
     844                safe_print( node->target );
    801845
    802846                if ( !node->target_args.empty() ) {
     
    812856                }
    813857
    814                 if ( node->cond ) {
     858                if ( node->when_cond ) {
    815859                        os << indent-1 << "... with condition:" << endl;
    816                         node->cond->accept( *this );
    817                 }
    818 
     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 )
    819873                return node;
    820874        }
  • src/AST/Stmt.hpp

    r3a513d89 r044ae62  
    378378};
    379379
    380 // Waitfor statement: when (...) waitfor (... , ...) ... timeout(...) ... else ...
    381 class WaitForStmt final : public Stmt {
    382   public:
    383         std::vector<ptr<WaitForClause>> clauses;
    384         ptr<Expr> timeout_time;
     380// Base class of WaitFor/WaitUntil statements
     381// form: KEYWORD(...) ... timeout(...) ... else ...
     382class WaitStmt : public Stmt {
     383  public:
     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 = {} )
     391                : Stmt(loc, std::move(labels)) {}
     392
     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
     400class WhenClause : public StmtClause {
     401  public:
     402        ptr<Expr> target;
     403        ptr<Stmt> stmt;
     404        ptr<Expr> when_cond;
     405
     406        WhenClause( const CodeLocation & loc )
     407                : StmtClause( loc ) {}
     408
     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 ...
     416class WaitForStmt final : public WaitStmt {
     417  public:
     418        std::vector<ptr<WaitForClause>> clauses;
     419
    390420        WaitForStmt( const CodeLocation & loc, const std::vector<Label> && labels = {} )
    391                 : Stmt(loc, std::move(labels)) {}
     421                : WaitStmt(loc, std::move(labels)) {}
    392422
    393423        const Stmt * accept( Visitor & v ) const override { return v.visit( this ); }
     
    398428
    399429// Clause in a waitfor statement: waitfor (..., ...) ...
    400 class WaitForClause final : public StmtClause {
    401   public:
    402         ptr<Expr> target_func;
     430class WaitForClause final : public WhenClause {
     431  public:
    403432        std::vector<ptr<Expr>> target_args;
    404         ptr<Stmt> stmt;
    405         ptr<Expr> cond;
    406433
    407434        WaitForClause( const CodeLocation & loc )
    408                 : StmtClause( loc ) {}
     435                : WhenClause( loc ) {}
    409436
    410437        const WaitForClause * accept( Visitor & v ) const override { return v.visit( this ); }
    411438  private:
    412439        WaitForClause * clone() const override { return new WaitForClause{ *this }; }
     440        MUTATE_FRIEND
     441};
     442
     443// waituntil statement: when (...) waituntil (...) ... timeout(...) ... else ...
     444class 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 }; }
    413486        MUTATE_FRIEND
    414487};
  • src/AST/Visitor.hpp

    r3a513d89 r044ae62  
    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;
    5354    virtual const ast::Stmt *             visit( const ast::WaitForStmt          * ) = 0;
    5455    virtual const ast::WaitForClause *    visit( const ast::WaitForClause        * ) = 0;
     56    virtual const ast::Stmt *             visit( const ast::WaitUntilStmt        * ) = 0;
    5557    virtual const ast::Decl *             visit( const ast::WithStmt             * ) = 0;
    5658    virtual const ast::NullStmt *         visit( const ast::NullStmt             * ) = 0;
  • src/Common/CodeLocationTools.cpp

    r3a513d89 r044ae62  
    129129    macro(FinallyClause, FinallyClause) \
    130130    macro(SuspendStmt, Stmt) \
     131    macro(WhenClause, WhenClause) \
    131132    macro(WaitForStmt, Stmt) \
    132133    macro(WaitForClause, WaitForClause) \
     134    macro(WaitUntilStmt, Stmt) \
    133135    macro(WithStmt, Decl) \
    134136    macro(NullStmt, NullStmt) \
  • src/Concurrency/WaitforNew.cpp

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

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

    r3a513d89 r044ae62  
    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_func = maybeBuild( targetExpr );
     330        clause->target = maybeBuild( targetExpr );
    331331        clause->stmt = maybeMoveBuild( stmt );
    332         clause->cond = notZeroExpr( maybeMoveBuild( when ) );
     332        clause->when_cond = notZeroExpr( maybeMoveBuild( when ) );
    333333
    334334        ExpressionNode * next = dynamic_cast<ExpressionNode *>( targetExpr->get_next() );
     
    359359        return existing;
    360360} // build_waitfor_timeout
     361
     362ast::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}
     369ast::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}
     375ast::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
     383ast::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}
    361450
    362451ast::Stmt * build_with( const CodeLocation & location, ExpressionNode * exprs, StatementNode * stmt ) {
  • src/Parser/StatementNode.h

    r3a513d89 r044ae62  
    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 );
     102ast::WaitUntilStmt::ClauseNode * build_waituntil_clause( const CodeLocation &, ExpressionNode * when, ExpressionNode * targetExpr, StatementNode * stmt );
     103ast::WaitUntilStmt::ClauseNode * build_waituntil_else( const CodeLocation &, ExpressionNode * when, StatementNode * stmt );
     104ast::WaitUntilStmt::ClauseNode * build_waituntil_timeout( const CodeLocation &, ExpressionNode * when, ExpressionNode * timeout, StatementNode * stmt );
     105ast::WaitUntilStmt * build_waituntil_stmt( const CodeLocation &, ast::WaitUntilStmt::ClauseNode * root );
    102106ast::Stmt * build_with( const CodeLocation &, ExpressionNode * exprs, StatementNode * stmt );
    103107ast::Stmt * build_mutex( const CodeLocation &, ExpressionNode * exprs, StatementNode * stmt );
  • src/Parser/lex.ll

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

    r3a513d89 r044ae62  
    99// Author           : Peter A. Buhr
    1010// Created On       : Sat Sep  1 20:22:55 2001
    11 // Last Modified By : Andrew Beach
    12 // Last Modified On : Tue Apr  4 14:02:00 2023
    13 // Update Count     : 6329
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Wed Apr 26 16:45:37 2023
     13// Update Count     : 6330
    1414//
    1515
     
    307307        ClauseNode * clause;
    308308        ast::WaitForStmt * wfs;
     309    ast::WaitUntilStmt::ClauseNode * wucn;
    309310        CondCtl * ifctl;
    310311        ForCtrl * forctl;
     
    427428%type<expr> when_clause                                 when_clause_opt                         waitfor         waituntil               timeout
    428429%type<stmt> waitfor_statement                           waituntil_statement
    429 %type<wfs> wor_waitfor_clause                   waituntil_clause                        wand_waituntil_clause   wor_waituntil_clause
     430%type<wfs> wor_waitfor_clause
     431%type<wucn> waituntil_clause                    wand_waituntil_clause       wor_waituntil_clause
    430432
    431433// declarations
     
    16821684
    16831685waituntil:
    1684         WAITUNTIL '(' cast_expression ')'
     1686        WAITUNTIL '(' comma_expression ')'
    16851687                { $$ = $3; }
    16861688        ;
     
    16881690waituntil_clause:
    16891691        when_clause_opt waituntil statement
    1690                 { printf( "waituntil_clause 1\n" ); $$ = nullptr; }
     1692                { $$ = build_waituntil_clause( yylloc, $1, $2, maybe_build_compound( yylloc, $3 ) ); }
    16911693        | '(' wor_waituntil_clause ')'
    1692                 { printf( "waituntil_clause 2\n" ); $$ = nullptr; }
     1694                { $$ = $2; }
    16931695        ;
    16941696
    16951697wand_waituntil_clause:
    16961698        waituntil_clause                                                                        %prec THEN
    1697                 { printf( "wand_waituntil_clause 1\n" ); $$ = nullptr; }
     1699                { $$ = $1; }
    16981700        | waituntil_clause wand wand_waituntil_clause
    1699                 { printf( "wand_waituntil_clause 2\n" ); $$ = nullptr; }
     1701                { $$ = new ast::WaitUntilStmt::ClauseNode( ast::WaitUntilStmt::ClauseNode::Op::AND, $1, $3 ); }
    17001702        ;
    17011703
    17021704wor_waituntil_clause:
    17031705        wand_waituntil_clause
    1704                 { printf( "wor_waituntil_clause 1\n" ); $$ = nullptr; }
     1706                { $$ = $1; }
    17051707        | wor_waituntil_clause wor wand_waituntil_clause
    1706                 { printf( "wor_waituntil_clause 2\n" ); $$ = nullptr; }
     1708                { $$ = new ast::WaitUntilStmt::ClauseNode( ast::WaitUntilStmt::ClauseNode::Op::OR, $1, $3 ); }
    17071709        | wor_waituntil_clause wor when_clause_opt ELSE statement
    1708                 { printf( "wor_waituntil_clause 3\n" ); $$ = nullptr; }
     1710                { $$ = new ast::WaitUntilStmt::ClauseNode( ast::WaitUntilStmt::ClauseNode::Op::LEFT_OR, $1, build_waituntil_else( yylloc, $3, maybe_build_compound( yylloc, $5 ) ) ); }
    17091711        | wor_waituntil_clause wor when_clause_opt timeout statement    %prec THEN
    1710                 { printf( "wor_waituntil_clause 4\n" ); $$ = nullptr; }
     1712                { $$ = new ast::WaitUntilStmt::ClauseNode( ast::WaitUntilStmt::ClauseNode::Op::LEFT_OR, $1, build_waituntil_timeout( yylloc, $3, $4, maybe_build_compound( yylloc, $5 ) ) ); }
    17111713        // "else" must be conditional after timeout or timeout is never triggered (i.e., it is meaningless)
    17121714        | wor_waituntil_clause wor when_clause_opt timeout statement wor ELSE statement // syntax error
    17131715                { SemanticError( yylloc, "else clause must be conditional after timeout or timeout never triggered." ); $$ = nullptr; }
    17141716        | wor_waituntil_clause wor when_clause_opt timeout statement wor when_clause ELSE statement
    1715                 { printf( "wor_waituntil_clause 6\n" ); $$ = nullptr; }
     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 ) ) ) ); }
    17161721        ;
    17171722
     
    17191724        wor_waituntil_clause                                                            %prec THEN
    17201725                // SKULLDUGGERY: create an empty compound statement to test parsing of waituntil statement.
    1721                 { $$ = new StatementNode( build_compound( yylloc, nullptr ) ); }
     1726                {
     1727            $$ = new StatementNode( build_waituntil_stmt( yylloc, $1 ) );
     1728            // $$ = new StatementNode( build_compound( yylloc, nullptr ) );
     1729        }
    17221730        ;
    17231731
  • src/ResolvExpr/Resolver.cc

    r3a513d89 r044ae62  
    17301730
    17311731                        // Find all candidates for a function in canonical form
    1732                         funcFinder.find( clause.target_func, ResolvMode::withAdjustment() );
     1732                        funcFinder.find( clause.target, ResolvMode::withAdjustment() );
    17331733
    17341734                        if ( funcFinder.candidates.empty() ) {
    17351735                                stringstream ss;
    17361736                                ss << "Use of undeclared indentifier '";
    1737                                 ss << clause.target_func.strict_as< ast::NameExpr >()->name;
     1737                                ss << clause.target.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_func = funcCandidates.front()->expr;
     1924                        clause2->target = 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->cond = findSingleExpression( clause.cond, context );
     1947                        clause2->when_cond = findSingleExpression( clause.when_cond, context );
    19481948                        clause2->stmt = clause.stmt->accept( *visitor );
    19491949
  • src/main.cc

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

    r3a513d89 r044ae62  
    1111## Created On       : Sun May 31 09:08:15 2015
    1212## Last Modified By : Peter A. Buhr
    13 ## Last Modified On : Mon Apr 10 23:24:02 2023
    14 ## Update Count     : 96
     13## Last Modified On : Tue May 16 09:27:48 2023
     14## Update Count     : 178
    1515###############################################################################
    1616
     
    2222DEFAULT_INCLUDES = -I${abs_srcdir}
    2323
    24 debug=yes
    25 installed=no
     24debug ?= yes
     25installed ?= no
     26ARCH = ${if ${arch},"--arch=${arch}"}
     27arch_support = "x86/x64/arm"
     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
    2632archiveerrors=
    27 
    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 
    3233concurrent=
    3334timeouts=
     
    3738# applies to both programs
    3839# since automake doesn't have support for CFA we have to
    39 AM_CFLAGS = $(if $(test), 2> $(test), ) \
    40         -fdebug-prefix-map=$(abspath ${abs_srcdir})= \
     40AM_CFLAGS = ${if ${test}, 2> ${test}, } \
     41        -fdebug-prefix-map=${abspath ${abs_srcdir}}= \
    4142        -fdebug-prefix-map=/tmp= \
    4243        -fno-diagnostics-show-caret \
     
    5152
    5253# get the desired cfa to test
    53 TARGET_CFA = $(if $(filter $(installed),yes), @CFACC_INSTALL@, @CFACC@)
     54TARGET_CFA = ${if ${filter ${installed},yes}, @CFACC_INSTALL@, @CFACC@}
    5455
    5556# adjust CC to current flags
    56 CC = LC_ALL=C $(if $(DISTCC_CFA_PATH),distcc $(DISTCC_CFA_PATH) ${ARCH_FLAGS} ,$(TARGET_CFA) ${DEBUG_FLAGS} ${ARCH_FLAGS})
    57 CFACC = $(CC)
     57CC = LC_ALL=C ${if ${DISTCC_CFA_PATH},distcc ${DISTCC_CFA_PATH} ${ARCH_FLAGS} ,${TARGET_CFA} ${DEBUG_FLAGS} ${ARCH_FLAGS}}
     58CFACC = ${CC}
    5859
    5960# get local binary for depedencies
     
    6162
    6263# adjusted CC but without the actual distcc call
    63 CFACCLOCAL = $(if $(DISTCC_CFA_PATH),$(DISTCC_CFA_PATH) ${ARCH_FLAGS} ,$(TARGET_CFA) ${DEBUG_FLAGS} ${ARCH_FLAGS})
    64 CFACCLINK = $(CFACCLOCAL) -quiet $(if $(test), 2> $(test), ) $($(shell echo "${@}_FLAGSLD" | sed 's/-\|\//_/g'))
    65 
    66 PRETTY_PATH=mkdir -p $(dir $(abspath ${@})) && cd ${srcdir} &&
    67 
    68 .PHONY: list .validate .test_makeflags
    69 .INTERMEDIATE: .validate .validate.cfa .test_makeflags
     64CFACCLOCAL = ${if ${DISTCC_CFA_PATH},${DISTCC_CFA_PATH} ${ARCH_FLAGS} ,${TARGET_CFA} ${DEBUG_FLAGS} ${ARCH_FLAGS}}
     65CFACCLINK = ${CFACCLOCAL} -quiet ${if ${test}, 2> ${test}, } ${${shell echo "${@}_FLAGSLD" | sed 's/-\|\//_/g'}}
     66
     67PRETTY_PATH = mkdir -p ${dir ${abspath ${@}}} && cd ${srcdir} &&
     68
     69.PHONY : list .validate .test_makeflags
     70.INTERMEDIATE : .validate .validate.cfa .test_makeflags
    7071EXTRA_PROGRAMS = avl_test linkonce linking/mangling/anon .dummy_hack # build but do not install
    7172EXTRA_DIST = test.py \
     
    9596        for file in `${TEST_PY} --list-dist`; do \
    9697                if test -f ${srcdir}/$${file}; then \
    97                         $(MKDIR_P) $$(dirname ${distdir}/$${file}); \
     98                        ${MKDIR_P} $$(dirname ${distdir}/$${file}); \
    9899                        cp -df ${srcdir}/$${file} ${distdir}/$${file}; \
    99100                fi; \
     
    107108
    108109#----------------------------------------------------------------------------------------------------------------
    109 all-local :
    110         @+${TEST_PY} --debug=${debug} --install=${installed} --archive-errors=${archiveerrors} ${concurrent} ${timeouts} ${quick_test}
    111 
    112 all-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
     110
     111all-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
     114install : all-local # PAB only
     115
     116tests : all-local
     117
     118quick :
     119        @+${TEST_PY} --debug=${debug} --install=${installed} --archive-errors=${archiveerrors} ${concurrent} ${timeouts} ${ARCH} ${quick_test}
     120
     121concurrency :
     122        @+${TEST_PY} --debug=${debug} --install=${installed} ${ARCH} -Iconcurrent
     123
     124list :
     125        @+${TEST_PY} --list ${concurrent}
     126
     127help :
     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"
    114140
    115141mostlyclean-local :
     
    123149        find ${builddir} -path '*.Po' -delete
    124150
    125 list :
    126         @+${TEST_PY} --list ${concurrent}
    127 
    128151.test_makeflags:
    129152        @echo "${MAKEFLAGS}"
    130153
    131154.validate: .validate.cfa
    132         $(CFACOMPILE) .validate.cfa -fsyntax-only -Wall -Wextra -Werror
     155        ${CFACOMPILE} .validate.cfa -fsyntax-only -Wall -Wextra -Werror
    133156
    134157.validate.cfa:
     
    142165        @echo "int bar() { return 0; }" > ${@}
    143166
    144 concurrency :
    145         @+${TEST_PY} --debug=${debug}  --install=${installed} -Iconcurrent
    146 
    147167#----------------------------------------------------------------------------------------------------------------
    148168
    149169# Use for all tests, make sure the path are correct and all flags are added
    150 CFACOMPILETEST=$(PRETTY_PATH) $(CFACOMPILE) $(shell realpath --relative-to=${srcdir} ${<}) $($(shell echo "${@}_FLAGSCFA" | sed 's/-\|\//_/g'))
     170CFACOMPILETEST=${PRETTY_PATH} ${CFACOMPILE} ${shell realpath --relative-to=${srcdir} ${<}} ${${shell echo "${@}_FLAGSCFA" | sed 's/-\|\//_/g'}}
    151171
    152172#----------------------------------------------------------------------------------------------------------------
     
    155175# split into two steps to support compiling remotely using distcc
    156176# don't use distcc to do the linking because distcc doesn't do linking
    157 % : %.cfa $(CFACCBIN)
    158         $(CFACOMPILETEST) -c -o $(abspath ${@}).o -DIN_DIR="$(abspath $(dir ${<}))/.in/"
    159         $(CFACCLINK) ${@}.o -o $(abspath ${@})
    160         rm $(abspath ${@}).o
     177% : %.cfa ${CFACCBIN}
     178        ${CFACOMPILETEST} -c -o ${abspath ${@}}.o -DIN_DIR="${abspath ${dir ${<}}}/.in/"
     179        ${CFACCLINK} ${@}.o -o ${abspath ${@}}
     180        rm ${abspath ${@}}.o
    161181
    162182# implicit rule for c++ test
    163183# convient for testing the testsuite itself but not actuall used
    164184% : %.cpp
    165         $(PRETTY_PATH) $(CXXCOMPILE) $(shell realpath --relative-to=${srcdir} ${<}) -o $(abspath ${@})
     185        ${PRETTY_PATH} ${CXXCOMPILE} ${shell realpath --relative-to=${srcdir} ${<}} -o ${abspath ${@}}
    166186
    167187#------------------------------------------------------------------------------
     
    174194# Generated code
    175195GENERATED_CODE = declarationSpecifier gccExtensions extension attributes functions KRfunctions
    176 $(GENERATED_CODE): % : %.cfa $(CFACCBIN)
    177         $(CFACOMPILETEST) -CFA -XCFA -p -c -fsyntax-only -o $(abspath ${@})
     196${GENERATED_CODE} : % : %.cfa ${CFACCBIN}
     197        ${CFACOMPILETEST} -CFA -XCFA -p -c -fsyntax-only -o ${abspath ${@}}
    178198
    179199#------------------------------------------------------------------------------
     
    181201#------------------------------------------------------------------------------
    182202# tests that just validate syntax and compiler output should be compared to stderr
    183 CFACOMPILE_SYNTAX = $(CFACOMPILETEST) -Wno-unused-variable -Wno-unused-label -c -fsyntax-only -o $(abspath ${@})
     203CFACOMPILE_SYNTAX = ${CFACOMPILETEST} -Wno-unused-variable -Wno-unused-label -c -fsyntax-only -o ${abspath ${@}}
    184204
    185205SYNTAX_ONLY_CODE = expression typedefRedef variableDeclarator switch numericConstants identFuncDeclarator \
    186206        init1 limits nested-types cast labelledExit array quasiKeyword include/stdincludes include/includes builtins/sync warnings/self-assignment concurrent/waitfor/parse
    187 $(SYNTAX_ONLY_CODE): % : %.cfa $(CFACCBIN)
    188         $(CFACOMPILE_SYNTAX)
    189         $(if $(test), cp $(test) $(abspath ${@}), )
     207${SYNTAX_ONLY_CODE} : % : %.cfa ${CFACCBIN}
     208        ${CFACOMPILE_SYNTAX}
     209        ${if ${test}, cp ${test} ${abspath ${@}}, }
    190210
    191211# expected failures
    192212# use custom target since they require a custom define *and* have a name that doesn't match the file
    193 alloc-ERROR : alloc.cfa $(CFACCBIN)
    194         $(CFACOMPILE_SYNTAX) -DERR1
    195         -cp $(test) $(abspath ${@})
    196 
    197 init1-ERROR : init1.cfa $(CFACCBIN)
    198         $(CFACOMPILE_SYNTAX) -DERR1
    199         -cp $(test) $(abspath ${@})
    200 
    201 typedefRedef-ERR1 : typedefRedef.cfa $(CFACCBIN)
    202         $(CFACOMPILE_SYNTAX) -DERR1
    203         -cp $(test) $(abspath ${@})
    204 
    205 nested-types-ERR1 : nested-types.cfa $(CFACCBIN)
    206         $(CFACOMPILE_SYNTAX) -DERR1
    207         -cp $(test) $(abspath ${@})
    208 
    209 nested-types-ERR2 : nested-types.cfa $(CFACCBIN)
    210         $(CFACOMPILE_SYNTAX) -DERR2
    211         -cp $(test) $(abspath ${@})
    212 
    213 raii/memberCtors-ERR1 : raii/memberCtors.cfa $(CFACCBIN)
    214         $(CFACOMPILE_SYNTAX) -DERR1
    215         -cp $(test) $(abspath ${@})
    216 
    217 raii/ctor-autogen-ERR1 : raii/ctor-autogen.cfa $(CFACCBIN)
    218         $(CFACOMPILE_SYNTAX) -DERR1
    219         -cp $(test) $(abspath ${@})
    220 
    221 raii/dtor-early-exit-ERR1 : raii/dtor-early-exit.cfa $(CFACCBIN)
    222         $(CFACOMPILE_SYNTAX) -DERR1
    223         -cp $(test) $(abspath ${@})
    224 
    225 raii/dtor-early-exit-ERR2 : raii/dtor-early-exit.cfa $(CFACCBIN)
    226         $(CFACOMPILE_SYNTAX) -DERR2
    227         -cp $(test) $(abspath ${@})
     213alloc-ERROR : alloc.cfa ${CFACCBIN}
     214        ${CFACOMPILE_SYNTAX} -DERR1
     215        -cp ${test} ${abspath ${@}}
     216
     217init1-ERROR : init1.cfa ${CFACCBIN}
     218        ${CFACOMPILE_SYNTAX} -DERR1
     219        -cp ${test} ${abspath ${@}}
     220
     221typedefRedef-ERR1 : typedefRedef.cfa ${CFACCBIN}
     222        ${CFACOMPILE_SYNTAX} -DERR1
     223        -cp ${test} ${abspath ${@}}
     224
     225nested-types-ERR1 : nested-types.cfa ${CFACCBIN}
     226        ${CFACOMPILE_SYNTAX} -DERR1
     227        -cp ${test} ${abspath ${@}}
     228
     229nested-types-ERR2 : nested-types.cfa ${CFACCBIN}
     230        ${CFACOMPILE_SYNTAX} -DERR2
     231        -cp ${test} ${abspath ${@}}
     232
     233raii/memberCtors-ERR1 : raii/memberCtors.cfa ${CFACCBIN}
     234        ${CFACOMPILE_SYNTAX} -DERR1
     235        -cp ${test} ${abspath ${@}}
     236
     237raii/ctor-autogen-ERR1 : raii/ctor-autogen.cfa ${CFACCBIN}
     238        ${CFACOMPILE_SYNTAX} -DERR1
     239        -cp ${test} ${abspath ${@}}
     240
     241raii/dtor-early-exit-ERR1 : raii/dtor-early-exit.cfa ${CFACCBIN}
     242        ${CFACOMPILE_SYNTAX} -DERR1
     243        -cp ${test} ${abspath ${@}}
     244
     245raii/dtor-early-exit-ERR2 : raii/dtor-early-exit.cfa ${CFACCBIN}
     246        ${CFACOMPILE_SYNTAX} -DERR2
     247        -cp ${test} ${abspath ${@}}
    228248
    229249# Exception Tests
    230250# Test with libcfathread; it changes how storage works.
    231251
    232 exceptions/%-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 ${@})
     252exceptions/%-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 ${@}}
    235255
    236256# Linking tests
    237257# Meta tests to make sure we see linking errors (can't compile with -O2 since it may multiply number of calls)
    238 linking/linkerror : linking/linkerror.cfa $(CFACCBIN)
    239         $(CFACOMPILETEST) -O0 -c -o $(abspath ${@}).o
    240         $(CFACCLINK)  -O0 ${@}.o -o $(abspath ${@})
    241         rm $(abspath ${@}).o
     258linking/linkerror : linking/linkerror.cfa ${CFACCBIN}
     259        ${CFACOMPILETEST} -O0 -c -o ${abspath ${@}}.o
     260        ${CFACCLINK}  -O0 ${@}.o -o ${abspath ${@}}
     261        rm ${abspath ${@}}.o
    242262
    243263#------------------------------------------------------------------------------
  • tests/PRNG.cfa

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

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