From: Martin Quinson Date: Thu, 6 Jun 2013 16:21:24 +0000 (+0200) Subject: Make semaphores visible from MSG X-Git-Tag: v3_9_90~326 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/40803b27ba5bcb382dfcd593885313a975bafd89 Make semaphores visible from MSG --- diff --git a/ChangeLog b/ChangeLog index 5a6b8c6bb5..42fc2cbf60 100644 --- a/ChangeLog +++ b/ChangeLog @@ -14,7 +14,8 @@ SimGrid (3.10) NOT RELEASED; urgency=low MSG: * Dramatically change the way files are handled. API and internals changed, but - this part of MSG was not considered as production grade either. + this part of MSG was not considered as production grade either. + * Add explicit synchronization facilities through semaphores SMPI: * SMPI is now included directly in the libsimgrid as the windows diff --git a/buildtools/Cmake/DefinePackages.cmake b/buildtools/Cmake/DefinePackages.cmake index 9f79fece75..74adcb8f38 100644 --- a/buildtools/Cmake/DefinePackages.cmake +++ b/buildtools/Cmake/DefinePackages.cmake @@ -330,6 +330,7 @@ set(MSG_SRC src/msg/msg_io.c src/msg/msg_mailbox.c src/msg/msg_process.c + src/msg/msg_synchro.c src/msg/msg_task.c src/msg/msg_vm.c ) diff --git a/doc/doxygen/module-msg.doc b/doc/doxygen/module-msg.doc index 2241a153d3..d652b971a7 100644 --- a/doc/doxygen/module-msg.doc +++ b/doc/doxygen/module-msg.doc @@ -29,6 +29,7 @@ us before digging into these badly documented internal modules). - \ref msg_file_management - \ref msg_task_usage - \ref msg_VMs + - \ref msg_synchro - \ref msg_trace_driven - \ref MSG_examples - \ref msg_deprecated_functions @@ -92,6 +93,14 @@ details). * by a process to execute, communicate or otherwise handle some task. */ +/** @defgroup msg_synchro Explicit Synchronization Functions + * @ingroup MSG_API + * @brief This section describes several explicit synchronization + * mechanisms existing in MSG: semaphores (#msg_sem_t) and friends. + * + * In some situations, these things are very helpful to synchronize processes without message exchanges. + */ + /** @defgroup msg_VMs VMs * @ingroup MSG_API * @brief This section describes the interface created to mimic IaaS clouds. diff --git a/include/msg/msg.h b/include/msg/msg.h index 891eb33f9a..9a5aa26c8e 100644 --- a/include/msg/msg.h +++ b/include/msg/msg.h @@ -351,6 +351,19 @@ XBT_PUBLIC(msg_error_t) MSG_set_channel_number(int number); XBT_PUBLIC(int) MSG_get_channel_number(void); #endif +/** @brief Opaque type representing a semaphore + * @ingroup msg_synchro + * @hideinitializer + */ +typedef struct s_smx_sem *msg_sem_t; // Yeah that's a rename of the smx_sem_t which doesnt require smx_sem_t to be declared here +XBT_PUBLIC(msg_sem_t) MSG_sem_init(int initial_value); +XBT_PUBLIC(void) MSG_sem_acquire(msg_sem_t sem); +XBT_PUBLIC(msg_error_t) MSG_sem_acquire_timeout(msg_sem_t sem, double timeout); +XBT_PUBLIC(void) MSG_sem_release(msg_sem_t sem); +XBT_PUBLIC(void) 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 describing a Virtual Machine. * @ingroup msg_VMs * diff --git a/src/msg/msg_synchro.c b/src/msg/msg_synchro.c new file mode 100644 index 0000000000..f06e6bbe25 --- /dev/null +++ b/src/msg/msg_synchro.c @@ -0,0 +1,66 @@ +/* Copyright (c) 2013 Da 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.h" +#include "xbt/sysdep.h" +#include "xbt/log.h" + +XBT_LOG_NEW_DEFAULT_SUBCATEGORY(msg_synchro, msg, + "Logging specific to MSG (synchro)"); + + +/** @addtogroup msg_synchro + * + * @{ + */ + +/********************************* Host **************************************/ + +/** @brief creates a semaphore object of the given initial capacity */ +msg_sem_t MSG_sem_init(int initial_value) { + return simcall_sem_init(initial_value); +} + +/** @brief locks on a semaphore object */ +void MSG_sem_acquire(msg_sem_t sem) { + simcall_sem_acquire(sem); +} +/** @brief locks on a semaphore object up until the provided timeout expires */ +msg_error_t MSG_sem_acquire_timeout(msg_sem_t sem, double timeout) { + xbt_ex_t e; + msg_error_t res = MSG_OK; + TRY { + simcall_sem_acquire_timeout(sem,timeout); + } CATCH(e) { + if (e.category == timeout_error) { + res = MSG_TIMEOUT; + xbt_ex_free(e); + } else { + RETHROW; + } + } + return res; +} +/** @brief releases the semaphore object */ +void MSG_sem_release(msg_sem_t sem) { + simcall_sem_release(sem); +} +void MSG_sem_get_capacity(msg_sem_t sem) { + simcall_sem_get_capacity(sem); +} + +void MSG_sem_destroy(msg_sem_t sem) { + simcall_sem_destroy(sem); +} +/** @brief returns a boolean indicating it this semaphore would block at this very specific time + * + * Note that the returned value may be wrong right after the function call, when you try to use it... + * But that's a classical semaphore issue, and SimGrid's semaphore are not different to usual ones here. + */ +int MSG_sem_would_block(msg_sem_t sem) { + return simcall_sem_would_block(sem); +} + +/**@}*/ diff --git a/src/surf/surf_routing_dijkstra.c b/src/surf/surf_routing_dijkstra.c index 4b0d4c96b1..d225cd4621 100644 --- a/src/surf/surf_routing_dijkstra.c +++ b/src/surf/surf_routing_dijkstra.c @@ -51,7 +51,7 @@ static void graph_node_map_elem_free(void *e) xbt_free(elm); } -static void graph_edge_data_free(void *e) // FIXME: useless code dupplication +static void graph_edge_data_free(void *e) // FIXME: useless code duplication { sg_platf_route_cbarg_t e_route = (sg_platf_route_cbarg_t) e; if (e_route) { diff --git a/src/xbt/log.c b/src/xbt/log.c index 2bcb103852..c560de6d9f 100644 --- a/src/xbt/log.c +++ b/src/xbt/log.c @@ -638,6 +638,7 @@ static void xbt_log_connect_categories(void) XBT_LOG_CONNECT(msg_mailbox); XBT_LOG_CONNECT(msg_new_API); XBT_LOG_CONNECT(msg_process); + XBT_LOG_CONNECT(msg_synchro); XBT_LOG_CONNECT(msg_task); XBT_LOG_CONNECT(msg_vm);