Changes in / [8f61052c:2ab67b9]


Ignore:
Files:
16 added
13 deleted
8 edited

Legend:

Unmodified
Added
Removed
  • TabularUnified Jenkinsfile

    r8f61052c r2ab67b9  
    2828                wrap([$class: 'TimestamperBuildWrapper']) {
    2929
    30                         notify_server(1)
     30                        notify_server(0)
    3131
    3232                        prepare_build()
    3333
    3434                        checkout()
     35
     36                        notify_server(0)
    3537
    3638                        build()
  • TabularUnified doc/LaTeXmacros/lstlang.sty

    r8f61052c r2ab67b9  
    107107\lstdefinelanguage{CFA}[ANSI]{C}{
    108108        morekeywords={
    109                 _Alignas, _Alignof, __alignof, __alignof__, asm, __asm, __asm__, _At, _Atomic, __attribute,
     109                _Alignas, _Alignof, __alignof, __alignof__, asm, __asm, __asm__, _At, __attribute,
    110110                __attribute__, auto, _Bool, catch, catchResume, choose, _Complex, __complex, __complex__,
    111                 __const, __const__, coroutine, disable, dtype, enable, __extension__, fallthrough, fallthru,
    112                 finally, forall, ftype, _Generic, _Imaginary, inline, __label__, lvalue, monitor, mutex,
    113                 _Noreturn, one_t, otype, restrict, _Static_assert, thread, _Thread_local, throw, throwResume,
    114                 trait, try, ttype, typeof, __typeof, __typeof__, zero_t},
     111                __const, __const__, disable, dtype, enable, __extension__, fallthrough, fallthru,
     112                finally, forall, ftype, _Generic, _Imaginary, inline, __label__, lvalue, _Noreturn, one_t,
     113                otype, restrict, _Static_assert, throw, throwResume, trait, try, ttype, typeof, __typeof,
     114                __typeof__, zero_t},
     115        morekeywords=[2]{
     116                accept, _Atomic, coroutine, is_coroutine, is_monitor, is_thread, monitor, mutex, nomutex,
     117                resume, signal, signal_block, suspend, thread, _Thread_local, wait, yield},
    115118}
    116119
  • TabularUnified doc/proposals/concurrency/.gitignore

    r8f61052c r2ab67b9  
    1 concurrency.aux
    2 concurrency.acn
    3 concurrency.acr
    4 concurrency.alg
    5 concurrency.bbl
    6 concurrency.blg
    7 concurrency.brf
    8 concurrency.dvi
    9 concurrency.glg
    10 concurrency.glo
    11 concurrency.gls
    12 concurrency.idx
    13 concurrency.ind
    14 concurrency.ist
    15 concurrency.log
    16 concurrency.out
    17 concurrency.pdf
    18 concurrency.ps
    19 version.aux
    20 monitor.tex
    21 ext_monitor.tex
     1build/*.aux
     2build/*.acn
     3build/*.acr
     4build/*.alg
     5build/*.bbl
     6build/*.blg
     7build/*.brf
     8build/*.dvi
     9build/*.glg
     10build/*.glo
     11build/*.gls
     12build/*.idx
     13build/*.ind
     14build/*.ist
     15build/*.log
     16build/*.out
     17build/*.ps
     18build/*.tex
     19build/*.toc
     20*.pdf
     21
     22examples
  • TabularUnified doc/proposals/concurrency/Makefile

    r8f61052c r2ab67b9  
    11## Define the appropriate configuration variables.
    22
    3 TeXLIB = .:../../LaTeXmacros:../../LaTeXmacros/listings:../../LaTeXmacros/enumitem:~/bibliographies:
    4 LaTeX  = TEXINPUTS=${TeXLIB} && export TEXINPUTS && latex -halt-on-error
    5 BibTeX = BIBINPUTS=${TeXLIB} && export BIBINPUTS && bibtex
     3TeXLIB = .:./style:./text:./annex:./build:../../LaTeXmacros:../../LaTeXmacros/listings:../../LaTeXmacros/enumitem:~/bibliographies:
     4LaTeX  = TEXINPUTS=${TeXLIB} && export TEXINPUTS && latex -halt-on-error -output-directory=build -interaction=nonstopmode
     5BibTeX = BIBINPUTS=${TeXLIB} && export BIBINPUTS && bibtex -terse
    66
    77## Define the text source files.
    88
    99SOURCES = ${addsuffix .tex, \
    10 concurrency \
    11 style \
    12 cfa-format \
    13 glossary \
     10thesis \
     11style/style \
     12style/cfa-format \
     13annex/glossary \
     14text/intro \
     15text/basics \
     16text/concurrency \
     17text/parallelism \
    1418}
    1519
    16 FIGURES = ${addsuffix .tex, \
     20FIGURES = ${addprefix build/, ${addsuffix .tex, \
    1721        monitor \
    1822        ext_monitor \
    19 }
     23}}
    2024
    2125PICTURES = ${addsuffix .pstex, \
     
    3034## Define the documents that need to be made.
    3135
    32 DOCUMENT = concurrency.pdf
     36DOCUMENT = thesis.pdf
    3337
    3438# Directives #
     
    3741
    3842clean :
    39         rm -f *.bbl *.aux *.dvi *.idx *.ilg *.ind *.brf *.out *.log *.toc *.blg *.pstex_t *.cf *.glg *.glo *.gls *.ist *.acn *.acr *.alg \
    40                 ${FIGURES} ${PICTURES} ${PROGRAMS} ${GRAPHS} ${basename ${DOCUMENT}}.ps ${DOCUMENT}
     43        @rm -fv ${DOCUMENT} \
     44        build/*.acn     \
     45        build/*.acr     \
     46        build/*.alg     \
     47        build/*.aux     \
     48        build/*.bbl     \
     49        build/*.blg     \
     50        build/*.brf     \
     51        build/*.cf      \
     52        build/*.dvi     \
     53        build/*.glg     \
     54        build/*.glo     \
     55        build/*.gls     \
     56        build/*.ist     \
     57        build/*.idx     \
     58        build/*.ilg     \
     59        build/*.ind     \
     60        build/*.log     \
     61        build/*.out     \
     62        build/*.ps      \
     63        build/*.pstex_t \
     64        build/*.tex     \
     65        build/*.toc     \
     66
    4167
    4268# File Dependencies #
    4369
    44 ${DOCUMENT} : ${basename ${DOCUMENT}}.ps
     70${DOCUMENT} : build/${basename ${DOCUMENT}}.ps
    4571        ps2pdf $<
    4672
    47 ${basename ${DOCUMENT}}.ps : ${basename ${DOCUMENT}}.dvi
     73build/${basename ${DOCUMENT}}.ps : build/${basename ${DOCUMENT}}.dvi
    4874        dvips $< -o $@
    4975
    50 ${basename ${DOCUMENT}}.dvi : Makefile ${GRAPHS} ${PROGRAMS} ${PICTURES} ${FIGURES} ${SOURCES} ${basename ${DOCUMENT}}.tex \
    51                 ../../LaTeXmacros/common.tex ../../LaTeXmacros/indexstyle
    52         # Conditionally create an empty *.ind (index) file for inclusion until makeindex is run.
    53         if [ ! -r ${basename $@}.ind ] ; then touch ${basename $@}.ind ; fi
    54         # Must have *.aux file containing citations for bibtex
    55         if [ ! -r ${basename $@}.aux ] ; then ${LaTeX} ${basename $@}.tex ; fi
    56         -${BibTeX} ${basename $@}
    57         # Some citations reference others so run steps again to resolve these citations
    58         ${LaTeX} ${basename $@}.tex
    59         -${BibTeX} ${basename $@}
    60         # Make index from *.aux entries and input index at end of document
    61         makeglossaries ${basename $@}
    62         #${LaTeX} ${basename $@}.tex
    63         # Run again to get index title into table of contents
    64         ${LaTeX} ${basename $@}.tex
    65         -./bump_ver.sh
    66         ${LaTeX} ${basename $@}.tex
     76build/${basename ${DOCUMENT}}.dvi : Makefile ${GRAPHS} ${PROGRAMS} ${PICTURES} ${FIGURES} ${SOURCES} ${basename ${DOCUMENT}}.tex ../../LaTeXmacros/common.tex ../../LaTeXmacros/indexstyle
     77
     78        @ if [ ! -r ${basename $@}.ind ] ; then touch ${basename $@}.ind ; fi                           # Conditionally create an empty *.ind (index) file for inclusion until makeindex is run.
     79        @ echo "Citation lookup"                                                                                        # Must have *.aux file containing citations for bibtex
     80        @ if [ ! -r ${basename $@}.aux ] ; then ${LaTeX} ${basename ${notdir $@}}.tex ; fi
     81        @ echo "Citation Pass 1"
     82        @ -${BibTeX} ${basename $@}                                                                                     # Some citations reference others so run steps again to resolve these citations
     83        @ echo "Citation Pass 2"
     84        @ ${LaTeX} ${basename ${notdir $@}}.tex
     85        @ -${BibTeX} ${basename $@}
     86        @ echo "Glossary"
     87        makeglossaries -q -s ${basename $@}.ist ${basename $@}                                          # Make index from *.aux entries and input index at end of document
     88        @ echo ".dvi generation"
     89        @ -build/bump_ver.sh
     90        @ ${LaTeX} ${basename ${notdir $@}}.tex                                                                 # Run again to get index title into table of contents
    6791
    6892
     
    7296## Define the default recipes.
    7397
    74 %.tex : %.fig
     98build/%.tex : figures/%.fig
    7599        fig2dev -L eepic $< > $@
    76100
    77 %.ps : %.fig
     101build/%.ps : figures/%.fig
    78102        fig2dev -L ps $< > $@
    79103
    80 %.pstex : %.fig
     104build/%.pstex : figures/%.fig
    81105        fig2dev -L pstex $< > $@
    82106        fig2dev -L pstex_t -p $@ $< > $@_t
  • TabularUnified src/libcfa/concurrency/monitor

    r8f61052c r2ab67b9  
    5959        unsigned short count;                           //Number of criterions in the criteria
    6060        __condition_node_t * next;                      //Intrusive linked list Next field
     61        uintptr_t user_info;                            //Custom user info accessible before signalling
    6162};
    6263
     
    8586}
    8687
    87 void wait( condition * this );
    88 void signal( condition * this );
    89 void signal_block( condition * this );
     88void wait( condition * this, uintptr_t user_info = 0 );
     89bool signal( condition * this );
     90bool signal_block( condition * this );
     91static inline bool is_empty( condition * this ) { return !this->blocked.head; }
     92uintptr_t front( condition * this );
     93
    9094#endif //MONITOR_H
  • TabularUnified src/libcfa/concurrency/monitor.c

    r8f61052c r2ab67b9  
    137137}
    138138
    139 void debug_break() __attribute__(( noinline ))
    140 {
    141        
     139void ?{}(__condition_node_t * this, thread_desc * waiting_thread, unsigned short count, uintptr_t user_info ) {
     140        this->waiting_thread = waiting_thread;
     141        this->count = count;
     142        this->next = NULL;
     143        this->user_info = user_info;
     144}
     145
     146void ?{}(__condition_criterion_t * this ) {
     147        this->ready  = false;
     148        this->target = NULL;
     149        this->owner  = NULL;
     150        this->next   = NULL;
     151}
     152
     153void ?{}(__condition_criterion_t * this, monitor_desc * target, __condition_node_t * owner ) {
     154        this->ready  = false;
     155        this->target = target;
     156        this->owner  = owner;
     157        this->next   = NULL;
    142158}
    143159
    144160//-----------------------------------------------------------------------------
    145161// Internal scheduling
    146 void wait( condition * this ) {
     162void wait( condition * this, uintptr_t user_info = 0 ) {
    147163        LIB_DEBUG_PRINT_SAFE("Waiting\n");
    148164
     
    160176        LIB_DEBUG_PRINT_SAFE("count %i\n", count);
    161177
    162         __condition_node_t waiter;
    163         waiter.waiting_thread = this_thread();
    164         waiter.count = count;
    165         waiter.next = NULL;
     178        __condition_node_t waiter = { this_thread(), count, user_info };
    166179
    167180        __condition_criterion_t criteria[count];
    168181        for(int i = 0; i < count; i++) {
    169                 criteria[i].ready  = false;
    170                 criteria[i].target = this->monitors[i];
    171                 criteria[i].owner  = &waiter;
    172                 criteria[i].next   = NULL;
     182                (&criteria[i]){ this->monitors[i], &waiter };
    173183                LIB_DEBUG_PRINT_SAFE( "Criterion %p\n", &criteria[i] );
    174184        }
     
    202212        ScheduleInternal( locks, count, threads, thread_count );
    203213
    204         debug_break();
    205214        //WE WOKE UP
    206215
     
    212221}
    213222
    214 void signal( condition * this ) {
    215         if( !this->blocked.head ) {
     223bool signal( condition * this ) {
     224        if( is_empty( this ) ) {
    216225                LIB_DEBUG_PRINT_SAFE("Nothing to signal\n");
    217                 return;
     226                return false;
    218227        }
    219228
     
    257266        //Release
    258267        unlock_all( this->monitors, count );
    259 }
    260 
    261 void signal_block( condition * this ) {
     268
     269        return true;
     270}
     271
     272bool signal_block( condition * this ) {
    262273        if( !this->blocked.head ) {
    263274                LIB_DEBUG_PRINT_SAFE("Nothing to signal\n");
    264                 return;
     275                return false;
    265276        }
    266277
     
    276287
    277288        //create creteria
    278         __condition_node_t waiter;
    279         waiter.waiting_thread = this_thread();
    280         waiter.count = count;
    281         waiter.next = NULL;
     289        __condition_node_t waiter = { this_thread(), count, 0 };
    282290
    283291        __condition_criterion_t criteria[count];
    284292        for(int i = 0; i < count; i++) {
     293                (&criteria[i]){ this->monitors[i], &waiter };
    285294                LIB_DEBUG_PRINT_SAFE( "Criterion %p\n", &criteria[i] );
    286                 criteria[i].ready  = false;
    287                 criteria[i].owner  = &waiter;
    288                 criteria[i].next   = NULL;
    289                 criteria[i].target = this->monitors[i];
    290295                push( &criteria[i].target->signal_stack, &criteria[i] );
    291296        }
     
    303308
    304309        LIB_DEBUG_PRINT_SAFE( "Waiting on signal block\n" );
    305         debug_break();
    306310
    307311        //Everything is ready to go to sleep
    308312        ScheduleInternal( locks, count, &signallee, 1 );
    309313
    310         debug_break();
    311314        LIB_DEBUG_PRINT_SAFE( "Back from signal block\n" );
    312315
     
    315318        restore_recursion( this->monitors, recursions, count );
    316319        unlock_all( locks, count );
     320
     321        return true;
     322}
     323
     324uintptr_t front( condition * this ) {
     325        LIB_DEBUG_DO(
     326                if( is_empty(this) ) {
     327                        abortf( "Attempt to access user data on an empty condition.\n"
     328                    "Possible cause is not checking if the condition is empty before reading stored data." );
     329                }
     330        );
     331        return this->blocked.head->user_info;
    317332}
    318333
  • TabularUnified src/tests/sched-int-block.c

    r8f61052c r2ab67b9  
    1010
    1111monitor global_data_t {
    12         state_t state;
    13         bool ran;
     12        thread_desc * last_thread;
     13        thread_desc * last_signaller;
    1414};
    1515
    1616void ?{} ( global_data_t * this ) {
    17         this->state = BARGE;
     17        this->last_thread = NULL;
     18        this->last_signaller = NULL;
    1819}
    1920
     
    2829//------------------------------------------------------------------------------
    2930void wait_op( global_data_t * mutex a, global_data_t * mutex b, unsigned i ) {
    30         wait( &cond );
    31         a->ran = b->ran = true;
     31        wait( &cond, (uintptr_t)this_thread() );
    3232
    3333        yield( ((unsigned)rand48()) % 10 );
    3434
    35         if(a->state != SIGNAL || b->state != SIGNAL) {
    36                 sout | "ERROR Barging detected" | a->state | b->state | endl;
     35        if(a->last_thread != a->last_signaller || b->last_thread != b->last_signaller ) {
     36                sout | "ERROR Barging detected, expected" | a->last_signaller | b->last_signaller | "got" | a->last_thread | b->last_thread | endl;
    3737                abort();
    3838        }
    3939
    40         a->state = b->state = WAITED;
     40        a->last_thread = b->last_thread = this_thread();
    4141
    4242        yield( ((unsigned)rand48()) % 10 );
     
    5454        yield( ((unsigned)rand48()) % 10 );
    5555
    56         a->ran = b->ran = false;
    57         a->state = b->state = SIGNAL;
     56        a->last_thread = b->last_thread = a->last_signaller = b->last_signaller = this_thread();
    5857
    59         signal_block( &cond );
     58        if( !is_empty( &cond ) ) {
    6059
    61         yield( ((unsigned)rand48()) % 10 );
     60                thread_desc * next = front( &cond );
    6261
    63         assert(a->ran == b->ran);
    64         if(a->ran)
    65         {
    66                 if(a->state != WAITED || b->state != WAITED) {
    67                         sout | "ERROR Barging detected" | a->state | b->state | endl;
     62                if( ! signal_block( &cond ) ) {
     63                        sout | "ERROR expected to be able to signal" | endl;
     64                        abort();
     65                }
     66
     67                yield( ((unsigned)rand48()) % 10 );
     68
     69                if(a->last_thread != next || b->last_thread != next) {
     70                        sout | "ERROR Barging detected, expected" | next | "got" | a->last_thread | b->last_thread | endl;
    6871                        abort();
    6972                }
     
    8184//------------------------------------------------------------------------------
    8285void barge_op( global_data_t * mutex a ) {
    83         a->state = BARGE;
     86        a->last_thread = this_thread();
    8487}
    8588
  • TabularUnified src/tests/sched-int-disjoint.c

    r8f61052c r2ab67b9  
    7878        signal( &cond, a, &data );
    7979
    80         int pauses = (unsigned)rand48() % 10;
    81         for(int i = 0; i < pauses; i++) {
    82                 yield();
    83         }
     80        yield( (unsigned)rand48() % 10 );
    8481
    8582        //This is technically a mutual exclusion violation but the mutex monitor protects us
Note: See TracChangeset for help on using the changeset viewer.