diff options
-rw-r--r-- | html/075channel.mu.html | 4 | ||||
-rw-r--r-- | html/088file.mu.html | 6 | ||||
-rw-r--r-- | html/089scenario_filesystem.cc.html | 2 |
3 files changed, 10 insertions, 2 deletions
diff --git a/html/075channel.mu.html b/html/075channel.mu.html index 42e8fda8..7b9ade33 100644 --- a/html/075channel.mu.html +++ b/html/075channel.mu.html @@ -45,6 +45,10 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color <span class="Comment"># b) Writing to a channel implicitly performs a deep copy. This prevents</span> <span class="Comment"># addresses from being shared between routines, and therefore eliminates all</span> <span class="Comment"># possibility of race conditions.</span> +<span class="Comment">#</span> +<span class="Comment"># There's still a narrow window for race conditions: the ingredients passed in</span> +<span class="Comment"># to 'start-running'. Pass only channels into routines and you should be fine.</span> +<span class="Comment"># Any other mutable ingredients will require locks.</span> <span class="muScenario">scenario</span> channel [ run [ diff --git a/html/088file.mu.html b/html/088file.mu.html index 26fa0c7c..46d9363a 100644 --- a/html/088file.mu.html +++ b/html/088file.mu.html @@ -35,6 +35,7 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color <span class="Comment"># are thus easier to test.</span> <span class="muData">container</span> resources [ + lock:bool data:&:@:resource ] @@ -117,7 +118,6 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color <span class="Delimiter">{</span> <span class="muControl">break-unless</span> resources <span class="Comment"># fake file system</span> - <span class="Comment"># beware: doesn't support multiple concurrent writes yet</span> routine-id <span class="Special"><-</span> start-running transmit-to-fake-file resources, filename, source <span class="muControl">reply</span> <span class="Delimiter">}</span> @@ -142,6 +142,8 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color <span class="muRecipe">def</span> transmit-to-fake-file resources:&:resources, filename:text, source:&:source:char<span class="muRecipe"> -> </span>resources:&:resources, source:&:source:char [ <span class="Constant">local-scope</span> <span class="Constant">load-ingredients</span> + lock:location <span class="Special"><-</span> get-location *resources, <span class="Constant">lock:offset</span> + wait-for-reset-then-set lock <span class="Comment"># compute new file contents</span> buf:&:buffer <span class="Special"><-</span> new-buffer<span class="Constant"> 30</span> <span class="Delimiter">{</span> @@ -166,6 +168,7 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color found?:bool <span class="Special"><-</span> equal filename, curr-filename <span class="muControl">loop-unless</span> found? put-index *data, i, new-resource + reset lock <span class="muControl">reply</span> <span class="Delimiter">}</span> <span class="Comment"># if file didn't already exist, make room for it</span> @@ -182,6 +185,7 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color <span class="Delimiter">}</span> <span class="Comment"># write new file</span> put-index *new-data, len, new-resource + reset lock ] </pre> </body> diff --git a/html/089scenario_filesystem.cc.html b/html/089scenario_filesystem.cc.html index d1fb007d..608f9c25 100644 --- a/html/089scenario_filesystem.cc.html +++ b/html/089scenario_filesystem.cc.html @@ -258,7 +258,7 @@ string munge_resources_contents<span class="Delimiter">(</span><span class="Norm trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"storing refcount 1 in location "</span> << resources_data_address << end<span class="Delimiter">();</span> <span class="Comment">// wrap the resources data in a 'resources' object</span> <span class="Normal">int</span> resources_address = allocate<span class="Delimiter">(</span>size_of_resources<span class="Delimiter">());</span> - curr = resources_address+<span class="Comment">/*</span><span class="Comment">skip refcount</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">;</span> + curr = resources_address+<span class="Comment">/*</span><span class="Comment">skip refcount</span><span class="Comment">*/</span><span class="Constant">1</span>+<span class="Comment">/*</span><span class="Comment">offset of 'data' element</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">;</span> put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr<span class="Delimiter">,</span> resources_data_address<span class="Delimiter">);</span> trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"storing resources data address "</span> << resources_data_address << <span class="Constant">" in location "</span> << curr << end<span class="Delimiter">();</span> put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> resources_address<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span> <span class="Comment">// initialize refcount</span> |