Content deleted Content added
Visual Prolog example (protected stream) |
|||
Line 70:
}
}
=== [[Visual Prolog]] ===
This is an almost realistic example of protecting the operations on a stream with a named mutex.
First the outputStream interface (a simplified version of the real one):
<font color="#808000">interface</font> outputStream
<font color="#808000">predicates</font>
write : <font color="#993300">(</font>...<font color="#993300">)</font>.
writef : <font color="#993300">(</font>string <font color="#008000">FormatString</font>, ...<font color="#993300">)</font>.
<font color="#808000">end</font> <font color="#808000">interface</font> outputStream
This class encapsulates each of the stream operations the mutex. The '''finally''' predicate is used to ensure that the mutex is released no matter how the operation goes (i.e. also in case of excetions). The underlying mutex object is released by a ''finalizer'' in the mutex class, and for this example we leave it at that.
<font color="#808000">class</font> outputStream_protected : outputStream
<font color="#808000">constructors</font>
new : <font color="#993300">(</font>string <font color="#008000">MutexName</font>, outputStream <font color="#008000">Stream</font><font color="#993300">)</font>.
<font color="#808000">end</font> <font color="#808000">class</font> outputStream_protected
<font color="#800080">#include</font> <font color="#0000FF">@"pfc\multiThread\multiThread.ph"</font>
<font color="#808000">implement</font> outputStream_protected
<font color="#808000">facts</font>
mutex : mutex.
stream : outputStream.
<font color="#808000">clauses</font>
new<font color="#993300">(</font><font color="#008000">MutexName</font>, <font color="#008000">Stream</font><font color="#993300">)</font> :-
mutex := mutex::createNamed<font color="#993300">(</font><font color="#008000">MutexName</font>, false<font color="#993300">)</font>, <font color="#AA77BD">% do not take ownership</font>
stream := <font color="#008000">Stream</font>.
<font color="#808000">clauses</font>
write<font color="#993300">(</font>...<font color="#993300">)</font> :-
_ = mutex:wait<font color="#993300">()</font>, <font color="#AA77BD">% ignore wait code in this simplified example</font>
<font color="#333399">finally</font><font color="#993300">(</font>stream:write<font color="#993300">(</font>...<font color="#993300">)</font>, mutex:release<font color="#993300">())</font>.
<font color="#808000">clauses</font>
writef<font color="#993300">(</font><font color="#008000">FormatString</font>, ...<font color="#993300">)</font> :-
_ = mutex:wait<font color="#993300">()</font>, <font color="#AA77BD">% ignore wait code in this simplified example</font>
<font color="#333399">finally</font><font color="#993300">(</font>stream:writef<font color="#993300">(</font><font color="#008000">FormatString</font>, ...<font color="#993300">)</font>, mutex:release<font color="#993300">())</font>.
<font color="#808000">end</font> <font color="#808000">implement</font> outputStream_protected
Usage example, the '''client''' uses an '''outputStream''' instead of receiving the pipeStream directly, it get the protected version of it.
<font color="#800080">#include</font> <font color="#0000FF">@"pfc\pipe\pipe.ph"</font>
<font color="#808000">goal</font>
<font color="#008000">Stream</font> = pipeStream::openClient<font color="#993300">(</font><font color="#0000FF">"TestPipe"</font><font color="#993300">)</font>,
<font color="#008000">Protected</font> = outputStream_protected::new<font color="#993300">(</font><font color="#0000FF">"PipeMutex"</font>, <font color="#008000">Stream</font><font color="#993300">)</font>,
client<font color="#993300">(</font><font color="#008000">Protected</font><font color="#993300">)</font>,
<font color="#008000">Stream</font>:close<font color="#993300">()</font>.
==See also==
|