<div dir="ltr"><div class="gmail_quote">On Sat Jan 24 2015 at 12:56:59 AM Thompson, John <<a href="mailto:John_Thompson@playstation.sony.com">John_Thompson@playstation.sony.com</a>> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">





<div lang="EN-US" link="blue" vlink="purple">
<div>
<p class="MsoNormal">I’ve been asked about this, but it’s currently beyond my knowledge.  Can someone shed some light?  Does Clang need fixing for this?</p></div></div></blockquote><div><br></div><div>We have the possibility to use explicit module compilation, which might solve the problem. </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div lang="EN-US" link="blue" vlink="purple"><div><p class="MsoNormal"><u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">***<u></u><u></u></p>
<p class="MsoNormal">> >- Does it allow for processes being terminated whilst creating cache entries?<u></u><u></u></p>
<p class="MsoNormal">> <u></u><u></u></p>
<p class="MsoNormal">> A subsequent run will clean up orphaned file locks from a previously crashed or aborted process,<u></u><u></u></p>
<p class="MsoNormal">> but it's not clear if other modules cache files are dealt with.<u></u><u></u></p>
<p class="MsoNormal">> <u></u><u></u></p>
<p class="MsoNormal">> I think the build system should probably include deleting the entire cache directory during a<u></u><u></u></p>
<p class="MsoNormal">> normal "realclean" or perhaps even a "clean" operation as well.  If a build reports errors in<u></u><u></u></p>
<p class="MsoNormal">> intermediate files that's typically the first thing I would try, i.e. do a clean and rebuild.<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">When we distribute builds we may abort processes at any point during the build.  It is essential<u></u><u></u></p>
<p class="MsoNormal">that doing this does not prevent other processes in the build from completing successfully.  In<u></u><u></u></p>
<p class="MsoNormal">this scenario failing the build with an error, doing a clean and a rebuild is not an option.<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">Our requirement us that if two compilation jobs A and B are running simultaneously and will create<u></u><u></u></p>
<p class="MsoNormal">a cache entry C, then:<u></u><u></u></p>
<p class="MsoNormal">1. A and B will arbitrate access to the cache as necessary to create and read C.<u></u><u></u></p>
<p class="MsoNormal">2. Aborting either A or B at any moment (without any opportunity for clean up by the aborted<u></u><u></u></p>
<p class="MsoNormal">process) will not prevent the other from completing successfully.<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">The important case is when A holds the lock and is writing C but is terminated before completing<u></u><u></u></p>
<p class="MsoNormal">the write.  It is essential that C won't be left in a state where B (either waiting on the same<u></u><u></u></p>
<p class="MsoNormal">lock or running at a later date) will think it is valid, try to use and error out.<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">This can be avoided if the procedure for writing to the cache goes like this:<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">1. Take the lock<u></u><u></u></p>
<p class="MsoNormal">2. If C does not exist then:<u></u><u></u></p>
<p class="MsoNormal">2.1. create C.TEMP<u></u><u></u></p>
<p class="MsoNormal">2.2. Rename C.TEMP to C<u></u><u></u></p>
<p class="MsoNormal">3. Release lock<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">This guarantees (in the absence of power outages, disk failures etc) that an invalid C will never<u></u><u></u></p>
<p class="MsoNormal">be left for B to fail on.<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">There are some minor implementation wrinkles in making the the rename as atomic as possible (on<u></u><u></u></p>
<p class="MsoNormal">Windows C.TEMP and C must be on the same volume so that a copy is not required), but this ought to<u></u><u></u></p>
<div style="border:none;border-bottom:dotted windowtext 3.0pt;padding:0in 0in 1.0pt 0in">
<p class="MsoNormal" style="border:none;padding:0in">be straight forward to implement if it hasn't been already.<u></u><u></u></p>
</div>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">Thanks.<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">-John<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
</div>

______________________________<u></u>_________________<br>
cfe-dev mailing list<br>
<a href="mailto:cfe-dev@cs.uiuc.edu" target="_blank">cfe-dev@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev" target="_blank">http://lists.cs.uiuc.edu/<u></u>mailman/listinfo/cfe-dev</a><br>
</blockquote></div></div>