Robustness of IC and erl_interface

Steve Langstaff <>
Tue Apr 10 12:12:39 CEST 2001


Hi all. Question for all you IC/erl_interface gurus out there:

For a call from a C-node to an Erlang genserver (names changed to protect 
the guilty!):

module mod {
	interface intf {
		void call(
			in unsigned long param1,
			in unsigned long param2,
			in unsigned long param3,
			in unsigned long param4,
			in unsigned long param5,
			in unsigned long param6,
			in unsigned long param7
		);
	}
}

IC generates something like the following code:

void mod_intf_call(mod_intf oe_obj, CORBA_unsigned_long param1, 
CORBA_unsigned_long param2, CORBA_unsigned_long param3, CORBA_unsigned_long 
param4, CORBA_unsigned_long param5, CORBA_unsigned_long param6, 
CORBA_unsigned_long param7, CORBA_Environment *oe_env) {

  int oe_msgType = 0;
  erlang_msg oe_msg;

  /* Initiating the message reference */
  ic_init_ref(oe_env,&oe_env->_unique);

  /* Initiating exception indicator */
  oe_env->_major = CORBA_NO_EXCEPTION;

  /* Creating call message */
  if (mod_intf_call__client_enc(oe_obj, param1, param2, param3, param4, 
param5, param6, param7, oe_env) < 0) {
    if (oe_env->_major == CORBA_NO_EXCEPTION)
      CORBA_exc_set(oe_env, CORBA_SYSTEM_EXCEPTION, MARSHAL, "Cannot encode 
message");
  }

  /* Sending call request */
  if (oe_env->_major == CORBA_NO_EXCEPTION) {
    if (strlen(oe_env->_regname) == 0) {
      if (ei_send_encoded(oe_env->_fd, oe_env->_to_pid, oe_env->_outbuf, 
oe_env->_iout) < 0) {
        CORBA_exc_set(oe_env, CORBA_SYSTEM_EXCEPTION, NO_RESPONSE, "Cannot 
connect to server");
      }
    }
    else if (ei_send_reg_encoded(oe_env->_fd, oe_env->_from_pid, 
oe_env->_regname, oe_env->_outbuf, oe_env->_iout) < 0) {
      CORBA_exc_set(oe_env, CORBA_SYSTEM_EXCEPTION, NO_RESPONSE, "Cannot 
connect to server");
    }
  }

  /* Receiving reply message */
  if (oe_env->_major == CORBA_NO_EXCEPTION)
    do {
      if ((oe_msgType = ei_receive_encoded(oe_env->_fd, &oe_env->_inbuf, 
&oe_env->_inbufsz, &oe_msg, &oe_env->_iin)) < 0) {
        CORBA_exc_set(oe_env, CORBA_SYSTEM_EXCEPTION, MARSHAL, "Cannot 
decode message");
        break;
      }
    } while (oe_msgType != ERL_SEND && oe_msgType != ERL_REG_SEND);

  /* Extracting message header */
  if (oe_env->_major == CORBA_NO_EXCEPTION)
    if (mod_intf__receive_info(oe_obj, oe_env) < 0) {
      CORBA_exc_set(oe_env, CORBA_SYSTEM_EXCEPTION, MARSHAL, "Bad 
message");
  }

  /* Extracting message tail */
  if (oe_env->_major == CORBA_NO_EXCEPTION)
    if (mod_intf_call__client_dec(oe_obj, oe_env) < 0) {
      CORBA_exc_set(oe_env, CORBA_SYSTEM_EXCEPTION, MARSHAL, "Bad message 
tail");
    }
}

This works OK for the simple case, but what happens if my genserver exits 
before sending a response
(or the node that it's on fails, or...)?

Will my C-node be hung waiting for a response until TCP/IP times out (maybe 
a couple of hours)?

Any ideas on how I could make this more responsive to failure, maybe with a 
client-side timeout
specified somehow?

--
Steve L.




More information about the erlang-questions mailing list