Beispiel #1
0
/* Non-blocking operation. Returns {0, 0} if queue is empty */
struct packet_buffer queue_pop(struct queue *q) {
    int success = uv_sem_trywait(&q->fill_count);
    if (success != 0) {
        return (struct packet_buffer){.payload_len = 0, .payload = NULL};
    }
    struct packet_buffer result = q->buf[q->head];
    q->head = (q->head + 1) % QUEUE_CAP;
    uv_sem_post(&q->empty_count);
    return result;
}
Beispiel #2
0
/* Non-blocking operation. Returns -1 if queue is full */
int queue_push(struct queue *q, struct packet_buffer b) {
    int success = uv_sem_trywait(&q->empty_count);
    if (success != 0) {
        return -1;
    }
    q->buf[q->tail] = b;
    q->tail = (q->tail + 1) % QUEUE_CAP;
    uv_sem_post(&q->fill_count);
    return 0;
}
Beispiel #3
0
void uv__stream_osx_select(void* arg) {
  uv_stream_t* stream;
  uv__stream_select_t* s;
  fd_set read;
  fd_set write;
  fd_set error;
  struct timeval timeout;
  int events;
  int fd;
  int r;

  stream = arg;
  s = stream->select;
  fd = stream->fd;

  while (1) {
    /* Terminate on semaphore */
    if (uv_sem_trywait(&s->sem) == 0) break;

    /* Watch fd using select(2) */
    FD_ZERO(&read);
    FD_ZERO(&write);
    FD_ZERO(&error);
    FD_SET(fd, &read);
    FD_SET(fd, &write);
    FD_SET(fd, &error);

    timeout.tv_sec = 0;
    timeout.tv_usec = 250000; /* 250 ms timeout */
    r = select(fd + 1, &read, &write, &error, &timeout);
    if (r == -1) {
      if (errno == EINTR) continue;
      /* XXX: Possible?! */
      abort();
    }

    /* Ignore timeouts */
    if (r == 0) continue;

    /* Handle events */
    events = 0;
    if (FD_ISSET(fd, &read)) events |= UV__IO_READ;
    if (FD_ISSET(fd, &write)) events |= UV__IO_WRITE;
    if (FD_ISSET(fd, &error)) events |= UV__IO_ERROR;

    uv_mutex_lock(&s->mutex);
    s->events |= events;
    uv_mutex_unlock(&s->mutex);

    if (events != 0) uv_async_send(&s->async);
  }
}
Beispiel #4
0
static PyObject *
Semaphore_func_trywait(Semaphore *self)
{
    int r;

    RAISE_IF_NOT_INITIALIZED(self, NULL);

    Py_BEGIN_ALLOW_THREADS
    r = uv_sem_trywait(&self->uv_semaphore);
    Py_END_ALLOW_THREADS

    return PyBool_FromLong((long)(r == 0));
}
Beispiel #5
0
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();
}
Beispiel #6
0
static void fib(uv_work_t *req) {
	struct threadpool_data_t *data = req->data;

	data->func(data->reason, data->userdata);

	int x = 0;
	if(data->ref != NULL) {
		x = uv_sem_trywait(data->ref);
	}
	if((data->ref == NULL) || (x == UV__EAGAIN)) {
		if(data->done != NULL && data->reason != REASON_END) {
			data->done(data->userdata);
		}
		if(data->ref != NULL) {
			FREE(data->ref);
		}
	}
	// FREE(req->data);
}
Beispiel #7
0
static void uv__stream_osx_select(void* arg) {
  uv_stream_t* stream;
  uv__stream_select_t* s;
  char buf[1024];
  int events;
  int fd;
  int r;
  int max_fd;

  stream = arg;
  s = stream->select;
  fd = s->fd;

  if (fd > s->int_fd)
    max_fd = fd;
  else
    max_fd = s->int_fd;

  while (1) {
    /* Terminate on semaphore */
    if (uv_sem_trywait(&s->close_sem) == 0)
      break;

    /* Watch fd using select(2) */
    memset(s->sread, 0, s->sread_sz);
    memset(s->swrite, 0, s->swrite_sz);

    if (uv__io_active(&stream->io_watcher, POLLIN))
      FD_SET(fd, s->sread);
    if (uv__io_active(&stream->io_watcher, POLLOUT))
      FD_SET(fd, s->swrite);
    FD_SET(s->int_fd, s->sread);

    /* Wait indefinitely for fd events */
    r = select(max_fd + 1, s->sread, s->swrite, NULL, NULL);
    if (r == -1) {
      if (errno == EINTR)
        continue;

      /* XXX: Possible?! */
      abort();
    }

    /* Ignore timeouts */
    if (r == 0)
      continue;

    /* Empty socketpair's buffer in case of interruption */
    if (FD_ISSET(s->int_fd, s->sread))
      while (1) {
        r = read(s->int_fd, buf, sizeof(buf));

        if (r == sizeof(buf))
          continue;

        if (r != -1)
          break;

        if (errno == EAGAIN || errno == EWOULDBLOCK)
          break;

        if (errno == EINTR)
          continue;

        abort();
      }

    /* Handle events */
    events = 0;
    if (FD_ISSET(fd, s->sread))
      events |= POLLIN;
    if (FD_ISSET(fd, s->swrite))
      events |= POLLOUT;

    assert(events != 0 || FD_ISSET(s->int_fd, s->sread));
    if (events != 0) {
      ACCESS_ONCE(int, s->events) = events;

      uv_async_send(&s->async);
      uv_sem_wait(&s->async_sem);

      /* Should be processed at this stage */
      assert((s->events == 0) || (stream->flags & UV_CLOSING));
    }
  }
Beispiel #8
0
 bool Semaphore::trywait()
 {
     int r = uv_sem_trywait(&sem);
     return r == 0;
 }
Beispiel #9
0
void uv__stream_osx_select(void* arg) {
  uv_stream_t* stream;
  uv__stream_select_t* s;
  char buf[1024];
  fd_set sread;
  fd_set swrite;
  fd_set serror;
  int events;
  int fd;
  int r;
  int max_fd;

  stream = arg;
  s = stream->select;
  fd = stream->io_watcher.fd;

  if (fd > s->int_fd)
    max_fd = fd;
  else
    max_fd = s->int_fd;

  while (1) {
    /* Terminate on semaphore */
    if (uv_sem_trywait(&s->sem) == 0)
      break;

    /* Watch fd using select(2) */
    FD_ZERO(&sread);
    FD_ZERO(&swrite);
    FD_ZERO(&serror);

    if (uv_is_readable(stream))
      FD_SET(fd, &sread);
    if (uv_is_writable(stream))
      FD_SET(fd, &swrite);
    FD_SET(fd, &serror);
    FD_SET(s->int_fd, &sread);

    /* Wait indefinitely for fd events */
    r = select(max_fd + 1, &sread, &swrite, &serror, NULL);
    if (r == -1) {
      if (errno == EINTR)
        continue;

      /* XXX: Possible?! */
      abort();
    }

    /* Ignore timeouts */
    if (r == 0)
      continue;

    /* Empty socketpair's buffer in case of interruption */
    if (FD_ISSET(s->int_fd, &sread))
      while (1) {
        r = read(s->int_fd, buf, sizeof(buf));

        if (r == sizeof(buf))
          continue;

        if (r != -1)
          break;

        if (errno == EAGAIN || errno == EWOULDBLOCK)
          break;

        if (errno == EINTR)
          continue;

        abort();
      }

    /* Handle events */
    events = 0;
    if (FD_ISSET(fd, &sread))
      events |= UV__POLLIN;
    if (FD_ISSET(fd, &swrite))
      events |= UV__POLLOUT;
    if (FD_ISSET(fd, &serror))
      events |= UV__POLLERR;

    uv_mutex_lock(&s->mutex);
    s->events |= events;
    uv_mutex_unlock(&s->mutex);

    if (events != 0)
      uv_async_send(&s->async);
  }
}