res->msg_waitqueue = xbt_dynar_new(sizeof(s_gras_msg_t), NULL);
res->cbl_list = xbt_dynar_new(sizeof(gras_cblist_t *),gras_cbl_free);
res->timers = xbt_dynar_new(sizeof(s_gras_timer_t), NULL);
+ res->msg_to_receive_queue = xbt_fifo_new();
+ res->msg_to_receive_queue_meas = xbt_fifo_new();
return (void*)res;
}
xbt_dynar_free(&( res->msg_waitqueue ));
xbt_dynar_free(&( res->cbl_list ));
xbt_dynar_free(&( res->timers ));
+ xbt_fifo_free( res->msg_to_receive_queue );
+ xbt_fifo_free( res->msg_to_receive_queue_meas );
free(res->name);
free(res);
*/
void
-gras_msg_wait_ext(double timeout,
+gras_msg_wait_ext_(double timeout,
gras_msgtype_t msgt_want,
gras_socket_t expe_want,
* and used by subsequent call to this function or gras_msg_handle().
*/
void
-gras_msg_wait(double timeout,
- gras_msgtype_t msgt_want,
- gras_socket_t *expeditor,
- void *payload) {
+gras_msg_wait_(double timeout,
+ gras_msgtype_t msgt_want,
+ gras_socket_t *expeditor,
+ void *payload) {
s_gras_msg_t msg;
- gras_msg_wait_ext(timeout,
- msgt_want, NULL, NULL, NULL,
- &msg);
+ gras_msg_wait_ext_(timeout,
+ msgt_want, NULL, NULL, NULL,
+ &msg);
if (msgt_want->ctn_type) {
xbt_assert1(payload,
s_gras_msg_t msg;
VERB1("Wait %f seconds for several message types",timeout);
- gras_msg_wait_ext(timeout,
- NULL, NULL,
- &gras_msg_wait_or_filter, (void*)msgt_want,
- &msg);
+ gras_msg_wait_ext_(timeout,
+ NULL, NULL,
+ &gras_msg_wait_or_filter, (void*)msgt_want,
+ &msg);
if (msg.type->ctn_type) {
xbt_assert1(payload,
/** \brief Send the data pointed by \a payload as a message of type
* \a msgtype to the peer \a sock */
void
-gras_msg_send(gras_socket_t sock,
+gras_msg_send_(gras_socket_t sock,
gras_msgtype_t msgtype,
void *payload) {
if (!ran_ok) {
DEBUG4("Use the callback #%d (@%p) for incomming msg %s (payload_size=%d)",
cpt+1,cb,msg.type->name,msg.payl_size);
- if ((*cb)(&ctx,msg.payl)) {
+ if (!(*cb)(&ctx,msg.payl)) {
/* cb handled the message */
free(msg.payl);
ran_ok = 1;
} CATCH(e) {
free(msg.payl);
if (msg.type->kind == e_gras_msg_kind_rpccall) {
+ char *old_file=e.file;
/* The callback raised an exception, propagate it on the network */
- if (!e.remote) { /* the exception is born on this machine */
+ if (!e.remote) {
+ /* Make sure we reduce the file name to its basename to avoid issues in tests */
+ char *new_file=strrchr(e.file,'/');
+ if (new_file)
+ e.file = new_file;
+ /* the exception is born on this machine */
e.host = (char*)gras_os_myname();
xbt_ex_setup_backtrace(&e);
}
gras_socket_peer_port(msg.expe));
gras_msg_send_ext(msg.expe, e_gras_msg_kind_rpcerror,
msg.ID, msg.type, &e);
+ e.file=old_file;
xbt_ex_free(e);
ctx.answer_due = 0;
ran_ok=1;
/** \brief Bind the given callback to the given message type
*
* Several callbacks can be attached to a given message type. The lastly added one will get the message first, and
- * if it returns false, the message will be passed to the second one.
+ * if it returns a non-null value, the message will be passed to the second one.
* And so on until one of the callbacks accepts the message.
*/
void
-gras_cb_register(gras_msgtype_t msgtype,
- gras_msg_cb_t cb) {
+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_cblist_t *list=NULL;
int cpt;
/** \brief Unbind the given callback from the given message type */
void
-gras_cb_unregister(gras_msgtype_t msgtype,
- gras_msg_cb_t cb) {
+gras_cb_unregister_(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_cblist_t *list;