Beispiel #1
0
/* check if the specified request is at the start of the list and should run */
static
int
check_request(NFS_BaseRequest *rq) {
	if (list_null(NfsRequests)) {
		dprintf(0, "!!! nfsfs: check_request NfsRequest list is null !!!\n");
		return run_request(rq);
	}

	/* Check at head of queue */
	NFS_BaseRequest *brq = (NFS_BaseRequest *) list_peek(NfsRequests);
	if (brq != rq) {
		return 0;
	}

	return run_request((NFS_BaseRequest *) list_peek(NfsRequests));
}
Beispiel #2
0
/* Run request at head of queue */
static
int
run_head_request(void) {
	if (list_null(NfsRequests)) {
		return 0;
	}
	return run_request((NFS_BaseRequest *) list_peek(NfsRequests));
}
Beispiel #3
0
void * request(DfaSet * dfaSet, state_name start_state, char * recipient_addr, state_machine_id recipient_machine_id, Message * message) {
  StateMachine * initial_sm;
  state_machine_id machine_id;
  void * ret;
  writelock(dfaSet->lock, 600);

  initial_sm = allocSmash(dfaSet->smash);
  if(initial_sm == NULL) {
    return NULL;
  }

  assert(start_state != NULL_STATE);
  
  if(message != NULL) {
    
    memcpy(&(initial_sm->message), message, sizeof(Message));
  }
  
  initial_sm->current_state = start_state;
  initial_sm->message.from_machine_id = initial_sm->machine_id;
  initial_sm->message.to_machine_id = recipient_machine_id;
  initial_sm->message.type = start_state;

  char * initiator;
  {
    int err = asprintf(&initiator, "%s:%d", dfaSet->networkSetup.localhost, dfaSet->networkSetup.localport);
    assert(err != -1);
  }
  strcpy(initial_sm->message.initiator, initiator);
  free(initiator);
  //  printf("Set message initiator to %s\n", initial_sm->message.initiator); fflush(stdout);
  initial_sm->message.initiator_machine_id = initial_sm->machine_id;

  strcpy(initial_sm->message_recipient, recipient_addr);
  machine_id = initial_sm->machine_id;
  writeunlock(dfaSet->lock);

  ret = run_request(dfaSet, machine_id);

  writelock(dfaSet->lock, machine_id); 
  assert(initial_sm == getSmash(dfaSet->smash, machine_id));
  if(message != NULL) {

    memcpy(message, &(initial_sm->message), sizeof(Message));
  }

  freeSmash(dfaSet->smash, initial_sm->machine_id);
  writeunlock(dfaSet->lock);

  return ret;
}