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; }