+/* Internal function doing the crude work of registering messages */
+void
+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) {
+
+ 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)
+ RETHROW;
+ xbt_ex_free(e);
+ }
+
+ if (found) {
+ VERB2("Re-register version %d of message '%s' (same kind & payload, ignored).",
+ version, name);
+ xbt_assert3(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));
+
+ return ; /* do really ignore it */
+
+ }
+
+ VERB4("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));
+
+ msgtype = xbt_new(s_gras_msgtype_t,1);
+ msgtype->name = (namev == name ? strdup(name) : namev);
+ msgtype->name_len = strlen(namev);
+ msgtype->version = version;
+ msgtype->kind = kind;
+ msgtype->ctn_type = payload_request;
+ msgtype->answer_type = payload_answer;
+
+ xbt_set_add(_gras_msgtype_set, (xbt_set_elm_t)msgtype,
+ &gras_msgtype_free);
+}
+
+