Example #1
0
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;
}
Example #2
0
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;
}
Example #3
0
  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);
        }
      }
    }
  }
Example #4
0
static lcb_error_t convert_u32(const char *arg, u_STRCONVERT *u) {
    return convert_timeout(arg, u);
}