-/* $Id$ */
-
/* gras message types and callback registering and retrieving */
-/* Copyright (c) 2003, 2004, 2005, 2006, 2007 Martin Quinson. */
-/* All rights reserved. */
+/* Copyright (c) 2007, 2009, 2010. 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 "xbt/ex.h"
#include "gras/Msg/msg_private.h"
#include "gras/Virtu/virtu_interface.h"
-#include "gras/DataDesc/datadesc_interface.h"
+#include "xbt/datadesc/datadesc_interface.h"
XBT_LOG_NEW_DEFAULT_SUBCATEGORY(gras_msg, gras, "High level messaging");
xbt_set_cursor_t cursor;
gras_msgtype_t msgtype = NULL;
- INFO0("Dump of all registered messages:");
+ XBT_INFO("Dump of all registered messages:");
xbt_set_foreach(_gras_msgtype_set, cursor, msgtype) {
- INFO6(" Message name: %s (v%d) %s; %s%s%s",
+ XBT_INFO(" Message name: %s (v%d) %s; %s%s%s",
msgtype->name, msgtype->version,
e_gras_msg_kind_names[msgtype->kind],
- gras_datadesc_get_name(msgtype->ctn_type),
+ xbt_datadesc_get_name(msgtype->ctn_type),
(msgtype->kind == e_gras_msg_kind_rpccall ? " -> " : ""),
(msgtype->kind ==
e_gras_msg_kind_rpccall ?
- gras_datadesc_get_name(msgtype->answer_type) : ""));
+ xbt_datadesc_get_name(msgtype->answer_type) : ""));
}
}
gras_msgtype_declare_ext(const char *name,
short int version,
e_gras_msg_kind_t kind,
- gras_datadesc_type_t payload_request,
- gras_datadesc_type_t payload_answer)
+ xbt_datadesc_type_t payload_request,
+ xbt_datadesc_type_t payload_answer)
{
gras_msgtype_t msgtype = NULL;
char *namev = make_namev(name, version);
- volatile int found = 0;
- xbt_ex_t e;
- TRY {
- msgtype = (gras_msgtype_t) xbt_set_get_by_name(_gras_msgtype_set, namev);
- found = 1;
- } CATCH(e) {
- if (e.category != not_found_error) {
- xbt_free(namev);
- RETHROW;
- }
- xbt_ex_free(e);
- }
+ msgtype = (gras_msgtype_t) xbt_set_get_by_name_or_null(
+ _gras_msgtype_set, (const char*) namev);
- if (found) {
- VERB2
- ("Re-register version %d of message '%s' (same kind & payload, ignored).",
- version, name);
- xbt_assert3(msgtype->kind == kind,
+ if (msgtype != NULL) {
+ XBT_DEBUG
+ ("Re-register version %d of message '%s' (same kind & payload, ignored).",
+ version, name);
+ xbt_assert(msgtype->kind == kind,
"Message %s re-registered as a %s (it was known as a %s)",
namev, e_gras_msg_kind_names[kind],
e_gras_msg_kind_names[msgtype->kind]);
- xbt_assert3(!gras_datadesc_type_cmp(msgtype->ctn_type, payload_request),
- "Message %s re-registred with another payload (%s was %s)",
- namev, gras_datadesc_get_name(payload_request),
- gras_datadesc_get_name(msgtype->ctn_type));
-
- xbt_assert3(!gras_datadesc_type_cmp(msgtype->answer_type, payload_answer),
- "Message %s re-registred with another answer payload (%s was %s)",
- namev, gras_datadesc_get_name(payload_answer),
- gras_datadesc_get_name(msgtype->answer_type));
+ xbt_assert(!xbt_datadesc_type_cmp
+ (msgtype->ctn_type, payload_request),
+ "Message %s re-registered with another payload (%s was %s)",
+ namev, xbt_datadesc_get_name(payload_request),
+ xbt_datadesc_get_name(msgtype->ctn_type));
+
+ xbt_assert(!xbt_datadesc_type_cmp
+ (msgtype->answer_type, payload_answer),
+ "Message %s re-registered with another answer payload (%s was %s)",
+ namev, xbt_datadesc_get_name(payload_answer),
+ xbt_datadesc_get_name(msgtype->answer_type));
xbt_free(namev);
return; /* do really ignore it */
}
- VERB4("Register version %d of message '%s' "
+ XBT_VERB("Register version %d of message '%s' "
"(payload: %s; answer payload: %s).",
- version, name, gras_datadesc_get_name(payload_request),
- gras_datadesc_get_name(payload_answer));
+ version, name, xbt_datadesc_get_name(payload_request),
+ xbt_datadesc_get_name(payload_answer));
msgtype = xbt_new(s_gras_msgtype_t, 1);
msgtype->name = namev;
msgtype->ctn_type = payload_request;
msgtype->answer_type = payload_answer;
- xbt_set_add(_gras_msgtype_set, (xbt_set_elm_t) msgtype, &gras_msgtype_free);
+ xbt_set_add(_gras_msgtype_set, (xbt_set_elm_t) msgtype,
+ &gras_msgtype_free);
}
* @param name: name as it should be used for logging messages (must be uniq)
* @param payload: datadescription of the payload
*/
-void gras_msgtype_declare(const char *name, gras_datadesc_type_t payload)
+void gras_msgtype_declare(const char *name, xbt_datadesc_type_t payload)
{
gras_msgtype_declare_ext(name, 0, e_gras_msg_kind_oneway, payload, NULL);
}
*/
void
gras_msgtype_declare_v(const char *name,
- short int version, gras_datadesc_type_t payload)
+ short int version, xbt_datadesc_type_t payload)
{
gras_msgtype_declare_ext(name, version,
TRY {
res = gras_msgtype_by_namev(name, 0);
- } CATCH(e) {
+ }
+ CATCH(e) {
res = NULL;
xbt_ex_free(e);
}
{
gras_msgtype_t res = NULL;
char *namev = make_namev(name, version);
- volatile int found = 0;
- xbt_ex_t e;
-
- TRY {
- res = (gras_msgtype_t) xbt_set_get_by_name(_gras_msgtype_set, namev);
- found = 1;
- } CATCH(e) {
- xbt_ex_free(e);
- }
- if (!found)
- THROW1(not_found_error, 0, "No registred message of that name: %s", name);
+ res = (gras_msgtype_t) xbt_set_get_by_name_or_null(_gras_msgtype_set, namev);
free(namev);
+ if (res == NULL)
+ THROWF(not_found_error, 0, "No registered message of that name: %s",
+ name);
+
return res;
}
return (gras_msgtype_t) xbt_set_get_by_id(_gras_msgtype_set, id);
}
+/* ******************************************************************** */
+/* GETTERS */
+/* ******************************************************************** */
+
+XBT_INLINE const char *gras_msgtype_get_name(gras_msgtype_t type)
+{
+ return type->name;
+}
/* ******************************************************************** */
void gras_cb_register_(gras_msgtype_t msgtype, gras_msg_cb_t cb)
{
gras_msg_procdata_t pd =
- (gras_msg_procdata_t) gras_libdata_by_id(gras_msg_libdata_id);
+ (gras_msg_procdata_t) gras_libdata_by_id(gras_msg_libdata_id);
gras_cblist_t *list = NULL;
unsigned int cpt;
- DEBUG2("Register %p as callback to '%s'", cb, msgtype->name);
+ XBT_DEBUG("Register %p as callback to '%s'", cb, msgtype->name);
/* search the list of cb for this message on this host (creating if NULL) */
xbt_dynar_foreach(pd->cbl_list, cpt, list) {
{
gras_msg_procdata_t pd =
- (gras_msg_procdata_t) gras_libdata_by_id(gras_msg_libdata_id);
+ (gras_msg_procdata_t) gras_libdata_by_id(gras_msg_libdata_id);
gras_cblist_t *list;
gras_msg_cb_t cb_cpt;
unsigned int cpt;
}
}
if (!found)
- VERB1("Ignoring removal of unexisting callback to msg id %d",
+ XBT_VERB("Ignoring removal of unexisting callback to msg id %u",
msgtype->code);
}
/** \brief Retrieve the expeditor of the message */
-gras_socket_t gras_msg_cb_ctx_from(gras_msg_cb_ctx_t ctx)
+xbt_socket_t gras_msg_cb_ctx_from(gras_msg_cb_ctx_t ctx)
{
return ctx->expeditor;
}
/* \brief Creates a new message exchange context (user should never have to) */
-gras_msg_cb_ctx_t gras_msg_cb_ctx_new(gras_socket_t expe,
+gras_msg_cb_ctx_t gras_msg_cb_ctx_new(xbt_socket_t expe,
gras_msgtype_t msgtype,
unsigned long int ID,
int answer_due, double timeout)