Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Add new entry in Release_Notes.
[simgrid.git] / doc / doxygen / inside_extending.doc
index f7c796b..dfd7e57 100644 (file)
@@ -1,99 +1,85 @@
-/*
-\page inside_extending Extending SimGrid 
+/**
+@page inside_extending Extending SimGrid
 
-We start to put TAGS in simgrid source code for having tutorials to see where is the important parts ans steps to create:
-\li \ref simgrid_dev_guide_api
-\li \ref simgrid_dev_guide_model
-\li \ref simgrid_dev_guide_tag
+@tableofcontents
 
-\section simgrid_dev_guide_api How to add a new MSG function?
-Search for expression \"TUTORIAL: New API\".
-\verbatim
-user@caraja:~/workspace/simgrid/src$ cg "TUTORIAL: New API"
- 0 msg/msg_new_api.c             15 /* TUTORIAL: New API*/
- 1 simix/smx_smurf.c            582 /* TUTORIAL: New API*/
- 2 simix/smx_smurf.c            616 /* TUTORIAL: New API*/
- 3 simix/smx_smurf_private.h    102 /* TUTORIAL: New API*/
- 4 simix/smx_smurf_private.h    629 /* TUTORIAL: New API*/
- 5 simix/smx_private.h           28 /* TUTORIAL: New API*/
- 6 simix/smx_private.h          101 /* TUTORIAL: New API*/
- 7 simix/smx_private.h          182 /* TUTORIAL: New API*/
- 8 simix/smx_global.c           454 /* TUTORIAL: New API*/
- 9 simix/smx_new_api.c            8 /* TUTORIAL: New API*/
-10 simix/smx_user.c            1684 /* TUTORIAL: New API*/
-11 simix/smx_new_api_private.h    8 /* TUTORIAL: New API*/
-12 simix/smx_process.c          338 /* TUTORIAL: New API*/
-\endverbatim
+@section simgrid_dev_guide_generic_simcall The modern SimCall interface
 
-\section simgrid_dev_guide_model How to add a new model in surf?
-Search for expression \"TUTORIAL: New model\".
-\verbatim
-user@caraja:~/workspace/simgrid/src$ cg "TUTORIAL: New model"
-0 surf/new_model_private.h   2 /* TUTORIAL: New model
-1 surf/surf.c              213 /* TUTORIAL: New model*/
-2 surf/surf_config.c       380 /* TUTORIAL: New model*/
-3 surf/surf_config.c       746 /* TUTORIAL: New model*/
-4 surf/new_model.c           8 /* TUTORIAL: New model*/
-5 include/surf/surf.h      157 /* TUTORIAL: New model*/
-6 include/surf/surf.h      345 /* TUTORIAL: New model*/
-7 include/surf/surf.h      661 /* TUTORIAL: New model*/
-\endverbatim
+We now have some generic simcalls which can be used to interface with the
+Maestro without creating new simcalls. You might want to use them instead of
+the defining additional simcalls.  The long term goal is to replace most of
+the simcalls with the generic ones.
 
-\section simgrid_dev_guide_simcall How to add a new simcall?
-To add a simcall called `<name>` with three arguments `arg1`, `arg2` and `arg3`
-of type `targ1`, `targ2`, `targ3` respectively and which return a value of
-type `tret` you must first define the simcall function in the the
-`include/simgrid/simix.h` and make it call the automatically generated `BODY`
-function which will do all the bad stuff.
+For simcalls which never block, `kernelImmediate()` can be used. It takes a
+C++ callback executes it in maestro. Any value returned by the callback is
+returned by `kernelImmediate()`. Conversely, if the callback throws an
+exception, this exception is propagated out of `kernelImmediate()`. Executing
+the code in maestro enforces mutual exclusion (no other user process is running)
+and enforce a deterministic order which guarantees the reproducibility of the
+simulation.  This call is particularly useful for implementing mutable calls:
 
