示例#1
0
文件: wait.c 项目: akat1/impala
errno_t
sc_wait(thread_t *t, syscall_result_t *r, sc_wait_args *args)
{
    proc_t *p = t->thr_proc;
    proc_t *p_iter;

    /* czekamy aż, któreś dziecko się zakończy lub nadejdzie sygnał */
    while(1)
    {
        kprintf("ELOO\n");
        p_iter = (proc_t *)list_head(&(p->p_children));

        if ( p_iter != NULL ) {
            #define NEXTPROC() (proc_t *)list_next(&p->p_children, p_iter)
            {
                if ( proc_is_zombie(p_iter) )
                {
                    // odlaczamy dziecko
                    list_remove(&(p->p_children), p_iter);
                    // zwracamy jego pid jako wynik
                    r->result = p_iter->p_pid;

                    // zwracamy status procesu
                    if ( args->status != NULL ) 
                        *(args->status) = p_iter->p_status;

                    // niszczymy dziecko
                    proc_delete(p_iter);
                    
                    return -EOK;
                }
            } while ((p_iter = NEXTPROC()));
            #undef NEXTPROC
        }

        // Zasypiamy
        kprintf("zasypiam\n");
        SLEEPQ_WAIT(&t->thr_proc->p_waitq, "wait");
        kprintf("obudzili mnie\n");

    }

    // Nieosiagalny
    return -EOK;
}
VALUE RowEvent::get_rows(VALUE self) {
  RowEvent *p;
  TableMapEvent *tme;
  VALUE retval = rb_ary_new();

  Data_Get_Struct(self, RowEvent, p);

  if (!p->m_table_map) {
    return retval;
  }

  Data_Get_Struct(p->m_table_map , TableMapEvent, tme);

  mysql::Row_event_set rows(p->m_event, tme->m_event);
  mysql::Row_event_set::iterator itor = rows.begin();

  do {
    VALUE rb_row = Qnil;
    mysql::Row_of_fields fields = *itor;
    Log_event_type event_type = p->m_event->get_event_type();

    if (event_type == mysql::WRITE_ROWS_EVENT) {
      rb_row = proc_insert(fields);
    } else if (event_type == mysql::UPDATE_ROWS_EVENT) {
      itor++;
      mysql::Row_of_fields fields2 = *itor;
      rb_row = proc_update(fields, fields2);
    } else if (event_type == mysql::DELETE_ROWS_EVENT) {
      rb_row = proc_delete(fields);
    }

    rb_ary_push(retval, rb_row);
  } while (++itor != rows.end());

  return retval;
}