static mrb_value mrb_uv_cond_wait(mrb_state *mrb, mrb_value self) { mrb_value mutex_val; uv_mutex_t *mutex; mrb_get_args(mrb, "o", &mutex_val); mutex = (uv_mutex_t*)mrb_uv_get_ptr(mrb, mutex_val, &mrb_uv_mutex_type); return uv_cond_wait((uv_cond_t*)mrb_uv_get_ptr(mrb, self, &mrb_uv_cond_type), mutex), self; }
static mrb_value mrb_uv_cond_destroy(mrb_state *mrb, mrb_value self) { uv_cond_destroy((uv_cond_t*)mrb_uv_get_ptr(mrb, self, &mrb_uv_cond_type)); DATA_PTR(self) = NULL; return self; }
static mrb_value mrb_uv_mutex_unlock(mrb_state *mrb, mrb_value self) { uv_mutex_t *m = (uv_mutex_t*)mrb_uv_get_ptr(mrb, self, &mrb_uv_mutex_type); uv_mutex_unlock(m); return self; }
static mrb_value mrb_uv_cond_timed_wait(mrb_state *mrb, mrb_value self) { mrb_value mutex_val; mrb_int timeout; uv_mutex_t *mutex; int err; mrb_get_args(mrb, "oi", &mutex_val, &timeout); mutex = (uv_mutex_t*)mrb_uv_get_ptr(mrb, mutex_val, &mrb_uv_mutex_type); err = uv_cond_timedwait((uv_cond_t*)mrb_uv_get_ptr(mrb, self, &mrb_uv_cond_type), mutex, timeout); if (err == UV_ETIMEDOUT) { return symbol_value_lit(mrb, "timedout"); } mrb_uv_check_error(mrb, err); return self; }
void mrb_uv_dlclose(mrb_state *mrb, mrb_value dl) { uv_lib_t *lib = (uv_lib_t*)mrb_uv_get_ptr(mrb, dl, &dl_type); uv_dlclose(lib); mrb_free(mrb, DATA_PTR(dl)); DATA_PTR(dl) = NULL; }
static mrb_value mrb_uv_key_destroy(mrb_state *mrb, mrb_value self) { uv_key_t *key = (uv_key_t*)mrb_uv_get_ptr(mrb, self, &mrb_uv_key_type); mrb_ary_clear(mrb, mrb_iv_get(mrb, self, mrb_intern_lit(mrb, "values"))); uv_key_delete(key); return self; }
static mrb_value mrb_uv_barrier_destroy(mrb_state *mrb, mrb_value self) { uv_barrier_destroy((uv_barrier_t*)mrb_uv_get_ptr(mrb, self, &barrier_type)); mrb_free(mrb, DATA_PTR(self)); DATA_PTR(self) = NULL; return self; }
static mrb_value mrb_uv_mutex_destroy(mrb_state *mrb, mrb_value self) { uv_mutex_t *m = (uv_mutex_t*)mrb_uv_get_ptr(mrb, self, &mrb_uv_mutex_type); uv_mutex_destroy(m); mrb_free(mrb, m); DATA_PTR(self) = NULL; return self; }
static mrb_value mrb_uv_sem_destroy(mrb_state *mrb, mrb_value self) { uv_sem_t *sem = (uv_sem_t*)mrb_uv_get_ptr(mrb, self, &sem_type); uv_sem_destroy(sem); mrb_free(mrb, DATA_PTR(self)); DATA_PTR(self) = NULL; return self; }
static mrb_value mrb_uv_key_get(mrb_state *mrb, mrb_value self) { uv_key_t *key; void *p; key = (uv_key_t*)mrb_uv_get_ptr(mrb, self, &mrb_uv_key_type); p = uv_key_get(key); return p? mrb_obj_value(p) : mrb_nil_value(); }
void* mrb_uv_dlsym(mrb_state *mrb, mrb_value dl, char const *name) { int err; void *p; uv_lib_t *lib = (uv_lib_t*)mrb_uv_get_ptr(mrb, dl, &dl_type); err = uv_dlsym(lib, name, &p); if(err == -1) { mrb_raise(mrb, E_UV_ERROR, uv_dlerror(lib)); } return p; }
static mrb_value mrb_uv_sem_trywait(mrb_state *mrb, mrb_value self) { int err; uv_sem_t *sem = (uv_sem_t*)mrb_uv_get_ptr(mrb, self, &sem_type); err = uv_sem_trywait(sem); if(err == UV_EAGAIN) { return mrb_false_value(); } if(err < 0) { mrb_uv_check_error(mrb, err); } return mrb_true_value(); }
static mrb_value mrb_uv_key_set(mrb_state *mrb, mrb_value self) { uv_key_t *key; void *p; mrb_value new_val; mrb_value ary; mrb_get_args(mrb, "o", &new_val); if (mrb_type(new_val) < MRB_TT_HAS_BASIC) { mrb_raisef(mrb, E_TYPE_ERROR, "cannot store value without basic: %S", new_val); } key = (uv_key_t*)mrb_uv_get_ptr(mrb, self, &mrb_uv_key_type); p = uv_key_get(key); ary = mrb_iv_get(mrb, self, mrb_intern_lit(mrb, "values")); mrb_assert(mrb_array_p(ary)); if (p) { /* remove value */ int i, dst; for (i = 0, dst = 0; i < RARRAY_LEN(ary); ++i) { mrb_value v = RARRAY_PTR(ary)[i]; if (mrb_ptr(v) != p) { mrb_ary_ptr(ary)->ptr[dst++] = v; } } RARRAY_LEN(ary) = dst; } uv_key_set(key, mrb_ptr(new_val)); mrb_ary_push(mrb, ary, new_val); /* protect from GC */ return new_val; }
static mrb_value mrb_uv_cond_signal(mrb_state *mrb, mrb_value self) { return uv_cond_signal((uv_cond_t*)mrb_uv_get_ptr(mrb, self, &mrb_uv_cond_type)), self; }
static mrb_value mrb_uv_barrier_wait(mrb_state *mrb, mrb_value self) { uv_barrier_wait((uv_barrier_t*)mrb_uv_get_ptr(mrb, self, &barrier_type)); return self; }
static mrb_value mrb_uv_cond_broadcast(mrb_state *mrb, mrb_value self) { return uv_cond_broadcast((uv_cond_t*)mrb_uv_get_ptr(mrb, self, &mrb_uv_cond_type)), self; }
static mrb_value mrb_uv_sem_wait(mrb_state *mrb, mrb_value self) { uv_sem_t *sem = (uv_sem_t*)mrb_uv_get_ptr(mrb, self, &sem_type); return uv_sem_wait(sem), self; }
static mrb_value mrb_uv_mutex_trylock(mrb_state *mrb, mrb_value self) { return mrb_bool_value(uv_mutex_trylock((uv_mutex_t*)mrb_uv_get_ptr(mrb, self, &mrb_uv_mutex_type))); }