- msg.expe = gras_trp_select(timeout ? timeout - now + start : 0);
- gras_msg_recv(msg.expe, &msg);
+ TRY {
+ msg.expe = gras_trp_select(timeout ? timeout - now + start : 0);
+ gras_msg_recv(msg.expe, &msg);
+ } CATCH(e) {
+ if (e.category == system_error &&
+ !strncmp("Socket closed by remote side",e.msg,
+ strlen("Socket closed by remote side"))) {
+ xbt_ex_free(e);
+ need_restart=1;
+ } else {
+ RETHROW;
+ }
+ }
+ if (need_restart)
+ goto restart_receive;
+