예제 #1
0
/*===========================================================================*
 *				  sef_lu_ready				     *
 *===========================================================================*/
static void sef_lu_ready(int result)
{
  message m;
  int old_state, r;

#if SEF_LU_DEBUG
  sef_lu_debug_begin();
  sef_lu_dprint("%s, cycle=%d. Ready to update with result: %d%s\n",
      sef_debug_header(), sef_lu_debug_cycle,
      result, (result == OK ? "(OK)" : ""));
  sef_lu_debug_end();
#endif

  /* If result is OK, let the callback code save
   * any state that must be carried over to the new version.
   */
  if(result == OK) {
      r = sef_cbs.sef_cb_lu_state_save(sef_lu_state);
      if(r != OK) {
          /* Abort update if callback returned error. */
          result = r;
      }
  }

  /* Let the callback code produce a live update response and block.
   * We should get beyond this point only if either result is an error or
   * something else goes wrong in the callback code.
   */
  m.m_source = sef_self_endpoint;
  m.m_type = RS_LU_PREPARE;
  m.m_rs_update.state = sef_lu_state;
  m.m_rs_update.result = result;
  r = sef_cbs.sef_cb_lu_response(&m);

#if SEF_LU_DEBUG
  sef_lu_debug_begin();
  sef_lu_dprint("%s, cycle=%d. The %s aborted the update with result %d!\n",
      sef_debug_header(), sef_lu_debug_cycle,
      (result == OK ? "server" : "client"),
      (result == OK ? r : result)); /* EINTR if update was canceled. */
  sef_lu_debug_end();
#endif

  /* Something went wrong. Update was aborted and we didn't get updated.
   * Restore things back to normal and continue executing.
   */
  old_state = sef_lu_state;
  sef_lu_state = SEF_LU_STATE_NULL;
  if(old_state != sef_lu_state) {
      sef_cbs.sef_cb_lu_state_changed(old_state, sef_lu_state);
  }
}
예제 #2
0
/*===========================================================================*
 *      	       sef_cb_lu_prepare_never_ready	                     *
 *===========================================================================*/
int sef_cb_lu_prepare_never_ready(int UNUSED(state))
{
#if SEF_LU_DEBUG
  sef_lu_debug_begin();
  sef_lu_dprint("%s, cycle=%d. Simulating a service never ready to update...\n",
      sef_debug_header(), sef_lu_debug_cycle);
  sef_lu_debug_end();
#endif

  return ENOTREADY;
}
예제 #3
0
/*===========================================================================*
 *      		   sef_cb_lu_state_dump         	             *
 *===========================================================================*/
void sef_cb_lu_state_dump(int state)
{
  sef_lu_dprint("floppy: live update state = %d\n", state);
  sef_lu_dprint("floppy: f_busy = %d\n", f_busy);
  sef_lu_dprint("floppy: motor_status = 0x%02X\n", motor_status);
  sef_lu_dprint("floppy: f_drive = %d\n", f_drive);
  sef_lu_dprint("floppy: last_was_write = %d\n", last_was_write);

  sef_lu_dprint("floppy: SEF_LU_STATE_WORK_FREE(%d) reached = %d\n",
      SEF_LU_STATE_WORK_FREE, TRUE);
  sef_lu_dprint("floppy: SEF_LU_STATE_REQUEST_FREE(%d) reached = %d\n",
      SEF_LU_STATE_REQUEST_FREE, (!IS_REQUEST_PENDING(f_busy)));
  sef_lu_dprint("floppy: SEF_LU_STATE_PROTOCOL_FREE(%d) reached = %d\n",
      SEF_LU_STATE_PROTOCOL_FREE, (!IS_REQUEST_PENDING(f_busy)));
  sef_lu_dprint("floppy: FL_STATE_MOTOR_OFF(%d) reached = %d\n",
      FL_STATE_MOTOR_OFF, (!IS_REQUEST_PENDING(f_busy)
      && !IS_MOTOR_RUNNING(motor_status, f_drive)));
}
예제 #4
0
/*===========================================================================*
 *      		   sef_cb_lu_state_dump         	 	     *
 *===========================================================================*/
