You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by be...@apache.org on 2017/10/17 18:39:20 UTC
mesos git commit: Replaced Doxygen style fenced code blocks with
GitHub Markdown.
Repository: mesos
Updated Branches:
refs/heads/master e757918f8 -> e56c01483
Replaced Doxygen style fenced code blocks with GitHub Markdown.
Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/e56c0148
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/e56c0148
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/e56c0148
Branch: refs/heads/master
Commit: e56c01483039882b9d049d209ea139ac6eadfb41
Parents: e757918
Author: Benjamin Hindman <be...@gmail.com>
Authored: Tue Oct 17 11:39:05 2017 -0700
Committer: Benjamin Hindman <be...@gmail.com>
Committed: Tue Oct 17 11:39:05 2017 -0700
----------------------------------------------------------------------
3rdparty/libprocess/README.md | 84 +++++++++++++++++++-------------------
1 file changed, 42 insertions(+), 42 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/mesos/blob/e56c0148/3rdparty/libprocess/README.md
----------------------------------------------------------------------
diff --git a/3rdparty/libprocess/README.md b/3rdparty/libprocess/README.md
index 97d190d..05d5896 100644
--- a/3rdparty/libprocess/README.md
+++ b/3rdparty/libprocess/README.md
@@ -48,7 +48,7 @@ Processes provide execution contexts (only one thread executing within
a process at a time so no need for per process synchronization).
<!---
-~~~{.cpp}
+```cpp
using namespace process;
class MyProcess : public Process<MyProcess> {};
@@ -61,7 +61,7 @@ int main(int argc, char** argv)
wait(process);
return 0;
}
-~~~
+```
---->
### `delay`
@@ -74,7 +74,7 @@ int main(int argc, char** argv)
`dispatch` schedules a method for asynchronous execution.
<!---
-~~~{.cpp}
+```cpp
using namespace process;
class QueueProcess : public Process<QueueProcess>
@@ -98,7 +98,7 @@ int main(int argc, char** argv)
...;
}
-~~~
+```
---->
@@ -122,7 +122,7 @@ As an example, consider the following function, which spawns a process
and registers two callbacks on it, one using `defer` and another
without it:
-~~~{.cpp}
+```cpp
using namespace process;
void foo()
@@ -153,18 +153,18 @@ void foo()
terminate(process);
}
-~~~
+```
As another example, consider this excerpt from the Mesos project's
`src/master/master.cpp`:
-~~~{.cpp}
+```cpp
// Start contending to be a leading master and detecting the current leader.
// NOTE: `.onAny` passes the relevant future to its callback as a parameter, and
// `lambda::_1` facilitates this when using `defer`.
contender->contend()
.onAny(defer(self(), &Master::contended, lambda::_1));
-~~~
+```
Why use `defer` in this context rather than just executing
`Master::detected` synchronously? To answer this, we need to remember
@@ -188,7 +188,7 @@ some circumstances, you actually don't need to defer back to your own
process, but you often want to defer. A good example of that is
handling HTTP requests. Consider this example:
-~~~{.cpp}
+```cpp
using namespace process;
using std::string;
@@ -206,7 +206,7 @@ public:
});
}
};
-~~~
+```
Now, while this is totally legal and correct code, the callback
executed after `functionWhichReturnsAFutureOfString` is completed
@@ -219,7 +219,7 @@ run this lambda using an execution context that libprocess can pick
for us (from a pool of threads). We do so by removing `self()` as the
first argument to `defer`:
-~~~{.cpp}
+```cpp
using namespace process;
using std::string;
@@ -237,7 +237,7 @@ public:
});
}
};
-~~~
+```
_Note that even in this example_ we still want to use `defer`! Why?
Because otherwise we are blocking the execution context (i.e.,
@@ -251,7 +251,7 @@ define a method for our `HttpProcess` class which accepts an input
string and returns a future via an asyncronous method called
`asyncStoreData`:
-~~~{.cpp}
+```cpp
using namespace process;
using std::string;
@@ -284,7 +284,7 @@ Future<int> HttpProcess::inputHandler(const string input)
return bytes;
});
}
-~~~
+```
When the callback is registered on the `Future<int>` returned by
`asyncStoreData`, a lambda is passed directly to `then`. This means
@@ -296,12 +296,12 @@ originally invoked `inputHandler` will have been destroyed, making
`this` a dangling pointer. In order to avoid this possibility, the
callback should be registered as follows:
-~~~{.cpp}
+```cpp
return asyncStoreData(input)
.then(defer(self(), [this](int bytes) -> Future<int> {
...
}));
-~~~
+```
The lambda is then guaranteed to execute within the execution context
of the current process, and we know that `this` will still be a valid
@@ -339,7 +339,7 @@ having an actual reference (pointer) to it (necessary for remote
processes).
<!---
-~~~{.cpp}
+```cpp
using namespace process;
int main(int argc, char** argv)
@@ -356,7 +356,7 @@ int main(int argc, char** argv)
return 0;
}
-~~~
+```
---->
---
@@ -375,7 +375,7 @@ explain the concepts.
First, you can construct a `Promise` of a particular type by
doing the following:
-~~~{.cpp}
+```cpp
using namespace process;
int main(int argc, char** argv)
@@ -384,7 +384,7 @@ int main(int argc, char** argv)
return 0;
}
-~~~
+```
A `Promise` is not copyable or assignable, in order to encourage
strict ownership rules between processes (i.e., it's hard to
@@ -394,7 +394,7 @@ reason about multiple actors concurrently trying to complete a
You can get a `Future` from a `Promise` using the
`Promise::future()` method:
-~~~{.cpp}
+```cpp
using namespace process;
int main(int argc, char** argv)
@@ -405,14 +405,14 @@ int main(int argc, char** argv)
return 0;
}
-~~~
+```
Note that the templated type of the future must be the exact
same as the promise: you cannot create a covariant or
contravariant future. Unlike `Promise`, a `Future` can be both
copied and assigned:
-~~~{.cpp}
+```cpp
using namespace process;
int main(int argc, char** argv)
@@ -431,7 +431,7 @@ int main(int argc, char** argv)
return 0;
}
-~~~
+```
The result encapsulated in the `Future`/`Promise` can be in one
of four states: `PENDING`, `READY`, `FAILED`, `DISCARDED`. When
@@ -439,7 +439,7 @@ a `Promise` is first created the result is `PENDING`. When you
complete a `Promise` using the `Promise::set()` method the
result becomes `READY`:
-~~~{.cpp}
+```cpp
using namespace process;
int main(int argc, char** argv)
@@ -454,7 +454,7 @@ int main(int argc, char** argv)
return 0;
}
-~~~
+```
> NOTE: `CHECK` is a macro from `gtest` which acts like an
> `assert` but prints a stack trace and does better signal
@@ -478,7 +478,7 @@ TODO(benh):
`Future::then` allows to invoke callbacks once a future is completed.
-~~~{.cpp}
+```cpp
using namespace process;
int main(int argc, char** argv)
@@ -495,7 +495,7 @@ int main(int argc, char** argv)
...;
}
-~~~
+```
### `Promise`
@@ -503,7 +503,7 @@ int main(int argc, char** argv)
A `promise` is an object that can fulfill a [futures](#future), i.e. assign a result value to it.
-~~~{.cpp}
+```cpp
using namespace process;
template <typename T>
@@ -537,7 +537,7 @@ int main(int argc, char** argv)
...;
}
-~~~
+```
-->
@@ -553,7 +553,7 @@ of communication.
`route` installs an HTTP endpoint onto a process. Let's define a simple process
that installs an endpoint upon initialization:
-~~~{.cpp}
+```cpp
using namespace process;
using namespace process::http;
@@ -585,7 +585,7 @@ public:
Owned<HttpProcess> process;
};
-~~~
+```
Now if our program instantiates this class, we can do something like:
`$ curl localhost:1234/testing?value=42`
@@ -601,19 +601,19 @@ according to the `--port` command-line flag.
containing the response. We can pass it either a libprocess `UPID` or a `URL`.
Here's an example hitting the endpoint assuming we have a `UPID` named `upid`:
-~~~{.cpp}
+```cpp
Future<Response> future = get(upid, "testing");
-~~~
+```
Or let's assume our serving process has been set up on a remote server and we
want to hit its endpoint. We'll construct a `URL` for the address and then call
`get`:
-~~~{.cpp}
+```cpp
URL url = URL("http", "hostname", 1234, "/testing");
Future<Response> future = get(url);
-~~~
+```
### `post` and `requestDelete`
@@ -626,7 +626,7 @@ A `Connection` represents a connection to an HTTP server. `connect`
can be used to connect to a server, and returns a `Future` containing the
`Connection`. Let's open a connection to a server and send some requests:
-~~~{.cpp}
+```cpp
Future<Connection> connect = connect(url);
connect.await();
@@ -640,7 +640,7 @@ request.body = "Amazing prose goes here.";
request.keepAlive = true;
Future<Response> response = connection.send(request);
-~~~
+```
It's also worth noting that if multiple requests are sent in succession on a
`Connection`, they will be automatically pipelined.
@@ -657,7 +657,7 @@ amount of system time has elapsed).
To invoke a function after a certain amount of time has elapsed, use `delay`:
-~~~{.cpp}
+```cpp
using namespace process;
class DelayedProcess : public Process<DelayedProcess>
@@ -693,13 +693,13 @@ int main()
return 0;
}
-~~~
+```
This invokes the `action` function after (at least) five seconds of time
have elapsed. When writing unit tests for this code, blocking the test for five
seconds is undesirable. To avoid this, we can use `Clock::advance`:
-~~~{.cpp}
+```cpp
int main()
{
@@ -726,7 +726,7 @@ int main()
return 0;
}
-~~~
+```
## <a name="miscellaneous-primitives"></a> Miscellaneous Primitives