/* 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)); }
/* 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)); }
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; }