[fpc-devel] Compiler trheads (was: NoGlobals branch)

Hans-Peter Diettrich DrDiettrich1 at aol.com
Thu Aug 12 08:12:22 CEST 2010


Marco van de Voort schrieb:
> In our previous episode, Hans-Peter Diettrich said:
>> How would you count an level, when multiple concurrent parser threads 
>> create further threads concurrently?
> 
> Hmm, I think a producer/consumer system with a queue for modules that can be
> compiled and N worker threads (specifiable by user)
>  
> So on start threads are created, and no new threads are created after?

That's not a solution :-(

*When* a parser becomes a thread, it can proceed only to the first 
"uses" clause - then it has to create further threads, one for each used 
unit, and has to wait for their completion. I.e. most threads are 
waiting for other threads to complete[1].

That behaviour makes it questionable, whether parsers should become 
threads at all. Furthermore it suggests (to me) a dynamic thread 
priorization, based on the number of other threads waiting for their 
completion[2]. At least we have to distinguish between processing the 
interface part (or loading the declarations from the ppu file), until 
which point all dependent threads (using that unit) are blocked. Once 
the interface information has become available, the dependent threads 
can continue parsing and generating object code (.o and .ppu files).

Brainstorming: What other models come into mind, for using threads in 
the compiler?


Your suggestion with a limited number of threads becomes interesting for 
the code generation, but this IMO deserves another modification of the 
workflow - currently all procedure bodies are processed "inline", during 
parsing, so that the procinfo can be destroyed on exit from parsing the 
procedure block. So we should have threads for parsing a procedure, with 
the strange result that parsing can happen in the mainstream, as well as 
in a thread. I just don't know what consequences will arise for the 
actual code, in such a splitted environment. Parsing inside a thread may 
require to synchronize several actions, what's not necessary during 
parsing in the mainstream (main thread).


[1] What synchronization methods exist for threads, suitable to block 
and resume threads before they have finished? With a fixed number of 
threads we IMO risk a stall of the entire compiler, as soon as each of 
these threads is blocked for *other* reasons (memory management, disk 
I/O...).

[2] How portable is a dynamic thread priorization?

DoDi




More information about the fpc-devel mailing list