-~~~~{.c}
-tret simcall_<NAME>(targ1 arg1, targ2 arg2, targ3 arg3){
-  return simcall_BODY_<NAME>(arg1, arg2, arg3);
+~~~
+void Host::setProperty(const char*key, const char *value){
+  simgrid::simix::kernelImmediate([&] {
+    simgrid::kernel::resource::HostImpl* host =
+       this->extension<simgrid::kernel::resource::HostImpl>();
+    host->setProperty(key,value);
+  });
 }
-~~~~
+~~~
 
-Then you must add an new line in the list `SIMCALL_LIST1` of simcall actions in
-`src/simix/smx_smurf_private.h`. The arguments of the `ACTION` are:
-- the simcall enum name,
-- the `<name>` of the simcall,
-- if the result must be automatically saved in the simcall
- (`WITH_ANSWER`/`WITHOUT_ANSWER`)
-- the return type,
-- the arguments.
+If there is no blocking and no mutation involved (getters), you might consider
+avoiding switching to Maestro and reading directly the data you're interested
+in.
 
-The return type and the arguments must be define by using `TSPEC(name, type)`,
-or one of the predefined type (e.g., `TSTRING(n)`, `TINT(n)`, `TVOID(n)`,
-`TPTR(n)`, …). You must get something like this:
+For simcalls which might block, `kernel_sync()` can be used. It takes a
+C++ callback and executes it immediately in maestro. This C++ callback is
+expected to return a `simgrid::kernel::Future<T>` reprensenting the operation
+in the kernel. When the operations completes, the user process is waken up
+with the result:
 
-~~~~{.c}
-ACTION(SIMCALL_<NAME>, <name>, WITH_ANSWER, TSPEC(result, tret), TSPEC(arg1, targ1), TSPEC(arg2, targ2), TSPEC(arg3, targ3)) sep  \
-~~~~
+~~~
+try {
+  std::vector<char> result = simgrid::simix::kernel_sync([&] {
+    // Fictional example, simgrid::kernel::readFile does not exist.
+    simgrid::kernel::Future<std::vector<char>> result = simgrid::kernel::readFile(file);
+    return result;
+  });
+  XBT_DEBUG("Finished reading file %s: length %zu", file, result.size());
+}
+// If the operation failed, kernel_sync() throws an exception:
+catch (std::runtime_error& e) {
+  XBT_ERROR("Could not read file %s", file);
+}
+~~~
 
-Finaly you have to define the kernel code in a `SIMIX_pre_<name>` in the
-corresponding src/simix/smx_*.c file:
+Asynchronous blocks can be implemented with `kernel_async()`. It works
+like `kernel_sync()` but does not block. Instead, it returns a
+`simgrid::simix::Future` representing the operation in the process:
 
-~~~~{.c}
-tret SIMIX_pre_<name>(smx_simcall_t simcall, targ1 arg1, targ2 arg2, targ3 arg3) {
-  SIMIX_<NAME>(arg1, arg2, arg3);
-}
+~~~
+simgrid::simix::Future<std:vector<char>> result = simgrid::simix::kernel_sync([&] {
+  // Fictional example, simgrid::kernel::readFile does not exist.
+  simgrid::kernek::Future<std::vector<char>> result = simgrid::kernel::readFile(file);
+  return result;
+};
 
-tret SIMIX_<name>(targ1 arg1, targ2 arg2, targ3 arg3) {
-  // Your code in kernel mode
+// Do some work while the operation is pending:
+while (!result.is_ready() && hasWorkToDo())
+  doMoreWork();
+
+// We don't have anything to do, wait for the operation to complete and
+// get its value:
+try {
+  std:vector<char> data = result.get();
+  XBT_DEBUG("Finished reading file %s: length %zu", file, data.size());
+}
+// If the operation failed, .get() throws an exception:
+catch (std::runtime_error& e) {
+  XBT_ERROR("Could not read file %s", file);
 }
-~~~~
+~~~
+
+<b>Note:</b> `kernel_sync(f)` could be implemented as `kernel_async(f).get()`.
 
-\section simgrid_dev_guide_tag What is How to add a new tag for xml files?
-Search for expression \"TUTORIAL: New TAG\".
-\verbatim
-user@caraja:~/workspace/simgrid/src$ cg "TUTORIAL: New TAG"
-0 surf/sg_platf.c                    43 /* TUTORIAL: New TAG*/
-1 surf/sg_platf.c                    89 /* TUTORIAL: New TAG*/
-2 surf/sg_platf.c                   124 /* TUTORIAL: New TAG*/
-3 surf/sg_platf.c                   337 /* TUTORIAL: New TAG*/
-4 surf/surfxml_parse.c              769 /* TUTORIAL: New TAG*/
-5 surf/surf_private.h               205 /* TUTORIAL: New TAG*/
-6 surf/surfxml_parseplatf.c          64 /* TUTORIAL: New TAG*/
-7 surf/surfxml_parseplatf.c          85 /* TUTORIAL: New TAG*/
-8 include/simgrid/platf_interface.h  42 /* TUTORIAL: New TAG*/
-\endverbatim
 */