From: Frederic Suter Date: Thu, 5 Jul 2018 13:08:21 +0000 (+0200) Subject: add C interface to s4u::Barrier X-Git-Tag: v3_21~561 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/d8e688dbb6900e672d3d36acea16bb421ea1a50b add C interface to s4u::Barrier move MSG version to legacy --- diff --git a/include/simgrid/barrier.h b/include/simgrid/barrier.h new file mode 100644 index 0000000000..72f990e695 --- /dev/null +++ b/include/simgrid/barrier.h @@ -0,0 +1,22 @@ +/* Public interface to the Link datatype */ + +/* Copyright (c) 2018. 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 INCLUDE_SIMGRID_BARRIER_H_ +#define INCLUDE_SIMGRID_BARRIER_H_ + +#include + +/* C interface */ +SG_BEGIN_DECL() + +XBT_PUBLIC sg_bar_t sg_barrier_init(unsigned int count); +XBT_PUBLIC void sg_barrier_destroy(sg_bar_t bar); +XBT_PUBLIC int sg_barrier_wait(sg_bar_t bar); + +SG_END_DECL() + +#endif /* INCLUDE_SIMGRID_BARRIER_H_ */ diff --git a/include/simgrid/forward.h b/include/simgrid/forward.h index 4ce7e57926..601cb74567 100644 --- a/include/simgrid/forward.h +++ b/include/simgrid/forward.h @@ -20,6 +20,7 @@ class Actor; using ActorPtr = boost::intrusive_ptr; XBT_PUBLIC void intrusive_ptr_release(Actor* actor); XBT_PUBLIC void intrusive_ptr_add_ref(Actor* actor); +class Barrier; class Comm; using CommPtr = boost::intrusive_ptr; XBT_PUBLIC void intrusive_ptr_release(Comm* c); @@ -128,6 +129,7 @@ class VirtualMachineImpl; } // namespace simgrid typedef simgrid::s4u::Actor s4u_Actor; +typedef simgrid::s4u::Barrier s4u_Barrier; typedef simgrid::s4u::Host s4u_Host; typedef simgrid::s4u::Link s4u_Link; typedef simgrid::s4u::File s4u_File; @@ -147,6 +149,7 @@ typedef simgrid::surf::StorageImpl* surf_storage_t; #else typedef struct s4u_Actor s4u_Actor; +typedef struct s4u_Barrier s4u_Barrier; typedef struct s4u_Host s4u_Host; typedef struct s4u_Link s4u_Link; typedef struct s4u_File s4u_File; @@ -164,6 +167,7 @@ typedef struct s_surf_storage* surf_storage_t; #endif +typedef s4u_Barrier* sg_bar_t; typedef s4u_NetZone* sg_netzone_t; typedef s4u_Host* sg_host_t; typedef s4u_Link* sg_link_t; diff --git a/include/simgrid/msg.h b/include/simgrid/msg.h index b562b47a2a..ea93d1b409 100644 --- a/include/simgrid/msg.h +++ b/include/simgrid/msg.h @@ -7,6 +7,7 @@ #define SIMGRID_MSG_H #include +#include #include #include #include @@ -354,13 +355,7 @@ XBT_PUBLIC int MSG_sem_get_capacity(msg_sem_t sem); XBT_PUBLIC void MSG_sem_destroy(msg_sem_t sem); XBT_PUBLIC int MSG_sem_would_block(msg_sem_t sem); -/** @brief Opaque type representing a barrier identifier - * @ingroup msg_synchro - * @hideinitializer - */ - -#define MSG_BARRIER_SERIAL_PROCESS -1 -typedef struct s_msg_bar_t* msg_bar_t; +typedef sg_bar_t msg_bar_t; XBT_PUBLIC msg_bar_t MSG_barrier_init(unsigned int count); XBT_PUBLIC void MSG_barrier_destroy(msg_bar_t bar); XBT_PUBLIC int MSG_barrier_wait(msg_bar_t bar); diff --git a/src/msg/msg_legacy.cpp b/src/msg/msg_legacy.cpp index bb1148f6cf..fc75415c81 100644 --- a/src/msg/msg_legacy.cpp +++ b/src/msg/msg_legacy.cpp @@ -358,3 +358,18 @@ 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); +} diff --git a/src/msg/msg_synchro.cpp b/src/msg/msg_synchro.cpp index bce88e5312..99290b1a17 100644 --- a/src/msg/msg_synchro.cpp +++ b/src/msg/msg_synchro.cpp @@ -54,45 +54,4 @@ int MSG_sem_would_block(msg_sem_t sem) { return simgrid::simix::simcall([sem] { return SIMIX_sem_would_block(sem); }); } -/*-**** barrier related functions ****-*/ -struct s_msg_bar_t { - xbt_mutex_t mutex; - xbt_cond_t cond; - unsigned int arrived_processes; - unsigned int expected_processes; -}; - -/** @brief Initializes a barrier, with count elements */ -msg_bar_t MSG_barrier_init(unsigned int count) { - msg_bar_t bar = new s_msg_bar_t; - bar->expected_processes = count; - bar->arrived_processes = 0; - bar->mutex = xbt_mutex_init(); - bar->cond = xbt_cond_init(); - return bar; -} - -/** @brief Initializes a barrier, with count elements */ -void MSG_barrier_destroy(msg_bar_t bar) { - xbt_mutex_destroy(bar->mutex); - xbt_cond_destroy(bar->cond); - delete bar; -} - -/** @brief Performs a barrier already initialized */ -int MSG_barrier_wait(msg_bar_t bar) { - xbt_mutex_acquire(bar->mutex); - bar->arrived_processes++; - XBT_DEBUG("waiting %p %u/%u", bar, bar->arrived_processes, bar->expected_processes); - if (bar->arrived_processes == bar->expected_processes) { - xbt_cond_broadcast(bar->cond); - xbt_mutex_release(bar->mutex); - bar->arrived_processes = 0; - return MSG_BARRIER_SERIAL_PROCESS; - } - - xbt_cond_wait(bar->cond, bar->mutex); - xbt_mutex_release(bar->mutex); - return 0; -} /**@}*/ diff --git a/src/s4u/s4u_Barrier.cpp b/src/s4u/s4u_Barrier.cpp index 482a16426d..713245c9e1 100644 --- a/src/s4u/s4u_Barrier.cpp +++ b/src/s4u/s4u_Barrier.cpp @@ -9,6 +9,7 @@ #include #include +#include "simgrid/barrier.h" #include "simgrid/s4u/Barrier.hpp" #include "simgrid/simix.h" @@ -44,3 +45,22 @@ int Barrier::wait() } } // namespace s4u } // namespace simgrid + +/* **************************** Public C interface *************************** */ + +sg_bar_t sg_barrier_init(unsigned int count) +{ + return new simgrid::s4u::Barrier(count); +} + +/** @brief Initializes a barrier, with count elements */ +void sg_barrier_destroy(sg_bar_t bar) +{ + delete bar; +} + +/** @brief Performs a barrier already initialized */ +int sg_barrier_wait(sg_bar_t bar) +{ + return bar->wait(); +} diff --git a/tools/cmake/DefinePackages.cmake b/tools/cmake/DefinePackages.cmake index 588be4aaaa..493b62f5e4 100644 --- a/tools/cmake/DefinePackages.cmake +++ b/tools/cmake/DefinePackages.cmake @@ -662,6 +662,7 @@ set(headers_to_install include/simgrid_config.h include/simgrid/actor.h + include/simgrid/barrier.h include/simgrid/engine.h include/simgrid/chrono.hpp include/simgrid/plugins/dvfs.h