X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/62a02b51b60cd69b26262eae02423f1d7da31b43..208debc0db79d1901a4655d3015218bb4700cd8c:/src/gras/Msg/msg.c diff --git a/src/gras/Msg/msg.c b/src/gras/Msg/msg.c index 7390f13828..23ceb57b3c 100644 --- a/src/gras/Msg/msg.c +++ b/src/gras/Msg/msg.c @@ -9,6 +9,9 @@ under the terms of the license (GNU LGPL) which comes with this package. */ #include "Msg/msg_private.h" +#include "DataDesc/datadesc_interface.h" +#include "Transport/transport_interface.h" /* gras_trp_chunk_send/recv */ +#include "Virtu/virtu_interface.h" GRAS_LOG_NEW_DEFAULT_SUBCATEGORY(msg,GRAS); @@ -91,9 +94,8 @@ static char *make_namev(const char *name, short int ver) { */ gras_error_t gras_msgtype_declare(const char *name, - gras_datadesc_type_t *payload, - gras_msgtype_t **dst) { - return gras_msgtype_declare_v(name, 0, payload, dst); + gras_datadesc_type_t *payload) { + return gras_msgtype_declare_v(name, 0, payload); } /** @@ -111,8 +113,7 @@ gras_msgtype_declare(const char *name, gras_error_t gras_msgtype_declare_v(const char *name, short int version, - gras_datadesc_type_t *payload, - gras_msgtype_t **dst) { + gras_datadesc_type_t *payload) { gras_error_t errcode; gras_msgtype_t *msgtype; @@ -131,6 +132,9 @@ gras_msgtype_declare_v(const char *name, "Message %s re-registred with another payload (%s was %s)", namev,gras_datadesc_get_name(payload), gras_datadesc_get_name(msgtype->ctn_type)); + + return no_error; /* do really ignore it */ + } else if (errcode == mismatch_error) { INFO3("Register version %d of message '%s' (payload: %s).", version, name, gras_datadesc_get_name(payload)); @@ -138,8 +142,6 @@ gras_msgtype_declare_v(const char *name, return errcode; /* Was expecting for mismatch_error */ } - /* create type anyway so that the old type gets removed from here, and - hopefully free'd when ref counter gets 0 */ if (! (msgtype = malloc(sizeof(gras_msgtype_t))) ) RAISE_MALLOC; @@ -147,11 +149,10 @@ gras_msgtype_declare_v(const char *name, msgtype->name_len = strlen(namev); msgtype->version = version; msgtype->ctn_type = payload; - gras_datadesc_ref(payload); TRY(gras_set_add(_gras_msgtype_set, (gras_set_elm_t*)msgtype, &gras_msgtype_free)); - + return no_error; } @@ -160,30 +161,29 @@ gras_msgtype_declare_v(const char *name, * * Retrieve a datatype description from its name */ -gras_error_t -gras_msgtype_by_name (const char *name, - gras_msgtype_t **dst) { - return gras_msgtype_by_namev(name,0,dst); +gras_msgtype_t * gras_msgtype_by_name (const char *name) { + return gras_msgtype_by_namev(name,0); } /** * gras_msgtype_by_namev: * * Retrieve a datatype description from its name and version */ -gras_error_t -gras_msgtype_by_namev(const char *name, - short int version, - gras_msgtype_t **dst) { +gras_msgtype_t * gras_msgtype_by_namev(const char *name, + short int version) { + gras_msgtype_t *res; gras_error_t errcode; char *namev = make_namev(name,version); errcode = gras_set_get_by_name(_gras_msgtype_set, namev, - (gras_set_elm_t**)dst); + (gras_set_elm_t**)&res); + if (errcode != no_error) + res = NULL; if (name != namev) free(namev); - - return errcode; + + return res; } /** @@ -198,15 +198,23 @@ gras_msg_send(gras_socket_t *sock, gras_error_t errcode; static gras_datadesc_type_t *string_type=NULL; + + if (!msgtype) + RAISE0(mismatch_error, + "Cannot send the NULL message (did msgtype_by_name fail?)"); + if (!string_type) { string_type = gras_datadesc_by_name("string"); gras_assert(string_type); } - + + DEBUG3("send '%s' to %s:%d", msgtype->name, + gras_socket_peer_name(sock),gras_socket_peer_port(sock)); TRY(gras_trp_chunk_send(sock, GRAS_header, 6)); TRY(gras_datadesc_send(sock, string_type, &msgtype->name)); TRY(gras_datadesc_send(sock, msgtype->ctn_type, payload)); + TRY(gras_trp_flush(sock)); return no_error; } @@ -241,12 +249,17 @@ gras_msg_recv(gras_socket_t *sock, RAISE2(mismatch_error,"GRAS protocol mismatch (got %d, use %d)", (int)header[4], (int)GRAS_header[4]); r_arch = (int)header[5]; - DEBUG2("Handle an incoming message using protocol %d from arch %s", + DEBUG2("Handle an incoming message using protocol %d (remote is %s)", (int)header[4],gras_datadesc_arch_name(r_arch)); TRY(gras_datadesc_recv(sock, string_type, r_arch, &msg_name)); - TRY(gras_set_get_by_name(_gras_msgtype_set, - msg_name,(gras_set_elm_t**)msgtype)); + errcode = gras_set_get_by_name(_gras_msgtype_set, + msg_name,(gras_set_elm_t**)msgtype); + if (errcode != no_error) + RAISE2(errcode, + "Got error %s while retrieving the type associated to messages '%s'", + gras_error_name(errcode),msg_name); + /* FIXME: Survive unknown messages */ free(msg_name); *payload_size=gras_datadesc_size((*msgtype)->ctn_type); @@ -289,9 +302,13 @@ gras_msg_wait(double timeout, *expeditor = NULL; payload_got = NULL; + if (!msgt_want) + RAISE0(mismatch_error, + "Cannot wait for the NULL message (did msgtype_by_name fail?)"); + VERB1("Waiting for message %s",msgt_want->name); - start = now = gras_time(); + start = now = gras_os_time(); gras_dynar_foreach(pd->msg_queue,cpt,msg){ if (msg.type->code == msgt_want->code) { @@ -321,7 +338,7 @@ gras_msg_wait(double timeout, msg.payload_size = payload_size_got; TRY(gras_dynar_push(pd->msg_queue,&msg)); - now=gras_time(); + now=gras_os_time(); if (now - start + 0.001 < timeout) { RAISE1(timeout_error,"Timeout while waiting for msg %s",msgt_want->name); } @@ -400,6 +417,15 @@ gras_msg_handle(double timeOut) { return mismatch_error; } +void +gras_cbl_free(void *data){ + gras_cblist_t *list=*(void**)data; + if (list) { + gras_dynar_free(list->cbs); + free(list); + } +} + gras_error_t gras_cb_register(gras_msgtype_t *msgtype, gras_cb_t cb) {