From aad6b6c4c7b1454dd284f822ba6f52e790f42c6e Mon Sep 17 00:00:00 2001 From: Martin Quinson Date: Sat, 14 Jan 2023 01:12:12 +0100 Subject: [PATCH] Remove MSG. Its EOL was scheduled for 2020 --- .circleci/config.yml | 2 +- .gitignore | 1 - .gitlab-ci.yml | 2 +- CMakeLists.txt | 11 - ChangeLog | 3 +- MANIFEST.in | 15 - README.coding | 56 +- doc/doxygen/FAQ.doc | 195 +---- doc/doxygen/inside_tests.doc | 12 +- doc/doxygen/module-index.doc | 6 +- doc/doxygen/module-surf.doc | 2 +- doc/webcruft/Paje_MSG_screenshot.jpg | Bin 340759 -> 0 bytes doc/webcruft/Paje_MSG_screenshot_thn.jpg | Bin 30326 -> 0 bytes docs/find-missing.py | 1 - docs/source/Configuring_SimGrid.rst | 25 +- docs/source/Deploying_your_application.rst | 4 - docs/source/Doxyfile | 2 - docs/source/Installing_SimGrid.rst | 3 - docs/source/Modeling_howtos.rst | 11 +- docs/source/Release_Notes.rst | 5 + docs/source/Start_your_own_project.rst | 1 - docs/source/Tutorial_Algorithms.rst | 3 - docs/source/XML_reference.rst | 6 +- docs/source/app_msg.rst | 253 ------ docs/source/app_s4u.rst | 13 +- docs/source/application.rst | 11 +- docs/source/conf.py | 2 - docs/source/index.rst | 1 - docs/source/tuto_disk/analysis.irst | 4 +- docs/source/tuto_disk/analysis.org | 4 +- include/simgrid/config.h.in | 2 - include/simgrid/msg.h | 419 --------- include/simgrid/plugins/dvfs.h | 4 - include/simgrid/plugins/energy.h | 12 - include/simgrid/plugins/file_system.h | 24 - include/simgrid/plugins/live_migration.h | 12 - include/simgrid/plugins/load.h | 13 - sonar-project.properties | 6 +- src/kernel/activity/MailboxImpl.cpp | 1 - src/msg/msg_comm.cpp | 220 ----- src/msg/msg_global.cpp | 74 -- src/msg/msg_legacy.cpp | 443 ---------- src/msg/msg_private.hpp | 119 --- src/msg/msg_process.cpp | 93 -- src/msg/msg_task.cpp | 810 ------------------ teshsuite/msg/CMakeLists.txt | 14 - .../task_destroy_cancel/task_destroy_cancel.c | 113 --- .../task_destroy_cancel.tesh | 17 - tools/CMakeLists.txt | 4 +- tools/MSG_visualization/colorize.pl | 128 --- tools/MSG_visualization/trace2fig.pl | 434 ---------- tools/cmake/DefinePackages.cmake | 21 - tools/cmake/Distrib.cmake | 9 - tools/cmake/Option.cmake | 7 +- tools/internal/spell_dict.txt | 1 - tools/jenkins/Coverage.sh | 2 +- tools/jenkins/Flags.sh | 13 +- 57 files changed, 55 insertions(+), 3614 deletions(-) delete mode 100644 doc/webcruft/Paje_MSG_screenshot.jpg delete mode 100644 doc/webcruft/Paje_MSG_screenshot_thn.jpg delete mode 100644 docs/source/app_msg.rst delete mode 100644 include/simgrid/msg.h delete mode 100644 src/msg/msg_comm.cpp delete mode 100644 src/msg/msg_global.cpp delete mode 100644 src/msg/msg_legacy.cpp delete mode 100644 src/msg/msg_private.hpp delete mode 100644 src/msg/msg_process.cpp delete mode 100644 src/msg/msg_task.cpp delete mode 100644 teshsuite/msg/CMakeLists.txt delete mode 100644 teshsuite/msg/task_destroy_cancel/task_destroy_cancel.c delete mode 100644 teshsuite/msg/task_destroy_cancel/task_destroy_cancel.tesh delete mode 100755 tools/MSG_visualization/colorize.pl delete mode 100755 tools/MSG_visualization/trace2fig.pl diff --git a/.circleci/config.yml b/.circleci/config.yml index 7eafeec2d9..2839cb33b1 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -19,5 +19,5 @@ jobs: name: Configure, build and test da stuff command: | mkdir _build && cd _build - cmake -Denable_documentation=OFF -Denable_coverage=ON -Denable_msg=ON -Denable_model-checking=OFF -Denable_compile_optimizations=OFF -Denable_smpi=ON -Denable_smpi_MPICH3_testsuite=OFF -Denable_compile_warnings=ON .. + cmake -Denable_documentation=OFF -Denable_coverage=ON -Denable_model-checking=OFF -Denable_compile_optimizations=OFF -Denable_smpi=ON -Denable_smpi_MPICH3_testsuite=OFF -Denable_compile_warnings=ON .. make -j4 tests && ctest -j4 --output-on-failure diff --git a/.gitignore b/.gitignore index 6014d75f6e..560814792f 100644 --- a/.gitignore +++ b/.gitignore @@ -292,7 +292,6 @@ teshsuite/models/cloud-sharing/cloud-sharing teshsuite/models/ptask_L07_usage/ptask_L07_usage teshsuite/models/wifi_usage/wifi_usage teshsuite/models/wifi_usage_decay/wifi_usage_decay -teshsuite/msg/task_destroy_cancel/task_destroy_cancel teshsuite/platforms/flatifier teshsuite/s4u/activity-lifecycle/activity-lifecycle teshsuite/s4u/actor/actor diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e56e10f9ce..49f4c5c4ab 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -32,7 +32,7 @@ release: script: - apt-get --allow-releaseinfo-change update - apt install -y binutils wget unzip zip - - cmake -Denable_documentation=OFF -Denable_msg=ON -Dminimal-bindings=ON -Denable_compile_optimizations=ON -Denable_smpi=OFF -DLTO_EXTRA_FLAG="auto" . + - cmake -Denable_documentation=OFF -Dminimal-bindings=ON -Denable_compile_optimizations=ON -Denable_smpi=OFF -DLTO_EXTRA_FLAG="auto" . - make VERBOSE=1 -j$(nproc) dist artifacts: paths: diff --git a/CMakeLists.txt b/CMakeLists.txt index d9e257a0d2..a57c58c4ca 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -243,11 +243,6 @@ else() message(STATUS "Disabling model BMF because Eigen3 was not found. If it's installed, use EIGEN3_HINT to hint cmake about the location of Eigen3Config.cmake") endif() -set(SIMGRID_HAVE_MSG 0) -if(enable_msg) - set(SIMGRID_HAVE_MSG 1) -endif() - set(HAVE_PAPI 0) if(enable_smpi_papi) include(FindPAPI) @@ -899,12 +894,6 @@ message(" LDFlags .....................: ${CMAKE_C_LINK_FLAGS}") message(" with LTO ....................: ${enable_lto}") message("") -if (SIMGRID_HAVE_MSG) - message(" Compile MSG .................: ON") -else() - message(" Compile MSG .................: OFF") -endif() - if (SIMGRID_HAVE_NS3) message(" Compile ns-3 ................: ON (path: ${NS3_PATH})") else() diff --git a/ChangeLog b/ChangeLog index 1e13d4e8a6..649d71e360 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,9 +1,10 @@ SimGrid (3.32.1) not released yet (target december 22) General: + - Remove the MSG API: its EOL was scheduled for 2020. + - Remove the Java bindings: they were limited to the MSG interface. - On Windows, you now need to install WSL2 as the native builds are now disabled. It was not really working anyway. - - Remove the Java bindings: they were completely outdated, limited to the MSG interface. S4U: - Activity::set_remaining() is not public anymore. Use for example diff --git a/MANIFEST.in b/MANIFEST.in index 42031f9541..40633076d2 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,8 +1,6 @@ # This file lists the content of the python source package # Prepared in tools/cmake/Distrib.cmake -include doc/webcruft/Paje_MSG_screenshot.jpg -include doc/webcruft/Paje_MSG_screenshot_thn.jpg include doc/webcruft/eclipseScreenShot.png include doc/webcruft/output.goal.pdf include examples/c/actor-create/actor-create.c @@ -642,8 +640,6 @@ include teshsuite/models/wifi_usage/wifi_usage.cpp include teshsuite/models/wifi_usage/wifi_usage.tesh include teshsuite/models/wifi_usage_decay/wifi_usage_decay.cpp include teshsuite/models/wifi_usage_decay/wifi_usage_decay.tesh -include teshsuite/msg/task_destroy_cancel/task_destroy_cancel.c -include teshsuite/msg/task_destroy_cancel/task_destroy_cancel.tesh include teshsuite/platforms/Dijkstra.xml include teshsuite/platforms/bob.trace include teshsuite/platforms/bogus_missing_dst_gateway.xml @@ -1579,8 +1575,6 @@ include teshsuite/xbt/parmap_test/parmap_test.cpp include teshsuite/xbt/parmap_test/parmap_test.tesh include teshsuite/xbt/signals/signals.cpp include teshsuite/xbt/signals/signals.tesh -include tools/MSG_visualization/colorize.pl -include tools/MSG_visualization/trace2fig.pl include tools/address_sanitizer.supp include tools/fix-paje-trace.sh include tools/generate-dwarf-functions @@ -1680,7 +1674,6 @@ include docs/source/_ext/showfile.js include docs/source/_ext/showfile.py include docs/source/_static/css/custom.css include docs/source/_templates/breadcrumbs.html -include docs/source/app_msg.rst include docs/source/app_s4u.rst include docs/source/app_smpi.rst include docs/source/application.rst @@ -1895,7 +1888,6 @@ include include/simgrid/kernel/routing/WifiZone.hpp include include/simgrid/link.h include include/simgrid/mailbox.h include include/simgrid/modelchecker.h -include include/simgrid/msg.h include include/simgrid/mutex.h include include/simgrid/plugins/ProducerConsumer.hpp include include/simgrid/plugins/dvfs.h @@ -2202,12 +2194,6 @@ include src/mc/transition/TransitionSynchro.cpp include src/mc/transition/TransitionSynchro.hpp include src/mc/udpor_global.cpp include src/mc/udpor_global.hpp -include src/msg/msg_comm.cpp -include src/msg/msg_global.cpp -include src/msg/msg_legacy.cpp -include src/msg/msg_private.hpp -include src/msg/msg_process.cpp -include src/msg/msg_task.cpp include src/plugins/ProducerConsumer.cpp include src/plugins/chaos_monkey.cpp include src/plugins/file_system/s4u_FileSystem.cpp @@ -2522,7 +2508,6 @@ include src/xbt/xbt_virtu.cpp include teshsuite/kernel/CMakeLists.txt include teshsuite/mc/CMakeLists.txt include teshsuite/models/CMakeLists.txt -include teshsuite/msg/CMakeLists.txt include teshsuite/platforms/CMakeLists.txt include teshsuite/python/CMakeLists.txt include teshsuite/s4u/CMakeLists.txt diff --git a/README.coding b/README.coding index e3eed4041c..101fd3a068 100644 --- a/README.coding +++ b/README.coding @@ -14,7 +14,7 @@ should leverage our tesh(1) utility. ** -** NEW type naming standard in SimGrid4 +** Type naming standard in SimGrid4 ** ***************************************************** @@ -42,60 +42,6 @@ SimGrid4 will follow the these rules: char* sg_host_get_name(sg_host_t* host); -This is different from the old convention (described below), that -should not be used in S4U and its bindings, nor in the kernel. - -** -** Commenting the source: doxygen -** -**************************************************** - -The global structure of the documentation is in doc/modules.doc - -The structure of each module (xbt, msg, etc) is in doc/module-.doc - -The structure of a module is in its public header. This way, you're sure to -see all the public interface (and only it). The different parts of the -interface are grouped using the @name construct, even if it's buggy. Since -parts often get reordered, it's better to add numbers to the parts (so that -users can see the intended order). - -The documentation of each type and macro are also in the public header since -this is were they live. - -The documentation of each function must be in the C++ file were it lives. - -Any public element (function, type and macro) must have a @brief part. - -We use @ as a command marker, not \ (so, use @brief not \brief) - -** -** OLD Type naming standard in SimGrid3 -** -***************************************************** - -SimGrid3 legacy interface (ie, MSG) is following these rules: - - - ???_t is a valid type (built with typedef) - - s_toto_t is a structure (access to fields with .) - - s_toto is a structure needing 'struct' keyword to be used - - e_toto_t is an enum - - u_toto_t is an union - - u_toto is an union needing 'union' keyword to be used - - toto_t is an 'object' (struct*) - -Please to not call toto_t something else than an 'object' (ie, something you -have to call _new and _free on it). - -Example: - typedef struct s_toto {} s_toto_t, *toto_t; - typedef enum {} e_toto_t; - -Moreover, only toto_t (and e_toto_t) are public. The rest (mainly s_toto_t) -is private. - - -* * SimGrid Hacker Survival Guide (FIXME: should be betterly placed) ******************************** * When you add/remove files, and/or make changes in the lists of files to build, diff --git a/doc/doxygen/FAQ.doc b/doc/doxygen/FAQ.doc index 1f95d4f1b5..7a5c4f199e 100644 --- a/doc/doxygen/FAQ.doc +++ b/doc/doxygen/FAQ.doc @@ -1,135 +1,11 @@ -/*! @page FAQ MSG Frequently Asked Questions +/*! @page FAQ Frequently Asked Questions @tableofcontents -This document is the FAQ of the MSG interface. Some entries are a bit aging and it should be refreshed at some point. - -@section faq_simgrid I'm new to SimGrid. I have some questions. Where should I start? - -You are at the right place... To understand what you can do or -cannot do with SimGrid, you should read the -tutorial -slides from the SimGrid's website. You may find more up-to-date -material on the -blog of -Martin Quinson. - -Another great source of inspiration can be found in the @ref s4u_examples. - -If you are stuck at any point and if this FAQ cannot help you, please drop us a -mail to the user mailing list: . - -@subsection faq_visualization Visualizing and analyzing the results - -It is sometime convenient to "see" how the agents are behaving. If you -like colors, you can use tools/MSG_visualization/colorize.pl -as a filter to your MSG outputs. It works directly with INFO. Beware, -INFO() prints on stderr. Do not forget to redirect if you want to -filter (e.g. with bash): -@verbatim -./msg_test small_platform.xml small_deployment.xml 2>&1 | ../../tools/MSG_visualization/colorize.pl -@endverbatim - -We also have a more graphical output. Have a look at section @ref options_tracing. +Some entries are a bit aging and it should be refreshed at some point. @section faq_howto Feature related questions -@subsection faq_MIA "Could you please add (your favorite feature here) to SimGrid?" - -Here is the deal. The whole SimGrid project (MSG, SURF, ...) is -meant to be kept as simple and generic as possible. We cannot add -functions for everybody's needs when these functions can easily be -built from the ones already in the API. Most of the time, it is -possible and when it was not possible we always have upgraded the API -accordingly. When somebody asks us a question like "How to do that? -Is there a function in the API to simply do this?", we're always glad -to answer and help. However if we don't need this code for our own -need, there is no chance we're going to write it... it's your job! :) -The counterpart to our answers is that once you come up with a neat -implementation of this feature (task duplication, RPC, thread -synchronization, ...), you should send it to us and we will be glad to -add it to the distribution. Thus, other people will take advantage of -it (and we don't have to answer this question again and again ;). - -You'll find in this section a few "Missing In Action" features. Many -people have asked about it and we have given hints on how to simply do -it with MSG. Feel free to contribute... - -@subsection faq_MIA_MSG MSG features - -@subsubsection faq_MIA_thread_synchronization How to synchronize my user processes? - -It depends on why you want to synchronize them. If you just want to -have a shared state between your processes, then you probably don't -need to do anything. User processes never get forcefully interrupted -in SimGrid (unless you explicitly request the parallel execution of -user processes -- see @ref options_virt_parallel). - -Even if several processes are executed at the exact same time within -the simulation, they are linearized in reality by default: one process -always run in an exclusive manner, atomic, uninterrupted until it does -a simcall (until it ask a service from the simulation kernel). This is -surprising at first, but things are much easier this way, both for the -user (who don't have to protect her shared data) and for the kernel -(that avoid many synchronization issues too). Processes are executed -concurrently in the simulated realm, but you don't need to bother with -this in the real realm. - -If you really need to synchronize your processes (because it's what -you are studying or to create an atomic section that spans over -several simcalls), you obviously cannot use regular synchronization -mechanisms (pthread_mutexes in C). -This is because the SimGrid kernel locks all processes and unlock them -one after the other when they are supposed to run, until they give the -control back in their simcall. If one of them gets locked by the OS -before returning the control to the kernel, that's definitively a -deadlock. - -Instead, you should use the synchronization mechanism provided by the -simulation kernel. This could with a SimGrid mutex, a SimGrid -condition variables or a SimGrid semaphore, as described in @ref -msg_synchro. But actually, -many synchronization patterns can be encoded with communication on -mailboxes. Typically, if you need one process to notify another one, -you could use a condition variable or a semaphore, but sending a -message to a specific mailbox does the trick in most cases. - -@subsubsection faq_MIA_communication_time How can I get the *real* communication time? - -Communications are synchronous and thus if you simply get the time -before and after a communication, you'll only get the transmission -time and the time spent to really communicate (it will also take into -account the time spent waiting for the other party to be -ready). However, getting the *real* communication time is not really -hard either. The following solution is a good starting point. - -@code -int sender() -{ - m_task_t task = MSG_task_create("Task", task_comp_size, task_comm_size, - calloc(1,sizeof(double))); - *((double*) task->data) = MSG_get_clock(); - MSG_task_put(task, workers[i % workers_count], PORT_22); - XBT_INFO("Send completed"); - return 0; -} -int receiver() -{ - m_task_t task = NULL; - double time1,time2; - - time1 = MSG_get_clock(); - a = MSG_task_get(&(task), PORT_22); - time2 = MSG_get_clock(); - if(time1<*((double *)task->data)) - time1 = *((double *) task->data); - XBT_INFO("Communication time : \"%f\" ", time2-time1); - free(task->data); - MSG_task_destroy(task); - return 0; -} -@endcode - @subsection faq_MIA_SimDag SimDag related questions @subsubsection faq_SG_comm Implementing communication delays between tasks. @@ -157,73 +33,6 @@ comprising the workstations on which t1 and t2 are scheduled (w1 and w2 for example) and build a communication matrix that should look like [0;amount ; 0; 0]. -@subsubsection faq_SG_DAG How to implement a distributed dynamic scheduler of DAGs. - -Distributed is somehow "contagious". If you start making distributed -decisions, there is no way to handle DAGs directly anymore (unless I -am missing something). You have to encode your DAGs in term of -communicating process to make the whole scheduling process -distributed. Here is an example of how you could do that. Assume T1 -has to be done before T2. - -@code - int your_agent(int argc, char *argv[] { - ... - T1 = MSG_task_create(...); - T2 = MSG_task_create(...); - ... - while(1) { - ... - if(cond) MSG_task_execute(T1); - ... - if((MSG_task_get_remaining_computation(T1)=0.0) && (you_re_in_a_good_mood)) - MSG_task_execute(T2) - else { - /* do something else */ - } - } - } -@endcode - -If you decide that the distributed part is not that much important and that -DAG is really the level of abstraction you want to work with, then you should -give a try to @ref SD_API. - -@subsection faq_MIA_generic Generic features - -@subsubsection faq_MIA_batch_scheduler Is there a native support for batch schedulers in SimGrid? - -No, there is no native support for batch schedulers and none is -planned because this is a very specific need (and doing it in a -generic way is thus very hard). However some people have implemented -their own batch schedulers. Vincent Garonne wrote one during his PhD -and put his code in the contrib directory of our SVN so that other can -keep working on it. You may find inspiring ideas in it. - -@subsection faq_platform Platform building and Dynamic resources - -@subsubsection faq_platform_synthetic Generating synthetic but realistic platforms - -Another possibility to get a platform file is to generate synthetic -platforms. Getting a realistic result is not a trivial task, and -moreover, nobody is really able to define what "realistic" means when -speaking of topology files. You can find some more thoughts on this -topic in these -slides. - -If you are looking for an actual tool, there we have a little tool to -annotate Tiers-generated topologies. This perl-script is in -tools/platform_generation/ directory of the SVN. Dinda et Al. -released a very comparable tool, and called it GridG. - - -The specified computing power will be available to up to 6 sequential -tasks without sharing. If more tasks are placed on this host, the -resource will be shared accordingly. For example, if you schedule 12 -tasks on the host, each will get half of the computing power. Please -note that although sound, this model were never scientifically -assessed. Please keep this fact in mind when using it. - @section faq_troubleshooting Troubleshooting @subsection faq_surf_network_latency I get weird timings when I play with the latencies. diff --git a/doc/doxygen/inside_tests.doc b/doc/doxygen/inside_tests.doc index 4bdbcf44d8..8f0f5ed0e6 100644 --- a/doc/doxygen/inside_tests.doc +++ b/doc/doxygen/inside_tests.doc @@ -30,13 +30,13 @@ cmake. These tests are run for every commit and the result is publicly @verbatim ctest # Launch all tests -ctest -R msg # Launch only the tests which name match the string "msg" +ctest -R mc- # Launch only the tests which name match the string "mc-" ctest -j4 # Launch all tests in parallel, at most 4 at the same time ctest --verbose # Display all details on what's going on ctest --output-on-failure # Only get verbose for the tests that fail -ctest -R msg- -j5 --output-on-failure # You changed MSG and want to check that you didn't break anything, huh? - # That's fine, I do so all the time myself. +ctest -R mc- -j5 --output-on-failure # You changed the model checker and want to check that you didn't break anything, huh? + # That's fine, I do so all the time myself. @endverbatim @section inside_tests_rununit Running the unit tests @@ -102,13 +102,13 @@ To add a new integration test, you thus have 3 things to do: - Add your test in the cmake infrastructure. For that, modify the following file: @verbatim - /teshsuite//CMakeLists.txt + /teshsuite//CMakeLists.txt @endverbatim Make sure to pick a wise name for your test. It is often useful to check a category of tests together. The only way to do so in ctest is to use the -R argument that specifies a regular expression that - the test names must match. For example, you can run all MSG test - with "ctest -R msg". That explains the importance of the test + the test names must match. For example, you can run all MC test + with "ctest -R mc-". That explains the importance of the test names. Once the name is chosen, create a new test by adding a line similar to diff --git a/doc/doxygen/module-index.doc b/doc/doxygen/module-index.doc index 0f252d6d61..3e0c376145 100644 --- a/doc/doxygen/module-index.doc +++ b/doc/doxygen/module-index.doc @@ -8,15 +8,15 @@ @brief Gather data about your simulation for later analysis SimGrid can trace the resource (of hosts and links) utilization using -any of its programming interfaces (MSG, SimDAG and SMPI). This means +any of its programming interfaces (S4U, SimDAG and SMPI). This means that the tracing will register how much power is used for each host and how much bandwidth is used for each link of the platform. The idea of the tracing facilities is to give SimGrid users to -possibility to classify MSG and SimDAG tasks by category, tracing the +possibility to classify S4U and SimDAG tasks by category, tracing the platform utilization (hosts and links) for each of the categories. The API enables the declaration of categories and a function to -associate them to the tasks (MSG and SD). The tasks that are not +associate them to the tasks (S4U and SD). The tasks that are not classified according to a category are not traced. If no categories are specified, simulations can still be traced using a special parameter in the command line (see @ref outcomes_vizu for details). diff --git a/doc/doxygen/module-surf.doc b/doc/doxygen/module-surf.doc index 32d997f76b..d3726b7be1 100644 --- a/doc/doxygen/module-surf.doc +++ b/doc/doxygen/module-surf.doc @@ -38,7 +38,7 @@ extract them from @a surf_host_model->common_public->states.done_action_set. Depending on these results, you can schedule other tasks and call solve() again. - Have a look at the implementation of @ref MSG_API "MSG" and @ref SD_API "Simdag" to see how these module + Have a look at the implementation ofd @ref SD_API "Simdag" to see how these module interact with SURF. But if you want to create a new API on top of SURF, we strongly recommend you to contact us before anyway. diff --git a/doc/webcruft/Paje_MSG_screenshot.jpg b/doc/webcruft/Paje_MSG_screenshot.jpg deleted file mode 100644 index 96394d8ddafd38824a86c94be4f2b2eab609d172..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 340759 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

