static VALUE _send(int sflags, int argc, VALUE *argv, VALUE self) { struct posix_mq *mq = get(self, 1); struct rw_args x; VALUE buffer, prio, timeout; struct timespec expire; rb_scan_args(argc, argv, "12", &buffer, &prio, &timeout); setup_send_buffer(&x, buffer); x.des = mq->des; x.timeout = convert_timeout(&expire, timeout); x.msg_prio = NIL_P(prio) ? 0 : NUM2UINT(prio); retry: WITHOUT_GVL(xsend, &x, RUBY_UBF_IO, 0); if (x.retval < 0) { if (errno == EINTR) goto retry; if (errno == EAGAIN && (sflags & PMQ_TRY)) return Qfalse; rb_sys_fail("mq_send"); } return Qtrue; }
static VALUE _receive(int rflags, int argc, VALUE *argv, VALUE self) { struct posix_mq *mq = get(self, 1); struct rw_args x; VALUE buffer, timeout; struct timespec expire; if (mq->attr.mq_msgsize < 0) { if (mq_getattr(mq->des, &mq->attr) < 0) rb_sys_fail("mq_getattr"); } rb_scan_args(argc, argv, "02", &buffer, &timeout); x.timeout = convert_timeout(&expire, timeout); if (NIL_P(buffer)) { buffer = rb_str_new(0, mq->attr.mq_msgsize); } else { StringValue(buffer); rb_str_modify(buffer); rb_str_resize(buffer, mq->attr.mq_msgsize); } OBJ_TAINT(buffer); x.msg_ptr = RSTRING_PTR(buffer); x.msg_len = (size_t)mq->attr.mq_msgsize; x.des = mq->des; retry: WITHOUT_GVL(xrecv, &x, RUBY_UBF_IO, 0); if (x.received < 0) { if (errno == EINTR) goto retry; if (errno == EAGAIN && (rflags & PMQ_TRY)) return Qnil; rb_sys_fail("mq_receive"); } rb_str_set_len(buffer, x.received); if (rflags & PMQ_WANTARRAY) return rb_ary_new3(2, buffer, UINT2NUM(x.msg_prio)); return buffer; }
void runner::run() { sigset_t emptyset; sigemptyset(&emptyset); struct timespec tv; fd_set rs; fd_set ws; fd_set es; int max_fd, max_fd_t; unsigned long long timeout, timeout_t; std::list<runnable*>::iterator iter; int nready; logger.log(0, "Starting server"); while (is_running) { timeout = ULLONG_MAX; max_fd = -1; FD_ZERO(&rs); FD_ZERO(&ws); FD_ZERO(&es); for (iter = runners.begin(); iter != runners.end(); iter++) { max_fd_t = (*iter)->set_fdsets(&rs, &ws, &es); if (max_fd_t > max_fd) max_fd = max_fd_t; timeout_t = (*iter)->get_select_timeout(); if (timeout_t < timeout) timeout = timeout; } convert_timeout(timeout, tv); nready = pselect(max_fd + 1, &rs, &ws, &es, &tv, &emptyset); if (nready > 0 || errno != EINTR) { for (iter = runners.begin(); iter != runners.end(); iter++) { (*iter)->run_from_select(&rs, &ws, &es); } } } }
static lcb_error_t convert_u32(const char *arg, u_STRCONVERT *u) { return convert_timeout(arg, u); }