Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
add C interface to s4u::Barrier
authorFrederic Suter <frederic.suter@cc.in2p3.fr>
Thu, 5 Jul 2018 13:08:21 +0000 (15:08 +0200)
committerFrederic Suter <frederic.suter@cc.in2p3.fr>
Thu, 5 Jul 2018 13:08:21 +0000 (15:08 +0200)
move MSG version to legacy

include/simgrid/barrier.h [new file with mode: 0644]
include/simgrid/forward.h
include/simgrid/msg.h
src/msg/msg_legacy.cpp
src/msg/msg_synchro.cpp
src/s4u/s4u_Barrier.cpp
tools/cmake/DefinePackages.cmake

diff --git a/include/simgrid/barrier.h b/include/simgrid/barrier.h
new file mode 100644 (file)
index 0000000..72f990e
--- /dev/null
@@ -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 <simgrid/forward.h>
+
+/* 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_ */
index 4ce7e57..601cb74 100644 (file)
@@ -20,6 +20,7 @@ class Actor;
 using ActorPtr = boost::intrusive_ptr<Actor>;
 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<Comm>;
 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;
index b562b47..ea93d1b 100644 (file)
@@ -7,6 +7,7 @@
 #define SIMGRID_MSG_H
 
 #include <simgrid/actor.h>
+#include <simgrid/barrier.h>
 #include <simgrid/engine.h>
 #include <simgrid/forward.h>
 #include <simgrid/host.h>
@@ -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);
index bb1148f..fc75415 100644 (file)
@@ -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);
+}
index bce88e5..99290b1 100644 (file)
@@ -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;
-}
 /**@}*/
index 482a164..713245c 100644 (file)
@@ -9,6 +9,7 @@
 #include <xbt/ex.hpp>
 #include <xbt/log.hpp>
 
+#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();
+}
index 588be4a..493b62f 100644 (file)
@@ -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