Changes in / [2ab67b9:8f61052c]
- Files:
-
- 13 added
- 16 deleted
- 8 edited
-
Jenkinsfile (modified) (1 diff)
-
doc/LaTeXmacros/lstlang.sty (modified) (1 diff)
-
doc/proposals/concurrency/.gitignore (modified) (1 diff)
-
doc/proposals/concurrency/Makefile (modified) (4 diffs)
-
doc/proposals/concurrency/annex/glossary.tex (deleted)
-
doc/proposals/concurrency/annex/local.bib (deleted)
-
doc/proposals/concurrency/build/bump_ver.sh (deleted)
-
doc/proposals/concurrency/build/version (deleted)
-
doc/proposals/concurrency/bump_ver.sh (added)
-
doc/proposals/concurrency/cfa-format.tex (added)
-
doc/proposals/concurrency/concurrency.tex (added)
-
doc/proposals/concurrency/cor-thread-traits.c (added)
-
doc/proposals/concurrency/ext_monitor.fig (added)
-
doc/proposals/concurrency/ext_monitor.fig.bak (added)
-
doc/proposals/concurrency/figures/ext_monitor.fig (deleted)
-
doc/proposals/concurrency/figures/monitor.fig (deleted)
-
doc/proposals/concurrency/glossary.tex (added)
-
doc/proposals/concurrency/lit-review.md (added)
-
doc/proposals/concurrency/local.bib (added)
-
doc/proposals/concurrency/monitor.fig (added)
-
doc/proposals/concurrency/notes.md (added)
-
doc/proposals/concurrency/notes/cor-thread-traits.c (deleted)
-
doc/proposals/concurrency/notes/lit-review.md (deleted)
-
doc/proposals/concurrency/notes/notes.md (deleted)
-
doc/proposals/concurrency/style.tex (added)
-
doc/proposals/concurrency/style/cfa-format.tex (deleted)
-
doc/proposals/concurrency/style/style.tex (deleted)
-
doc/proposals/concurrency/text/basics.tex (deleted)
-
doc/proposals/concurrency/text/concurrency.tex (deleted)
-
doc/proposals/concurrency/text/intro.tex (deleted)
-
doc/proposals/concurrency/text/parallelism.tex (deleted)
-
doc/proposals/concurrency/thesis.tex (deleted)
-
doc/proposals/concurrency/version (added)
-
src/libcfa/concurrency/monitor (modified) (2 diffs)
-
src/libcfa/concurrency/monitor.c (modified) (8 diffs)
-
src/tests/sched-int-block.c (modified) (4 diffs)
-
src/tests/sched-int-disjoint.c (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
Jenkinsfile
r2ab67b9 r8f61052c 28 28 wrap([$class: 'TimestamperBuildWrapper']) { 29 29 30 notify_server( 0)30 notify_server(1) 31 31 32 32 prepare_build() 33 33 34 34 checkout() 35 36 notify_server(0)37 35 38 36 build() -
doc/LaTeXmacros/lstlang.sty
r2ab67b9 r8f61052c 107 107 \lstdefinelanguage{CFA}[ANSI]{C}{ 108 108 morekeywords={ 109 _Alignas, _Alignof, __alignof, __alignof__, asm, __asm, __asm__, _At, _ _attribute,109 _Alignas, _Alignof, __alignof, __alignof__, asm, __asm, __asm__, _At, _Atomic, __attribute, 110 110 __attribute__, auto, _Bool, catch, catchResume, choose, _Complex, __complex, __complex__, 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}, 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}, 118 115 } 119 116 -
doc/proposals/concurrency/.gitignore
r2ab67b9 r8f61052c 1 build/*.aux 2 build/*.acn 3 build/*.acr 4 build/*.alg 5 build/*.bbl 6 build/*.blg 7 build/*.brf 8 build/*.dvi 9 build/*.glg 10 build/*.glo 11 build/*.gls 12 build/*.idx 13 build/*.ind 14 build/*.ist 15 build/*.log 16 build/*.out 17 build/*.ps 18 build/*.tex 19 build/*.toc 20 *.pdf 21 22 examples 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 -
doc/proposals/concurrency/Makefile
r2ab67b9 r8f61052c 1 1 ## Define the appropriate configuration variables. 2 2 3 TeXLIB = .:. /style:./text:./annex:./build:../../LaTeXmacros:../../LaTeXmacros/listings:../../LaTeXmacros/enumitem:~/bibliographies:4 LaTeX = TEXINPUTS=${TeXLIB} && export TEXINPUTS && latex -halt-on-error -output-directory=build -interaction=nonstopmode5 BibTeX = BIBINPUTS=${TeXLIB} && export BIBINPUTS && bibtex -terse3 TeXLIB = .:../../LaTeXmacros:../../LaTeXmacros/listings:../../LaTeXmacros/enumitem:~/bibliographies: 4 LaTeX = TEXINPUTS=${TeXLIB} && export TEXINPUTS && latex -halt-on-error 5 BibTeX = BIBINPUTS=${TeXLIB} && export BIBINPUTS && bibtex 6 6 7 7 ## Define the text source files. 8 8 9 9 SOURCES = ${addsuffix .tex, \ 10 thesis \ 11 style/style \ 12 style/cfa-format \ 13 annex/glossary \ 14 text/intro \ 15 text/basics \ 16 text/concurrency \ 17 text/parallelism \ 10 concurrency \ 11 style \ 12 cfa-format \ 13 glossary \ 18 14 } 19 15 20 FIGURES = ${add prefix build/, ${addsuffix .tex, \16 FIGURES = ${addsuffix .tex, \ 21 17 monitor \ 22 18 ext_monitor \ 23 } }19 } 24 20 25 21 PICTURES = ${addsuffix .pstex, \ … … 34 30 ## Define the documents that need to be made. 35 31 36 DOCUMENT = thesis.pdf32 DOCUMENT = concurrency.pdf 37 33 38 34 # Directives # … … 41 37 42 38 clean : 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 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} 67 41 68 42 # File Dependencies # 69 43 70 ${DOCUMENT} : build/${basename ${DOCUMENT}}.ps44 ${DOCUMENT} : ${basename ${DOCUMENT}}.ps 71 45 ps2pdf $< 72 46 73 build/${basename ${DOCUMENT}}.ps : build/${basename ${DOCUMENT}}.dvi47 ${basename ${DOCUMENT}}.ps : ${basename ${DOCUMENT}}.dvi 74 48 dvips $< -o $@ 75 49 76 build/${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 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 91 67 92 68 … … 96 72 ## Define the default recipes. 97 73 98 build/%.tex : figures/%.fig74 %.tex : %.fig 99 75 fig2dev -L eepic $< > $@ 100 76 101 build/%.ps : figures/%.fig77 %.ps : %.fig 102 78 fig2dev -L ps $< > $@ 103 79 104 build/%.pstex : figures/%.fig80 %.pstex : %.fig 105 81 fig2dev -L pstex $< > $@ 106 82 fig2dev -L pstex_t -p $@ $< > $@_t -
src/libcfa/concurrency/monitor
r2ab67b9 r8f61052c 59 59 unsigned short count; //Number of criterions in the criteria 60 60 __condition_node_t * next; //Intrusive linked list Next field 61 uintptr_t user_info; //Custom user info accessible before signalling62 61 }; 63 62 … … 86 85 } 87 86 88 void wait( condition * this, uintptr_t user_info = 0 ); 89 bool signal( condition * this ); 90 bool signal_block( condition * this ); 91 static inline bool is_empty( condition * this ) { return !this->blocked.head; } 92 uintptr_t front( condition * this ); 93 87 void wait( condition * this ); 88 void signal( condition * this ); 89 void signal_block( condition * this ); 94 90 #endif //MONITOR_H -
src/libcfa/concurrency/monitor.c
r2ab67b9 r8f61052c 137 137 } 138 138 139 void ?{}(__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 146 void ?{}(__condition_criterion_t * this ) { 147 this->ready = false; 148 this->target = NULL; 149 this->owner = NULL; 150 this->next = NULL; 151 } 152 153 void ?{}(__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; 139 void debug_break() __attribute__(( noinline )) 140 { 141 158 142 } 159 143 160 144 //----------------------------------------------------------------------------- 161 145 // Internal scheduling 162 void wait( condition * this , uintptr_t user_info = 0) {146 void wait( condition * this ) { 163 147 LIB_DEBUG_PRINT_SAFE("Waiting\n"); 164 148 … … 176 160 LIB_DEBUG_PRINT_SAFE("count %i\n", count); 177 161 178 __condition_node_t waiter = { this_thread(), count, user_info }; 162 __condition_node_t waiter; 163 waiter.waiting_thread = this_thread(); 164 waiter.count = count; 165 waiter.next = NULL; 179 166 180 167 __condition_criterion_t criteria[count]; 181 168 for(int i = 0; i < count; i++) { 182 (&criteria[i]){ this->monitors[i], &waiter }; 169 criteria[i].ready = false; 170 criteria[i].target = this->monitors[i]; 171 criteria[i].owner = &waiter; 172 criteria[i].next = NULL; 183 173 LIB_DEBUG_PRINT_SAFE( "Criterion %p\n", &criteria[i] ); 184 174 } … … 212 202 ScheduleInternal( locks, count, threads, thread_count ); 213 203 204 debug_break(); 214 205 //WE WOKE UP 215 206 … … 221 212 } 222 213 223 boolsignal( condition * this ) {224 if( is_empty( this )) {214 void signal( condition * this ) { 215 if( !this->blocked.head ) { 225 216 LIB_DEBUG_PRINT_SAFE("Nothing to signal\n"); 226 return false;217 return; 227 218 } 228 219 … … 266 257 //Release 267 258 unlock_all( this->monitors, count ); 268 269 return true; 270 } 271 272 bool signal_block( condition * this ) { 259 } 260 261 void signal_block( condition * this ) { 273 262 if( !this->blocked.head ) { 274 263 LIB_DEBUG_PRINT_SAFE("Nothing to signal\n"); 275 return false;264 return; 276 265 } 277 266 … … 287 276 288 277 //create creteria 289 __condition_node_t waiter = { this_thread(), count, 0 }; 278 __condition_node_t waiter; 279 waiter.waiting_thread = this_thread(); 280 waiter.count = count; 281 waiter.next = NULL; 290 282 291 283 __condition_criterion_t criteria[count]; 292 284 for(int i = 0; i < count; i++) { 293 (&criteria[i]){ this->monitors[i], &waiter };294 285 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]; 295 290 push( &criteria[i].target->signal_stack, &criteria[i] ); 296 291 } … … 308 303 309 304 LIB_DEBUG_PRINT_SAFE( "Waiting on signal block\n" ); 305 debug_break(); 310 306 311 307 //Everything is ready to go to sleep 312 308 ScheduleInternal( locks, count, &signallee, 1 ); 313 309 310 debug_break(); 314 311 LIB_DEBUG_PRINT_SAFE( "Back from signal block\n" ); 315 312 … … 318 315 restore_recursion( this->monitors, recursions, count ); 319 316 unlock_all( locks, count ); 320 321 return true;322 }323 324 uintptr_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;332 317 } 333 318 -
src/tests/sched-int-block.c
r2ab67b9 r8f61052c 10 10 11 11 monitor global_data_t { 12 thread_desc * last_thread;13 thread_desc * last_signaller;12 state_t state; 13 bool ran; 14 14 }; 15 15 16 16 void ?{} ( global_data_t * this ) { 17 this->last_thread = NULL; 18 this->last_signaller = NULL; 17 this->state = BARGE; 19 18 } 20 19 … … 29 28 //------------------------------------------------------------------------------ 30 29 void wait_op( global_data_t * mutex a, global_data_t * mutex b, unsigned i ) { 31 wait( &cond, (uintptr_t)this_thread() ); 30 wait( &cond ); 31 a->ran = b->ran = true; 32 32 33 33 yield( ((unsigned)rand48()) % 10 ); 34 34 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;35 if(a->state != SIGNAL || b->state != SIGNAL) { 36 sout | "ERROR Barging detected" | a->state | b->state | endl; 37 37 abort(); 38 38 } 39 39 40 a-> last_thread = b->last_thread = this_thread();40 a->state = b->state = WAITED; 41 41 42 42 yield( ((unsigned)rand48()) % 10 ); … … 54 54 yield( ((unsigned)rand48()) % 10 ); 55 55 56 a->last_thread = b->last_thread = a->last_signaller = b->last_signaller = this_thread(); 56 a->ran = b->ran = false; 57 a->state = b->state = SIGNAL; 57 58 58 if( !is_empty( &cond ) ) {59 signal_block( &cond ); 59 60 60 thread_desc * next = front( &cond);61 yield( ((unsigned)rand48()) % 10 ); 61 62 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; 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; 71 68 abort(); 72 69 } … … 84 81 //------------------------------------------------------------------------------ 85 82 void barge_op( global_data_t * mutex a ) { 86 a-> last_thread = this_thread();83 a->state = BARGE; 87 84 } 88 85 -
src/tests/sched-int-disjoint.c
r2ab67b9 r8f61052c 78 78 signal( &cond, a, &data ); 79 79 80 yield( (unsigned)rand48() % 10 ); 80 int pauses = (unsigned)rand48() % 10; 81 for(int i = 0; i < pauses; i++) { 82 yield(); 83 } 81 84 82 85 //This is technically a mutual exclusion violation but the mutex monitor protects us
Note:
See TracChangeset
for help on using the changeset viewer.