Esempio n. 1
0
static int
start_config_set(void *cb_data, int shutdown)
{
    solparm_set_handler_t *elem = cb_data;
    int                   rv;

    if (shutdown) {
	ipmi_log(IPMI_LOG_ERR_INFO,
		 "solparm.c(start_config_set): "
		 "SOLPARM was destroyed while an operation was in progress");
	solparm_lock(elem->solparm);
	set_complete(elem->solparm, ECANCELED, elem);
	return OPQ_HANDLER_STARTED;
    }

    /* The read lock must be claimed before the solparm lock to avoid
       deadlock. */
    rv = ipmi_mc_pointer_cb(elem->solparm->mc, start_config_set_cb, elem);
    if (rv) {
	ipmi_log(IPMI_LOG_ERR_INFO,
		 "solparm.c(start_config_set): "
		 "SOLPARM's MC is not valid");
	solparm_lock(elem->solparm);
	set_complete(elem->solparm, rv, elem);
    }
    return OPQ_HANDLER_STARTED;
}
Esempio n. 2
0
int main() {
    LIST *jlist = init_list();

    assert(gen_job_id(jlist) == 1);
    assert(get_fg(jlist) == (job *)NULL);
    assert(jlist->size == 0);

    //print_bg(jlist);
    
    job *jb1 = tstjob(1);
    push(jlist, JOB, jb1);
    assert(gen_job_id(jlist) == 2);
    assert(get_fg(jlist) == jb1);

    //print_bg(jlist);

    job *jb2 = tstjob(3);
    push(jlist, JOB, jb2);
    assert(gen_job_id(jlist) == 2);

    job *jb3 = tstjob(2);
    push(jlist, JOB, jb3);
    assert(gen_job_id(jlist) == 4);

    push(jlist, JOB, tstjob(7));
    assert(gen_job_id(jlist) == 4);

    print_bg(jlist);

    pop(jlist);
    assert(gen_job_id(jlist) == 4);

    assert(get_job_pgid(jlist, 11) == (job *)NULL);
    assert(get_job_pgid(jlist, 7) == jb2);
    assert(get_job_pgid(jlist, 3) == jb3);
    assert(get_job(jlist, 3) == jb2);
    assert(del_job(jlist, 7) == jb2);
    assert(get_job(jlist, 3) == (job *)NULL);
    assert(get_job(jlist, 55) == jb3);
    assert(get_job(jlist, 10) == (job *)NULL);
    assert(set_complete(jb2, 3) == 0);
    assert(set_complete(jb2, 4) == -1);
    assert(set_complete(jb3, 55) == 0);
    assert(((process *)jb2->pid_list->head->node_ptr)->complete == 0);
    assert(jb2->complete == 0);
    assert(jb3->complete == 1);
    assert(jlist->size == 2);
    assert(get_job_jid(jlist, 1) == jb1);
    assert(get_job_jid(jlist, 11) == (job *)NULL);

    printf("[job_handler_tst] All tests pass!\n");
    return 0;
}
Esempio n. 3
0
static void
start_config_set_cb(ipmi_mc_t *mc, void *cb_data)
{
    solparm_set_handler_t *elem = cb_data;
    ipmi_solparm_t        *solparm = elem->solparm;
    ipmi_msg_t        msg;
    int               rv;

    solparm_lock(solparm);
    if (solparm->destroyed) {
	ipmi_log(IPMI_LOG_ERR_INFO,
		 "%ssolparm.c(start_config_set_cb): "
		 "SOLPARM was destroyed while an operation was in progress",
		 MC_NAME(mc));
	set_complete(solparm, ECANCELED, elem);
	goto out;
    }

    msg.netfn = IPMI_TRANSPORT_NETFN;
    msg.cmd = IPMI_SET_SOL_CONFIGURATION_PARAMETERS;
    msg.data = elem->data;
    msg.data_len = elem->data_len;
    rv = ipmi_mc_send_command(mc, 0, &msg, solparm_config_set, elem);

    if (rv) {
	ipmi_log(IPMI_LOG_ERR_INFO,
		 "%ssolparm.c(start_config_set_cb): "
		 "SOLPARM start_config_set: could not send cmd: %x",
		 MC_NAME(mc), rv);
	set_complete(solparm, ECANCELED, elem);
	goto out;
    }

    solparm_unlock(solparm);
 out:
    return;
}
Esempio n. 4
0
static void
solparm_config_set(ipmi_mc_t  *mc,
		   ipmi_msg_t *rsp,
		   void       *rsp_data)
{
    solparm_set_handler_t *elem = rsp_data;
    ipmi_solparm_t        *solparm = elem->solparm;
    int               rv;

    rv = check_solparm_response_param(solparm, mc, rsp, 1,
				      "solparm_config_set");

    solparm_lock(solparm);
    set_complete(solparm, rv, elem);
}
Esempio n. 5
0
File: pmsh.c Progetto: pdsouza/pmsh
/** SIGCHLD handler **/
void handler(int signum, siginfo_t *info, void *context) {
    int cpid, status;

    cpid = info->si_pid; // sending pid
    //printf("Got a SIGCHLD from %d!\n", cpid);

    // loop to catch simultaneous SIGCHLDs
    while( (cpid = waitpid(-1, &status, WNOHANG | WUNTRACED | WCONTINUED)) > 0 ) {

        //printf("HANDLER Got %d from waitpid\n", cpid);
        job *j = get_job(job_list, cpid);
        if(j == NULL) {
            printf("Error: get_job returned null\n");
            _exit(EXIT_FAILURE);
        }

        if(WIFEXITED(status)) { // completed
            if( set_complete(j, cpid) == -1 ) {
                printf("HANDLER set_complete went awry!\n");
                _exit(EXIT_FAILURE);
            }
        }
        else if(WIFSIGNALED(status)) { // terminated
            set_complete(j, cpid);
            printf("\n");
            //printf("TERMINATED: %d\n", WTERMSIG(status));
        }
        else if(WIFSTOPPED(status)) { // stopped
            j->running = 0;

            if(j->fg) {
                send_back(job_list, j->pgid);
                printf("\nStopped: %s\n", j->rawcmd);
            } else {

                // queue stopped message
                message *m = malloc(sizeof(message));
                copy_to_buf(j->rawcmd, m->msg);
                m->status = 0;
                push(msg_q, PROCESS, (void *)m);
            }
        }
        else if(WIFCONTINUED(status)) { // continued
            j->running = 1;
            //printf("CONTINUED\n");
        }

        if(j->complete) {
            j->running = 0;
            if(!j->fg) {
                // queue finished message
                message *m = malloc(sizeof(message));
                copy_to_buf(j->rawcmd, m->msg);
                m->status = 1;
                push(msg_q, PROCESS, (void *)m);

                free_job(del_job(job_list, j->pgid));
            }
        }
    }

    //printf("HANDLER Done with waitpid loop\n");
}
Esempio n. 6
0
SEQ_T *print_random_seqs (
  FILE *out,				// Stream to print on.
  int seed,				// Random number seed.
  int nseqs, 				// Number of sequences to print.
  int min,				// Minimum sequence length.
  int max,				// Maximum sequence length.
  char **letters,			// Array of letter strings.
  int r,				// Number of letter strings.
  int c,				// Length of letter strings.
  int order,				// Order of Markov model.
  double *cum				// Cumulative distribution(s) defining model.
)
{
  int i, j;
  int n;				// Length of sequence.
  char *buffer = NULL;			// Buffer for sequences.
  char *id = NULL;			// Sequence name.
  char first_letter = letters[0][0];	// First letter in alphabet.

  // Create the buffer for the string.
  mm_resize(buffer, max*(c-1)+1, char);

  /* set up random number generator */
  if (seed != 0) srand48(seed);

  /* print random sequences */
  for (i=0; i<nseqs; i++) {			/* sequence */

    // Decide length of sequence to print.
    n = (int) (min + drand48() * (max - min + 1));

    // Print FASTA ID line.
    if (out != NULL) {
      fprintf(out, ">SEQ_%-d %d\n", i+1, n);
    } else {
      mm_resize(id, 50, char);
      sprintf(id, ">SEQ_%-d %d\n", i+1, n);
    }

    /*
      Generate letters by
        1) random x ~ [0,1)
        2) binary search of cum for cum[i-1]<x<=cum[i]
        3) letter/codon is letters[i-1]
    */
    for (j=0; j<n; j++) {   // generate letters/codons
      double x = drand48(); // random number
      int lo = 0;
      int hi = r;
      int offset = 0; // Offset into cum array.

      if (order >= 1) { // Markov model.
        int start_ptr;
        // Find the offset into the cumulative prob array by looking
        // for the offset of the preceeding "order" characters.
        buffer[j] = first_letter; // Now contains index into array.
        buffer[j+1] = '\0';
        start_ptr = j > order ? j-order : 0; // Start of index string.
        offset = s2i(buffer + start_ptr);
        //fprintf(stderr, "b: %s\n offset: %d x: %f\n", buffer+start_ptr, offset, x);
      }

      while (hi-lo > 1) {    // binary search
        int mid = (lo+hi)/2; // midpoint
        if (x > cum[mid+offset]) { lo = mid; } else { hi = mid; }
      }
      //fprintf(stderr, "%11.8f %s r %d\n", x, letters[x<cum[lo+offset] ? lo : lo+1], r);
      //fprintf(stderr, "%s", letters[x<cum[lo+offset] ? lo : lo+1]);
      buffer[j] = letters[x<cum[lo+offset] ? lo : lo+1][0];
    } /* generate letters/codons */
    buffer[j] = '\0';

    // Print the sequence.
    if (out != NULL) {
      for (j=0; j<n; j+=50) {
        fprintf(out, "%-50.50s\n", buffer+j);
      }
    } else {
      SEQ_T *seq = allocate_seq(id, "", 0, buffer);
      set_complete(TRUE, seq);
      myfree(buffer);
      return(seq);
    }

  } /* sequence */

  myfree(buffer);
  return(NULL);
} // print_random_seqs