PUBLIC void sef_cb_lu_state_dump(int state)
{
  sef_lu_dprint("sb16: live update state = %d\n", state);
  sef_lu_dprint("sb16: is_processing = %d\n", is_processing);
  sef_lu_dprint("sb16: is_status_msg_expected = %d\n",
      is_status_msg_expected);

  sef_lu_dprint("sb16: SEF_LU_STATE_WORK_FREE(%d) reached = %d\n", 
      SEF_LU_STATE_WORK_FREE, TRUE);
  sef_lu_dprint("sb16: SEF_LU_STATE_REQUEST_FREE(%d) reached = %d\n", 
      SEF_LU_STATE_REQUEST_FREE, TRUE);
  sef_lu_dprint("sb16: SEF_LU_STATE_PROTOCOL_FREE(%d) reached = %d\n", 
      SEF_LU_STATE_PROTOCOL_FREE, (!is_processing && !is_status_msg_expected));
  sef_lu_dprint("sb16: SB16_STATE_PROCESSING_PROTOCOL_FREE(%d) reached = %d\n", 
      SB16_STATE_PROCESSING_PROTOCOL_FREE, (!is_processing));
}
예제 #5
0
/*===========================================================================*
 *      		   sef_cb_lu_state_dump         	             *
 *===========================================================================*/
PUBLIC void sef_cb_lu_state_dump(int state)
{
  sef_lu_dprint("printer: live update state = %d\n", state);
  sef_lu_dprint("printer: writing = %d\n", writing);
  sef_lu_dprint("printer: is_status_msg_expected = %d\n",
      is_status_msg_expected);

  sef_lu_dprint("printer: SEF_LU_STATE_WORK_FREE(%d) reached = %d\n", 
      SEF_LU_STATE_WORK_FREE, TRUE);
  sef_lu_dprint("printer: SEF_LU_STATE_REQUEST_FREE(%d) reached = %d\n", 
      SEF_LU_STATE_REQUEST_FREE, TRUE);
  sef_lu_dprint("printer: SEF_LU_STATE_PROTOCOL_FREE(%d) reached = %d\n", 
      SEF_LU_STATE_PROTOCOL_FREE, (!writing && !is_status_msg_expected));
  sef_lu_dprint("printer: PR_STATE_WRITE_PROTOCOL_FREE(%d) reached = %d\n", 
      PR_STATE_WRITE_PROTOCOL_FREE, (!writing));
}
예제 #6
0
/*===========================================================================*
 *      		   sef_cb_lu_state_dump         	             *
 *===========================================================================*/
PUBLIC void sef_cb_lu_state_dump(int state)
{
  /* Load state information. */
  load_state_info();

  sef_lu_dprint("log: live update state = %d\n", state);
  sef_lu_dprint("log: is_read_pending = %d\n", is_read_pending);
  sef_lu_dprint("log: is_select_callback_pending = %d\n",
      is_select_callback_pending);

  sef_lu_dprint("log: SEF_LU_STATE_WORK_FREE(%d) reached = %d\n", 
      SEF_LU_STATE_WORK_FREE, TRUE);
  sef_lu_dprint("log: SEF_LU_STATE_REQUEST_FREE(%d) reached = %d\n", 
      SEF_LU_STATE_REQUEST_FREE, (!is_read_pending));
  sef_lu_dprint("log: SEF_LU_STATE_PROTOCOL_FREE(%d) reached = %d\n", 
      SEF_LU_STATE_PROTOCOL_FREE, (!is_read_pending
      && !is_select_callback_pending));
  sef_lu_dprint("log: LOG_STATE_SELECT_PROTOCOL_FREE(%d) reached = %d\n", 
      LOG_STATE_SELECT_PROTOCOL_FREE, (!is_select_callback_pending));
}
예제 #7
0
/*===========================================================================*
 *                         do_sef_lu_before_receive             	     *
 *===========================================================================*/
void do_sef_lu_before_receive(void)
{
/* Handle SEF Live update before receive events. */
  int r;

  /* Initialize on first receive. */
  if(!sef_self_first_receive_done) {
      sef_lu_state = SEF_LU_STATE_NULL;
  }

  /* Nothing to do if we are not preparing for a live update. */
  if(sef_lu_state == SEF_LU_STATE_NULL) {
      return;
  }

  /* Debug. */
#if SEF_LU_DEBUG
  sef_lu_debug_cycle++;
  sef_lu_debug_begin();
  sef_lu_dprint("%s, cycle=%d. Dumping state variables:\n",
      sef_debug_header(), sef_lu_debug_cycle);
  sef_cbs.sef_cb_lu_state_dump(sef_lu_state);
  sef_lu_debug_end();
#endif

  /* Let the callback code handle the event.
   * For SEF_LU_STATE_WORK_FREE, we're always ready, tell immediately.
   */
  r = OK;
  if(sef_lu_state != SEF_LU_STATE_WORK_FREE) {
      r = sef_cbs.sef_cb_lu_prepare(sef_lu_state);
  }
  if(r == OK) {
      sef_lu_ready(OK);
  }
}
예제 #8
0
/*===========================================================================*
 *                       sef_cb_lu_state_dump_null        		     *
 *===========================================================================*/
void sef_cb_lu_state_dump_null(int UNUSED(state))
{
  sef_lu_dprint("NULL\n");
}