From a96adb51dabc0c759af11e60c770355f22a54ef3 Mon Sep 17 00:00:00 2001 From: Arnaud Giersch Date: Tue, 10 Oct 2017 11:29:10 +0200 Subject: [PATCH] In C++ files, replace SG_{BEGIN,END}+_DECL() by extern "C" { }. --- include/simgrid/jedule/jedule.hpp | 6 ++---- include/simgrid/jedule/jedule_events.hpp | 8 +++----- include/simgrid/jedule/jedule_platform.hpp | 7 +++---- src/bindings/java/jmsg.cpp | 5 ++--- src/bindings/java/jmsg.hpp | 5 ++--- src/bindings/java/jmsg_as.cpp | 5 ++--- src/bindings/java/jmsg_as.hpp | 5 ++--- src/bindings/java/jmsg_comm.cpp | 5 ++--- src/bindings/java/jmsg_file.cpp | 5 ++--- src/bindings/java/jmsg_host.cpp | 5 ++--- src/bindings/java/jmsg_process.cpp | 5 ++--- src/bindings/java/jmsg_rngstream.cpp | 5 ++--- src/bindings/java/jmsg_storage.cpp | 5 ++--- src/bindings/java/jmsg_synchro.cpp | 5 ++--- src/bindings/java/jmsg_task.cpp | 5 ++--- src/bindings/java/jmsg_vm.cpp | 4 ++-- src/bindings/java/jtrace.cpp | 5 ++--- src/bindings/java/jxbt_utilities.cpp | 5 ++--- src/bindings/java/jxbt_utilities.hpp | 5 ++--- src/include/smpi/smpi_utils.hpp | 5 ++--- src/include/surf/maxmin.hpp | 4 ++-- src/instr/instr_private.hpp | 5 ++--- src/instr/instr_smpi.hpp | 5 ++--- src/kernel/context/Context.hpp | 6 ++---- src/kernel/routing/RoutedZone.hpp | 6 +++--- src/mc/checker/LivenessChecker.hpp | 4 ---- src/mc/mc_comm_pattern.hpp | 5 ++--- src/mc/mc_private.hpp | 5 ++--- src/mc/mc_record.hpp | 4 ---- src/mc/mc_smx.hpp | 5 ++--- src/mc/mc_snapshot.hpp | 5 ++--- src/msg/msg_actions.cpp | 5 ++--- src/msg/msg_deployment.cpp | 5 ++--- src/msg/msg_environment.cpp | 5 ++--- src/msg/msg_global.cpp | 5 ++--- src/msg/msg_gos.cpp | 5 ++--- src/msg/msg_host.cpp | 5 ++--- src/msg/msg_io.cpp | 5 ++--- src/msg/msg_mailbox.cpp | 5 ++--- src/msg/msg_private.hpp | 5 ++--- src/msg/msg_process.cpp | 10 ++++------ src/msg/msg_task.cpp | 5 ++--- src/msg/msg_vm.cpp | 5 ++--- src/simdag/simdag_private.hpp | 4 ++-- src/simix/ActorImpl.hpp | 5 ++--- src/simix/popping_private.hpp | 5 ++--- src/simix/smx_host_private.hpp | 5 ++--- src/simix/smx_private.hpp | 5 ++--- src/smpi/include/private.hpp | 5 ++--- src/surf/ns3/ns3_interface.hpp | 5 ++--- src/surf/plugins/host_energy.cpp | 5 ++--- src/surf/plugins/host_load.cpp | 5 ++--- src/surf/surf_private.hpp | 5 ++--- src/surf/trace_mgr.hpp | 5 ++--- src/surf/xml/platf.hpp | 5 ++--- src/surf/xml/platf_private.hpp | 5 ++--- src/surf/xml/surfxml_parseplatf.cpp | 5 ++--- src/surf/xml/surfxml_sax_cb.cpp | 5 ++--- 58 files changed, 117 insertions(+), 181 deletions(-) diff --git a/include/simgrid/jedule/jedule.hpp b/include/simgrid/jedule/jedule.hpp index ebb956ed2e..0ea9ab82fe 100644 --- a/include/simgrid/jedule/jedule.hpp +++ b/include/simgrid/jedule/jedule.hpp @@ -36,11 +36,9 @@ public: } } -SG_BEGIN_DECL() - +extern "C" { typedef simgrid::jedule::Jedule *jedule_t; - -SG_END_DECL() +} #endif #endif /* JEDULE_HPP_ */ diff --git a/include/simgrid/jedule/jedule_events.hpp b/include/simgrid/jedule/jedule_events.hpp index aa1609959d..704d4f6d22 100644 --- a/include/simgrid/jedule/jedule_events.hpp +++ b/include/simgrid/jedule/jedule_events.hpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2010-2012, 2014-2016. The SimGrid Team. +/* Copyright (c) 2010-2012, 2014-2017. The SimGrid Team. * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it @@ -40,11 +40,9 @@ XBT_PUBLIC_CLASS Event{ } } -SG_BEGIN_DECL() - +extern "C" { typedef simgrid::jedule::Event * jed_event_t; - -SG_END_DECL() +} #endif diff --git a/include/simgrid/jedule/jedule_platform.hpp b/include/simgrid/jedule/jedule_platform.hpp index caaf67225b..9510ad01b0 100644 --- a/include/simgrid/jedule/jedule_platform.hpp +++ b/include/simgrid/jedule/jedule_platform.hpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2010-2012, 2014-2016. The SimGrid Team. +/* Copyright (c) 2010-2012, 2014-2017. The SimGrid Team. * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it @@ -50,12 +50,11 @@ public: } } -SG_BEGIN_DECL() +extern "C" { typedef simgrid::jedule::Container * jed_container_t; typedef simgrid::jedule::Subset * jed_subset_t; void get_resource_selection_by_hosts(std::vector* subset_list, std::vector *host_list); - -SG_END_DECL() +} #endif diff --git a/src/bindings/java/jmsg.cpp b/src/bindings/java/jmsg.cpp index 804cc7b820..971a49688a 100644 --- a/src/bindings/java/jmsg.cpp +++ b/src/bindings/java/jmsg.cpp @@ -38,7 +38,7 @@ #endif /* end of eclipse-mandated pimple */ -SG_BEGIN_DECL() +extern "C" { int JAVA_HOST_LEVEL = -1; @@ -243,8 +243,7 @@ Java_org_simgrid_msg_Msg_deployApplication(JNIEnv * env, jclass cls, jstring jde JNIEXPORT void JNICALL Java_org_simgrid_msg_Msg_energyInit() { sg_host_energy_plugin_init(); } - -SG_END_DECL() +} // extern "C" /** Run a Java org.simgrid.msg.Process * diff --git a/src/bindings/java/jmsg.hpp b/src/bindings/java/jmsg.hpp index 9e6996a6c3..afb050fc63 100644 --- a/src/bindings/java/jmsg.hpp +++ b/src/bindings/java/jmsg.hpp @@ -11,7 +11,7 @@ #include #include -SG_BEGIN_DECL() +extern "C" { /* Shut up some errors in eclipse online compiler. I wish such a pimple wouldn't be needed */ #ifndef JNIEXPORT @@ -48,6 +48,5 @@ JNIEXPORT void JNICALL Java_org_simgrid_msg_Msg_critical(JNIEnv * env, jclass cl JNIEXPORT void JNICALL Java_org_simgrid_msg_Msg_createEnvironment(JNIEnv * env, jclass cls, jstring jplatformFile); JNIEXPORT jobject JNICALL Java_org_simgrid_msg_Msg_environmentGetRoutingRoot(JNIEnv * env, jclass cls); JNIEXPORT void JNICALL Java_org_simgrid_msg_Msg_deployApplication(JNIEnv * env, jclass cls, jstring jdeploymentFile); - -SG_END_DECL() +} #endif diff --git a/src/bindings/java/jmsg_as.cpp b/src/bindings/java/jmsg_as.cpp index cdf07b7ed4..3b5109b8cc 100644 --- a/src/bindings/java/jmsg_as.cpp +++ b/src/bindings/java/jmsg_as.cpp @@ -16,7 +16,7 @@ XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(java); -SG_BEGIN_DECL() +extern "C" { static jmethodID jas_method_As_constructor; static jfieldID jas_field_As_bind; @@ -155,5 +155,4 @@ JNIEXPORT jobjectArray JNICALL Java_org_simgrid_msg_As_getHosts(JNIEnv * env, jo } return jtable; } - -SG_END_DECL() +} diff --git a/src/bindings/java/jmsg_as.hpp b/src/bindings/java/jmsg_as.hpp index 2d9e1cb304..f79ef9be2d 100644 --- a/src/bindings/java/jmsg_as.hpp +++ b/src/bindings/java/jmsg_as.hpp @@ -10,7 +10,7 @@ #include #include "simgrid/msg.h" -SG_BEGIN_DECL() +extern "C" { /* Shut up some errors in eclipse online compiler. I wish such a pimple wouldn't be needed */ #ifndef JNIEXPORT @@ -32,6 +32,5 @@ JNIEXPORT jobject JNICALL Java_org_simgrid_msg_As_getName(JNIEnv * env, jobject JNIEXPORT jobjectArray JNICALL Java_org_simgrid_msg_As_getSons(JNIEnv* env, jobject jnetzone); JNIEXPORT jobject JNICALL Java_org_simgrid_msg_As_getProperty(JNIEnv *env, jobject jhost, jobject jname); JNIEXPORT jobjectArray JNICALL Java_org_simgrid_msg_As_getHosts(JNIEnv* env, jobject jnetzone); - -SG_END_DECL() +} #endif diff --git a/src/bindings/java/jmsg_comm.cpp b/src/bindings/java/jmsg_comm.cpp index 011d39d67c..f58666ac6d 100644 --- a/src/bindings/java/jmsg_comm.cpp +++ b/src/bindings/java/jmsg_comm.cpp @@ -14,7 +14,7 @@ XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(java); -SG_BEGIN_DECL() +extern "C" { static jfieldID jcomm_field_Comm_bind; static jfieldID jcomm_field_Comm_finished; @@ -166,5 +166,4 @@ JNIEXPORT int JNICALL Java_org_simgrid_msg_Comm_waitAny(JNIEnv *env, jclass cls, xbt_dynar_free(&dyn); return rank; } - -SG_END_DECL() +} diff --git a/src/bindings/java/jmsg_file.cpp b/src/bindings/java/jmsg_file.cpp index b1b8377218..ff8dcba252 100644 --- a/src/bindings/java/jmsg_file.cpp +++ b/src/bindings/java/jmsg_file.cpp @@ -8,7 +8,7 @@ #include "jmsg_file.h" #include "jxbt_utilities.hpp" -SG_BEGIN_DECL() +extern "C" { void jfile_bind(JNIEnv *env, jobject jfile, msg_file_t fd) { env->SetLongField(jfile, jfile_field_bind, reinterpret_cast(fd)); @@ -53,5 +53,4 @@ JNIEXPORT void JNICALL Java_org_simgrid_msg_File_close(JNIEnv *env, jobject jfil MSG_file_close(file); jfile_bind(env, jfile, nullptr); } - -SG_END_DECL() +} diff --git a/src/bindings/java/jmsg_host.cpp b/src/bindings/java/jmsg_host.cpp index a5a8b91cd4..98b7f09c84 100644 --- a/src/bindings/java/jmsg_host.cpp +++ b/src/bindings/java/jmsg_host.cpp @@ -16,7 +16,7 @@ XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(java); -SG_BEGIN_DECL() +extern "C" { static jmethodID jhost_method_Host_constructor; static jfieldID jhost_field_Host_bind; @@ -374,5 +374,4 @@ JNIEXPORT jdouble JNICALL Java_org_simgrid_msg_Host_getPowerPeakAt(JNIEnv* env, msg_host_t host = jhost_get_native(env, jhost); return MSG_host_get_power_peak_at(host, pstate); } - -SG_END_DECL() +} diff --git a/src/bindings/java/jmsg_process.cpp b/src/bindings/java/jmsg_process.cpp index 023e19907f..330a89b121 100644 --- a/src/bindings/java/jmsg_process.cpp +++ b/src/bindings/java/jmsg_process.cpp @@ -16,7 +16,7 @@ XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(java); -SG_BEGIN_DECL() +extern "C" { jfieldID jprocess_field_Process_bind; jfieldID jprocess_field_Process_host; @@ -289,5 +289,4 @@ JNIEXPORT void JNICALL Java_org_simgrid_msg_Process_setKillTime (JNIEnv *env , j JNIEXPORT jint JNICALL Java_org_simgrid_msg_Process_getCount(JNIEnv * env, jclass cls) { return (jint) MSG_process_get_number(); } - -SG_END_DECL() +} diff --git a/src/bindings/java/jmsg_rngstream.cpp b/src/bindings/java/jmsg_rngstream.cpp index b294843857..cf069b30f5 100644 --- a/src/bindings/java/jmsg_rngstream.cpp +++ b/src/bindings/java/jmsg_rngstream.cpp @@ -10,7 +10,7 @@ #include "jmsg_rngstream.h" #include "jxbt_utilities.hpp" -SG_BEGIN_DECL() +extern "C" { jfieldID jrngstream_bind; @@ -145,5 +145,4 @@ JNIEXPORT jint JNICALL Java_org_simgrid_msg_RngStream_randInt(JNIEnv *env, jobje return (jint)RngStream_RandInt(rngstream, (int)i, (int)j); } - -SG_END_DECL() +} diff --git a/src/bindings/java/jmsg_storage.cpp b/src/bindings/java/jmsg_storage.cpp index f421d022e5..e92d05086a 100644 --- a/src/bindings/java/jmsg_storage.cpp +++ b/src/bindings/java/jmsg_storage.cpp @@ -13,7 +13,7 @@ XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(java); -SG_BEGIN_DECL() +extern "C" { static jmethodID jstorage_method_Storage_constructor; static jfieldID jstorage_field_Storage_bind; @@ -227,5 +227,4 @@ JNIEXPORT jobjectArray JNICALL Java_org_simgrid_msg_Storage_all(JNIEnv * env, jc xbt_dynar_free(&table); return jtable; } - -SG_END_DECL() +} diff --git a/src/bindings/java/jmsg_synchro.cpp b/src/bindings/java/jmsg_synchro.cpp index 51d3cba00e..a831b3fafe 100644 --- a/src/bindings/java/jmsg_synchro.cpp +++ b/src/bindings/java/jmsg_synchro.cpp @@ -14,7 +14,7 @@ XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(java); -SG_BEGIN_DECL() +extern "C" { static jfieldID jsynchro_field_Mutex_bind; @@ -94,5 +94,4 @@ JNIEXPORT void JNICALL Java_org_simgrid_msg_Semaphore_nativeFinalize(JNIEnv * en sem = (msg_sem_t)(uintptr_t)env->GetLongField(obj, jsynchro_field_Semaphore_bind); MSG_sem_destroy(sem); } - -SG_END_DECL() +} diff --git a/src/bindings/java/jmsg_task.cpp b/src/bindings/java/jmsg_task.cpp index 77f5872085..77a54f04a3 100644 --- a/src/bindings/java/jmsg_task.cpp +++ b/src/bindings/java/jmsg_task.cpp @@ -15,7 +15,7 @@ XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(java); -SG_BEGIN_DECL() +extern "C" { static jmethodID jtask_method_Comm_constructor; @@ -525,5 +525,4 @@ JNIEXPORT jint JNICALL Java_org_simgrid_msg_Task_listenFrom(JNIEnv * env, jclass return (jint) rv; } - -SG_END_DECL() +} diff --git a/src/bindings/java/jmsg_vm.cpp b/src/bindings/java/jmsg_vm.cpp index b1cd76ad5e..70dc62c527 100644 --- a/src/bindings/java/jmsg_vm.cpp +++ b/src/bindings/java/jmsg_vm.cpp @@ -13,7 +13,7 @@ XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(java); -SG_BEGIN_DECL() +extern "C" { extern int JAVA_HOST_LEVEL; static jfieldID jvm_field_bind; @@ -186,4 +186,4 @@ JNIEXPORT jobject JNICALL Java_org_simgrid_msg_VM_getVMByName(JNIEnv* env, jclas return static_cast(host->extension(JAVA_HOST_LEVEL)); } -SG_END_DECL() +} diff --git a/src/bindings/java/jtrace.cpp b/src/bindings/java/jtrace.cpp index 667c7b4255..02f22f13c4 100644 --- a/src/bindings/java/jtrace.cpp +++ b/src/bindings/java/jtrace.cpp @@ -20,7 +20,7 @@ // Define a new category XBT_LOG_NEW_DEFAULT_CATEGORY (jtrace, "TRACE for Java(TM)"); -SG_BEGIN_DECL() +extern "C" { JNIEXPORT void JNICALL Java_org_simgrid_trace_Trace_hostStateDeclare(JNIEnv * env, jclass cls, jstring js) { @@ -198,5 +198,4 @@ JNIEXPORT void JNICALL Java_org_simgrid_trace_Trace_linkSrcDstVariableSet JNIEXPORT void JNICALL Java_org_simgrid_trace_Trace_linkSrcDstVariableSubWithTime(JNIEnv *env, jclass cls, jdouble, jstring, jstring, jstring, jdouble) */ - -SG_END_DECL() +} diff --git a/src/bindings/java/jxbt_utilities.cpp b/src/bindings/java/jxbt_utilities.cpp index 6756075308..5a285b3337 100644 --- a/src/bindings/java/jxbt_utilities.cpp +++ b/src/bindings/java/jxbt_utilities.cpp @@ -10,7 +10,7 @@ #include /* abort */ -SG_BEGIN_DECL() +extern "C" { jclass jxbt_get_class(JNIEnv * env, const char *name) { @@ -211,5 +211,4 @@ void jxbt_throw_task_cancelled(JNIEnv* env, std::string details) { jxbt_throw_by_name(env, "org/simgrid/msg/TaskCancelledException", details); } - -SG_END_DECL() +} diff --git a/src/bindings/java/jxbt_utilities.hpp b/src/bindings/java/jxbt_utilities.hpp index 4b65d60d8a..537167dbf3 100644 --- a/src/bindings/java/jxbt_utilities.hpp +++ b/src/bindings/java/jxbt_utilities.hpp @@ -12,7 +12,7 @@ #include #include -SG_BEGIN_DECL() +extern "C" { /* Search a class and throw an exception if not found */ jclass jxbt_get_class(JNIEnv * env, const char *name); @@ -73,6 +73,5 @@ void jxbt_throw_time_out_failure(JNIEnv* env, std::string details); void jxbt_throw_task_cancelled(JNIEnv* env, std::string details); /** Thrown when looking for a storage from name does not lead to anything */ void jxbt_throw_storage_not_found(JNIEnv* env, std::string invalid_name); - -SG_END_DECL() +} #endif diff --git a/src/include/smpi/smpi_utils.hpp b/src/include/smpi/smpi_utils.hpp index 0f98f38a44..8af0b0adc7 100644 --- a/src/include/smpi/smpi_utils.hpp +++ b/src/include/smpi/smpi_utils.hpp @@ -9,7 +9,7 @@ #include #include -SG_BEGIN_DECL() +extern "C" { // Methods used to parse and store the values for timing injections in smpi typedef struct s_smpi_factor *smpi_os_factor_t; @@ -17,8 +17,7 @@ typedef struct s_smpi_factor{ size_t factor=0; std::vector values; } s_smpi_factor_t; - -SG_END_DECL() +} XBT_PUBLIC(std::vector) parse_factor(const char *smpi_coef_string); diff --git a/src/include/surf/maxmin.hpp b/src/include/surf/maxmin.hpp index d635efd762..55b4f60798 100644 --- a/src/include/surf/maxmin.hpp +++ b/src/include/surf/maxmin.hpp @@ -153,7 +153,7 @@ static inline int double_equals(double value1, double value2, double precision) return (fabs(value1 - value2) < precision); } -SG_BEGIN_DECL() +extern "C" { /** @{ @ingroup SURF_lmm */ /** @@ -459,6 +459,6 @@ XBT_PUBLIC(double func_vegas_fp) (lmm_variable_t var, double x); XBT_PUBLIC(double func_vegas_fpi) (lmm_variable_t var, double x); /** @} */ -SG_END_DECL() +} #endif diff --git a/src/instr/instr_private.hpp b/src/instr/instr_private.hpp index 98b34ce26f..50a189a856 100644 --- a/src/instr/instr_private.hpp +++ b/src/instr/instr_private.hpp @@ -263,7 +263,7 @@ class NewEvent : public PajeEvent { } // namespace simgrid::instr typedef simgrid::instr::Container* container_t; -SG_BEGIN_DECL() +extern "C" { extern XBT_PRIVATE std::set created_categories; extern XBT_PRIVATE std::set declared_marks; @@ -406,8 +406,7 @@ typedef struct s_instr_extra_data { */ typedef enum { instr_fmt_paje, instr_fmt_TI } instr_fmt_type_t; extern instr_fmt_type_t instr_fmt_type; - -SG_END_DECL() +} void LogContainerTypeDefinition(simgrid::instr::Type* type); void LogVariableTypeDefinition(simgrid::instr::Type* type); diff --git a/src/instr/instr_smpi.hpp b/src/instr/instr_smpi.hpp index 77951ef89d..4abfe02827 100644 --- a/src/instr/instr_smpi.hpp +++ b/src/instr/instr_smpi.hpp @@ -10,7 +10,7 @@ #include "src/instr/instr_private.hpp" #include -SG_BEGIN_DECL() +extern "C" { XBT_PRIVATE void TRACE_internal_smpi_set_category(const char* category); XBT_PRIVATE const char* TRACE_internal_smpi_get_category(); @@ -48,7 +48,6 @@ typedef struct smpi_trace_call_location { } } smpi_trace_call_location_t; - -SG_END_DECL() +} #endif diff --git a/src/kernel/context/Context.hpp b/src/kernel/context/Context.hpp index c2ac93eaa3..c467f05245 100644 --- a/src/kernel/context/Context.hpp +++ b/src/kernel/context/Context.hpp @@ -148,8 +148,7 @@ XBT_PRIVATE ContextFactory* boost_factory(); typedef simgrid::kernel::context::ContextFactory *smx_context_factory_t; -SG_BEGIN_DECL() - +extern "C" { XBT_PRIVATE void SIMIX_context_mod_init(); XBT_PRIVATE void SIMIX_context_mod_exit(); @@ -185,8 +184,7 @@ XBT_PRIVATE smx_context_t SIMIX_context_get_current(); XBT_PUBLIC(int) SIMIX_process_get_maxpid(); XBT_PRIVATE void SIMIX_post_create_environment(); - -SG_END_DECL() +} XBT_PRIVATE simgrid::simix::ActorCodeFactory& SIMIX_get_actor_code_factory(const char *name); diff --git a/src/kernel/routing/RoutedZone.hpp b/src/kernel/routing/RoutedZone.hpp index 3904232c22..74e655bc30 100644 --- a/src/kernel/routing/RoutedZone.hpp +++ b/src/kernel/routing/RoutedZone.hpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2016. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2013-2017. 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. */ @@ -64,9 +64,9 @@ protected: } } // namespace -SG_BEGIN_DECL() +extern "C" { XBT_PRIVATE xbt_node_t new_xbt_graph_node(xbt_graph_t graph, const char* name, xbt_dict_t nodes); XBT_PRIVATE xbt_edge_t new_xbt_graph_edge(xbt_graph_t graph, xbt_node_t s, xbt_node_t d, xbt_dict_t edges); -SG_END_DECL() +} #endif /* SIMGRID_ROUTING_GENERIC_HPP_ */ diff --git a/src/mc/checker/LivenessChecker.hpp b/src/mc/checker/LivenessChecker.hpp index 93dc6cb755..a6c6f42f12 100644 --- a/src/mc/checker/LivenessChecker.hpp +++ b/src/mc/checker/LivenessChecker.hpp @@ -20,10 +20,6 @@ #include "src/mc/mc_state.hpp" #include "src/mc/checker/Checker.hpp" -SG_BEGIN_DECL() - -SG_END_DECL() - namespace simgrid { namespace mc { diff --git a/src/mc/mc_comm_pattern.hpp b/src/mc/mc_comm_pattern.hpp index afd3aa23c6..feac5b4b47 100644 --- a/src/mc/mc_comm_pattern.hpp +++ b/src/mc/mc_comm_pattern.hpp @@ -23,7 +23,7 @@ struct PatternCommunicationList { } } -SG_BEGIN_DECL() +extern "C" { /** * Type: `xbt_dynar_t` @@ -77,7 +77,6 @@ XBT_PRIVATE void MC_restore_communications_pattern(simgrid::mc::State* state); XBT_PRIVATE void MC_state_copy_incomplete_communications_pattern(simgrid::mc::State* state); XBT_PRIVATE void MC_state_copy_index_communications_pattern(simgrid::mc::State* state); - -SG_END_DECL() +} #endif diff --git a/src/mc/mc_private.hpp b/src/mc/mc_private.hpp index 09d17dcd54..8869643741 100644 --- a/src/mc/mc_private.hpp +++ b/src/mc/mc_private.hpp @@ -26,7 +26,7 @@ struct DerefAndCompareByActorsCountAndUsedHeap { } } -SG_BEGIN_DECL() +extern "C" { /********************************* MC Global **********************************/ @@ -42,8 +42,7 @@ XBT_PRIVATE void MC_show_deadlock(void); #define MC_VERBOSE 1 /********************************** Miscellaneous **********************************/ - -SG_END_DECL() +} namespace simgrid { namespace mc { diff --git a/src/mc/mc_record.hpp b/src/mc/mc_record.hpp index 698d824819..2b7bfffc9a 100644 --- a/src/mc/mc_record.hpp +++ b/src/mc/mc_record.hpp @@ -39,8 +39,6 @@ XBT_PRIVATE void replay(const char* trace); } } -SG_BEGIN_DECL() - /** Whether the MC record mode is enabled * * The behaviour is not changed. The only real difference is that @@ -50,6 +48,4 @@ SG_BEGIN_DECL() // **** Data conversion -SG_END_DECL() - #endif diff --git a/src/mc/mc_smx.hpp b/src/mc/mc_smx.hpp index d9ca09d103..cebb749f94 100644 --- a/src/mc/mc_smx.hpp +++ b/src/mc/mc_smx.hpp @@ -28,7 +28,7 @@ * MCed code. */ -SG_BEGIN_DECL() +extern "C" { /** Get the issuer of a simcall (`req->issuer`) * @@ -47,7 +47,6 @@ XBT_PRIVATE const char* MC_smx_actor_get_host_name(smx_actor_t p); XBT_PRIVATE int MC_smpi_process_count(void); XBT_PRIVATE unsigned long MC_smx_get_maxpid(void); - -SG_END_DECL() +} #endif diff --git a/src/mc/mc_snapshot.hpp b/src/mc/mc_snapshot.hpp index b0a19d0523..eab2acf26c 100644 --- a/src/mc/mc_snapshot.hpp +++ b/src/mc/mc_snapshot.hpp @@ -16,7 +16,7 @@ #include "src/mc/mc_forward.hpp" #include "src/mc/mc_unw.hpp" -SG_BEGIN_DECL() +extern "C" { // ***** Snapshot region @@ -231,7 +231,6 @@ static XBT_ALWAYS_INLINE void* MC_region_read_pointer(mc_mem_region_t region, co void* res; return *(void**) MC_region_read(region, &res, addr, sizeof(void*)); } - -SG_END_DECL() +} #endif diff --git a/src/msg/msg_actions.cpp b/src/msg/msg_actions.cpp index dd9f3a9f30..82619ee002 100644 --- a/src/msg/msg_actions.cpp +++ b/src/msg/msg_actions.cpp @@ -10,7 +10,7 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(msg_action, msg, "MSG actions for trace driven simulation"); -SG_BEGIN_DECL() +extern "C" { void MSG_action_init() { @@ -52,5 +52,4 @@ msg_error_t MSG_action_trace_run(char *path) return res; } - -SG_END_DECL() +} diff --git a/src/msg/msg_deployment.cpp b/src/msg/msg_deployment.cpp index d8ddde4c82..ae3d87a062 100644 --- a/src/msg/msg_deployment.cpp +++ b/src/msg/msg_deployment.cpp @@ -5,7 +5,7 @@ #include "src/msg/msg_private.hpp" -SG_BEGIN_DECL() +extern "C" { /** \ingroup msg_simulation * \brief An application deployer. @@ -59,5 +59,4 @@ void MSG_set_function(const char *host_id, const char *function_name, xbt_dynar_ { SIMIX_process_set_function(host_id, function_name, arguments, -1, -1); } - -SG_END_DECL() +} diff --git a/src/msg/msg_environment.cpp b/src/msg/msg_environment.cpp index 4392d98bee..92d67e9e9a 100644 --- a/src/msg/msg_environment.cpp +++ b/src/msg/msg_environment.cpp @@ -13,7 +13,7 @@ #include #endif -SG_BEGIN_DECL() +extern "C" { /********************************* MSG **************************************/ @@ -76,5 +76,4 @@ void MSG_zone_get_hosts(msg_netzone_t netzone, xbt_dynar_t whereto) for (auto const& host : hosts) xbt_dynar_push(whereto, &host); } - -SG_END_DECL() +} diff --git a/src/msg/msg_global.cpp b/src/msg/msg_global.cpp index 8d1aca601c..5651178070 100644 --- a/src/msg/msg_global.cpp +++ b/src/msg/msg_global.cpp @@ -13,7 +13,7 @@ XBT_LOG_NEW_CATEGORY(msg, "All MSG categories"); XBT_LOG_NEW_DEFAULT_SUBCATEGORY(msg_kernel, msg, "Logging specific to MSG (kernel)"); -SG_BEGIN_DECL() +extern "C" { MSG_Global_t msg_global = nullptr; static void MSG_exit(); @@ -130,5 +130,4 @@ unsigned long int MSG_get_sent_msg() { return msg_global->sent_msg; } - -SG_END_DECL() +} diff --git a/src/msg/msg_gos.cpp b/src/msg/msg_gos.cpp index c1faa1ed1a..3846e9e4fd 100644 --- a/src/msg/msg_gos.cpp +++ b/src/msg/msg_gos.cpp @@ -11,7 +11,7 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(msg_gos, msg, "Logging specific to MSG (gos)"); -SG_BEGIN_DECL() +extern "C" { /** \ingroup msg_task_usage * \brief Executes a task and waits for its termination. @@ -907,5 +907,4 @@ const char *MSG_task_get_category (msg_task_t task) { return task->category; } - -SG_END_DECL() +} diff --git a/src/msg/msg_host.cpp b/src/msg/msg_host.cpp index 844fb889d0..7605967a69 100644 --- a/src/msg/msg_host.cpp +++ b/src/msg/msg_host.cpp @@ -13,7 +13,7 @@ XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(msg); simgrid::xbt::Extension simgrid::MsgHostExt::EXTENSION_ID; -SG_BEGIN_DECL() +extern "C" { int sg_storage_max_file_descriptors = 1024; @@ -266,5 +266,4 @@ xbt_dict_t MSG_host_get_storage_content(msg_host_t host) return contents; } - -SG_END_DECL() +} diff --git a/src/msg/msg_io.cpp b/src/msg/msg_io.cpp index 269ae90076..592312a0e1 100644 --- a/src/msg/msg_io.cpp +++ b/src/msg/msg_io.cpp @@ -11,7 +11,7 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(msg_io, msg, "Logging specific to MSG (io)"); -SG_BEGIN_DECL() +extern "C" { /** @addtogroup msg_file * (#msg_file_t) and the functions for managing it. @@ -510,5 +510,4 @@ const char* MSG_storage_get_host(msg_storage_t storage) xbt_assert((storage != nullptr), "Invalid parameters"); return storage->getHost()->getCname(); } - -SG_END_DECL() +} diff --git a/src/msg/msg_mailbox.cpp b/src/msg/msg_mailbox.cpp index 394e409d54..791e59d738 100644 --- a/src/msg/msg_mailbox.cpp +++ b/src/msg/msg_mailbox.cpp @@ -10,7 +10,7 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(msg_mailbox, msg, "Logging specific to MSG (mailbox)"); -SG_BEGIN_DECL() +extern "C" { /** \ingroup msg_mailbox_management * \brief Set the mailbox to receive in asynchronous mode @@ -26,5 +26,4 @@ void MSG_mailbox_set_async(const char *alias){ mailbox->setReceiver(simgrid::s4u::Actor::self()); XBT_VERB("%s mailbox set to receive eagerly for myself\n",alias); } - -SG_END_DECL() +} diff --git a/src/msg/msg_private.hpp b/src/msg/msg_private.hpp index 614994e421..6516a84d50 100644 --- a/src/msg/msg_private.hpp +++ b/src/msg/msg_private.hpp @@ -98,7 +98,7 @@ typedef struct MSG_Global { } s_MSG_Global_t; typedef s_MSG_Global_t* MSG_Global_t; -SG_BEGIN_DECL() +extern "C" { XBT_PUBLIC_DATA(MSG_Global_t) msg_global; @@ -135,8 +135,7 @@ XBT_PRIVATE void TRACE_msg_process_suspend(msg_process_t process); XBT_PRIVATE void TRACE_msg_process_resume(msg_process_t process); XBT_PRIVATE void TRACE_msg_process_sleep_in(msg_process_t process); //called from msg/gos.c XBT_PRIVATE void TRACE_msg_process_sleep_out(msg_process_t process); - -SG_END_DECL() +} inline void simdata_task::setUsed() { diff --git a/src/msg/msg_process.cpp b/src/msg/msg_process.cpp index 27bef10399..465e4cffef 100644 --- a/src/msg/msg_process.cpp +++ b/src/msg/msg_process.cpp @@ -10,7 +10,7 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(msg_process, msg, "Logging specific to MSG (process)"); -SG_BEGIN_DECL() +extern "C" { /** @addtogroup m_process_management * @@ -138,8 +138,7 @@ msg_process_t MSG_process_create_with_environment(const char *name, xbt_main_fun xbt_free(argv); return res; } - -SG_END_DECL() +} msg_process_t MSG_process_create_from_stdfunc(const char* name, std::function code, void* data, msg_host_t host, std::map* properties) @@ -158,7 +157,7 @@ msg_process_t MSG_process_create_from_stdfunc(const char* name, std::functionciface(); } -SG_BEGIN_DECL() +extern "C" { /* Become a process in the simulation * @@ -524,5 +523,4 @@ XBT_PUBLIC(void) MSG_process_unref(msg_process_t process) { intrusive_ptr_release(process); } - -SG_END_DECL() +} diff --git a/src/msg/msg_task.cpp b/src/msg/msg_task.cpp index 6d925d00a4..814282ba9f 100644 --- a/src/msg/msg_task.cpp +++ b/src/msg/msg_task.cpp @@ -6,7 +6,7 @@ #include "msg_private.hpp" #include "src/simix/smx_private.hpp" -SG_BEGIN_DECL() +extern "C" { /** @addtogroup m_task_management * @@ -304,5 +304,4 @@ void MSG_task_set_bound(msg_task_t task, double bound) if (task->simdata->compute) simcall_execution_set_bound(task->simdata->compute, task->simdata->bound); } - -SG_END_DECL() +} diff --git a/src/msg/msg_vm.cpp b/src/msg/msg_vm.cpp index de4310dc8e..50f0f47ffe 100644 --- a/src/msg/msg_vm.cpp +++ b/src/msg/msg_vm.cpp @@ -19,7 +19,7 @@ #include "simgrid/host.h" #include "simgrid/simix.hpp" -SG_BEGIN_DECL() +extern "C" { struct dirty_page { double prev_clock; @@ -830,5 +830,4 @@ void MSG_vm_set_bound(msg_vm_t vm, double bound) { simgrid::simix::kernelImmediate([vm, bound]() { vm->pimpl_vm_->setBound(bound); }); } - -SG_END_DECL() +} diff --git a/src/simdag/simdag_private.hpp b/src/simdag/simdag_private.hpp index b5e52f0251..84cb5ee8b8 100644 --- a/src/simdag/simdag_private.hpp +++ b/src/simdag/simdag_private.hpp @@ -34,7 +34,7 @@ std::set* simulate (double how_long); } } -SG_BEGIN_DECL() +extern "C" { extern XBT_PRIVATE simgrid::sd::Global *sd_global; /* Task */ @@ -71,5 +71,5 @@ XBT_PRIVATE void SD_task_run(SD_task_t task); XBT_PRIVATE bool acyclic_graph_detail(xbt_dynar_t dag); XBT_PRIVATE void uniq_transfer_task_name(SD_task_t task); XBT_PRIVATE const char *__get_state_name(e_SD_task_state_t state); -SG_END_DECL() +} #endif diff --git a/src/simix/ActorImpl.hpp b/src/simix/ActorImpl.hpp index a75c24ee96..5e9b5c27c8 100644 --- a/src/simix/ActorImpl.hpp +++ b/src/simix/ActorImpl.hpp @@ -122,7 +122,7 @@ typedef simgrid::simix::ProcessArg *smx_process_arg_t; typedef simgrid::simix::ActorImpl* smx_actor_t; -SG_BEGIN_DECL() +extern "C" { XBT_PRIVATE smx_actor_t SIMIX_process_create(const char* name, std::function code, void* data, sg_host_t host, std::map* properties, @@ -142,8 +142,7 @@ XBT_PRIVATE smx_actor_t SIMIX_process_get_by_name(const char* name); XBT_PRIVATE void SIMIX_process_auto_restart_set(smx_actor_t process, int auto_restart); extern void (*SMPI_switch_data_segment)(int dest); - -SG_END_DECL() +} XBT_PRIVATE void SIMIX_process_sleep_destroy(smx_activity_t synchro); XBT_PRIVATE smx_activity_t SIMIX_process_join(smx_actor_t issuer, smx_actor_t process, double timeout); diff --git a/src/simix/popping_private.hpp b/src/simix/popping_private.hpp index f02bba88e8..71b10506fe 100644 --- a/src/simix/popping_private.hpp +++ b/src/simix/popping_private.hpp @@ -15,7 +15,7 @@ #include -SG_BEGIN_DECL() +extern "C" { /********************************* Simcalls *********************************/ XBT_PUBLIC_DATA(const char*) simcall_names[]; /* Name of each simcall */ @@ -67,8 +67,7 @@ XBT_PRIVATE void SIMIX_simcall_exit(smx_activity_t synchro); XBT_PRIVATE const char *SIMIX_simcall_name(e_smx_simcall_t kind); XBT_PRIVATE void SIMIX_run_kernel(std::function const* code); XBT_PRIVATE void SIMIX_run_blocking(std::function const* code); - -SG_END_DECL() +} /* Defines the marshal/unmarshal functions for each type of parameters. * diff --git a/src/simix/smx_host_private.hpp b/src/simix/smx_host_private.hpp index 3b45cbff2a..ab59350471 100644 --- a/src/simix/smx_host_private.hpp +++ b/src/simix/smx_host_private.hpp @@ -39,7 +39,7 @@ namespace simgrid { } } -SG_BEGIN_DECL() +extern "C" { XBT_PRIVATE void SIMIX_host_add_auto_restart_process(sg_host_t host, const char* name, std::function code, void* data, double kill_time, std::map* properties, int auto_restart); @@ -49,8 +49,7 @@ XBT_PRIVATE void SIMIX_host_autorestart(sg_host_t host); XBT_PRIVATE void SIMIX_execution_finish(simgrid::kernel::activity::ExecImplPtr exec); XBT_PRIVATE void SIMIX_set_category(smx_activity_t synchro, const char *category); - -SG_END_DECL() +} XBT_PRIVATE boost::intrusive_ptr SIMIX_execution_start(smx_actor_t issuer, const char* name, double flops_amount, double priority, double bound); diff --git a/src/simix/smx_private.hpp b/src/simix/smx_private.hpp index 1f20d8304e..8fd641fcf4 100644 --- a/src/simix/smx_private.hpp +++ b/src/simix/smx_private.hpp @@ -60,7 +60,7 @@ public: } } -SG_BEGIN_DECL() +extern "C" { XBT_PUBLIC_DATA(std::unique_ptr) simix_global; @@ -76,7 +76,6 @@ XBT_PUBLIC(void) SIMIX_clean(); e.value = val; \ _smx_throw_issuer->exception = std::make_exception_ptr(e); \ } else ((void)0) - -SG_END_DECL() +} #endif diff --git a/src/smpi/include/private.hpp b/src/smpi/include/private.hpp index f85d4f2a9b..9504e94524 100644 --- a/src/smpi/include/private.hpp +++ b/src/smpi/include/private.hpp @@ -13,7 +13,7 @@ #include #include -SG_BEGIN_DECL() +extern "C" { #define PERSISTENT 0x1 #define NON_PERSISTENT 0x2 @@ -413,8 +413,7 @@ typedef s_smpi_privatization_region_t* smpi_privatization_region_t; extern XBT_PRIVATE smpi_privatization_region_t smpi_privatization_regions; extern XBT_PRIVATE int smpi_loaded_page; extern XBT_PRIVATE int smpi_universe_size; - -SG_END_DECL() +} /** * Get the address of the beginning of the memory page where addr is located. diff --git a/src/surf/ns3/ns3_interface.hpp b/src/surf/ns3/ns3_interface.hpp index 58ed7d1416..e9966b58e7 100644 --- a/src/surf/ns3/ns3_interface.hpp +++ b/src/surf/ns3/ns3_interface.hpp @@ -22,7 +22,7 @@ public: int node_num; }; -SG_BEGIN_DECL() +extern "C" { XBT_PUBLIC(void) ns3_initialize(const char* TcpProtocol); XBT_PUBLIC(void) @@ -32,7 +32,6 @@ XBT_PUBLIC(void) ns3_simulator(double maxSeconds); XBT_PUBLIC(void*) ns3_add_router(const char* id); XBT_PUBLIC(void) ns3_add_link(NetPointNs3* src, NetPointNs3* dst, double bw, double lat); XBT_PUBLIC(void) ns3_add_cluster(const char* id, double bw, double lat); - -SG_END_DECL() +} #endif diff --git a/src/surf/plugins/host_energy.cpp b/src/surf/plugins/host_energy.cpp index 6e102e470e..1ff949dc58 100644 --- a/src/surf/plugins/host_energy.cpp +++ b/src/surf/plugins/host_energy.cpp @@ -432,7 +432,7 @@ static void onSimulationEnd() } /* **************************** Public interface *************************** */ -SG_BEGIN_DECL() +extern "C" { /** \ingroup plugin_energy * \brief Enable host energy plugin @@ -513,5 +513,4 @@ double sg_host_get_current_consumption(sg_host_t host) double cpu_load = lmm_constraint_get_usage(host->pimpl_cpu->constraint()) / host->getSpeed(); return host->extension()->getCurrentWattsValue(cpu_load); } - -SG_END_DECL() +} diff --git a/src/surf/plugins/host_load.cpp b/src/surf/plugins/host_load.cpp index 99e7a39f35..f1e039a858 100644 --- a/src/surf/plugins/host_load.cpp +++ b/src/surf/plugins/host_load.cpp @@ -139,7 +139,7 @@ static void onActionStateChange(simgrid::surf::CpuAction* action, simgrid::surf: } /* **************************** Public interface *************************** */ -SG_BEGIN_DECL() +extern "C" { /** \ingroup plugin_load * \brief Initializes the HostLoad plugin @@ -185,5 +185,4 @@ void sg_host_load_reset(sg_host_t host) host->extension()->reset(); } - -SG_END_DECL() +} diff --git a/src/surf/surf_private.hpp b/src/surf/surf_private.hpp index 3278c2f601..f42b8c5348 100644 --- a/src/surf/surf_private.hpp +++ b/src/surf/surf_private.hpp @@ -12,7 +12,7 @@ #define NO_MAX_DURATION -1.0 -SG_BEGIN_DECL() +extern "C" { extern XBT_PRIVATE const char *surf_action_state_names[6]; @@ -51,7 +51,6 @@ XBT_PRIVATE void parse_after_config(); /* from surf_instr.c */ void TRACE_surf_host_set_speed(double date, const char *resource, double power); void TRACE_surf_link_set_bandwidth(double date, const char *resource, double bandwidth); - -SG_END_DECL() +} #endif diff --git a/src/surf/trace_mgr.hpp b/src/surf/trace_mgr.hpp index 89bfc16d96..625db0422b 100644 --- a/src/surf/trace_mgr.hpp +++ b/src/surf/trace_mgr.hpp @@ -11,7 +11,7 @@ #include "xbt/sysdep.h" #include -SG_BEGIN_DECL() +extern "C" { /* Iterator within a trace */ typedef struct tmgr_trace_event { @@ -35,8 +35,7 @@ XBT_PUBLIC(void) tmgr_finalize(); XBT_PUBLIC(tmgr_trace_t) tmgr_trace_new_from_file(std::string filename); XBT_PUBLIC(tmgr_trace_t) tmgr_trace_new_from_string(std::string id, std::string input, double periodicity); - -SG_END_DECL() +} namespace simgrid { /** @brief Modeling of the availability profile (due to an external load) or the churn diff --git a/src/surf/xml/platf.hpp b/src/surf/xml/platf.hpp index 17c6f9e155..bd5c32f34d 100644 --- a/src/surf/xml/platf.hpp +++ b/src/surf/xml/platf.hpp @@ -8,7 +8,7 @@ #include -SG_BEGIN_DECL() +extern "C" { /* Module management functions */ XBT_PUBLIC(void) sg_platf_init();; @@ -29,7 +29,6 @@ XBT_PUBLIC(double) surf_parse_get_bandwidth(const char* string, const char* enti XBT_PUBLIC(double) surf_parse_get_speed(const char* string, const char* entity_kind, std::string name); XBT_PUBLIC(int) surf_parse(); /* Entry-point to the parser */ - -SG_END_DECL() +} #endif diff --git a/src/surf/xml/platf_private.hpp b/src/surf/xml/platf_private.hpp index 93958801c9..a4f9047321 100644 --- a/src/surf/xml/platf_private.hpp +++ b/src/surf/xml/platf_private.hpp @@ -15,7 +15,7 @@ #include #include -SG_BEGIN_DECL() +extern "C" { #include "src/surf/xml/simgrid_dtd.h" #ifndef YY_TYPEDEF_YY_SIZE_T @@ -237,8 +237,7 @@ XBT_PUBLIC(void) surf_parse_set_debug(int bdebug); XBT_PUBLIC(int) surf_parse_lex_destroy(); XBT_PUBLIC(void) routing_route_free(sg_platf_route_cbarg_t route); - -SG_END_DECL() +} namespace simgrid { namespace surf { diff --git a/src/surf/xml/surfxml_parseplatf.cpp b/src/surf/xml/surfxml_parseplatf.cpp index 7b6e4c1875..38e43ad2ef 100644 --- a/src/surf/xml/surfxml_parseplatf.cpp +++ b/src/surf/xml/surfxml_parseplatf.cpp @@ -33,7 +33,7 @@ XBT_PRIVATE std::unordered_map trace_connect_list_link XBT_PRIVATE std::unordered_map trace_connect_list_link_bw; XBT_PRIVATE std::unordered_map trace_connect_list_link_lat; -SG_BEGIN_DECL() +extern "C" { void sg_platf_trace_connect(TraceConnectCreationArgs* trace_connect) { xbt_assert(traces_set_list.find(trace_connect->trace) != traces_set_list.end(), @@ -170,5 +170,4 @@ void parse_platform_file(const char *file) surf_parse_error(std::string("Parse error in ") + file); } } - -SG_END_DECL() +} diff --git a/src/surf/xml/surfxml_sax_cb.cpp b/src/surf/xml/surfxml_sax_cb.cpp index b7f147c737..2b16c03ebc 100644 --- a/src/surf/xml/surfxml_sax_cb.cpp +++ b/src/surf/xml/surfxml_sax_cb.cpp @@ -17,7 +17,7 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_parse, surf, "Logging specific to the SURF parsing module"); -SG_BEGIN_DECL() +extern "C" { int ETag_surfxml_include_state(); @@ -1124,5 +1124,4 @@ int surf_parse() { return surf_parse_lex(); } - -SG_END_DECL() +} -- 2.20.1