V6TIJ`}saK5y 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 se-ienOrv(Rfqv*elP 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�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
>VNN^sGFTvT17m5%RJyQV1L5(t65(gdt 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 diff --git a/doc/webcruft/Paje_MSG_screenshot_thn.jpg b/doc/webcruft/Paje_MSG_screenshot_thn.jpg deleted file mode 100644 index 323d6674eee8367712d60b10f8bcac7722841a84..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30326 zcmb5V1ymeevo<=oLvSZJ4DJLAZi57d!7UJ62De}d7Cgw{7G!|I-6goYdk7LBAwaMI z0WRRduRYz>RZl&&yL$KDHIK`WUjWZQN~%f#BqSt&+S3Q{xD6mv z^tHDE05miJ8~^|S^XdDvJ+1-d0ca?wsHiAtPdhX;G;|DHOpK?E00##Pmym#nh>(Dg zkeG~yoS1})l#q~ufr5&b_WASY#N>?3jC9O2bkFJjQiAk!DF!+QJ|-qU9SI=`-T&|H z@iTxB6A1&!3V;PcEi$TuBEGVDc zbEe?#F}p4F=5ZB(`{W%mAqpWt8erEqOJa+dS7Ie>$SV~Jt6TAfYgTjcI$l-;)Yd<% zk2nx!LtKi85DWB4jw$|v%nFc(TKFG2Z}8D_H zZ?=KfvA>ygpxa7BMAR%x&kAPM%JxW#vdmVY-#(HHhJw$m^(Sf66l~2s^Ib(f@$Nne zurJ#f3(gAZ)(gPOt-2)RL6P*qreqtizMr)sW3ZC>^_`I*3)Vm~xBd|1kI+pdMt=O5 zbegFiN7@>yQ~H+FeHFkBVCSU;d13-wV=Qfk9a$uvMXFJ0n-hqB{jG6l?p09;2B}`b z^>|gx#h?&|l@-Ey3?tow-8h3<=TI92ng?UG?lWZ%JV-O0uDHyWtWkyN5kVAR!gOJ( zRksfUZMV0D?sgXgIA_Mbi`7mBJHMpyQtvqeYhV2N*k|1h%5zd5RkiyeEc#_j!)!Sx zqWBN>Vfh;M?|+}w{I^~#Sklb0gG*0WW@oJgp2ly{IsGO{-M0}*a^*t1iT<1R$ctN3 zbX514E|ogU5B7A+>P4xh|58U>GrtuYDD3}+Zfd$3I-%pU)|Gf1wQ@^71ld?RDe|`v zNHX-M$~tu^u6EMw(+R@6SU8ULmzL{n7uM)bVOk@uzu;V}hpcUGTzqt51*`G=OD5{y zfIiwD=yls1HvKB{xBLe}@P6WP*r=-Yza{<+ng7Q<_SKIC(ZKdYy5*d_e6x+r;zz&) z)7q1NWB-C_`EM+5R⋙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 A last solution is to pass your configuration directly in your program -with :cpp:func:`simgrid::s4u::Engine::set_config` or :cpp:func:`MSG_config`. +with :cpp:func:`simgrid::s4u::Engine::set_config`. .. code-block:: cpp @@ -108,8 +108,6 @@ Existing Configuration Items - **maxmin/precision:** :ref:`cfg=maxmin/precision` - **maxmin/concurrency-limit:** :ref:`cfg=maxmin/concurrency-limit` -- **msg/debug-multiple-use:** :ref:`cfg=msg/debug-multiple-use` - - **model-check:** :ref:`options_modelchecking` - **model-check/checkpoint:** :ref:`cfg=model-check/checkpoint` - **model-check/communications-determinism:** :ref:`cfg=model-check/communications-determinism` @@ -980,7 +978,7 @@ Running User Code in Parallel ............................. Parallel execution of the user code is only considered stable in -SimGrid v3.7 and higher, and mostly for MSG simulations. SMPI +SimGrid v3.7 and higher, and mostly for S4U simulations. SMPI simulations may well fail in parallel mode. It is described in `INRIA RR-7653 `_. @@ -1020,7 +1018,7 @@ We detail here a simple way to get the traces working for you, even if you never used the tracing API. -- Any SimGrid-based simulator (MSG, SMPI, ...) and raw traces: +- Any SimGrid-based simulator (S4U, SMPI, ...) and raw traces: .. code-block:: none @@ -1030,7 +1028,7 @@ you never used the tracing API. tells it to trace host and link utilization (without any categorization). -- MSG-based simulator and categorized traces (you need to +- S4U-based simulator and categorized traces (you need to declare categories and classify your tasks according to them) .. code-block:: none @@ -1070,21 +1068,6 @@ Please, use these two parameters (for comments) to make reproducible simulations. For additional details about this and all tracing options, check See the :ref:`tracing_tracing_options`. -Configuring MSG ---------------- - -.. _cfg=msg/debug-multiple-use: - -Debugging MSG Code -.................. - -**Option** ``msg/debug-multiple-use`` **Default:** off - -Sometimes your application may try to send a task that is still being -executed somewhere else, making it impossible to send this task. However, -for debugging purposes, one may want to know what the other host is/was -doing. This option shows a backtrace of the other process. - Configuring SMPI ---------------- diff --git a/docs/source/Deploying_your_application.rst b/docs/source/Deploying_your_application.rst index 5e02efeab5..4cd1287909 100644 --- a/docs/source/Deploying_your_application.rst +++ b/docs/source/Deploying_your_application.rst @@ -76,10 +76,6 @@ This tag starts a new actor executing the given function on a given host. with :cpp:func:`simgrid::s4u::Engine::register_actor` or with :cpp:func:`simgrid::s4u::Engine::register_function`. - If you are stuck with MSG, use :cpp:func:`MSG_process_create`, - :cpp:func:`MSG_process_create_with_arguments` or - :cpp:func:`MSG_process_create_with_environment`. - :``start_time``: Useful to delay the start of your actor. -1 starts the actor immediately. diff --git a/docs/source/Doxyfile b/docs/source/Doxyfile index 02cd82d673..c1746d98a4 100644 --- a/docs/source/Doxyfile +++ b/docs/source/Doxyfile @@ -2,7 +2,6 @@ INPUT = ../../include/simgrid/forward.h INPUT += ../../include/simgrid/plugins/ INPUT += ../../include/simgrid/s4u/ -INPUT += ../../include/simgrid/msg.h INPUT += ../../include/simgrid/actor.h INPUT += ../../src/s4u/s4u_Actor.cpp INPUT += ../../include/simgrid/barrier.h @@ -22,7 +21,6 @@ INPUT += ../../include/simgrid/zone.h INPUT += ../../include/xbt/dynar.h INPUT += ../../src/xbt/dynar.cpp INPUT += ../../include/xbt/signal.hpp -INPUT += ../../src/msg/ INPUT += ../../src/plugins/ RECURSIVE = YES diff --git a/docs/source/Installing_SimGrid.rst b/docs/source/Installing_SimGrid.rst index b04db319b3..53ba688887 100644 --- a/docs/source/Installing_SimGrid.rst +++ b/docs/source/Installing_SimGrid.rst @@ -234,9 +234,6 @@ enable_model-checking (on/OFF) simulation speed** even when the model checker is not activated at run time. -enable_msg (on/OFF) - Activates the :ref:`MSG ` legacy interface. - enable_ns3 (on/OFF) Activates the ns-3 bindings. See section :ref:`model_ns3`. diff --git a/docs/source/Modeling_howtos.rst b/docs/source/Modeling_howtos.rst index 3772a67904..f6589f7c5c 100644 --- a/docs/source/Modeling_howtos.rst +++ b/docs/source/Modeling_howtos.rst @@ -152,13 +152,10 @@ programs actually die and restart during a reboot. Since there are many ways to model it, SimGrid does not do any modeling choice for you but the most obvious ones. -Any actor (or process in MSG) running on a host that is shut down -will be killed and all its activities (tasks in MSG) will be -automatically canceled. If the actor killed was marked as -auto-restartable (with -:cpp:func:`simgrid::s4u::Actor::set_auto_restart` or with -:cpp:func:`MSG_process_auto_restart_set`), it will start anew with the -same parameters when the host boots back up. +Any actor running on a host that is shut down will be killed and all +its activities will be automatically canceled. If the actor killed was +marked as auto-restartable (with :cpp:func:`simgrid::s4u::Actor::set_auto_restart`), +it will start anew with the same parameters when the host boots back up. By default, shutdowns and boots are instantaneous. If you want to add an extra delay, you have to do that yourself, for example from a diff --git a/docs/source/Release_Notes.rst b/docs/source/Release_Notes.rst index d1bb3c7447..3d61282c92 100644 --- a/docs/source/Release_Notes.rst +++ b/docs/source/Release_Notes.rst @@ -573,6 +573,11 @@ Version 3.33 (not released yet) .. |br| raw:: html +**On the maintainance front,** we removed the ancient MSG interface which end-of-life was scheduled for 2020, the Java +bindings that was MSG-only and support for native builds on Windows (WSL is now required). Keeping SimGrid alive while +adding new features require to remove old, unused stuff. The very rare users impacted by these removals are urged to +move to the new API and systems. + **On the model front,** we realized an idea that has been on the back of our minds for quite some time. The question was: could we use something in the line of the ptask model, that mixes computations and network transfers in a single fluid activity, to simulate a *fluid I/O stream activity* that would consume both disk and network resources? This diff --git a/docs/source/Start_your_own_project.rst b/docs/source/Start_your_own_project.rst index 3d131a7f7d..b6f5d0ac96 100644 --- a/docs/source/Start_your_own_project.rst +++ b/docs/source/Start_your_own_project.rst @@ -160,7 +160,6 @@ Many undefined references .. code-block:: console masterworker.c:209: undefined reference to `sg_version_check' - masterworker.c:209: undefined reference to `MSG_init_nocheck' (and many other undefined references) This happens when the linker tries to use the wrong library. Use diff --git a/docs/source/Tutorial_Algorithms.rst b/docs/source/Tutorial_Algorithms.rst index d5398959e2..3c6574dd23 100644 --- a/docs/source/Tutorial_Algorithms.rst +++ b/docs/source/Tutorial_Algorithms.rst @@ -567,9 +567,6 @@ is a better way to visualize SimGrid traces (see below). .. note:: - If you use an older version of SimGrid (before v3.26), you should use - ``--cfg=tracing/msg/process:yes`` instead of ``--cfg=tracing/actor:yes``. - If you want the full power to visualize SimGrid traces, you need to use R. As a start, you can download this `starter script `_ diff --git a/docs/source/XML_reference.rst b/docs/source/XML_reference.rst index 95bba47b77..afe1081310 100644 --- a/docs/source/XML_reference.rst +++ b/docs/source/XML_reference.rst @@ -456,12 +456,12 @@ the plugins. From your code, you can interact with these properties using the following functions: -- Actor: :cpp:func:`simgrid::s4u::Actor::get_property` or :cpp:func:`MSG_process_get_property_value` +- Actor: :cpp:func:`simgrid::s4u::Actor::get_property` - Cluster: this is a zone, see below. - Disk: :cpp:func:`simgrid::s4u::Disk::get_property` -- Host: :cpp:func:`simgrid::s4u::Host::get_property` or :cpp:func:`MSG_host_get_property_value` +- Host: :cpp:func:`simgrid::s4u::Host::get_property` - Link: :cpp:func:`simgrid::s4u::Link::get_property` -- Zone: :cpp:func:`simgrid::s4u::NetZone::get_property` of :cpp:func:`MSG_zone_get_property_value` +- Zone: :cpp:func:`simgrid::s4u::NetZone::get_property` **Parent tags:** :ref:`pf_tag_actor`, :ref:`pf_tag_config`, :ref:`pf_tag_cluster`, :ref:`pf_tag_host`, :ref:`pf_tag_link`, :ref:`pf_tag_disk`,:ref:`pf_tag_zone` |br| diff --git a/docs/source/app_msg.rst b/docs/source/app_msg.rst deleted file mode 100644 index 22eeff61a3..0000000000 --- a/docs/source/app_msg.rst +++ /dev/null @@ -1,253 +0,0 @@ -.. _MSG_doc: - -The MSG Interface (legacy interface) -#################################### - -.. warning:: - - MSG used to be the main API of SimGrid 3, but we are currently in - the process of releasing SimGrid 4. So MSG is frozen and will - probably never evolve. If you are starting a new project, you - should consider S4U instead. Note that the support for MSG will not - be removed from SimGrid before 2020Q4 or 2021Q1. - - This interface is disabled by default. Pass -Denable_msg=ON to - cmake if you still need it. - -MSG is a simple API to write algorithms organized with Concurrent -Sequential Processes (CSP) that interact by exchanging messages. It -constitutes a convenient simplification of the reality of distributed -systems. It can be used to build rather realistic simulations, but -remains simple to use: most unpleasant technical elements can be -abstracted away rather easily. - -C API reference -*************** - -Main MSG Functions -================== - -The basic workflow is the following: - - - Initialize the library with :c:macro:`MSG_init` - - Create a platform (usually by parsing a file with :cpp:func:`MSG_create_environment`) - - Register the functions that your processes are supposed to run with - :cpp:func:`MSG_function_register` (and maybe :cpp:func:`MSG_function_register_default`) - - Launch your processes from a deployment file with :cpp:func:`MSG_launch_application` - - Run the simulation with :cpp:func:`MSG_main` - -.. doxygenenum:: msg_error_t - -.. doxygenfunction:: MSG_config -.. doxygenfunction:: MSG_create_environment -.. doxygenfunction:: MSG_function_register -.. doxygenfunction:: MSG_function_register_default -.. doxygenfunction:: MSG_get_clock -.. doxygenfunction:: MSG_get_sent_msg -.. doxygendefine:: MSG_init -.. doxygenfunction:: MSG_launch_application -.. doxygenfunction:: MSG_main - -Process Management -================== - -This describes the process structure :cpp:type:`msg_process_t` and the functions for managing it. - -.. doxygentypedef:: msg_process_t -.. doxygenfunction:: MSG_process_attach -.. doxygenfunction:: MSG_process_auto_restart_set -.. doxygenfunction:: MSG_process_create -.. doxygenfunction:: MSG_process_create_with_arguments -.. doxygenfunction:: MSG_process_create_with_environment -.. doxygenfunction:: MSG_process_daemonize -.. doxygenfunction:: MSG_process_detach -.. doxygenfunction:: MSG_process_from_PID -.. doxygenfunction:: MSG_process_get_data -.. doxygenfunction:: MSG_process_get_host -.. doxygenfunction:: MSG_process_get_name -.. doxygenfunction:: MSG_process_get_PID -.. doxygenfunction:: MSG_process_get_PPID -.. doxygenfunction:: MSG_process_get_properties -.. doxygenfunction:: MSG_process_get_property_value -.. doxygenfunction:: MSG_process_is_suspended -.. doxygenfunction:: MSG_process_join -.. doxygenfunction:: MSG_process_kill -.. doxygenfunction:: MSG_process_killall -.. doxygenfunction:: MSG_process_migrate -.. doxygenfunction:: MSG_process_on_exit -.. doxygenfunction:: MSG_process_ref -.. doxygenfunction:: MSG_process_restart -.. doxygenfunction:: MSG_process_resume -.. doxygenfunction:: MSG_process_self -.. doxygenfunction:: MSG_process_self_name -.. doxygenfunction:: MSG_process_self_PID -.. doxygenfunction:: MSG_process_self_PPID -.. doxygenfunction:: MSG_process_set_data -.. doxygenfunction:: MSG_process_set_data_cleanup -.. doxygenfunction:: MSG_process_set_kill_time -.. doxygenfunction:: MSG_process_sleep -.. doxygenfunction:: MSG_process_suspend -.. doxygenfunction:: MSG_process_unref -.. doxygenfunction:: MSG_process_yield - -Host Management -=============== - -.. doxygentypedef:: msg_host_t -.. doxygenfunction:: MSG_host_by_name -.. doxygenfunction:: MSG_get_host_by_name -.. doxygenfunction:: MSG_get_host_number -.. doxygenfunction:: MSG_host_get_core_number -.. doxygenfunction:: MSG_host_get_data -.. doxygenfunction:: MSG_host_get_name -.. doxygenfunction:: MSG_host_get_nb_pstates -.. doxygenfunction:: MSG_host_get_load -.. doxygenfunction:: MSG_host_get_power_peak_at -.. doxygenfunction:: MSG_host_get_process_list -.. doxygenfunction:: MSG_host_get_properties -.. doxygenfunction:: MSG_host_get_property_value -.. doxygenfunction:: MSG_host_get_pstate -.. doxygenfunction:: MSG_host_get_speed -.. doxygenfunction:: MSG_host_is_on -.. doxygenfunction:: MSG_host_off -.. doxygenfunction:: MSG_host_on -.. doxygenfunction:: MSG_host_self -.. doxygenfunction:: MSG_host_set_data -.. doxygenfunction:: MSG_host_set_property_value -.. doxygenfunction:: MSG_host_set_pstate - -Task Management -=============== - -Task structure of MSG :cpp:type:`msg_task_t` and associated functions. - -.. doxygentypedef:: msg_task_t -.. doxygentypedef:: const_msg_task_t -.. doxygendefine:: MSG_TASK_UNINITIALIZED - -.. doxygenfunction:: MSG_parallel_task_create -.. doxygenfunction:: MSG_parallel_task_execute -.. doxygenfunction:: MSG_parallel_task_execute_with_timeout -.. doxygenfunction:: MSG_task_cancel -.. doxygenfunction:: MSG_task_create -.. doxygenfunction:: MSG_task_destroy -.. doxygenfunction:: MSG_task_dsend -.. doxygenfunction:: MSG_task_dsend_bounded -.. doxygenfunction:: MSG_task_execute -.. doxygenfunction:: MSG_task_get_bytes_amount -.. doxygenfunction:: MSG_task_get_category -.. doxygenfunction:: MSG_task_get_data -.. doxygenfunction:: MSG_task_get_flops_amount -.. doxygenfunction:: MSG_task_get_name -.. doxygenfunction:: MSG_task_get_remaining_communication -.. doxygenfunction:: MSG_task_get_remaining_work_ratio -.. doxygenfunction:: MSG_task_get_sender -.. doxygenfunction:: MSG_task_get_source -.. doxygenfunction:: MSG_task_irecv -.. doxygenfunction:: MSG_task_irecv_bounded -.. doxygenfunction:: MSG_task_isend -.. doxygenfunction:: MSG_task_isend_bounded -.. doxygenfunction:: MSG_task_listen -.. doxygenfunction:: MSG_task_listen_from -.. doxygenfunction:: MSG_task_receive -.. doxygenfunction:: MSG_task_receive_bounded -.. doxygenfunction:: MSG_task_receive_with_timeout -.. doxygenfunction:: MSG_task_receive_with_timeout_bounded -.. doxygendefine:: MSG_task_recv -.. doxygendefine:: MSG_task_recv_bounded -.. doxygenfunction:: MSG_task_send -.. doxygenfunction:: MSG_task_send_bounded -.. doxygenfunction:: MSG_task_send_with_timeout -.. doxygenfunction:: MSG_task_send_with_timeout_bounded -.. doxygenfunction:: MSG_task_set_bound -.. doxygenfunction:: MSG_task_set_bytes_amount -.. doxygenfunction:: MSG_task_set_category -.. doxygenfunction:: MSG_task_set_data -.. doxygenfunction:: MSG_task_set_flops_amount -.. doxygenfunction:: MSG_task_set_name -.. doxygenfunction:: MSG_task_set_priority - - -Mailbox Management -================== - -.. doxygenfunction:: MSG_mailbox_set_async - -Communications -============== - -.. doxygentypedef:: msg_comm_t -.. doxygentypedef:: const_msg_comm_t -.. doxygenfunction:: MSG_comm_destroy -.. doxygenfunction:: MSG_comm_get_status -.. doxygenfunction:: MSG_comm_get_task -.. doxygenfunction:: MSG_comm_test -.. doxygenfunction:: MSG_comm_testany -.. doxygenfunction:: MSG_comm_wait -.. doxygenfunction:: MSG_comm_waitall -.. doxygenfunction:: MSG_comm_waitany - -Explicit Synchronization -======================== - -Explicit synchronization mechanisms: semaphores (:cpp:type:`msg_sem_t`) and friends. - -In some situations, these things are very helpful to synchronize processes without message exchanges. - -Barriers --------- - -.. doxygentypedef:: msg_bar_t -.. doxygenfunction:: MSG_barrier_destroy -.. doxygenfunction:: MSG_barrier_init -.. doxygenfunction:: MSG_barrier_wait - -Semaphores ----------- - -.. doxygentypedef:: msg_sem_t -.. doxygenfunction:: MSG_sem_acquire -.. doxygenfunction:: MSG_sem_acquire_timeout -.. doxygenfunction:: MSG_sem_destroy -.. doxygenfunction:: MSG_sem_get_capacity -.. doxygenfunction:: MSG_sem_init -.. doxygenfunction:: MSG_sem_release -.. doxygenfunction:: MSG_sem_would_block - -Virtual Machines -================ - -This interface mimics IaaS clouds. -With it, you can create virtual machines to put your processes -into, and interact directly with the VMs to manage groups of -processes. - -.. doxygentypedef:: msg_vm_t -.. doxygenfunction:: MSG_vm_create_core -.. doxygenfunction:: MSG_vm_create_multicore -.. doxygenfunction:: MSG_vm_destroy -.. doxygenfunction:: MSG_vm_get_name -.. doxygenfunction:: MSG_vm_get_pm -.. doxygenfunction:: MSG_vm_get_ramsize -.. doxygenfunction:: MSG_vm_is_created -.. doxygenfunction:: MSG_vm_is_running -.. doxygenfunction:: MSG_vm_is_suspended -.. doxygenfunction:: MSG_vm_resume -.. doxygenfunction:: MSG_vm_set_bound -.. doxygenfunction:: MSG_vm_set_ramsize -.. doxygenfunction:: MSG_vm_shutdown -.. doxygenfunction:: MSG_vm_start -.. doxygenfunction:: MSG_vm_suspend - -NetZone Management -================== -Network Zone (:cpp:type:`msg_netzone_t`) and associated functions. - -.. doxygentypedef:: msg_netzone_t -.. doxygenfunction:: MSG_zone_get_by_name -.. doxygenfunction:: MSG_zone_get_hosts -.. doxygenfunction:: MSG_zone_get_name -.. doxygenfunction:: MSG_zone_get_property_value -.. doxygenfunction:: MSG_zone_get_root -.. doxygenfunction:: MSG_zone_get_sons -.. doxygenfunction:: MSG_zone_set_property_value diff --git a/docs/source/app_s4u.rst b/docs/source/app_s4u.rst index 53d9a1dac0..5408491ea1 100644 --- a/docs/source/app_s4u.rst +++ b/docs/source/app_s4u.rst @@ -20,15 +20,10 @@ with the full power of C++. This is the preferred interface to describe abstract algorithms in the domains of Cloud, P2P, HPC, IoT, and similar settings. -Since v3.20 (June 2018), S4U is the way to go for long-term -projects. It is feature complete, but may still evolve slightly in -future releases. It can already be used to do everything that can be -done in SimGrid, but you may have to adapt your code in future -releases. When this happens, compiling your code will produce -deprecation warnings for 4 releases (one year) before the removal of -the old symbols. -If you want an API that will never ever evolve in the future, you -should use the :ref:`deprecated MSG API ` instead. +Since v3.33 (Spring 2023), S4U is the main interface of SimGrid for algorithms. +It is feature complete, but may still evolve slightly in future releases. +When this happens, compiling your code will produce deprecation warnings for 4 +releases (one year) before the removal of the old symbols. .. _S4U_main_concepts: diff --git a/docs/source/application.rst b/docs/source/application.rst index 6ccf536995..499465af93 100644 --- a/docs/source/application.rst +++ b/docs/source/application.rst @@ -31,13 +31,7 @@ to mix several interfaces in the same simulation. MPI profilers). You can reuse this mechanism for any kind of trace that you want to replay, for example to study how a P2P DHT overlay reacts to a given workload. - - Simulating algorithms with the legacy interface in C: :ref:`MSG for distributed - algorithms `. SimGrid was founded in 1998, and many interfaces were proposed - along the way. MSG (introduced around 2002) is still present in SimGrid. It - does not evolve anymore, but given its popularity, it will not be removed - until at least 2020. That being said, our goal is to make S4U so useful that - this legacy API becomes useless and obsolete. - - We are currently working on the ability to modify any existing + - A prototypal tool is intended to allow the modification of any existing application so that it can run on top of SimGrid. This project, called `Remote-SimGrid `_, is somewhat @@ -55,6 +49,3 @@ applications, but our long term goal would be to allow for the execution of any legacy application, with absolutely no modification. We call it SimOS, even if it will not become usable before several years of additional work. - -.. The old documentation of the obsolete MSG replay module was removed in -.. https://github.com/simgrid/simgrid/commit/e05361c201fb95d2b7605e59001cd0a49a489739 diff --git a/docs/source/conf.py b/docs/source/conf.py index 0b0eb26fec..66e541d1ca 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -117,8 +117,6 @@ nitpick_ignore = [ ('cpp:identifier', 's4u_Semaphore'), ('cpp:identifier', 's4u_VM'), ('cpp:identifier', 's4u_VirtualMachine'), - ('cpp:identifier', 'sg_msg_Comm'), - ('cpp:identifier', 'sg_msg_Task'), ('cpp:identifier', 'simgrid'), ('cpp:identifier', 'simgrid::s4u'), ('cpp:identifier', 'simgrid::s4u::Activity_T'), diff --git a/docs/source/index.rst b/docs/source/index.rst index 689ef77f1e..29008d02e5 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -73,7 +73,6 @@ of every page. Bugs in the code should be reported Describing your application    The S4U interface    The SMPI interface -    The MSG interface    The XBT toolbox Describing the simulated platform    Network topology examples diff --git a/docs/source/tuto_disk/analysis.irst b/docs/source/tuto_disk/analysis.irst index 2f564afcbc..912d7bcdcb 100644 --- a/docs/source/tuto_disk/analysis.irst +++ b/docs/source/tuto_disk/analysis.irst @@ -32,8 +32,8 @@ in IO operations (Fig. 5 to 7). data for your context. - SimGrid has been in active development since the paper release in - 2015, thus the MSG and XML description used in the paper may have - evolved and may not be available anymore. + 2015, thus the XML description used in the paper may have evolved + while MSG was superseeded by S4U since then. Running this tutorial --------------------- diff --git a/docs/source/tuto_disk/analysis.org b/docs/source/tuto_disk/analysis.org index ee082ba512..01ed87cacb 100644 --- a/docs/source/tuto_disk/analysis.org +++ b/docs/source/tuto_disk/analysis.org @@ -30,8 +30,8 @@ - You must run similar experiments on your hardware to get realistic data for your context. - SimGrid has been in active development since the paper release in - 2015, thus the MSG and XML description used in the paper may have - evolved and may not be available anymore. + 2015, thus the XML description used in the paper may have evolved + while MSG was superseeded by S4U since then. *** Running this tutorial diff --git a/include/simgrid/config.h.in b/include/simgrid/config.h.in index 43c99232c5..2995c8d460 100644 --- a/include/simgrid/config.h.in +++ b/include/simgrid/config.h.in @@ -9,8 +9,6 @@ #define SIMGRID_PUBLIC_CONFIG_H #include -/* Was MSG compiled in? */ -#cmakedefine01 SIMGRID_HAVE_MSG /* Were mallocators (object pools) compiled in? */ #cmakedefine01 SIMGRID_HAVE_MALLOCATOR /* Was the model-checking compiled in? */ diff --git a/include/simgrid/msg.h b/include/simgrid/msg.h deleted file mode 100644 index af145db9f8..0000000000 --- a/include/simgrid/msg.h +++ /dev/null @@ -1,419 +0,0 @@ -/* Copyright (c) 2004-2023. The SimGrid Team. All rights reserved. */ - -/* This program is free software; you can redistribute it and/or modify it - * under the terms of the license (GNU LGPL) which comes with this package. */ - -#ifndef SIMGRID_MSG_H -#define SIMGRID_MSG_H - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifndef MIN -#define MIN(a, b) ((a) < (b) ? (a) : (b)) -#endif -#ifndef MAX -#define MAX(a, b) ((a) > (b) ? (a) : (b)) -#endif - -#ifdef __cplusplus -namespace simgrid { -namespace msg { -class Comm; -class Task; -} -} -using sg_msg_Comm = simgrid::msg::Comm; -using sg_msg_Task = simgrid::msg::Task; -#else -typedef struct msg_Comm sg_msg_Comm; -typedef struct msg_Task sg_msg_Task; -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/** @brief Return code of most MSG functions */ -typedef enum { - MSG_OK = 0, /**< @brief Everything is right. Keep on going this way ! */ - MSG_TIMEOUT = 1, /**< @brief nothing good happened before the timer you provided elapsed */ - MSG_TRANSFER_FAILURE = 2, /**< @brief There has been a problem during you task - transfer. Either the network is down or the remote host has been - shutdown. */ - MSG_HOST_FAILURE = 4, /**< @brief System shutdown. The host on which you are - running has just been rebooted. Free your datastructures and - return now !*/ - MSG_TASK_CANCELED = 8 /**< @brief Canceled task. This task has been canceled by somebody!*/ -} msg_error_t; - -/* *************************** Network Zones ******************************** */ -typedef sg_netzone_t msg_netzone_t; - -XBT_PUBLIC msg_netzone_t MSG_zone_get_root(); -XBT_PUBLIC const char* MSG_zone_get_name(const_sg_netzone_t zone); -XBT_PUBLIC msg_netzone_t MSG_zone_get_by_name(const char* name); -XBT_PUBLIC void MSG_zone_get_sons(const_sg_netzone_t zone, xbt_dict_t whereto); -XBT_PUBLIC const char* MSG_zone_get_property_value(const_sg_netzone_t zone, const char* name); -XBT_PUBLIC void MSG_zone_set_property_value(msg_netzone_t zone, const char* name, const char* value); -XBT_PUBLIC void MSG_zone_get_hosts(const_sg_netzone_t zone, xbt_dynar_t whereto); - -/* ******************************** Hosts ************************************ */ -/** @brief Host datatype. - * - * A location (or host) is any possible place where a process may run. Thus it is represented as a - * physical resource with computing capabilities, some mailboxes to enable running process to - * communicate with remote ones, and some private data that can be only accessed by local process. - */ -typedef sg_host_t msg_host_t; - -/** @brief Finds a msg_host_t using its name. */ -XBT_PUBLIC sg_host_t MSG_get_host_by_name(const char* name); -/** @brief Finds a msg_host_t using its name. */ -XBT_PUBLIC sg_host_t MSG_host_by_name(const char* name); - -/** @brief Returns the amount of host found in the platform */ -XBT_PUBLIC size_t MSG_get_host_number(); - -/** @brief Returns the name of this host */ -XBT_PUBLIC const char* MSG_host_get_name(const_sg_host_t host); -/** @brief Returns the user data of this host */ -XBT_PUBLIC void* MSG_host_get_data(const_sg_host_t host); -/** @brief Sets the user data of this host */ -XBT_PUBLIC void MSG_host_set_data(sg_host_t host, void* data); - -XBT_PUBLIC double MSG_host_get_speed(const_sg_host_t host); -XBT_PUBLIC double MSG_host_get_power_peak_at(const_sg_host_t host, int pstate_index); -XBT_PUBLIC int MSG_host_get_core_number(const_sg_host_t host); -XBT_PUBLIC int MSG_host_get_nb_pstates(const_sg_host_t host); -XBT_PUBLIC int MSG_host_get_pstate(const_sg_host_t host); -XBT_PUBLIC void MSG_host_set_pstate(sg_host_t host, int pstate); -/** @brief Start the host if it is off - * - * @beginrst - * See also :cpp:func:`MSG_host_is_on()` to test the current state of the host, and :ref:`plugin_host_energy` - * for more info on DVFS. - * @endrst - */ -XBT_PUBLIC void MSG_host_on(sg_host_t h); -/** @brief Stop the host if it is on - * - * @beginrst - * See also :cpp:func:`MSG_host_is_on()` to test the current state of the host, and :ref:`plugin_host_energy` - * for more info on DVFS. - * @endrst - */ -XBT_PUBLIC void MSG_host_off(sg_host_t h); -XBT_PUBLIC int MSG_host_is_on(const_sg_host_t h); -XBT_PUBLIC xbt_dict_t MSG_host_get_properties(const_sg_host_t host); -XBT_PUBLIC const char* MSG_host_get_property_value(const_sg_host_t host, const char* name); -XBT_PUBLIC void MSG_host_set_property_value(sg_host_t host, const char* name, const char* value); -XBT_PUBLIC void MSG_host_get_process_list(const_sg_host_t host, xbt_dynar_t whereto); - -/** @brief Return the location on which the current process is executed */ -XBT_PUBLIC sg_host_t MSG_host_self(); -XBT_PUBLIC double MSG_host_get_load(const_sg_host_t host); - -/* ******************************** VMs ************************************* */ -typedef sg_vm_t msg_vm_t; - -XBT_PUBLIC msg_vm_t MSG_vm_create_core(msg_host_t pm, const char* name); -XBT_PUBLIC msg_vm_t MSG_vm_create_multicore(msg_host_t pm, const char* name, int coreAmount); - -XBT_PUBLIC int MSG_vm_is_created(const_sg_vm_t vm); -XBT_PUBLIC int MSG_vm_is_running(const_sg_vm_t vm); -XBT_PUBLIC int MSG_vm_is_suspended(const_sg_vm_t vm); - -XBT_PUBLIC const char* MSG_vm_get_name(const_sg_vm_t vm); -XBT_PUBLIC void MSG_vm_set_ramsize(msg_vm_t vm, size_t size); -XBT_PUBLIC size_t MSG_vm_get_ramsize(const_sg_vm_t vm); -XBT_PUBLIC msg_host_t MSG_vm_get_pm(const_sg_vm_t vm); -XBT_PUBLIC void MSG_vm_set_bound(msg_vm_t vm, double bound); - -XBT_PUBLIC void MSG_vm_start(msg_vm_t vm); -XBT_PUBLIC void MSG_vm_suspend(msg_vm_t vm); -XBT_PUBLIC void MSG_vm_resume(msg_vm_t vm); -XBT_PUBLIC void MSG_vm_shutdown(msg_vm_t vm); -XBT_PUBLIC void MSG_vm_destroy(msg_vm_t vm); - -/* ******************************** Actor/process *************************** */ -/** Processes are independent agents that can do stuff on their own. - * They are in charge of executing your code interacting with the simulated world. - * A process may be defined as a code with some private data. - * Processes must be located on hosts (#msg_host_t), and they exchange data by sending tasks (#msg_task_t) - * that are similar to envelops containing data. - * - * @hideinitializer - */ -typedef sg_actor_t msg_process_t; - -XBT_PUBLIC int MSG_process_get_PID(const_sg_actor_t process); -XBT_PUBLIC int MSG_process_get_PPID(const_sg_actor_t process); -/** @brief Return a process from its PID (or NULL if not found). - * - * Note that the PID are unique in the whole simulation, not only on a given host. - */ -XBT_PUBLIC sg_actor_t MSG_process_from_PID(int pid); -XBT_PUBLIC const char* MSG_process_get_name(const_sg_actor_t process); -XBT_PUBLIC sg_host_t MSG_process_get_host(const_sg_actor_t process); - -/*property handlers*/ -XBT_PUBLIC xbt_dict_t MSG_process_get_properties(const_sg_actor_t process); -XBT_PUBLIC const char* MSG_process_get_property_value(const_sg_actor_t process, const char* name); - -XBT_PUBLIC void MSG_process_suspend(msg_process_t process); -XBT_PUBLIC void MSG_process_resume(msg_process_t process); -XBT_PUBLIC int MSG_process_is_suspended(const_sg_actor_t process); -XBT_PUBLIC void MSG_process_restart(msg_process_t process); -/** @brief Sets the "auto-restart" flag of the process. - * - * If the flag is set, the process will be automatically restarted when its host comes back up. - */ -XBT_PUBLIC void MSG_process_auto_restart_set(msg_process_t process, int auto_restart); -/** @brief Indicates that this process should not prevent the simulation from ending - * - * SimGrid simulations run until all non-daemon processes are stopped. - */ -XBT_PUBLIC void MSG_process_daemonize(msg_process_t process); -/** @brief Immediately changes the host on which this process runs */ -XBT_PUBLIC void MSG_process_migrate(msg_process_t process, msg_host_t host); -/** @brief Wait for the completion of a process. - * - * @param process the process to wait for - * @param timeout wait until the process is over, or the timeout occurs - */ -XBT_PUBLIC void MSG_process_join(const_sg_actor_t process, double timeout); -/** @brief Kills a process */ -XBT_PUBLIC void MSG_process_kill(msg_process_t process); -/** @brief Kill all running process */ -XBT_PUBLIC void MSG_process_killall(); -/** @brief Specifies the time at which the process should be automatically killed */ -XBT_PUBLIC void MSG_process_set_kill_time(msg_process_t process, double kill_time); -/** @brief Yield the current actor; let the other actors execute first */ -XBT_PUBLIC void MSG_process_yield(); -/*** @brief Sleep for the specified number of seconds */ -XBT_PUBLIC msg_error_t MSG_process_sleep(double nb_sec); -XBT_PUBLIC msg_process_t MSG_process_self(); -XBT_PUBLIC aid_t MSG_process_self_PID(); -XBT_PUBLIC aid_t MSG_process_self_PPID(); -XBT_PUBLIC const char* MSG_process_self_name(); -XBT_PUBLIC void MSG_process_ref(const_sg_actor_t process); -XBT_PUBLIC void MSG_process_unref(const_sg_actor_t process); - -/** @brief Object representing an ongoing communication between processes. - * - * @beginrst - * Such beast is usually obtained by using :cpp:func:`MSG_task_isend`, :cpp:func:`MSG_task_irecv` or friends. - * @endrst - */ -typedef sg_msg_Comm* msg_comm_t; -typedef const sg_msg_Comm* const_msg_comm_t; - -/** @brief Task datatype. - * - * Since most scheduling algorithms rely on a concept of task that can be either computed locally or - * transferred on another processor, it seems to be the right level of abstraction for our purposes. - * A task may then be defined by a computing amount, a message size and - * some private data. - */ -typedef sg_msg_Task* msg_task_t; -typedef const sg_msg_Task* const_msg_task_t; - -/* ******************************** Task ************************************ */ - - -/** @brief Default value for an uninitialized #msg_task_t. */ -#define MSG_TASK_UNINITIALIZED NULL - -/************************** Global ******************************************/ -/** @brief set a configuration variable - * - * @beginrst - * Do --help on any simgrid binary to see the list of currently existing configuration variables, and see Section - * :ref:`options`. - * @endrst - * - * Example: - * MSG_config("host/model","ptask_L07"); - */ -XBT_PUBLIC void MSG_config(const char* key, const char* value); -/** @brief Initialize the MSG internal data. - * @hideinitializer - * - * It also checks that the link-time and compile-time versions of SimGrid do - * match, so you should use this version instead of the #MSG_init_nocheck - * function that does the same initializations, but without this check. - * - * We allow linking against compiled versions that differ in the patch level. - */ -#define MSG_init(argc, argv) \ - do { \ - sg_version_check(SIMGRID_VERSION_MAJOR, SIMGRID_VERSION_MINOR, SIMGRID_VERSION_PATCH); \ - MSG_init_nocheck((argc), (argv)); \ - } while (0) - -XBT_PUBLIC void MSG_init_nocheck(int* argc, char** argv); -/** @brief Launch the MSG simulation */ -XBT_PUBLIC msg_error_t MSG_main(); -/** @brief Registers the main function of a process in a global table. - * - * This table is then used by #MSG_launch_application. - * @param name the reference name of the function. - * @param code the function (must have the same prototype than the main function of any C program: int ..(int argc, char - * *argv[])) - */ -XBT_PUBLIC void MSG_function_register(const char* name, int (*code)(int, char**)); -/** @brief Registers a code function as being the default value. - * - * This function will get used by MSG_launch_application() when there is no registered function of the requested name - * in. - * - * @param code the function (must have the same prototype than the main function of any C program: int ..(int argc, char - * *argv[])) - */ -XBT_PUBLIC void MSG_function_register_default(int (*code)(int, char**)); -/** @brief Creates a new platform, including hosts, links and the routing_table */ -XBT_PUBLIC void MSG_create_environment(const char* file); -/** @brief Creates the application described in the provided file */ -XBT_PUBLIC void MSG_launch_application(const char* file); - -/** @brief A clock (in second). */ -XBT_PUBLIC double MSG_get_clock(); -/** @brief Returns the amount of messages sent since the simulation start */ -XBT_PUBLIC unsigned long int MSG_get_sent_msg(); - -/************************** Process handling *********************************/ -XBT_PUBLIC msg_process_t MSG_process_create(const char* name, int (*code)(int, char**), void* data, msg_host_t host); -XBT_PUBLIC msg_process_t MSG_process_create_with_arguments(const char* name, int (*code)(int, char**), void* data, - msg_host_t host, int argc, char** argv); -XBT_PUBLIC msg_process_t MSG_process_create_with_environment(const char* name, int (*code)(int, char**), void* data, - msg_host_t host, int argc, char** argv, - xbt_dict_t properties); - -XBT_PUBLIC msg_process_t MSG_process_attach(const char* name, void* data, msg_host_t host, xbt_dict_t properties); -XBT_PUBLIC void MSG_process_detach(); - -XBT_PUBLIC void MSG_process_set_data_cleanup(void_f_pvoid_t data_cleanup); - -XBT_PUBLIC void* MSG_process_get_data(const_sg_actor_t process); -XBT_PUBLIC msg_error_t MSG_process_set_data(msg_process_t process, void* data); - -XBT_PUBLIC void MSG_process_on_exit(int_f_int_pvoid_t fun, void* data); - -/************************** Task handling ************************************/ -XBT_PUBLIC msg_task_t MSG_task_create(const char* name, double flops_amount, double bytes_amount, void* data); -XBT_PUBLIC msg_task_t MSG_parallel_task_create(const char* name, int host_nb, const msg_host_t* host_list, - double* flops_amount, double* bytes_amount, void* data); -XBT_PUBLIC void* MSG_task_get_data(const_msg_task_t task); -XBT_PUBLIC void MSG_task_set_data(msg_task_t task, void* data); -XBT_PUBLIC msg_process_t MSG_task_get_sender(const_msg_task_t task); -XBT_PUBLIC msg_host_t MSG_task_get_source(const_msg_task_t task); -XBT_PUBLIC const char* MSG_task_get_name(const_msg_task_t task); -XBT_PUBLIC void MSG_task_set_name(msg_task_t task, const char* name); -XBT_PUBLIC msg_error_t MSG_task_cancel(msg_task_t task); -XBT_PUBLIC msg_error_t MSG_task_destroy(msg_task_t task); - -XBT_PUBLIC msg_error_t MSG_task_execute(msg_task_t task); -XBT_PUBLIC msg_error_t MSG_parallel_task_execute(msg_task_t task); -XBT_PUBLIC msg_error_t MSG_parallel_task_execute_with_timeout(msg_task_t task, double timeout); -XBT_PUBLIC void MSG_task_set_priority(msg_task_t task, double priority); -XBT_PUBLIC void MSG_task_set_bound(msg_task_t task, double bound); - -XBT_PUBLIC void MSG_task_set_flops_amount(msg_task_t task, double flops_amount); -XBT_PUBLIC double MSG_task_get_flops_amount(const_msg_task_t task); -XBT_PUBLIC double MSG_task_get_remaining_work_ratio(const_msg_task_t task); -XBT_PUBLIC void MSG_task_set_bytes_amount(msg_task_t task, double bytes_amount); - -XBT_PUBLIC double MSG_task_get_remaining_communication(const_msg_task_t task); -XBT_PUBLIC double MSG_task_get_bytes_amount(const_msg_task_t task); - -XBT_PUBLIC msg_error_t MSG_task_receive_with_timeout(msg_task_t* task, const char* alias, double timeout); - -XBT_PUBLIC msg_error_t MSG_task_receive(msg_task_t* task, const char* alias); -#define MSG_task_recv(t, a) MSG_task_receive((t), (a)) - -XBT_PUBLIC msg_error_t MSG_task_receive_with_timeout_bounded(msg_task_t* task, const char* alias, double timeout, - double rate); -XBT_PUBLIC msg_error_t MSG_task_receive_bounded(msg_task_t* task, const char* alias, double rate); -#define MSG_task_recv_bounded(t, a, r) MSG_task_receive_bounded((t), (a), (r)) - -XBT_PUBLIC msg_comm_t MSG_task_isend(msg_task_t task, const char* alias); -XBT_PUBLIC msg_comm_t MSG_task_isend_bounded(msg_task_t task, const char* alias, double maxrate); - -XBT_PUBLIC void MSG_task_dsend(msg_task_t task, const char* alias, void_f_pvoid_t cleanup); -XBT_PUBLIC void MSG_task_dsend_bounded(msg_task_t task, const char* alias, void_f_pvoid_t cleanup, double maxrate); -XBT_PUBLIC msg_comm_t MSG_task_irecv(msg_task_t* task, const char* alias); -XBT_PUBLIC msg_comm_t MSG_task_irecv_bounded(msg_task_t* task, const char* alias, double rate); -XBT_PUBLIC int MSG_comm_test(msg_comm_t comm); -XBT_PUBLIC int MSG_comm_testany(const_xbt_dynar_t comms); -XBT_PUBLIC void MSG_comm_destroy(const_msg_comm_t comm); -XBT_PUBLIC msg_error_t MSG_comm_wait(msg_comm_t comm, double timeout); -XBT_PUBLIC void MSG_comm_waitall(msg_comm_t* comm, int nb_elem, double timeout); -XBT_PUBLIC int MSG_comm_waitany(const_xbt_dynar_t comms); -XBT_PUBLIC msg_task_t MSG_comm_get_task(const_msg_comm_t comm); -XBT_PUBLIC msg_error_t MSG_comm_get_status(const_msg_comm_t comm); - -/** @brief Check if there is a communication going on in a mailbox. - * - * @param alias the name of the mailbox to be considered - * - * @return Returns 1 if there is a communication, 0 otherwise - */ -XBT_PUBLIC int MSG_task_listen(const char* alias); -XBT_PUBLIC msg_error_t MSG_task_send_with_timeout(msg_task_t task, const char* alias, double timeout); -XBT_PUBLIC msg_error_t MSG_task_send_with_timeout_bounded(msg_task_t task, const char* alias, double timeout, - double maxrate); -XBT_PUBLIC msg_error_t MSG_task_send(msg_task_t task, const char* alias); -XBT_PUBLIC msg_error_t MSG_task_send_bounded(msg_task_t task, const char* alias, double rate); -XBT_PUBLIC int MSG_task_listen_from(const char* alias); -XBT_PUBLIC void MSG_task_set_category(msg_task_t task, const char* category); -XBT_PUBLIC const char* MSG_task_get_category(const_msg_task_t task); - -/************************** Mailbox handling ************************************/ - -/* @brief set a mailbox in eager mode. - * All messages sent to this mailbox will be transferred to the receiver without waiting for the receive call. - * The receive call will still be necessary to use the received data. - * If there is a need to receive some messages asynchronously, and some not, two different mailboxes should be used. - * - * This call should be done before issuing any receive, and on the receiver's side only - */ -XBT_PUBLIC void MSG_mailbox_set_async(const char* alias); - -/** @brief Opaque type representing a semaphore */ -typedef sg_sem_t msg_sem_t; -XBT_PUBLIC msg_sem_t MSG_sem_init(int initial_value); -XBT_PUBLIC void MSG_sem_acquire(msg_sem_t sem); -XBT_PUBLIC int MSG_sem_acquire_timeout(msg_sem_t sem, double timeout); -XBT_PUBLIC void MSG_sem_release(msg_sem_t sem); -XBT_PUBLIC int MSG_sem_get_capacity(const_sg_sem_t sem); -XBT_PUBLIC void MSG_sem_destroy(const_sg_sem_t sem); -XBT_PUBLIC int MSG_sem_would_block(const_sg_sem_t sem); - -/** @brief Opaque type representing a barrier identifier */ -typedef sg_bar_t msg_bar_t; -/** @brief Initializes a barrier, with count elements */ -XBT_PUBLIC msg_bar_t MSG_barrier_init(unsigned int count); -/** @brief Destroys barrier */ -XBT_PUBLIC void MSG_barrier_destroy(sg_bar_t bar); -/** @brief Performs a barrier already initialized */ -XBT_PUBLIC int MSG_barrier_wait(msg_bar_t bar); - -/* ****************************************************************************************** */ -#ifdef __cplusplus -} -#endif - -#endif diff --git a/include/simgrid/plugins/dvfs.h b/include/simgrid/plugins/dvfs.h index 2ee39b4848..2f5de8027a 100644 --- a/include/simgrid/plugins/dvfs.h +++ b/include/simgrid/plugins/dvfs.h @@ -15,10 +15,6 @@ SG_BEGIN_DECL XBT_PUBLIC void sg_host_dvfs_plugin_init(); -#if SIMGRID_HAVE_MSG -#define MSG_host_dvfs_plugin_init() sg_host_dvfs_plugin_init() -#endif // SIMGRID_HAVE_MSG - SG_END_DECL #endif diff --git a/include/simgrid/plugins/energy.h b/include/simgrid/plugins/energy.h index 7a5263304f..ee63dd862e 100644 --- a/include/simgrid/plugins/energy.h +++ b/include/simgrid/plugins/energy.h @@ -31,18 +31,6 @@ XBT_PUBLIC int sg_link_energy_is_inited(); * @brief Initialize the wifi energy plugin */ XBT_PUBLIC void sg_wifi_energy_plugin_init(); -#if SIMGRID_HAVE_MSG - -#define MSG_host_energy_plugin_init() sg_host_energy_plugin_init() -#define MSG_host_get_consumed_energy(host) sg_host_get_consumed_energy(host) -#define MSG_host_get_idle_consumption_at(host,pstate) sg_host_get_idle_consumption_at((host), (pstate)) -#define MSG_host_get_wattmin_at(host,pstate) sg_host_get_wattmin_at((host), (pstate)) -#define MSG_host_get_wattmax_at(host,pstate) sg_host_get_wattmax_at((host), (pstate)) -#define MSG_host_get_power_range_slope_at(host,pstate) sg_host_get_power_range_slope_at((host), (pstate)) -#define MSG_host_get_current_consumption(host) sg_host_get_current_consumption(host) - -#endif // SIMGRID_HAVE_MSG - SG_END_DECL #endif diff --git a/include/simgrid/plugins/file_system.h b/include/simgrid/plugins/file_system.h index d6cbfe6186..af744b03b9 100644 --- a/include/simgrid/plugins/file_system.h +++ b/include/simgrid/plugins/file_system.h @@ -46,30 +46,6 @@ XBT_PUBLIC sg_size_t sg_disk_get_size_used(const_sg_disk_t d); XBT_PUBLIC sg_size_t sg_disk_get_size(const_sg_disk_t d); XBT_PUBLIC const char* sg_disk_get_mount_point(const_sg_disk_t d); -#if SIMGRID_HAVE_MSG - -typedef sg_file_t msg_file_t; // MSG backwards compatibility - -#define MSG_file_open(fullpath, data) sg_file_open((fullpath), (data)) -#define MSG_file_read(fd, size) sg_file_read((fd), (size)) -#define MSG_file_write(fd, size) sg_file_write((fd), (size)) -#define MSG_file_close(fd) sg_file_close(fd) -#define MSG_file_get_name(fd) sg_file_get_name(fd) -#define MSG_file_get_size(fd) sg_file_get_size(fd) -#define MSG_file_dump(fd) sg_file_dump(fd) -#define MSG_file_get_data(fd) sg_file_get_data(fd) -#define MSG_file_set_data(fd, data) sg_file_set_data((fd), (data)) -#define MSG_file_seek(fd, offset, origin) sg_file_seek((fd), (offset), (origin)) -#define MSG_file_tell(fd) sg_file_tell(fd) -#define MSG_file_move(fd, fullpath) sg_file_get_size((fd), (fullpath)) -#define MSG_file_unlink(fd) sg_file_unlink(fd) -#define MSG_file_rcopy(file, host, fullpath) sg_file_rcopy((file), (host), (fullpath)) -#define MSG_file_rmove(file, host, fullpath) sg_file_rmove((file), (host), (fullpath)) - -#define MSG_storage_file_system_init() sg_storage_file_system_init() - -#endif // SIMGRID_HAVE_MSG - SG_END_DECL // C++ interface diff --git a/include/simgrid/plugins/live_migration.h b/include/simgrid/plugins/live_migration.h index bf0e64c07e..52f0ed6ada 100644 --- a/include/simgrid/plugins/live_migration.h +++ b/include/simgrid/plugins/live_migration.h @@ -29,18 +29,6 @@ XBT_PUBLIC int sg_vm_is_migrating(const_sg_vm_t vm); XBT_PUBLIC sg_vm_t sg_vm_create_migratable(sg_host_t pm, const char* name, int coreAmount, int ramsize, int mig_netspeed, int dp_intensity); -#if SIMGRID_HAVE_MSG - -#define MSG_vm_live_migration_plugin_init() sg_vm_live_migration_plugin_init() - -#define MSG_vm_create_migratable(pm, name, coreAmount, ramsize, mig_netspeed, dp_intensity) \ - sg_vm_create_migratable((pm), (name), (coreAmount), (ramsize), (mig_netspeed), (dp_intensity)) - -#define MSG_vm_is_migrating(vm) sg_vm_is_migrating(vm) -#define MSG_vm_migrate(vm, dst_pm) sg_vm_migrate((vm), (dst_pm)) - -#endif // SIMGRID_HAVE_MSG - SG_END_DECL #endif diff --git a/include/simgrid/plugins/load.h b/include/simgrid/plugins/load.h index e2efbdd7e8..41f95636f6 100644 --- a/include/simgrid/plugins/load.h +++ b/include/simgrid/plugins/load.h @@ -29,19 +29,6 @@ XBT_PUBLIC double sg_link_get_avg_load(const_sg_link_t link); XBT_PUBLIC double sg_link_get_min_instantaneous_load(const_sg_link_t link); XBT_PUBLIC double sg_link_get_max_instantaneous_load(const_sg_link_t link); -#if SIMGRID_HAVE_MSG - -#define MSG_host_load_plugin_init() sg_host_load_plugin_init() -/** @brief Returns the current load of that host, as a ratio = achieved_flops / (core_current_speed * core_amount) - * - * See simgrid::plugin::HostLoad::get_current_load() for the full documentation. - */ -#define MSG_host_get_current_load(host) sg_host_get_current_load(host) -#define MSG_host_get_computed_flops(host) sg_host_get_computed_flops(host) -#define MSG_host_get_avg_load(host) sg_host_get_avg_load(host) - -#endif // SIMGRID_HAVE_MSG - SG_END_DECL #endif diff --git a/sonar-project.properties b/sonar-project.properties index a80884c57e..29e01eea69 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -155,8 +155,7 @@ sonar.issue.ignore.multicriteria.s5.resourceKey=src/smpi/bindings/*.cpp # - the NAS, that are included in our examples # - The Catch2 library, that is included in our unit tests # - The xxHash library, used by the MC -# - MSG along with its examples and teshsuite -sonar.exclusions=src/include/catch.hpp,src/include/xxhash.hpp,src/*_unit.c*,teshsuite/smpi/mpich3-test/**,teshsuite/smpi/MBI/**,**/*_dtd.c,**/*_dtd.h,**/*yy.c,src/xbt/automaton/parserPromela.tab.*,src/smpi/colls/**/*,examples/smpi/NAS/*,examples/smpi/gemm/gemm.c,src/msg/**,include/msg/**,teshsuite/msg/** +sonar.exclusions=src/include/catch.hpp,src/include/xxhash.hpp,src/*_unit.c*,teshsuite/smpi/mpich3-test/**,teshsuite/smpi/MBI/**,**/*_dtd.c,**/*_dtd.h,**/*yy.c,src/xbt/automaton/parserPromela.tab.*,src/smpi/colls/**/*,examples/smpi/NAS/*,examples/smpi/gemm/gemm.c # Exclude our examples from the duplication detection. # Examples are expected to be somehow repetitive @@ -176,8 +175,7 @@ sonar.cfamily.gcov.reportsPath=Testing/CoverageInfo # - examples in smpi/mc (coverage doesn't work with model checker) # - XML files # - Python files used to generate either simcalls or deployment files -# - MSG (deprecated too) -sonar.coverage.exclusions=teshsuite/smpi/mpich3-test/**,teshsuite/smpi/MBI/**,examples/smpi/mc/**,**/*.xml,**/generate.py,src/msg/**,include/msg/**,teshsuite/msg/** +sonar.coverage.exclusions=teshsuite/smpi/mpich3-test/**,teshsuite/smpi/MBI/**,examples/smpi/mc/**,**/*.xml,**/generate.py, # Encoding of the source files sonar.sourceEncoding=UTF-8 diff --git a/src/kernel/activity/MailboxImpl.cpp b/src/kernel/activity/MailboxImpl.cpp index 7da50727d8..7bbb8152ce 100644 --- a/src/kernel/activity/MailboxImpl.cpp +++ b/src/kernel/activity/MailboxImpl.cpp @@ -4,7 +4,6 @@ * under the terms of the license (GNU LGPL) which comes with this package. */ #include "src/kernel/activity/MailboxImpl.hpp" -#include "simgrid/msg.h" #include "src/kernel/activity/CommImpl.hpp" #include diff --git a/src/msg/msg_comm.cpp b/src/msg/msg_comm.cpp deleted file mode 100644 index ee668fcbdc..0000000000 --- a/src/msg/msg_comm.cpp +++ /dev/null @@ -1,220 +0,0 @@ -/* Copyright (c) 2004-2023. The SimGrid Team. All rights reserved. */ - -/* This program is free software; you can redistribute it and/or modify it - * under the terms of the license (GNU LGPL) which comes with this package. */ - -#include - -#include "simgrid/Exception.hpp" -#include "simgrid/s4u/Actor.hpp" -#include "simgrid/s4u/Comm.hpp" -#include "simgrid/s4u/Exec.hpp" -#include "simgrid/s4u/Mailbox.hpp" -#include "src/instr/instr_private.hpp" -#include "src/msg/msg_private.hpp" - -namespace simgrid::msg { - -bool Comm::test() -{ - bool finished = false; - - try { - finished = s_comm->test(); - if (finished && task_received != nullptr) { - /* I am the receiver */ - (*task_received)->set_not_used(); - } - } catch (const simgrid::TimeoutException&) { - status_ = MSG_TIMEOUT; - finished = true; - } catch (const simgrid::CancelException&) { - status_ = MSG_TASK_CANCELED; - finished = true; - } catch (const simgrid::NetworkFailureException&) { - status_ = MSG_TRANSFER_FAILURE; - finished = true; - } - - return finished; -} -msg_error_t Comm::wait_for(double timeout) -{ - try { - s_comm->wait_for(timeout); - - if (task_received != nullptr) { - /* I am the receiver */ - (*task_received)->set_not_used(); - } - - /* FIXME: these functions are not traceable */ - } catch (const simgrid::TimeoutException&) { - status_ = MSG_TIMEOUT; - } catch (const simgrid::CancelException&) { - status_ = MSG_TASK_CANCELED; - } catch (const simgrid::NetworkFailureException&) { - status_ = MSG_TRANSFER_FAILURE; - } - - return status_; -} -} // namespace simgrid::msg - -/** - * @brief Checks whether a communication is done, and if yes, finalizes it. - * @param comm the communication to test - * @return 'true' if the communication is finished - * (but it may have failed, use MSG_comm_get_status() to know its status) - * or 'false' if the communication is not finished yet - * If the status is 'false', don't forget to use MSG_process_sleep() after the test. - */ -int MSG_comm_test(msg_comm_t comm) -{ - return comm->test(); -} - -/** - * @brief This function checks if a communication is finished. - * @param comms a vector of communications - * @return the position of the finished communication if any - * (but it may have failed, use MSG_comm_get_status() to know its status), or -1 if none is finished - */ -int MSG_comm_testany(const_xbt_dynar_t comms) -{ - ssize_t finished_index = -1; - - /* Create the equivalent array with SIMIX objects: */ - std::vector s_comms; - s_comms.reserve(xbt_dynar_length(comms)); - msg_comm_t comm; - unsigned int cursor; - xbt_dynar_foreach (comms, cursor, comm) - s_comms.push_back(comm->s_comm); - - msg_error_t status = MSG_OK; - try { - finished_index = simgrid::s4u::Comm::test_any(s_comms); - } catch (const simgrid::TimeoutException& e) { - finished_index = e.get_value(); - status = MSG_TIMEOUT; - } catch (const simgrid::CancelException& e) { - finished_index = e.get_value(); - status = MSG_TASK_CANCELED; - } catch (const simgrid::NetworkFailureException& e) { - finished_index = e.get_value(); - status = MSG_TRANSFER_FAILURE; - } - - if (finished_index != -1) { - comm = xbt_dynar_get_as(comms, finished_index, msg_comm_t); - /* the communication is finished */ - comm->set_status(status); - - if (status == MSG_OK && comm->task_received != nullptr) { - /* I am the receiver */ - (*comm->task_received)->set_not_used(); - } - } - - return static_cast(finished_index); -} - -/** @brief Destroys the provided communication. */ -void MSG_comm_destroy(const_msg_comm_t comm) -{ - delete comm; -} - -/** @brief Wait for the completion of a communication. - * - * It takes two parameters. - * @param comm the communication to wait. - * @param timeout Wait until the communication terminates or the timeout occurs. - * You can provide a -1 timeout to obtain an infinite timeout. - * @return msg_error_t - */ -msg_error_t MSG_comm_wait(msg_comm_t comm, double timeout) -{ - return comm->wait_for(timeout); -} - -/** @brief This function is called by a sender and permits waiting for each communication - * - * @param comm a vector of communication - * @param nb_elem is the size of the comm vector - * @param timeout for each call of MSG_comm_wait - */ -void MSG_comm_waitall(msg_comm_t* comm, int nb_elem, double timeout) -{ - for (int i = 0; i < nb_elem; i++) - comm[i]->wait_for(timeout); -} - -/** @brief This function waits for the first communication finished in a list. - * @param comms a vector of communications - * @return the position of the first finished communication - * (but it may have failed, use MSG_comm_get_status() to know its status) - */ -int MSG_comm_waitany(const_xbt_dynar_t comms) -{ - ssize_t finished_index = -1; - - /* Create the equivalent array with SIMIX objects: */ - std::vector s_comms; - s_comms.reserve(xbt_dynar_length(comms)); - msg_comm_t comm; - unsigned int cursor; - xbt_dynar_foreach (comms, cursor, comm) { - s_comms.push_back(comm->s_comm); - } - - msg_error_t status = MSG_OK; - try { - finished_index = simgrid::s4u::Comm::wait_any_for(s_comms, -1); - } catch (const simgrid::TimeoutException& e) { - finished_index = e.get_value(); - status = MSG_TIMEOUT; - } catch (const simgrid::CancelException& e) { - finished_index = e.get_value(); - status = MSG_TASK_CANCELED; - } catch (const simgrid::NetworkFailureException& e) { - finished_index = e.get_value(); - status = MSG_TRANSFER_FAILURE; - } - - xbt_assert(finished_index != -1, "WaitAny returned -1"); - - comm = xbt_dynar_get_as(comms, finished_index, msg_comm_t); - /* the communication is finished */ - comm->set_status(status); - - if (comm->task_received != nullptr) { - /* I am the receiver */ - (*comm->task_received)->set_not_used(); - } - - return static_cast(finished_index); -} - -/** - * @brief Returns the error (if any) that occurred during a finished communication. - * @param comm a finished communication - * @return the status of the communication, or #MSG_OK if no error occurred during the communication - */ -msg_error_t MSG_comm_get_status(const_msg_comm_t comm) -{ - return comm->get_status(); -} - -/** @brief Get a task (#msg_task_t) from a communication - * - * @param comm the communication where to get the task - * @return the task from the communication - */ -msg_task_t MSG_comm_get_task(const_msg_comm_t comm) -{ - xbt_assert(comm, "Invalid parameter"); - - return comm->task_received ? *comm->task_received : comm->task_sent; -} diff --git a/src/msg/msg_global.cpp b/src/msg/msg_global.cpp deleted file mode 100644 index 957edf1000..0000000000 --- a/src/msg/msg_global.cpp +++ /dev/null @@ -1,74 +0,0 @@ -/* Copyright (c) 2004-2023. The SimGrid Team. All rights reserved. */ - -/* This program is free software; you can redistribute it and/or modify it - * under the terms of the license (GNU LGPL) which comes with this package. */ - -#include "mc/mc.h" -#include "simgrid/s4u/Engine.hpp" -#include "simgrid/s4u/Host.hpp" -#include "src/instr/instr_private.hpp" -#include "src/kernel/EngineImpl.hpp" -#include "src/msg/msg_private.hpp" -#include - -XBT_LOG_NEW_CATEGORY(msg, "All MSG categories"); - -bool MSG_Global_t::debug_multiple_use = false; - -MSG_Global_t* msg_global = nullptr; - -static void MSG_exit(); - -/********************************* MSG **************************************/ - -/** - * @ingroup msg_simulation - * @brief Initialize MSG with less verifications - * You should use the MSG_init() function instead. Failing to do so may turn into PEBKAC some day. You've been warned. - */ -void MSG_init_nocheck(int* argc, char** argv) -{ - simgrid::instr::init(); - - if (not msg_global) { - simgrid::config::bind_flag(MSG_Global_t::debug_multiple_use, "msg/debug-multiple-use", - "Print backtraces of both processes when there is a conflict of multiple use of a task"); - - simgrid::kernel::EngineImpl::get_instance(argc, argv); - - msg_global = new MSG_Global_t(); - - msg_global->sent_msg = 0; - msg_global->task_copy_callback = nullptr; - msg_global->process_data_cleanup = nullptr; - simgrid::s4u::Actor::on_termination_cb([](simgrid::s4u::Actor const& actor) { - // free the data if a function was provided - void* userdata = sg_actor_get_data(&actor); - if (userdata && msg_global->process_data_cleanup) - msg_global->process_data_cleanup(userdata); - }); - } - - /* Ignore total amount of messages sent during the simulation for heap comparison */ - MC_ignore_heap(&msg_global->sent_msg, sizeof msg_global->sent_msg); - - if (simgrid::config::get_value("debug/clean-atexit")) - atexit(MSG_exit); -} - -void MSG_config(const char* key, const char* value) -{ - xbt_assert(msg_global,"ERROR: Please call MSG_init() before using MSG_config()"); - simgrid::config::set_as_string(key, value); -} - -static void MSG_exit() -{ - delete msg_global; - msg_global = nullptr; -} - -unsigned long int MSG_get_sent_msg() -{ - return msg_global->sent_msg; -} diff --git a/src/msg/msg_legacy.cpp b/src/msg/msg_legacy.cpp deleted file mode 100644 index 0968f4d32e..0000000000 --- a/src/msg/msg_legacy.cpp +++ /dev/null @@ -1,443 +0,0 @@ -/* Copyright (c) 2004-2023. The SimGrid Team. All rights reserved. */ - -/* This program is free software; you can redistribute it and/or modify it - * under the terms of the license (GNU LGPL) which comes with this package. */ - -#include "simgrid/Exception.hpp" -#include "simgrid/s4u/Engine.hpp" -#include "src/msg/msg_private.hpp" -#include "xbt/functional.hpp" - -#define MSG_CALL(type, oldname, args) - -/* ************************** Engine *************************** */ -void MSG_create_environment(const char* filename) -{ - simgrid_load_platform(filename); -} - -void MSG_launch_application(const char* filename) -{ - simgrid_load_deployment(filename); -} -msg_error_t MSG_main() -{ - simgrid_run(); - return MSG_OK; -} -void MSG_function_register(const char* name, int (*code)(int, char**)) -{ - simgrid::kernel::actor::ActorCodeFactory code_factory = [code](std::vector args) { - return simgrid::xbt::wrap_main(code, std::move(args)); - }; - simgrid::s4u::Engine::get_instance()->register_function(name, code_factory); -} -void MSG_function_register_default(int (*code)(int, char**)) -{ - simgrid::s4u::Engine::get_instance()->register_default( - [code](std::vector args) { return simgrid::xbt::wrap_main(code, std::move(args)); }); -} -double MSG_get_clock() -{ - return simgrid_get_clock(); -} - -/* ************************** Mailboxes ************************ */ -void MSG_mailbox_set_async(const char* alias) -{ - sg_mailbox_set_receiver(alias); -} -int MSG_task_listen(const char* alias) -{ - return sg_mailbox_listen(alias); -} - -/* ************************** Actors *************************** */ -void MSG_process_on_exit(int_f_int_pvoid_t fun, void* data) -{ - /* We can't use the sg_actor_on_exit, as the return type of the callback changed: the int in MSG is ignored and was - * removed in sg */ - simgrid::s4u::this_actor::on_exit([fun, data](bool failed) { fun(failed ? 1 /*FAILURE*/ : 0 /*SUCCESS*/, data); }); -} - -int MSG_process_get_PID(const_sg_actor_t actor) -{ - return sg_actor_get_pid(actor); -} -int MSG_process_get_PPID(const_sg_actor_t actor) -{ - return sg_actor_get_ppid(actor); -} -msg_process_t MSG_process_from_PID(int pid) -{ - return sg_actor_by_pid(pid); -} -const char* MSG_process_get_name(const_sg_actor_t actor) -{ - return sg_actor_get_name(actor); -} -sg_host_t MSG_process_get_host(const_sg_actor_t actor) -{ - return sg_actor_get_host(actor); -} -xbt_dict_t MSG_process_get_properties(const_sg_actor_t actor) -{ - return sg_actor_get_properties(actor); -} -const char* MSG_process_get_property_value(const_sg_actor_t actor, const char* name) -{ - return sg_actor_get_property_value(actor, name); -} -void MSG_process_suspend(sg_actor_t actor) -{ - sg_actor_suspend(actor); -} -void MSG_process_resume(sg_actor_t actor) -{ - sg_actor_resume(actor); -} -int MSG_process_is_suspended(const_sg_actor_t actor) -{ - return sg_actor_is_suspended(actor); -} -void MSG_process_restart(sg_actor_t actor) -{ - sg_actor_restart(actor); -} -void MSG_process_auto_restart_set(sg_actor_t actor, int auto_restart) -{ - sg_actor_set_auto_restart(actor, auto_restart); -} - -void MSG_process_daemonize(sg_actor_t actor) -{ - sg_actor_daemonize(actor); -} -void MSG_process_migrate(sg_actor_t actor, sg_host_t host) -{ - sg_actor_set_host(actor, host); -} -void MSG_process_join(const_sg_actor_t actor, double timeout) -{ - sg_actor_join(actor, timeout); -} -void MSG_process_kill(sg_actor_t actor) -{ - sg_actor_kill(actor); -} -void MSG_process_killall() -{ - sg_actor_kill_all(); -} -void MSG_process_set_kill_time(sg_actor_t actor, double kill_time) -{ - sg_actor_set_kill_time(actor, kill_time); -} -void MSG_process_yield() -{ - sg_actor_yield(); -} - -msg_error_t MSG_process_sleep(double duration) -{ - try { - sg_actor_sleep_for(duration); - return MSG_OK; - } catch (const simgrid::HostFailureException&) { - return MSG_HOST_FAILURE; - } -} - -/** @brief Returns the user data of a process. - * - * This function checks whether @a process is a valid pointer and returns the user data associated to this process. - */ -void* MSG_process_get_data(const_sg_actor_t process) -{ - xbt_assert(process != nullptr, "Invalid parameter: first parameter must not be nullptr!"); - - /* get from SIMIX the MSG process data, and then the user data */ - return sg_actor_get_data(process); -} - -/** @brief Sets the user data of a process. - * - * This function checks whether @a process is a valid pointer and sets the user data associated to this process. - */ -msg_error_t MSG_process_set_data(msg_process_t process, void* data) -{ - xbt_assert(process != nullptr, "Invalid parameter: first parameter must not be nullptr!"); - sg_actor_set_data(process, data); - - return MSG_OK; -} - -msg_process_t MSG_process_attach(const char* name, void* data, msg_host_t host, xbt_dict_t properties) -{ - return sg_actor_attach(name, data, host, properties); -} - -void MSG_process_detach() -{ - sg_actor_detach(); -} -aid_t MSG_process_self_PID() -{ - return sg_actor_self_get_pid(); -} - -/** @brief Return the PPID of the current process. - * - * This function returns the PID of the parent of the currently running #msg_process_t. - */ -aid_t MSG_process_self_PPID() -{ - return sg_actor_self_get_ppid(); -} - -/** @brief Return the name of the current process. */ -const char* MSG_process_self_name() -{ - return sg_actor_self_get_name(); -} -/** @brief Return the current process. - * - * This function returns the currently running #msg_process_t. - */ -msg_process_t MSG_process_self() -{ - return sg_actor_self(); -} - -/** @brief Take an extra reference on that process to prevent it to be garbage-collected */ -void MSG_process_ref(const_sg_actor_t process) -{ - sg_actor_ref(process); -} -/** @brief Release a reference on that process so that it can get be garbage-collected */ -void MSG_process_unref(const_sg_actor_t process) -{ - sg_actor_unref(process); -} - -/* ************************** NetZones *************************** */ -sg_netzone_t MSG_zone_get_root() -{ - return sg_zone_get_root(); -} -const char* MSG_zone_get_name(const_sg_netzone_t zone) -{ - return sg_zone_get_name(zone); -} -sg_netzone_t MSG_zone_get_by_name(const char* name) -{ - return sg_zone_get_by_name(name); -} -void MSG_zone_get_sons(const_sg_netzone_t zone, xbt_dict_t whereto) -{ - return sg_zone_get_sons(zone, whereto); -} -const char* MSG_zone_get_property_value(const_sg_netzone_t zone, const char* name) -{ - return sg_zone_get_property_value(zone, name); -} -void MSG_zone_set_property_value(sg_netzone_t zone, const char* name, const char* value) -{ - sg_zone_set_property_value(zone, name, value); -} -void MSG_zone_get_hosts(const_sg_netzone_t zone, xbt_dynar_t whereto) -{ - sg_zone_get_hosts(zone, whereto); -} - -/* ************************** hosts *************************** */ -size_t MSG_get_host_number() -{ - return sg_host_count(); -} -sg_host_t MSG_get_host_by_name(const char* name) -{ - return sg_host_by_name(name); -} -sg_host_t MSG_host_by_name(const char* name) -{ - return sg_host_by_name(name); -} -const char* MSG_host_get_name(const_sg_host_t host) -{ - return sg_host_get_name(host); -} -void* MSG_host_get_data(const_sg_host_t host) -{ - return sg_host_get_data(host); -} -void MSG_host_set_data(sg_host_t host, void* data) -{ - return sg_host_set_data(host, data); -} -double MSG_host_get_speed(const_sg_host_t host) -{ - return sg_host_get_speed(host); -} -double MSG_host_get_power_peak_at(const_sg_host_t host, int pstate_index) -{ - return sg_host_get_pstate_speed(host, pstate_index); -} -int MSG_host_get_core_number(const_sg_host_t host) -{ - return sg_host_core_count(host); -} -int MSG_host_get_nb_pstates(const_sg_host_t host) -{ - return sg_host_get_nb_pstates(host); -} -int MSG_host_get_pstate(const_sg_host_t host) -{ - return sg_host_get_pstate(host); -} -void MSG_host_set_pstate(sg_host_t host, int pstate) -{ - sg_host_set_pstate(host, pstate); -} -void MSG_host_on(sg_host_t h) -{ - sg_host_turn_on(h); -} -void MSG_host_off(sg_host_t h) -{ - sg_host_turn_off(h); -} -int MSG_host_is_on(const_sg_host_t h) -{ - return sg_host_is_on(h); -} -xbt_dict_t MSG_host_get_properties(const_sg_host_t host) -{ - return sg_host_get_properties(host); -} -const char* MSG_host_get_property_value(const_sg_host_t host, const char* name) -{ - return sg_host_get_property_value(host, name); -} -void MSG_host_set_property_value(sg_host_t host, const char* name, const char* value) -{ - sg_host_set_property_value(host, name, value); -} -void MSG_host_get_process_list(const_sg_host_t host, xbt_dynar_t whereto) -{ - sg_host_get_actor_list(host, whereto); -} -sg_host_t MSG_host_self() -{ - return sg_host_self(); -} - -double MSG_host_get_load(const_sg_host_t host) -{ - return sg_host_get_load(host); -} -/* ************************** Virtual Machines *************************** */ -sg_vm_t MSG_vm_create_core(sg_host_t pm, const char* name) -{ - return sg_vm_create_core(pm, name); -} -sg_vm_t MSG_vm_create_multicore(sg_host_t pm, const char* name, int coreAmount) -{ - return sg_vm_create_multicore(pm, name, coreAmount); -} -int MSG_vm_is_created(const_sg_vm_t vm) -{ - return sg_vm_is_created(vm); -} -int MSG_vm_is_running(const_sg_vm_t vm) -{ - return sg_vm_is_running(vm); -} -int MSG_vm_is_suspended(const_sg_vm_t vm) -{ - return sg_vm_is_suspended(vm); -} -const char* MSG_vm_get_name(const_sg_vm_t vm) -{ - return sg_vm_get_name(vm); -} -void MSG_vm_set_ramsize(sg_vm_t vm, size_t size) -{ - sg_vm_set_ramsize(vm, size); -} -size_t MSG_vm_get_ramsize(const_sg_vm_t vm) -{ - return sg_vm_get_ramsize(vm); -} -sg_host_t MSG_vm_get_pm(const_sg_vm_t vm) -{ - return sg_vm_get_pm(vm); -} -void MSG_vm_set_bound(sg_vm_t vm, double bound) -{ - sg_vm_set_bound(vm, bound); -} -void MSG_vm_start(sg_vm_t vm) -{ - sg_vm_start(vm); -} -void MSG_vm_suspend(sg_vm_t vm) -{ - sg_vm_suspend(vm); -} -void MSG_vm_resume(sg_vm_t vm) -{ - sg_vm_resume(vm); -} -void MSG_vm_shutdown(sg_vm_t vm) -{ - sg_vm_shutdown(vm); -} -void MSG_vm_destroy(sg_vm_t vm) -{ - sg_vm_destroy(vm); -} -/********* barriers ************/ -sg_bar_t MSG_barrier_init(unsigned int count) -{ - return sg_barrier_init(count); -} - -void MSG_barrier_destroy(sg_bar_t bar) -{ - sg_barrier_destroy(bar); -} - -int MSG_barrier_wait(sg_bar_t bar) -{ - return sg_barrier_wait(bar); -} - -sg_sem_t MSG_sem_init(int initial_value) -{ - return sg_sem_init(initial_value); -} -void MSG_sem_acquire(sg_sem_t sem) -{ - sg_sem_acquire(sem); -} -int MSG_sem_acquire_timeout(sg_sem_t sem, double timeout) -{ - return sg_sem_acquire_timeout(sem, timeout); -} -void MSG_sem_release(sg_sem_t sem) -{ - sg_sem_release(sem); -} -int MSG_sem_get_capacity(const_sg_sem_t sem) -{ - return sg_sem_get_capacity(sem); -} -void MSG_sem_destroy(const_sg_sem_t sem) -{ - sg_sem_destroy(sem); -} -int MSG_sem_would_block(const_sg_sem_t sem) -{ - return sg_sem_would_block(sem); -} diff --git a/src/msg/msg_private.hpp b/src/msg/msg_private.hpp deleted file mode 100644 index 46460de1c5..0000000000 --- a/src/msg/msg_private.hpp +++ /dev/null @@ -1,119 +0,0 @@ -/* Copyright (c) 2004-2023. The SimGrid Team. All rights reserved. */ - -/* This program is free software; you can redistribute it and/or modify it - * under the terms of the license (GNU LGPL) which comes with this package. */ - -#ifndef MSG_PRIVATE_HPP -#define MSG_PRIVATE_HPP - -#include "simgrid/Exception.hpp" -#include "simgrid/msg.h" -#include "src/kernel/activity/CommImpl.hpp" -#include -#include - -#include - -/**************** datatypes **********************************/ -namespace simgrid { - -extern template class XBT_PUBLIC xbt::Extendable; - -namespace msg { -class Task : public xbt::Extendable { - std::string name_ = ""; - std::string tracing_category_ = ""; - long long int id_; - - double timeout_ = -1; /* Default timeout is infinite */ - double priority_ = 1.0; - double bound_ = 0.0; /* Capping for CPU resource, or 0 for no capping */ - double rate_ = -1; /* Capping for network resource, or -1 for no capping*/ - bool is_used_ = false; /* Indicates whether the task is used in SIMIX currently */ - - explicit Task(const std::string& name, double flops_amount, double bytes_amount, void* data); - explicit Task(const std::string& name, std::vector&& hosts, std::vector&& flops_amount, - std::vector&& bytes_amount, void* data); - - void report_multiple_use() const; - -public: - static Task* create(const std::string& name, double flops_amount, double bytes_amount, void* data); - static Task* create_parallel(const std::string& name, int host_nb, const msg_host_t* host_list, double* flops_amount, - double* bytes_amount, void* data); - msg_error_t execute(); - msg_error_t send(const std::string& alias, double timeout); - s4u::CommPtr send_async(const std::string& alias, void_f_pvoid_t cleanup, bool detached); - - void cancel(); - - Task(const Task&) = delete; - Task& operator=(const Task&) = delete; - - bool is_used() const { return is_used_; } - bool is_parallel() const { return parallel_; } - - void set_used(); - void set_not_used() { this->is_used_ = false; } - const std::string& get_name() const { return name_; } - const char* get_cname() const { return name_.c_str(); } - void set_name(const char* new_name) { name_ = new_name; } - void set_tracing_category(const char* category) { tracing_category_ = category ? category : ""; } - const std::string& get_tracing_category() const { return tracing_category_; } - bool has_tracing_category() { return not tracing_category_.empty(); } - long long int get_id() const { return id_; } - double get_priority() const { return priority_; } - void set_priority(double priority); - void set_bound(double bound) { bound_ = bound; } - double get_bound() const { return bound_; } - void set_rate(double rate) { rate_ = rate; } - double get_rate() const { return rate_; } - void set_timeout(double timeout) { timeout_ = timeout; } - - s4u::Actor* get_sender() const; - s4u::Host* get_source() const; - - s4u::ExecPtr compute = nullptr; /* S4U modeling of computation */ - s4u::CommPtr comm = nullptr; /* S4U modeling of communication */ - double flops_amount = 0.0; /* Computation size */ - double bytes_amount = 0.0; /* Data size */ - - /******* Parallel Tasks Only !!!! *******/ - bool parallel_ = false; - std::vector hosts_; - std::vector flops_parallel_amount; - std::vector bytes_parallel_amount; -}; - -class Comm { - msg_error_t status_ = MSG_OK; /* status of the communication once finished */ -public: - Task* task_sent; /* task sent (NULL for the receiver) */ - Task** task_received; /* where the task will be received (NULL for the sender) */ - s4u::CommPtr s_comm; /* SIMIX communication object encapsulated (the same for both processes) */ - Comm(msg_task_t sent, msg_task_t* received, s4u::CommPtr comm) - : task_sent(sent), task_received(received), s_comm(std::move(comm)) - { - } - bool test(); - msg_error_t wait_for(double timeout); - void set_status(msg_error_t status) { status_ = status; } - msg_error_t get_status() const { return status_; } -}; - -} // namespace msg -} // namespace simgrid - -/************************** Global variables ********************************/ -struct MSG_Global_t { - static bool debug_multiple_use; /* whether we want an error message when reusing the same Task for 2 things */ - std::atomic_int_fast32_t sent_msg; /* Total amount of messages sent during the simulation */ - void (*task_copy_callback)(msg_task_t task, msg_process_t src, msg_process_t dst); - void_f_pvoid_t process_data_cleanup; -}; - -XBT_PUBLIC_DATA MSG_Global_t* msg_global; - -/*************************************************************/ - -#endif diff --git a/src/msg/msg_process.cpp b/src/msg/msg_process.cpp deleted file mode 100644 index 40c4b88037..0000000000 --- a/src/msg/msg_process.cpp +++ /dev/null @@ -1,93 +0,0 @@ -/* Copyright (c) 2004-2023. The SimGrid Team. All rights reserved. */ - -/* This program is free software; you can redistribute it and/or modify it - * under the terms of the license (GNU LGPL) which comes with this package. */ - -#include "msg_private.hpp" -#include "simgrid/Exception.hpp" -#include "simgrid/s4u/Host.hpp" -#include "src/kernel/EngineImpl.hpp" - -/******************************** Process ************************************/ -/** @brief Creates and runs a new #msg_process_t. - * - * Does exactly the same as #MSG_process_create_with_arguments but without providing standard arguments - * (@a argc, @a argv, @a start_time, @a kill_time). - */ -msg_process_t MSG_process_create(const char* name, int (*code)(int, char**), void* data, msg_host_t host) -{ - return MSG_process_create_with_environment(name == nullptr ? "" : name, code, data, host, 0, nullptr, nullptr); -} - -/** @brief Creates and runs a new process. - - * A constructor for #msg_process_t taking four arguments and returning the corresponding object. The structure (and - * the corresponding thread) is created, and put in the list of ready process. - * @param name a name for the object. It is for user-level information and can be nullptr. - * @param code is a function describing the behavior of the process. - * @param data a pointer to any data one may want to attach to the new object. It is for user-level information and - * can be nullptr. It can be retrieved with the function MSG_process_get_data(). - * @param host the location where the new process is executed. - * @param argc first argument passed to @a code - * @param argv second argument passed to @a code - */ - -msg_process_t MSG_process_create_with_arguments(const char* name, int (*code)(int, char**), void* data, msg_host_t host, - int argc, char** argv) -{ - return MSG_process_create_with_environment(name, code, data, host, argc, argv, nullptr); -} - -/** - * @brief Creates and runs a new #msg_process_t. - - * A constructor for #msg_process_t taking four arguments and returning the corresponding object. The structure (and - * the corresponding thread) is created, and put in the list of ready process. - * @param name a name for the object. It is for user-level information and can be nullptr. - * @param code is a function describing the behavior of the process. - * @param data a pointer to any data one may want to attach to the new object. It is for user-level information and - * can be nullptr. It can be retrieved with the function MSG_process_get_data(). - * @param host the location where the new process is executed. - * @param argc first argument passed to @a code - * @param argv second argument passed to @a code. WARNING, these strings are freed by the SimGrid kernel when the - * process exits, so they cannot be static nor shared between several processes. - * @param properties list a properties defined for this process - * @see msg_process_t - * @return The new corresponding object. - */ -msg_process_t MSG_process_create_with_environment(const char* name, int (*code)(int, char**), void* data, - msg_host_t host, int argc, char** argv, xbt_dict_t properties) -{ - xbt_assert(host != nullptr, "Invalid parameters: host param must not be nullptr"); - sg_actor_t actor = sg_actor_init(std::move(name), host); - - try { - if (data != nullptr) { - sg_actor_set_data(actor, data); - xbt_dict_cursor_t cursor = nullptr; - char* key; - char* value; - xbt_dict_foreach (properties, cursor, key, value) - actor->set_property(key, value); - } - actor->start(std::move(simgrid::xbt::wrap_main(code, argc, argv))); - } catch (simgrid::HostFailureException const&) { - xbt_die("Could not launch a new process on failed host %s.", host->get_cname()); - } - - xbt_dict_free(&properties); - for (int i = 0; i != argc; ++i) - xbt_free(argv[i]); - xbt_free(argv); - - simgrid::s4u::this_actor::yield(); - return actor; -} - -/** @brief Sets a cleanup function to be called to free the userdata of a process when a process is destroyed. - * @param data_cleanup a cleanup function for the userdata of a process, or nullptr to call no function - */ -XBT_PUBLIC void MSG_process_set_data_cleanup(void_f_pvoid_t data_cleanup) -{ - msg_global->process_data_cleanup = data_cleanup; -} diff --git a/src/msg/msg_task.cpp b/src/msg/msg_task.cpp deleted file mode 100644 index 051de7413d..0000000000 --- a/src/msg/msg_task.cpp +++ /dev/null @@ -1,810 +0,0 @@ -/* Copyright (c) 2004-2023. The SimGrid Team. All rights reserved. */ - -/* This program is free software; you can redistribute it and/or modify it - * under the terms of the license (GNU LGPL) which comes with this package. */ - -#include "msg_private.hpp" -#include "src/instr/instr_private.hpp" -#include -#include -#include -#include - -#include -#include - -XBT_LOG_NEW_DEFAULT_SUBCATEGORY(msg_task, msg, "Logging specific to MSG (task)"); - -namespace simgrid { - -template class xbt::Extendable; - -namespace msg { - -Task::Task(const std::string& name, double flops_amount, double bytes_amount, void* data) - : name_(name), flops_amount(flops_amount), bytes_amount(bytes_amount) -{ - static std::atomic_ullong counter{0}; - id_ = counter++; - set_data(data); - MC_ignore_heap(&id_, sizeof id_); -} - -Task::Task(const std::string& name, std::vector&& hosts, std::vector&& flops_amount, - std::vector&& bytes_amount, void* data) - : Task(name, 1.0, 0, data) -{ - parallel_ = true; - hosts_ = std::move(hosts); - flops_parallel_amount = std::move(flops_amount); - bytes_parallel_amount = std::move(bytes_amount); -} - -Task* Task::create(const std::string& name, double flops_amount, double bytes_amount, void* data) -{ - return new Task(name, flops_amount, bytes_amount, data); -} - -Task* Task::create_parallel(const std::string& name, int host_nb, const msg_host_t* host_list, double* flops_amount, - double* bytes_amount, void* data) -{ - std::vector hosts(host_list, host_list + host_nb); - std::vector flops; - std::vector bytes; - if (flops_amount != nullptr) - flops = std::vector(flops_amount, flops_amount + host_nb); - if (bytes_amount != nullptr) - bytes = std::vector(bytes_amount, bytes_amount + host_nb * host_nb); - - return new Task(name, std::move(hosts), std::move(flops), std::move(bytes), data); -} - -msg_error_t Task::execute() -{ - /* checking for infinite values */ - xbt_assert(std::isfinite(flops_amount), "flops_amount is not finite!"); - - msg_error_t status = MSG_OK; - if (flops_amount <= 0.0) - return MSG_OK; - - try { - set_used(); - if (parallel_) - compute = s4u::this_actor::exec_init(hosts_, flops_parallel_amount, bytes_parallel_amount); - else - compute = s4u::this_actor::exec_init(flops_amount); - - compute->set_name(name_) - ->set_tracing_category(tracing_category_) - ->set_priority(1 / priority_) - ->set_bound(bound_) - ->wait_for(timeout_); - - set_not_used(); - XBT_DEBUG("Execution task '%s' finished", get_cname()); - } catch (const HostFailureException&) { - status = MSG_HOST_FAILURE; - } catch (const TimeoutException&) { - status = MSG_TIMEOUT; - } catch (const CancelException&) { - status = MSG_TASK_CANCELED; - } - - /* action ended, set comm and compute = nullptr, the actions is already destroyed in the main function */ - flops_amount = 0.0; - comm = nullptr; - compute = nullptr; - - return status; -} - -s4u::CommPtr Task::send_async(const std::string& alias, void_f_pvoid_t cleanup, bool detached) -{ - if (TRACE_actor_is_enabled()) { - auto* process_container = instr::Container::by_name(instr_pid(*MSG_process_self())); - std::string key = "p" + std::to_string(get_id()); - instr::Container::get_root()->get_link("ACTOR_LINK")->start_event(process_container, "SR", key); - } - - /* Prepare the task to send */ - set_used(); - this->comm = nullptr; - msg_global->sent_msg++; - - s4u::CommPtr s4u_comm = s4u::Mailbox::by_name(alias)->put_init(this, bytes_amount)->set_rate(get_rate()); - if (TRACE_is_enabled() && has_tracing_category()) - s4u_comm->set_tracing_category(tracing_category_); - - comm = s4u_comm; - - if (detached) - comm->detach(cleanup); - else - comm->start(); - - return comm; -} - -msg_error_t Task::send(const std::string& alias, double timeout) -{ - msg_error_t ret = MSG_OK; - /* Try to send it */ - try { - comm = nullptr; // needed, otherwise MC gets confused. - s4u::CommPtr s4u_comm = send_async(alias, nullptr, false); - comm = s4u_comm; - comm->wait_for(timeout); - } catch (const TimeoutException&) { - ret = MSG_TIMEOUT; - } catch (const CancelException&) { - ret = MSG_HOST_FAILURE; - } catch (const NetworkFailureException&) { - ret = MSG_TRANSFER_FAILURE; - /* If the send failed, it is not used anymore */ - set_not_used(); - } - - return ret; -} -void Task::cancel() -{ - if (compute) { - compute->cancel(); - } else if (comm) { - comm->cancel(); - } - set_not_used(); -} - -void Task::set_priority(double priority) -{ - xbt_assert(std::isfinite(1.0 / priority), "priority is not finite!"); - priority_ = 1.0 / priority; -} - -s4u::Actor* Task::get_sender() const -{ - return comm ? comm->get_sender() : nullptr; -} - -s4u::Host* Task::get_source() const -{ - return comm ? comm->get_sender()->get_host() : nullptr; -} - -void Task::set_used() -{ - if (is_used_) - report_multiple_use(); - is_used_ = true; -} - -void Task::report_multiple_use() const -{ - if (MSG_Global_t::debug_multiple_use) { - XBT_ERROR("This task is already used in there:"); - // TODO, backtrace - XBT_ERROR(""); - XBT_ERROR("And you try to reuse it from here:"); - xbt_backtrace_display_current(); - } else { - xbt_die("This task is still being used somewhere else. You cannot send it now. Go fix your code!" - "(use --cfg=msg/debug-multiple-use:on to get the backtrace of the other process)"); - } -} -} // namespace msg -} // namespace simgrid - -/********************************* Task **************************************/ -/** @brief Creates a new task - * - * A constructor for msg_task_t taking four arguments. - * - * @param name a name for the object. It is for user-level information and can be nullptr. - * @param flop_amount a value of the processing amount (in flop) needed to process this new task. - * If 0, then it cannot be executed with MSG_task_execute(). This value has to be >=0. - * @param message_size a value of the amount of data (in bytes) needed to transfer this new task. If 0, then it cannot - * be transferred with MSG_task_send() and MSG_task_recv(). This value has to be >=0. - * @param data a pointer to any data may want to attach to the new object. It is for user-level information and can - * be nullptr. It can be retrieved with the function MSG_task_get_data(). - * @return The new corresponding object. - */ -msg_task_t MSG_task_create(const char *name, double flop_amount, double message_size, void *data) -{ - return simgrid::msg::Task::create(name ? name : "", flop_amount, message_size, data); -} - -/** @brief Creates a new parallel task - * - * A constructor for #msg_task_t taking six arguments. - * - * @beginrst - * See :ref:`simgrid::s4u::this_actor::parallel_execute() ` for - * the exact semantic of the parameters. - * @endrst - * - * @param name a name for the object. It is for user-level information and can be nullptr. - * @param host_nb the number of hosts implied in the parallel task. - * @param host_list an array of @p host_nb msg_host_t. - * @param flops_amount an array of @p host_nb doubles. - * flops_amount[i] is the total number of operations that have to be performed on host_list[i]. - * @param bytes_amount an array of @p host_nb* @p host_nb doubles. - * @param data a pointer to any data may want to attach to the new object. - * It is for user-level information and can be nullptr. - * It can be retrieved with the function MSG_task_get_data(). - */ -msg_task_t MSG_parallel_task_create(const char *name, int host_nb, const msg_host_t * host_list, - double *flops_amount, double *bytes_amount, void *data) -{ - // Task's flops amount is set to an arbitrary value > 0.0 to be able to distinguish, in - // MSG_task_get_remaining_work_ratio(), a finished task and a task that has not started yet. - return simgrid::msg::Task::create_parallel(name ? name : "", host_nb, host_list, flops_amount, bytes_amount, data); -} - -/** @brief Return the user data of the given task */ -void* MSG_task_get_data(const_msg_task_t task) -{ - return task->get_data(); -} - -/** @brief Sets the user data of a given task */ -void MSG_task_set_data(msg_task_t task, void *data) -{ - task->set_data(data); -} - -/** @brief Returns the sender of the given task */ -msg_process_t MSG_task_get_sender(const_msg_task_t task) -{ - return task->get_sender(); -} - -/** @brief Returns the source (the sender's host) of the given task */ -msg_host_t MSG_task_get_source(const_msg_task_t task) -{ - return task->get_source(); -} - -/** @brief Returns the name of the given task. */ -const char* MSG_task_get_name(const_msg_task_t task) -{ - return task->get_cname(); -} - -/** @brief Sets the name of the given task. */ -void MSG_task_set_name(msg_task_t task, const char *name) -{ - task->set_name(name); -} - -/** - * @brief Executes a task and waits for its termination. - * - * This function is used for describing the behavior of a process. It takes only one parameter. - * @param task a #msg_task_t to execute on the location on which the process is running. - * @return #MSG_OK if the task was successfully completed, #MSG_TASK_CANCELED or #MSG_HOST_FAILURE otherwise - */ -msg_error_t MSG_task_execute(msg_task_t task) -{ - return task->execute(); -} - -/** - * @brief Executes a parallel task and waits for its termination. - * - * @param task a #msg_task_t to execute on the location on which the process is running. - * - * @return #MSG_OK if the task was successfully completed, #MSG_TASK_CANCELED or #MSG_HOST_FAILURE otherwise - */ -msg_error_t MSG_parallel_task_execute(msg_task_t task) -{ - return task->execute(); -} - -msg_error_t MSG_parallel_task_execute_with_timeout(msg_task_t task, double timeout) -{ - task->set_timeout(timeout); - return task->execute(); -} - -/** - * @brief Sends a task on a mailbox. - * - * This is a non blocking function: use MSG_comm_wait() or MSG_comm_test() to end the communication. - * - * @param task a #msg_task_t to send on another location. - * @param alias name of the mailbox to sent the task to - * @return the msg_comm_t communication created - */ -msg_comm_t MSG_task_isend(msg_task_t task, const char* alias) -{ - return new simgrid::msg::Comm(task, nullptr, task->send_async(alias, nullptr, false)); -} - -/** - * @brief Sends a task on a mailbox with a maximum rate - * - * This is a non blocking function: use MSG_comm_wait() or MSG_comm_test() to end the communication. The maxrate - * parameter allows the application to limit the bandwidth utilization of network links when sending the task. - * - * @param task a #msg_task_t to send on another location. - * @param alias name of the mailbox to sent the task to - * @param maxrate the maximum communication rate for sending this task (byte/sec). - * @return the msg_comm_t communication created - */ -msg_comm_t MSG_task_isend_bounded(msg_task_t task, const char* alias, double maxrate) -{ - task->set_rate(maxrate); - return new simgrid::msg::Comm(task, nullptr, task->send_async(alias, nullptr, false)); -} - -/** - * @brief Sends a task on a mailbox. - * - * This is a non blocking detached send function. - * Think of it as a best effort send. Keep in mind that the third parameter is only called if the communication fails. - * If the communication does work, it is responsibility of the receiver code to free anything related to the task, as - * usual. More details on this can be obtained on - *
this thread - * in the SimGrid-user mailing list archive. - * - * @param task a #msg_task_t to send on another location. - * @param alias name of the mailbox to sent the task to - * @param cleanup a function to destroy the task if the communication fails, e.g. MSG_task_destroy - * (if nullptr, no function will be called) - */ -void MSG_task_dsend(msg_task_t task, const char* alias, void_f_pvoid_t cleanup) -{ - task->send_async(alias, cleanup, true); -} - -/** - * @brief Sends a task on a mailbox with a maximal rate. - * - * This is a non blocking detached send function. - * Think of it as a best effort send. Keep in mind that the third parameter is only called if the communication fails. - * If the communication does work, it is responsibility of the receiver code to free anything related to the task, as - * usual. More details on this can be obtained on - * this thread - * in the SimGrid-user mailing list archive. - * - * The rate parameter can be used to send a task with a limited bandwidth (smaller than the physical available value). - * Use MSG_task_dsend() if you don't limit the rate (or pass -1 as a rate value do disable this feature). - * - * @param task a #msg_task_t to send on another location. - * @param alias name of the mailbox to sent the task to - * @param cleanup a function to destroy the task if the communication fails, e.g. MSG_task_destroy (if nullptr, no - * function will be called) - * @param maxrate the maximum communication rate for sending this task (byte/sec) - * - */ -void MSG_task_dsend_bounded(msg_task_t task, const char* alias, void_f_pvoid_t cleanup, double maxrate) -{ - task->set_rate(maxrate); - task->send_async(alias, cleanup, true); -} -/** - * @brief Sends a task to a mailbox - * - * This is a blocking function, the execution flow will be blocked until the task is sent (and received on the other - * side if #MSG_task_receive is used). - * See #MSG_task_isend for sending tasks asynchronously. - * - * @param task the task to be sent - * @param alias the mailbox name to where the task is sent - * - * @return Returns #MSG_OK if the task was successfully sent, - * #MSG_HOST_FAILURE, or #MSG_TRANSFER_FAILURE otherwise. - */ -msg_error_t MSG_task_send(msg_task_t task, const char* alias) -{ - XBT_DEBUG("MSG_task_send: Trying to send a message on mailbox '%s'", alias); - return task->send(alias, -1); -} - -/** - * @brief Sends a task to a mailbox with a maximum rate - * - * This is a blocking function, the execution flow will be blocked until the task is sent. The maxrate parameter allows - * the application to limit the bandwidth utilization of network links when sending the task. - * - * The maxrate parameter can be used to send a task with a limited bandwidth (smaller than the physical available - * value). Use MSG_task_send() if you don't limit the rate (or pass -1 as a rate value do disable this feature). - * - * @param task the task to be sent - * @param alias the mailbox name to where the task is sent - * @param maxrate the maximum communication rate for sending this task (byte/sec) - * - * @return Returns #MSG_OK if the task was successfully sent, - * #MSG_HOST_FAILURE, or #MSG_TRANSFER_FAILURE otherwise. - */ -msg_error_t MSG_task_send_bounded(msg_task_t task, const char* alias, double maxrate) -{ - task->set_rate(maxrate); - return task->send(alias, -1); -} - -/** - * @brief Sends a task to a mailbox with a timeout - * - * This is a blocking function, the execution flow will be blocked until the task is sent or the timeout is achieved. - * - * @param task the task to be sent - * @param alias the mailbox name to where the task is sent - * @param timeout is the maximum wait time for completion (if -1, this call is the same as #MSG_task_send) - * - * @return Returns #MSG_OK if the task was successfully sent, - * #MSG_HOST_FAILURE, or #MSG_TRANSFER_FAILURE, or #MSG_TIMEOUT otherwise. - */ -msg_error_t MSG_task_send_with_timeout(msg_task_t task, const char* alias, double timeout) -{ - return task->send(alias, timeout); -} - -/** - * @brief Sends a task to a mailbox with a timeout and with a maximum rate - * - * This is a blocking function, the execution flow will be blocked until the task is sent or the timeout is achieved. - * - * The maxrate parameter can be used to send a task with a limited bandwidth (smaller than the physical available - * value). Use MSG_task_send_with_timeout() if you don't limit the rate (or pass -1 as a rate value do disable this - * feature). - * - * @param task the task to be sent - * @param alias the mailbox name to where the task is sent - * @param timeout is the maximum wait time for completion (if -1, this call is the same as #MSG_task_send) - * @param maxrate the maximum communication rate for sending this task (byte/sec) - * - * @return Returns #MSG_OK if the task was successfully sent, - * #MSG_HOST_FAILURE, or #MSG_TRANSFER_FAILURE, or #MSG_TIMEOUT otherwise. - */ -msg_error_t MSG_task_send_with_timeout_bounded(msg_task_t task, const char* alias, double timeout, double maxrate) -{ - task->set_rate(maxrate); - return task->send(alias, timeout); -} - -/** - * @brief Receives a task from a mailbox. - * - * This is a blocking function, the execution flow will be blocked until the task is received. See #MSG_task_irecv - * for receiving tasks asynchronously. - * - * @param task a memory location for storing a #msg_task_t. - * @param alias name of the mailbox to receive the task from - * - * @return Returns - * #MSG_OK if the task was successfully received, - * #MSG_HOST_FAILURE, or #MSG_TRANSFER_FAILURE otherwise. - */ -msg_error_t MSG_task_receive(msg_task_t * task, const char *alias) -{ - return MSG_task_receive_with_timeout(task, alias, -1); -} - -/** - * @brief Receives a task from a mailbox at a given rate. - * - * @param task a memory location for storing a #msg_task_t. - * @param alias name of the mailbox to receive the task from - * @param rate limit the reception to rate bandwidth (byte/sec) - * - * The rate parameter can be used to receive a task with a limited bandwidth (smaller than the physical available - * value). Use MSG_task_receive() if you don't limit the rate (or pass -1 as a rate value do disable this feature). - * - * @return Returns - * #MSG_OK if the task was successfully received, - * #MSG_HOST_FAILURE, or #MSG_TRANSFER_FAILURE otherwise. - */ -msg_error_t MSG_task_receive_bounded(msg_task_t* task, const char* alias, double rate) -{ - return MSG_task_receive_with_timeout_bounded(task, alias, -1, rate); -} - -/** - * @brief Receives a task from a mailbox with a given timeout. - * - * This is a blocking function with a timeout, the execution flow will be blocked until the task is received or the - * timeout is achieved. See #MSG_task_irecv for receiving tasks asynchronously. You can provide a -1 timeout - * to obtain an infinite timeout. - * - * @param task a memory location for storing a #msg_task_t. - * @param alias name of the mailbox to receive the task from - * @param timeout is the maximum wait time for completion (if -1, this call is the same as #MSG_task_receive) - * - * @return Returns - * #MSG_OK if the task was successfully received, - * #MSG_HOST_FAILURE, or #MSG_TRANSFER_FAILURE, or #MSG_TIMEOUT otherwise. - */ -msg_error_t MSG_task_receive_with_timeout(msg_task_t* task, const char* alias, double timeout) -{ - return MSG_task_receive_with_timeout_bounded(task, alias, timeout, -1); -} - -/** - * @brief Receives a task from a mailbox with a given timeout and at a given rate. - * - * @param task a memory location for storing a #msg_task_t. - * @param alias name of the mailbox to receive the task from - * @param timeout is the maximum wait time for completion (if -1, this call is the same as #MSG_task_receive) - * @param rate limit the reception to rate bandwidth (byte/sec) - * - * The rate parameter can be used to send a task with a limited - * bandwidth (smaller than the physical available value). Use - * MSG_task_receive() if you don't limit the rate (or pass -1 as a - * rate value do disable this feature). - * - * @return Returns - * #MSG_OK if the task was successfully received, - * #MSG_HOST_FAILURE, or #MSG_TRANSFER_FAILURE, or #MSG_TIMEOUT otherwise. - */ -msg_error_t MSG_task_receive_with_timeout_bounded(msg_task_t* task, const char* alias, double timeout, double rate) -{ - XBT_DEBUG("MSG_task_receive_with_timeout_bounded: Trying to receive a message on mailbox '%s'", alias); - msg_error_t ret = MSG_OK; - - /* Sanity check */ - xbt_assert(task, "Null pointer for the task storage"); - - if (*task) - XBT_WARN("Asked to write the received task in a non empty struct -- proceeding."); - - /* Try to receive it by calling SIMIX network layer */ - try { - void* payload; - simgrid::s4u::Mailbox::by_name(alias) - ->get_init() - ->set_dst_data(&payload, sizeof(msg_task_t*)) - ->set_rate(rate) - ->wait_for(timeout); - *task = static_cast(payload); - XBT_DEBUG("Got task %s from %s", (*task)->get_cname(), alias); - (*task)->set_not_used(); - } catch (const simgrid::HostFailureException&) { - ret = MSG_HOST_FAILURE; - } catch (const simgrid::TimeoutException&) { - ret = MSG_TIMEOUT; - } catch (const simgrid::CancelException&) { - ret = MSG_TASK_CANCELED; - } catch (const simgrid::NetworkFailureException&) { - ret = MSG_TRANSFER_FAILURE; - } - - if (TRACE_actor_is_enabled() && ret != MSG_HOST_FAILURE && ret != MSG_TRANSFER_FAILURE && ret != MSG_TIMEOUT) { - auto* process_container = simgrid::instr::Container::by_name(instr_pid(*MSG_process_self())); - - std::string key = "p" + std::to_string((*task)->get_id()); - simgrid::instr::Container::get_root()->get_link("ACTOR_LINK")->end_event(process_container, "SR", key); - } - return ret; -} - -/** - * @brief Starts listening for receiving a task from an asynchronous communication. - * - * This is a non blocking function: use MSG_comm_wait() or MSG_comm_test() to end the communication. - * - * @param task a memory location for storing a #msg_task_t. has to be valid until the end of the communication. - * @param name of the mailbox to receive the task on - * @return the msg_comm_t communication created - */ -msg_comm_t MSG_task_irecv(msg_task_t* task, const char* name) -{ - return MSG_task_irecv_bounded(task, name, -1.0); -} - -/** - * @brief Starts listening for receiving a task from an asynchronous communication at a given rate. - * - * The rate parameter can be used to receive a task with a limited - * bandwidth (smaller than the physical available value). Use - * MSG_task_irecv() if you don't limit the rate (or pass -1 as a rate - * value do disable this feature). - * - * @param task a memory location for storing a #msg_task_t. has to be valid until the end of the communication. - * @param name of the mailbox to receive the task on - * @param rate limit the bandwidth to the given rate (byte/sec) - * @return the msg_comm_t communication created - */ -msg_comm_t MSG_task_irecv_bounded(msg_task_t* task, const char* name, double rate) -{ - /* FIXME: these functions are not traceable */ - /* Sanity check */ - xbt_assert(task, "Null pointer for the task storage"); - - if (*task) - XBT_CRITICAL("MSG_task_irecv() was asked to write in a non empty task struct."); - - /* Try to receive it by calling SIMIX network layer */ - simgrid::s4u::CommPtr comm = simgrid::s4u::Mailbox::by_name(name) - ->get_init() - ->set_dst_data((void**)task, sizeof(msg_task_t*)) - ->set_rate(rate) - ->start(); - - return new simgrid::msg::Comm(nullptr, task, comm); -} - -/** - * @brief Look if there is a communication on a mailbox and return the PID of the sender process. - * - * @param alias the name of the mailbox to be considered - * - * @return Returns the PID of sender process (or -1 if there is no communication in the mailbox) - * - */ -int MSG_task_listen_from(const char* alias) -{ - return simgrid::s4u::Mailbox::by_name(alias)->listen_from(); -} - -/** @brief Destroys the given task. - * - * You should free user data, if any, @b before calling this destructor. - * - * Only the process that owns the task can destroy it. - * The owner changes after a successful send. - * If a task is successfully sent, the receiver becomes the owner and is supposed to destroy it. The sender should not - * use it anymore. - * If the task failed to be sent, the sender remains the owner of the task. - */ -msg_error_t MSG_task_destroy(msg_task_t task) -{ - if (task->is_used()) { - /* the task is being sent or executed: cancel it first */ - task->cancel(); - } - - /* free main structures */ - delete task; - - return MSG_OK; -} - -/** @brief Cancel the given task - * - * If it was currently executed or transferred, the working process is stopped. - */ -msg_error_t MSG_task_cancel(msg_task_t task) -{ - xbt_assert((task != nullptr), "Cannot cancel a nullptr task"); - task->cancel(); - return MSG_OK; -} - -/** @brief Returns a value in ]0,1[ that represent the task remaining work - * to do: starts at 1 and goes to 0. Returns 0 if not started or finished. - * - * It works for either parallel or sequential tasks. - */ -double MSG_task_get_remaining_work_ratio(const_msg_task_t task) -{ - xbt_assert((task != nullptr), "Cannot get information from a nullptr task"); - if (task->compute) { - // Task in progress - return task->compute->get_remaining_ratio(); - } else { - // Task not started (flops_amount is > 0.0) or finished (flops_amount is set to 0.0) - return task->flops_amount > 0.0 ? 1.0 : 0.0; - } -} - -/** @brief Returns the amount of flops that remain to be computed - * - * The returned value is initially the cost that you defined for the task, then it decreases until it reaches 0 - * - * It works for sequential tasks, but the remaining amount of work is not a scalar value for parallel tasks. - * So you will get an exception if you call this function on parallel tasks. Just don't do it. - */ -double MSG_task_get_flops_amount(const_msg_task_t task) -{ - if (task->compute != nullptr && task->compute->get_state() == simgrid::s4u::Activity::State::STARTED) { - return task->compute->get_remaining(); - } else { - // Not started or already done. - // - Before starting, flops_amount is initially the task cost - // - After execution, flops_amount is set to 0 (until someone uses MSG_task_set_flops_amount, if any) - return task->flops_amount; - } -} - -/** @brief set the computation amount needed to process the given task. - * - * @warning If the computation is ongoing (already started and not finished), - * it is not modified by this call. Moreover, after its completion, the ongoing execution with set the flops_amount to - * zero, overriding any value set during the execution. - */ -void MSG_task_set_flops_amount(msg_task_t task, double flops_amount) -{ - task->flops_amount = flops_amount; -} - -/** @brief set the amount data attached with the given task. - * - * @warning If the transfer is ongoing (already started and not finished), it is not modified by this call. - */ -void MSG_task_set_bytes_amount(msg_task_t task, double data_size) -{ - task->bytes_amount = data_size; -} - -/** @brief Returns the total amount received by the given task - * - * If the communication does not exist it will return 0. - * So, if the communication has FINISHED or FAILED it returns zero. - */ -double MSG_task_get_remaining_communication(const_msg_task_t task) -{ - XBT_DEBUG("calling s4u::Comm::get_remaining (%p)", task->comm.get()); - return task->comm->get_remaining(); -} - -/** @brief Returns the size of the data attached to the given task. */ -double MSG_task_get_bytes_amount(const_msg_task_t task) -{ - xbt_assert(task != nullptr, "Invalid parameter"); - return task->bytes_amount; -} - -/** @brief Changes the priority of a computation task. - * - * This priority doesn't affect the transfer rate. A priority of 2 - * will make a task receive two times more cpu power than regular tasks. - */ -void MSG_task_set_priority(msg_task_t task, double priority) -{ - task->set_priority(priority); -} - -/** @brief Changes the maximum CPU utilization of a computation task (in flops/s). - * - * For VMs, there is a pitfall. Please see MSG_vm_set_bound(). - */ -void MSG_task_set_bound(msg_task_t task, double bound) -{ - if (bound < 1e-12) /* close enough to 0 without any floating precision surprise */ - XBT_INFO("bound == 0 means no capping (i.e., unlimited)."); - task->set_bound(bound); -} - -/** - * @brief Sets the tracing category of a task. - * - * This function should be called after the creation of a MSG task, to define the category of that task. The - * first parameter task must contain a task that was =created with the function MSG_task_create(). The second - * parameter category must contain a category that was previously declared with the function #TRACE_category - * (or with #TRACE_category_with_color). - * - * @beginrst - * See :ref:`outcome_vizu` for details on how to trace the (categorized) resource utilization. - * @endrst - * - * @param task the task that is going to be categorized - * @param category the name of the category to be associated to the task - */ -void MSG_task_set_category(msg_task_t task, const char* category) -{ - xbt_assert(not task->has_tracing_category(), "Task %p(%s) already has a category (%s).", task, task->get_cname(), - task->get_tracing_category().c_str()); - - // if user provides a nullptr category, task is no longer traced - if (category == nullptr) { - task->set_tracing_category(""); - XBT_DEBUG("MSG task %p(%s), category removed", task, task->get_cname()); - } else { - // set task category - task->set_tracing_category(category); - XBT_DEBUG("MSG task %p(%s), category %s", task, task->get_cname(), task->get_tracing_category().c_str()); - } -} - -/** - * @brief Gets the current tracing category of a task. (@see MSG_task_set_category) - * @param task the task to be considered - * @return Returns the name of the tracing category of the given task, "" otherwise - */ -const char* MSG_task_get_category(const_msg_task_t task) -{ - return task->get_tracing_category().c_str(); -} diff --git a/teshsuite/msg/CMakeLists.txt b/teshsuite/msg/CMakeLists.txt deleted file mode 100644 index 1c22032505..0000000000 --- a/teshsuite/msg/CMakeLists.txt +++ /dev/null @@ -1,14 +0,0 @@ -if(enable_msg) - add_executable (task_destroy_cancel EXCLUDE_FROM_ALL task_destroy_cancel/task_destroy_cancel.c) - target_link_libraries(task_destroy_cancel simgrid) - set_target_properties(task_destroy_cancel PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/task_destroy_cancel) - add_dependencies(tests task_destroy_cancel) - - ADD_TESH_FACTORIES(tesh-msg-task_destroy_cancel "raw" --setenv platfdir=${CMAKE_HOME_DIRECTORY}/examples/platforms - --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/msg/task_destroy_cancel - --cd ${CMAKE_HOME_DIRECTORY}/teshsuite/msg/task_destroy_cancel - ${CMAKE_HOME_DIRECTORY}/teshsuite/msg/task_destroy_cancel/task_destroy_cancel.tesh) -endif() - -set(tesh_files ${tesh_files} ${CMAKE_CURRENT_SOURCE_DIR}/task_destroy_cancel/task_destroy_cancel.tesh PARENT_SCOPE) -set(teshsuite_src ${teshsuite_src} ${CMAKE_CURRENT_SOURCE_DIR}/task_destroy_cancel/task_destroy_cancel.c PARENT_SCOPE) diff --git a/teshsuite/msg/task_destroy_cancel/task_destroy_cancel.c b/teshsuite/msg/task_destroy_cancel/task_destroy_cancel.c deleted file mode 100644 index eb038b2228..0000000000 --- a/teshsuite/msg/task_destroy_cancel/task_destroy_cancel.c +++ /dev/null @@ -1,113 +0,0 @@ -/* Copyright (c) 2010-2023. The SimGrid Team. All rights reserved. */ - -/* This program is free software; you can redistribute it and/or modify it - * under the terms of the license (GNU LGPL) which comes with this package. */ - -#include "simgrid/msg.h" - -XBT_LOG_NEW_DEFAULT_CATEGORY(msg_test, "Messages specific for this msg example"); - -static int master(XBT_ATTRIB_UNUSED int argc, XBT_ATTRIB_UNUSED char* argv[]) -{ - double task_comp_size = 5E7; - double task_comm_size = 1E6; - double timeout = 1; - - msg_task_t task = MSG_task_create("normal", task_comp_size, task_comm_size, NULL); - XBT_INFO("Sending task: \"%s\"", MSG_task_get_name(task)); - MSG_task_send_with_timeout(task, "worker_mailbox", timeout); - - task = MSG_task_create("cancel directly", task_comp_size, task_comm_size, NULL); - XBT_INFO("Canceling task \"%s\" directly", MSG_task_get_name(task)); - MSG_task_cancel(task); - MSG_task_destroy(task); - - task = MSG_task_create("destroy directly", task_comp_size, task_comm_size, NULL); - XBT_INFO("Destroying task \"%s\" directly", MSG_task_get_name(task)); - MSG_task_destroy(task); - - task = MSG_task_create("cancel", task_comp_size, task_comm_size, NULL); - msg_comm_t comm = MSG_task_isend(task, "worker_mailbox"); - XBT_INFO("Canceling task \"%s\" during comm", MSG_task_get_name(task)); - MSG_task_cancel(task); - if (MSG_comm_wait(comm, -1) != MSG_OK) - MSG_comm_destroy(comm); - MSG_task_destroy(task); - - task = MSG_task_create("finalize", task_comp_size, task_comm_size, NULL); - comm = MSG_task_isend(task, "worker_mailbox"); - XBT_INFO("Destroying task \"%s\" during comm", MSG_task_get_name(task)); - MSG_task_destroy(task); - if (MSG_comm_wait(comm, -1) != MSG_OK) - MSG_comm_destroy(comm); - - task = MSG_task_create("cancel", task_comp_size, task_comm_size, NULL); - MSG_task_send_with_timeout(task, "worker_mailbox", timeout); - - task = MSG_task_create("finalize", task_comp_size, task_comm_size, NULL); - MSG_task_send_with_timeout(task, "worker_mailbox", timeout); - - XBT_INFO("Goodbye now!"); - return 0; -} - -static int worker_main(XBT_ATTRIB_UNUSED int argc, XBT_ATTRIB_UNUSED char* argv[]) -{ - msg_task_t task = (msg_task_t)MSG_process_get_data(MSG_process_self()); - msg_error_t res; - XBT_INFO("Start %s", MSG_task_get_name(task)); - res = MSG_task_execute(task); - XBT_INFO("Task %s", res == MSG_OK ? "done" : "failed"); - MSG_task_destroy(task); - return 0; -} - -static int worker(XBT_ATTRIB_UNUSED int argc, XBT_ATTRIB_UNUSED char* argv[]) -{ - while (1) { - msg_task_t task = NULL; - xbt_assert(MSG_task_receive(&(task), "worker_mailbox") == MSG_OK, "MSG_task_receive failed"); - XBT_INFO("Handling task \"%s\"", MSG_task_get_name(task)); - - if (!strcmp(MSG_task_get_name(task), "finalize")) { - XBT_INFO("Destroying task \"%s\"", MSG_task_get_name(task)); - MSG_task_destroy(task); - break; - } - - if (!strcmp(MSG_task_get_name(task), "cancel")) { - MSG_process_create("worker1", worker_main, task, MSG_host_self()); - MSG_process_sleep(0.1); - XBT_INFO("Canceling task \"%s\"", MSG_task_get_name(task)); - MSG_task_cancel(task); - continue; - } - - double start = MSG_get_clock(); - MSG_task_execute(task); - double end = MSG_get_clock(); - XBT_INFO("Task \"%s\" done in %f (amount %f)", MSG_task_get_name(task), end - start, - MSG_task_get_flops_amount(task)); - - MSG_task_destroy(task); - } - XBT_INFO("I'm done. See you!"); - return 0; -} - -int main(int argc, char* argv[]) -{ - MSG_init(&argc, argv); - xbt_assert(argc == 2, "Usage: %s platform_file\n\tExample: %s platform.xml\n", argv[0], argv[0]); - - MSG_create_environment(argv[1]); - - MSG_process_create("master", master, NULL, MSG_get_host_by_name("Tremblay")); - MSG_process_create("worker", worker, NULL, MSG_get_host_by_name("Jupiter")); - - msg_error_t res = MSG_main(); - - XBT_INFO("Simulation time %g", MSG_get_clock()); - - return res != MSG_OK; -} diff --git a/teshsuite/msg/task_destroy_cancel/task_destroy_cancel.tesh b/teshsuite/msg/task_destroy_cancel/task_destroy_cancel.tesh deleted file mode 100644 index a0f67f753d..0000000000 --- a/teshsuite/msg/task_destroy_cancel/task_destroy_cancel.tesh +++ /dev/null @@ -1,17 +0,0 @@ -$ ${bindir}/task_destroy_cancel ${platfdir}/small_platform.xml -> [Tremblay:master:(1) 0.000000] [msg_test/INFO] Sending task: "normal" -> [Jupiter:worker:(2) 0.169155] [msg_test/INFO] Handling task "normal" -> [Tremblay:master:(1) 0.169155] [msg_test/INFO] Canceling task "cancel directly" directly -> [Tremblay:master:(1) 0.169155] [msg_test/INFO] Destroying task "destroy directly" directly -> [Tremblay:master:(1) 0.169155] [msg_test/INFO] Canceling task "cancel" during comm -> [Tremblay:master:(1) 0.169155] [msg_test/INFO] Destroying task "finalize" during comm -> [Jupiter:worker:(2) 0.824497] [msg_test/INFO] Task "normal" done in 0.655342 (amount 0.000000) -> [Jupiter:worker:(2) 0.993652] [msg_test/INFO] Handling task "cancel" -> [Jupiter:worker1:(3) 0.993652] [msg_test/INFO] Start cancel -> [Jupiter:worker:(2) 1.093652] [msg_test/INFO] Canceling task "cancel" -> [Jupiter:worker1:(3) 1.093652] [msg_test/INFO] Task failed -> [Tremblay:master:(1) 1.262806] [msg_test/INFO] Goodbye now! -> [Jupiter:worker:(2) 1.262806] [msg_test/INFO] Handling task "finalize" -> [Jupiter:worker:(2) 1.262806] [msg_test/INFO] Destroying task "finalize" -> [Jupiter:worker:(2) 1.262806] [msg_test/INFO] I'm done. See you! -> [1.262806] [msg_test/INFO] Simulation time 1.26281 diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt index b05f9f9767..d07dcdd2bb 100644 --- a/tools/CMakeLists.txt +++ b/tools/CMakeLists.txt @@ -3,9 +3,7 @@ set(bin_files ${bin_files} ${CMAKE_CURRENT_SOURCE_DIR}/fix-paje-trace.sh ${CMAKE_CURRENT_SOURCE_DIR}/normalize-pointers.py ${CMAKE_CURRENT_SOURCE_DIR}/sg_xml_unit_converter.py ${CMAKE_CURRENT_SOURCE_DIR}/simgrid_update_xml.pl - ${CMAKE_CURRENT_SOURCE_DIR}/simgrid_convert_TI_traces.py - ${CMAKE_CURRENT_SOURCE_DIR}/MSG_visualization/colorize.pl - ${CMAKE_CURRENT_SOURCE_DIR}/MSG_visualization/trace2fig.pl PARENT_SCOPE) + ${CMAKE_CURRENT_SOURCE_DIR}/simgrid_convert_TI_traces.py PARENT_SCOPE) set(txt_files ${txt_files} ${CMAKE_CURRENT_SOURCE_DIR}/pkg-config/simgrid.pc.in ${CMAKE_CURRENT_SOURCE_DIR}/address_sanitizer.supp diff --git a/tools/MSG_visualization/colorize.pl b/tools/MSG_visualization/colorize.pl deleted file mode 100755 index 675956d1f7..0000000000 --- a/tools/MSG_visualization/colorize.pl +++ /dev/null @@ -1,128 +0,0 @@ -#!/usr/bin/env perl - -# Copyright (c) 2005-2023. The SimGrid Team. -# All rights reserved. - -# This program is free software; you can redistribute it and/or modify it -# under the terms of the license (GNU LGPL) which comes with this package. - -$col_white = "\033[00m"; -$col_black = "\033[30m"; -$col_red = "\033[31m"; -$col_green = "\033[32m"; -$col_yellow = "\033[33m"; -$col_blue = "\033[34m"; -$col_purple = "\033[35m"; -$col_cyan = "\033[36m"; -$col_ltgray = "\033[37m"; -$col_darkgray = "\033[30m"; - -$col_norm = $col_white; -$col_background = "\033[07m"; -$col_brighten = "\033[01m"; -$col_underline = "\033[04m"; -$col_blink = "\033[05m"; - -# Customize colors here... -$col_default = $col_ltgray; -my (@coltab) = ( - $col_green, $col_yellow, - $col_purple, $col_cyan, - $col_red, $col_blue, - $col_background . $col_green, - $col_background . $col_yellow, $col_background . $col_purple, - $col_background . $col_cyan, $col_background . $col_red, - $col_background . $col_blue, $col_background . $col_magenta, -); - -my %pid; - -# Get options -while (($_ = $ARGV[0]) =~ /^-/) { - shift; - if (/-location/i) { - $opt_print_location = 1; shift; - } elsif (/-h(elp)?$|-u(sage)?$/i) { - print< - - where is a text file of values or '-' for STDIN - -Options: () denote short version - - -location Print the location in the code of the message. -EOH -; - exit; - } -} - -sub pidcolor { - my $pid = shift; - - unless (defined($pid{$pid})) { - # first time we see this pid. Affect it a color - $pid{$pid}=(scalar keys %pid) % (scalar @coltab); - } - return $coltab[$pid{$pid}]; -} - -sub print_line { - my($host,$procname,$pid,$date,$location,$xbt_channel,$message)=@_; - - print $col_norm; - printf "[% 10.6f]",$date; - - print pidcolor($pid); - - if(defined($location)) { - printf "[%10s:%-10s] %s ",$host,$procname,$location; - } else { - printf "[%10s:%-10s]",$host,$procname; - } - print " $message"; - print $col_norm."\n"; -} - -# Read the messages and do the job -while (<>) { - $orgline = $thisline = $_; - - # Typical line [Gatien:slave:(9) 11.243148] msg/gos.c:137: [msg_gos/DEBUG] Action terminated - if ($thisline =~ /^\[(.+):([^:]+):\((\d+)\) ([\d\.]*)\] ([^\[]*) \[([^\[]*)\] (.*)$/) { - $host=$1; - $procname=$2; - $pid=$3; - $date=$4; - if($opt_print_location) { - $location=$5; - $location =~ s/:$//; - } else { - $location = undef; - } - $xbt_channel=$6; - $message=$7; - - print_line($host,$procname,$pid,$date,$location,$xbt_channel,$message); - # Typical line [Boivin:slave:(2) 9.269357] [pmm/INFO] ROW: step(2)<>myrow(0). Receive data from TeX - } elsif ($thisline =~ /^\[([^:]+):([^:]+):\((\d+)\) ([\d\.]*)\] \[([^\[]*)\] (.*)$/) { - $host=$1; - $procname=$2; - $pid=$3; - $date=$4; - $xbt_channel=$5; - $message=$6; - print_line($host,$procname,$pid,$date,undef,$xbt_channel,$message); - } elsif ( $thisline =~ /^==(\d+)== (.*)$/) { - # take care of valgrind outputs - print pidcolor($1)."$2\n"; - - } else { - print $col_default. $orgline; - } -} - -print $col_norm; diff --git a/tools/MSG_visualization/trace2fig.pl b/tools/MSG_visualization/trace2fig.pl deleted file mode 100755 index 921287fd82..0000000000 --- a/tools/MSG_visualization/trace2fig.pl +++ /dev/null @@ -1,434 +0,0 @@ -#!/usr/bin/env perl - -# Copyright (c) 2006-2023. The SimGrid Team. -# All rights reserved. - -# This program is free software; you can redistribute it and/or modify it -# under the terms of the license (GNU LGPL) which comes with this package. - -use strict; -use warnings; - -#use Data::Dumper; -use XFig; -use POSIX; - -my($grid_Y_size)=225; -my($grid_X_size)=100550; # Can be changed to improve readability in function of the total execution time - -my($color_suspended)=1; -my($color_compute)=2; -my($color_wait_for_recpt)=3; -my($color_communicate)=4; - -# Determine the order of the colors in the legend -my(@color_list)=($color_compute,$color_communicate,$color_wait_for_recpt,$color_suspended); - -sub read_cat { - my(%Cat); - my($filename)=@_; - my($line); - - open INPUT, $filename; - - while (defined($line=)) { - chomp $line; - if($line =~ /^7\s/) { - my($event,$date,$id,$type,$father,@name) = split(/\s+/,$line); - - $Cat{$id}{name}="@name "; - $Cat{$id}{name}=~s/\"//g; - $Cat{$id}{father}=$father; - $Cat{$id}{type}=$type; - $Cat{$id}{date}=$date; - } - } - close INPUT; - return \%Cat; -} - -sub read_event { - my($filename,$Cat)=@_; - my($line); - - open INPUT, $filename; - - while (defined($line=)) { - chomp $line; - if($line =~ /^11\s/) { - my($event,$date,$type,$id,$state) = split(/\s+/,$line); - push @{$$Cat{$id}{state}}, [$date,$state]; - } - if($line =~ /^12\s/) { - my($event,$date,$type,$id) = split(/\s+/,$line); - push @{$$Cat{$id}{state}}, [$date]; - } - } - close INPUT; -} - -sub read_link { - my($filename)=@_; - my($line); - my(%link); - - open INPUT, $filename; - - while (defined($line=)) { - chomp $line; - if($line =~ /^16\s/) { - my($event,$date,$type,$father,$channel,$src,$key,$trash) = split(/\t+/,$line); - my($numkey)=hex "$key"; - while (defined($link{$numkey})) {$numkey++;} - $link{$numkey}{src}=$src; - $link{$numkey}{src_date}=$date; - - } - if($line =~ /^17\s/) { - my($event,$date,$type,$father,$channel,$dst,$key,$trash) = split(/\t+/,$line); - my($numkey)=hex "$key"; - while (defined($link{$numkey}{dst})) {$numkey++;} - $link{$numkey}{dst}=$dst; - $link{$numkey}{dst_date}=$date; - } - } - close INPUT; - return \%link; -} - -sub build_cat_tree { - my($root,$Cat)=@_; - my(@children)=(); - my($cat); - - foreach $cat (keys %$Cat) { - if($$Cat{$cat}{father} eq $root) { - push @children, build_cat_tree($cat,$Cat); - } -# print "$$Cat{$cat}{name}\t\t $Cat{$cat}{father}\n"; - } - return [$root,@children]; -} - -sub build_cat_list { - my($tree,$cat_list)=@_; - my($root) = shift @$tree; - my($u); - - push @$cat_list,$root; - - foreach $u (@$tree) { - build_cat_list($u,$cat_list); - } - unshift @$tree, $root; -} - -sub cat_sorting_function { - my($cat1,$cat2,$Cat)=@_; - if (!defined($$Cat{$cat1}{state})) { - if (!defined($$Cat{$cat2}{state})) { - return 0; - } else { - return 1; - } - } - - if (!defined($$Cat{$cat2}{state})) { - return -1; - } - - my($comp) = $$Cat{$$Cat{$cat1}{'father'}}{'name'} cmp $$Cat{$$Cat{$cat2}{'father'}}{'name'}; - if ($comp == 0) { - return $$Cat{$cat1}{'name'} cmp $$Cat{$cat2}{'name'}; - } else { - return $comp; - } -} - -sub update_host_Y { - my($host,$i) = @_; - if (!defined($$host{'Y_min_host'})) { - $$host{'Y_min_host'} = $i; - } else { - if ($$host{'Y_min_host'} > $i) { - $$host{'Y_min_host'} = $i; - } - } - if (!defined($$host{'Y_max_host'})) { - $$host{'Y_max_host'} = $i+1; - } else { - if ($$host{'Y_max_host'} < $i+1) { - $$host{'Y_max_host'} = $i+1; - } - } -} - -sub set_cat_position { - my($Cat,$cat_list)=@_; - my($i)=0; - my($cat); - foreach $cat (sort {cat_sorting_function($a,$b,$Cat)} @$cat_list) { - if(defined($$Cat{$cat}{state})) { - update_host_Y($$Cat{$$Cat{$cat}{'father'}},$i); - $$Cat{$cat}{Y_min} = $i; - $$Cat{$cat}{Y_max} = $i+1; - $i++; - } - } -} - -sub create_fig { - my($filename)=shift; - my($fig)=new XFig; - $fig->{object} = 'compound'; # Compound - $fig->{elements} = []; - $fig->{version} = 3.2; - $fig->{orientation} = 'Landscape'; - $fig->{justification} = 'Center'; - $fig->{units} = 'Metric'; - $fig->{papersize} = 'A4'; - $fig->{magnification} = '100.00'; - $fig->{multiplepage} = 'Single'; - $fig->{transparent} = '-2'; - $fig->{resolution} = '1200'; - $fig->{coordsystem} = '2'; - $fig->{filename} = $filename; - return $fig; -} - -sub draw_cat { - my($fig,$Cat,$Link)=@_; - my($cat,$e,$link); - my($max_string_length)=0; - foreach $cat (keys %$Cat) { - next unless (defined($$Cat{$cat}{Y_min}) && - defined($$Cat{$cat}{Y_max})); - my($text) = new XFig ('text'); -# $text->{'text'} = "$$Cat{$$Cat{$cat}{father}}{name}"."$$Cat{$cat}{name}"; - my($printed_name)= $$Cat{$cat}{name}; - $printed_name =~ s/\d+ \(0\)\s*$//; - if (length($printed_name) > $max_string_length) { - $max_string_length = length($printed_name); - } - $text->{'text'} = "$printed_name"; - $text->{'y'} = ($$Cat{$cat}{Y_min}+$$Cat{$cat}{Y_max})/2*$grid_Y_size+68; - $text->{'x'} = -100; - $text->{'subtype'} = 2; - $fig->add ($text); - } - - my($max_date)=0; - foreach $cat (keys %$Cat) { - next unless (defined($$Cat{$cat}{Y_min}) && defined($$Cat{$cat}{Y_max})); - my(@states)=(); - my($e); - foreach $e (@{$$Cat{$cat}{state}}) { - my($new_date,$state) = ($$e[0],$$e[1]); - if ($new_date > $max_date) { - $max_date = $new_date; - } - if(defined($state)) { - push @states, $e; - } else { - my($old_event) = pop @states; - my($old_date) = $$old_event[0]; - $state = $$old_event[1]; - -# LM: I added the next line because of "undefined values"... -# normally, I think that this should not happen, but this part of code is a bit too cryptic to me - next unless (defined($state)); - - my($line) = new XFig ('polyline'); - - $line->{'depth'} = 50; # line - $line->{'subtype'} = 1; # line - $line->{'points'} = [ [$old_date*$grid_X_size, $$Cat{$cat}{Y_min}*$grid_Y_size], - [$new_date*$grid_X_size, $$Cat{$cat}{Y_min}*$grid_Y_size], - [$new_date*$grid_X_size, $$Cat{$cat}{Y_max}*$grid_Y_size], - [$old_date*$grid_X_size, $$Cat{$cat}{Y_max}*$grid_Y_size], - [$old_date*$grid_X_size, $$Cat{$cat}{Y_min}*$grid_Y_size] ]; - $line->{'areafill'} = 20; - if($state eq "S") { - $line->{'fillcolor'} = $color_suspended; - } elsif ($state eq "E") { - $line->{'fillcolor'} = $color_compute; - } elsif ($state eq "B") { - $line->{'fillcolor'} = $color_wait_for_recpt; - } elsif ($state eq "C") { - $line->{'fillcolor'} = $color_communicate; - } - $fig->add ($line); - } - } - } - - foreach $link (keys %$Link) { - my($line) = new XFig ('polyline'); - my($src_date)=$$Link{$link}{src_date}; - my($src)=$$Link{$link}{src}; - my($dst_date)=$$Link{$link}{dst_date}; - my($dst)=$$Link{$link}{dst}; - $line->{'subtype'} = 1; # line - - print STDERR "$link: $src ($src_date) -> $dst ($dst_date)\n"; - - print STDERR "$$Cat{$src}{name} -> $$Cat{$dst}{name}\n"; - $line->{'points'} = [ [$src_date*$grid_X_size, - ($$Cat{$src}{Y_min}+$$Cat{$src}{Y_max})/2*$grid_Y_size], - [$dst_date*$grid_X_size, - ($$Cat{$dst}{Y_min}+$$Cat{$dst}{Y_max})/2*$grid_Y_size] ]; - $line->{'forwardarrow'} = ['1', '1', '1.00', '60.00', '120.00']; - $fig->add ($line); - } - -# Host visualization - my($max_Y)= 0; - - my($index_fill)=0; - my($width_of_one_letter)=80; - my($min_x_for_host)=-400 - $max_string_length*$width_of_one_letter; - my($host_text_x)= $min_x_for_host + 200; - - foreach $cat (keys %$Cat) { - next unless (defined($$Cat{$cat}{Y_min_host}) && defined($$Cat{$cat}{Y_max_host})); - my($line) = new XFig ('polyline'); - - $line->{'depth'} = 150; - $line->{'subtype'} = 1; # line - $line->{'points'} = [ [$min_x_for_host, $$Cat{$cat}{Y_min_host}*$grid_Y_size], - [$max_date*$grid_X_size+150, $$Cat{$cat}{Y_min_host}*$grid_Y_size], - [$max_date*$grid_X_size+150, $$Cat{$cat}{Y_max_host}*$grid_Y_size], - [$min_x_for_host, $$Cat{$cat}{Y_max_host}*$grid_Y_size] ]; - $line->{'areafill'} = 4+3*($index_fill % 2); - $line->{'fillcolor'} = 0; - $line->{'thickness'} = 0; - $index_fill++; - $fig->add ($line); - - my($text) = new XFig ('text'); - $text->{'text'} = "$$Cat{$cat}{name}"; - $text->{'angle'} = 3.14159265/2; - $text->{'x'} = $host_text_x; - $text->{'y'} = ($$Cat{$cat}{Y_min_host}+$$Cat{$cat}{Y_max_host})/2*$grid_Y_size; - $text->{'subtype'} = 1; - $text->{'font_size'} = 30; - $fig->add ($text); - - if ($max_Y<$$Cat{$cat}{Y_max_host}) { - $max_Y = $$Cat{$cat}{Y_max_host}; - } - } - -# Legend: - my($i)=1; - my($color); - foreach $color (@color_list) { - my($min_x)=0; - my($min_Y)=($max_Y+1)*$grid_Y_size; - my($width)=1700; - my($height)=$grid_Y_size; - - my($line) = new XFig ('polyline'); - - $line->{'depth'} = 50; - $line->{'subtype'} = 1; # line - $line->{'points'} = [ [$min_x,$min_Y + ($i-1)*$height ], - [$min_x + $width,$min_Y + ($i-1)*$height], - [$min_x + $width,$min_Y+$height + ($i-1)*$height], - [$min_x,$min_Y+$height + ($i-1)*$height], - [$min_x,$min_Y+ ($i-1)*$height]]; - $line->{'areafill'} = 20; - $line->{'fillcolor'} = $color; - $fig->add ($line); - - my($text) = new XFig ('text'); - - if ($color==$color_suspended) { - $text->{'text'} = "Suspended"; - } - if ($color==$color_compute) { - $text->{'text'} = "Computing"; - } - if ($color==$color_wait_for_recpt) { - $text->{'text'} = "Waiting for reception"; - } - if ($color==$color_communicate) { - $text->{'text'} = "Communicating"; - } - - $text->{'y'} = $min_Y + ($i-0.5)*$height +68; - $text->{'x'} = 50; - $text->{'subtype'} = 0; - $fig->add ($text); - $i++; - } - -# Time axis - my($line) = new XFig ('polyline'); - $line->{'depth'} = 0; - $line->{'subtype'} = 1; # line - $line->{'points'} = [ [0,0],[$max_date * $grid_X_size+150,0] ]; - $line->{'forwardarrow'} = ['1', '1', '1.00', '60.00', '120.00']; - $fig->add ($line); - - my($digits)=POSIX::floor(log($max_date)/log(10)); - my($exponent) = 10**$digits; - my($mantissa)= $max_date / $exponent; - my($incr); - if ($mantissa<2) { - $incr = $exponent/10; - } elsif ($mantissa<5) { - $incr = $exponent/4; - } else { - $incr = $exponent/2; - } - - print "$max_date $digits $exponent $mantissa $incr\n"; - my($x); - for($x=0; $x < $max_date; $x += $incr) { - print "$x\n"; - $line = new XFig ('polyline'); - $line->{'depth'} = 0; - $line->{'subtype'} = 1; # line - $line->{'points'} = [ [$x * $grid_X_size,0],[$x * $grid_X_size, -100] ]; - $line->{'forwardarrow'} = 0; - $fig->add ($line); - - my($text) = new XFig ('text'); - $text->{'text'} = "$x"; - $text->{'y'} = -200; - $text->{'x'} = $x * $grid_X_size; - $text->{'subtype'} = 1; - $fig->add ($text); - } - -# Empty line so that the text of the time axis can be seen on the pdf - $line = new XFig ('polyline'); - $line->{'depth'} = 999; - $line->{'subtype'} = 1; # line - $line->{'thickness'} = 0; - $line->{'points'} = [ [0,0],[0, -400] ]; - $fig->add ($line); -} - -sub main { - my($Cat) = read_cat($ARGV[0]); - my($cat_tree)=build_cat_tree("0",$Cat); - read_event($ARGV[0],$Cat); - my($Link)=read_link($ARGV[0]); -# print Dumper($cat_tree); -# print Dumper($Cat); - my($cat_list)=[]; - build_cat_list($cat_tree,$cat_list); - shift @$cat_list; - shift @$cat_list; -# print "@$cat_list \n"; - set_cat_position($Cat,$cat_list); - - my($fig)=create_fig("toto.fig"); - draw_cat($fig,$Cat,$Link); - $fig->writefile (); - system "fig2dev -L pdf toto.fig toto.pdf"; -} - -main; diff --git a/tools/cmake/DefinePackages.cmake b/tools/cmake/DefinePackages.cmake index 7ca8e49172..414e10ba74 100644 --- a/tools/cmake/DefinePackages.cmake +++ b/tools/cmake/DefinePackages.cmake @@ -23,7 +23,6 @@ set(EXTRA_DIST src/kernel/resource/WifiLinkImpl.hpp src/mc/mc_mmu.hpp src/mc/mc_record.hpp - src/msg/msg_private.hpp src/smpi/colls/coll_tuned_topo.hpp src/smpi/colls/colls_private.hpp src/smpi/colls/smpi_mvapich2_selector_stampede.hpp @@ -475,14 +474,6 @@ set(SIMGRID_SRC src/simgrid/util.hpp ) -set(MSG_SRC - src/msg/msg_comm.cpp - src/msg/msg_global.cpp - src/msg/msg_legacy.cpp - src/msg/msg_process.cpp - src/msg/msg_task.cpp - ) - set(DAG_SRC src/dag/loaders.cpp ) @@ -743,14 +734,6 @@ set(simgrid_sources ${DAG_SRC} ) -if(${enable_msg}) - set(headers_to_install ${headers_to_install} include/simgrid/msg.h) - set(simgrid_sources ${simgrid_sources} ${MSG_SRC}) -else() - set(EXTRA_DIST ${EXTRA_DIST} include/simgrid/msg.h - ${MSG_SRC}) -endif() - if(enable_smpi) set(simgrid_sources ${simgrid_sources} ${SMPI_SRC}) endif() @@ -821,7 +804,6 @@ set(DOC_SOURCES docs/source/img/zoom_comm.svg docs/source/application.rst - docs/source/app_msg.rst docs/source/app_s4u.rst docs/source/app_smpi.rst docs/source/The_XBT_toolbox.rst @@ -925,8 +907,6 @@ set(DOC_TOOLS # these files get copied automatically to the html documentation set(DOC_IMG - ${CMAKE_HOME_DIRECTORY}/doc/webcruft/Paje_MSG_screenshot.jpg - ${CMAKE_HOME_DIRECTORY}/doc/webcruft/Paje_MSG_screenshot_thn.jpg ${CMAKE_HOME_DIRECTORY}/doc/webcruft/eclipseScreenShot.png ${CMAKE_HOME_DIRECTORY}/doc/webcruft/output.goal.pdf ) @@ -969,7 +949,6 @@ set(CMAKEFILES_TXT teshsuite/kernel/CMakeLists.txt teshsuite/mc/CMakeLists.txt teshsuite/models/CMakeLists.txt - teshsuite/msg/CMakeLists.txt teshsuite/platforms/CMakeLists.txt teshsuite/python/CMakeLists.txt teshsuite/s4u/CMakeLists.txt diff --git a/tools/cmake/Distrib.cmake b/tools/cmake/Distrib.cmake index 85b862e79b..26de62b0b5 100644 --- a/tools/cmake/Distrib.cmake +++ b/tools/cmake/Distrib.cmake @@ -25,14 +25,6 @@ endif() install(PROGRAMS ${CMAKE_BINARY_DIR}/bin/tesh DESTINATION ${CMAKE_INSTALL_BINDIR}/) -install(PROGRAMS ${CMAKE_HOME_DIRECTORY}/tools/MSG_visualization/colorize.pl - DESTINATION ${CMAKE_INSTALL_BINDIR}/ - RENAME simgrid-colorizer) - -add_custom_target(simgrid-colorizer ALL - COMMENT "Install ${CMAKE_BINARY_DIR}/bin/colorize" - COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_HOME_DIRECTORY}/tools/MSG_visualization/colorize.pl ${CMAKE_BINARY_DIR}/bin/colorize) - install(PROGRAMS ${CMAKE_HOME_DIRECTORY}/tools/simgrid_update_xml.pl DESTINATION ${CMAKE_INSTALL_BINDIR}/ RENAME simgrid_update_xml) @@ -89,7 +81,6 @@ set(source_to_pack ${MC_SRC_BASE} ${MC_SRC} ${MC_SIMGRID_MC_SRC} - ${MSG_SRC} ${S4U_SRC} ${NS3_SRC} ${PLUGINS_SRC} diff --git a/tools/cmake/Option.cmake b/tools/cmake/Option.cmake index 1ac892978f..cea129115a 100644 --- a/tools/cmake/Option.cmake +++ b/tools/cmake/Option.cmake @@ -23,7 +23,12 @@ option(enable_debug "Turn this off to remove all debug messages option(enable_documentation "Whether to produce documentation" off) option(enable_ns3 "Whether ns-3 model is activated." off) -option(enable_msg "Whether the MSG module is activated." off) +option(enable_msg "Java was removed from SimGrid v3.33. Please do not enable it here." off) +mark_as_advanced(enable_msg) +if (enable_msg) + message(FATAL "MSG was removed from SimGrid v3.33. Please stick to v3.32 or earlier if you need Java.") +endif() + option(enable_java "Java was removed from SimGrid v3.33. Please do not enable it here." off) mark_as_advanced(enable_java) if (enable_java) diff --git a/tools/internal/spell_dict.txt b/tools/internal/spell_dict.txt index 1e0a264778..86b7ac16a1 100644 --- a/tools/internal/spell_dict.txt +++ b/tools/internal/spell_dict.txt @@ -62,7 +62,6 @@ ModelChecker modelchecker MPI MPICH -msg mutex NetZone nullptr diff --git a/tools/jenkins/Coverage.sh b/tools/jenkins/Coverage.sh index 34ffbf7e6b..d38aac208c 100755 --- a/tools/jenkins/Coverage.sh +++ b/tools/jenkins/Coverage.sh @@ -95,7 +95,7 @@ if [ -f Testing/TAG ] ; then sloccount --duplicates --wide --details "$WORKSPACE" | grep -v -e '.git' -e 'mpich3-test' -e 'sloccount.sc' -e 'build/' -e 'xml_coverage.xml' -e 'CTestResults_memcheck.xml' -e 'DynamicAnalysis.xml' > "$WORKSPACE"/sloccount.sc #generate PVS-studio report - EXCLUDEDPATH="-e $WORKSPACE/src/include/catch.hpp -e $WORKSPACE/src/include/xxhash.hpp -e $WORKSPACE/teshsuite/smpi/mpich3-test/ -e *_dtd.c -e *_dtd.h -e *.yy.c -e *.tab.cacc -e *.tab.hacc -e $WORKSPACE/src/smpi/colls/ -e $WORKSPACE/examples/smpi/NAS/ -e $WORKSPACE/examples/smpi/gemm/gemm.c -e $WORKSPACE/src/msg/ -e $WORKSPACE/include/msg/ -e $WORKSPACE/teshsuite/msg/" + EXCLUDEDPATH="-e $WORKSPACE/src/include/catch.hpp -e $WORKSPACE/src/include/xxhash.hpp -e $WORKSPACE/teshsuite/smpi/mpich3-test/ -e *_dtd.c -e *_dtd.h -e *.yy.c -e *.tab.cacc -e *.tab.hacc -e $WORKSPACE/src/smpi/colls/ -e $WORKSPACE/examples/smpi/NAS/ -e $WORKSPACE/examples/smpi/gemm/gemm.cq" pvs-studio-analyzer analyze -f "$BUILDFOLDER"/compile_commands.json -o "$WORKSPACE"/pvs.log $EXCLUDEDPATH -j$NUMPROC # Disable: # V521 Such expressions using the ',' operator are dangerous. (-> commas in catch.hpp), diff --git a/tools/jenkins/Flags.sh b/tools/jenkins/Flags.sh index 9d3af90410..157800a331 100755 --- a/tools/jenkins/Flags.sh +++ b/tools/jenkins/Flags.sh @@ -18,7 +18,7 @@ onoff() { fi } -[ $# -eq 4 ] || die "Needs 4 arguments : MC SMPI DEBUG MSG" +[ $# -eq 4 ] || die "Needs 4 arguments : MC SMPI DEBUG" ### Cleanup previous runs @@ -65,15 +65,8 @@ else builddebug="OFF" fi -if [ "$4" = "MSG" ] -then - buildmsg="ON" -else - buildmsg="OFF" -fi - -echo "Step ${STEP}/${NSTEPS} - Building with debug=${builddebug}, SMPI=${buildsmpi}, MC=${buildmc}, MSG=${buildmsg}" -cmake -Denable_documentation=OFF -Denable_msg=${buildmsg} \ +echo "Step ${STEP}/${NSTEPS} - Building with debug=${builddebug}, SMPI=${buildsmpi}, MC=${buildmc}" +cmake -Denable_documentation=OFF \ -Denable_compile_optimizations=OFF -Denable_compile_warnings=ON \ -Denable_mallocators=ON -Denable_debug=${builddebug} \ -Denable_smpi=${buildsmpi} -Denable_smpi_MPICH3_testsuite=${buildsmpi} -Denable_model-checking=${buildmc} \ -- 2.20.1