5238cda077
Also, needed to understand Byzantine fault tolerant paxos better. Still do not.
75 lines
2.1 KiB
HTML
75 lines
2.1 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="en">
|
||
<head>
|
||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||
<style>
|
||
body {
|
||
max-width: 30em;
|
||
margin-left: 2em;
|
||
}
|
||
p.center {
|
||
text-align:center;
|
||
}
|
||
</style>
|
||
<link rel="shortcut icon" href="../rho.ico">
|
||
<title>Write your own InterlockedXxx
|
||
operation</title> </head> <body>
|
||
|
||
<p><A href="./"> To Home page</A> </p>
|
||
|
||
<h1>Write your own InterlockedXxx
|
||
operation</h1><p>
|
||
|
||
It has long been known that InterlockedCompareExchange can be
|
||
used to write any Interlockedxxx operation. </p>
|
||
|
||
<pre>
|
||
long InterlockedXxx(
|
||
__inout long volatile *Target,
|
||
, whatever parameters we need for Xxx
|
||
)
|
||
{
|
||
long prevValue, prevCopy;
|
||
|
||
prevValue = *Target;
|
||
|
||
do {
|
||
if Xxx operations is illegal on prevValue, return with error code
|
||
|
||
prevCopy = prevValue;
|
||
|
||
//
|
||
// prevValue will be the value that used to be Target if the exchange was made
|
||
// or its current value if the exchange was not made.
|
||
//
|
||
prevValue = InterlockedCompareExchange(Target, Xxx operation on prevCopy, prevValue);
|
||
|
||
//
|
||
// If prevCopy == prevValue, then no one updated Target in between the deref at the top
|
||
// and the InterlockecCompareExchange afterward and we are done
|
||
//
|
||
} while (prevCopy != prevValue);
|
||
|
||
//
|
||
// [value] can be anything you want, but it is typically either
|
||
// a) The new value stored in Target. This is the type of return value that
|
||
// InterlockedIncrement returns
|
||
// or
|
||
// b) The new value is the previous value that was in Target. This si the
|
||
// type of return value that InterlockedOr or InterlockedExchange return
|
||
//
|
||
return [value];
|
||
}</pre><p>
|
||
|
||
Structures larger than a long can be handled by
|
||
using InterlockedCompareExchange to add to a
|
||
linked list, or remove stuff from a linked
|
||
list. Of course you should not be writing such
|
||
things yourself, when Intel has already written
|
||
it for you. </p>
|
||
|
||
<p style="background-color : #ccffcc; font-size:80%">These documents are
|
||
licensed under the <a rel="license" href="http://creativecommons.org/licenses/by-sa/3.0/">Creative
|
||
Commons Attribution-Share Alike 3.0 License</a></p>
|
||
</body></html>
|