Ejemplo n.º 1
0
Archivo: socket.c Proyecto: mattn/h2o
static void do_write(h2o_socket_t *sock, h2o_buf_t *bufs, size_t bufcnt, h2o_socket_cb cb)
{
    assert(sock->_cb.write == NULL);
    assert(sock->_wreq.cnt == 0);
    sock->_cb.write = cb;

    /* try to write now */
    if (write_core(sock->fd, &bufs, &bufcnt) != 0) {
        sock->_flags |= H2O_SOCKET_FLAG_IS_WRITE_ERROR;
        h2o_socket__link_to_pending(sock);
        return;
    }
    if (bufcnt == 0) {
        /* write complete, schedule the callback */
        h2o_socket__link_to_pending(sock);
        return;
    }

    /* setup the buffer to send pending data */
    if (bufcnt <= sizeof(sock->_wreq.smallbufs) / sizeof(sock->_wreq.smallbufs[0])) {
        sock->_wreq.bufs = sock->_wreq.smallbufs;
    } else {
        sock->_wreq.bufs = h2o_malloc(sizeof(h2o_buf_t) * bufcnt);
        sock->_wreq.alloced_ptr = sock->_wreq.bufs = sock->_wreq.bufs;
    }
    memcpy(sock->_wreq.bufs, bufs, sizeof(h2o_buf_t) * bufcnt);
    sock->_wreq.cnt = bufcnt;

    /* schedule the write */
    h2o_socket__link_to_statechanged(sock);
}
Ejemplo n.º 2
0
static void
write_pair_help(struct writer_control *p, struct pic_pair *pair)
{
  pic_state *pic = p->pic;
  khash_t(l) *lh = &p->labels;
  khash_t(v) *vh = &p->visited;
  khiter_t it;
  int ret;

  write_core(p, pair->car);

  if (pic_nil_p(pair->cdr)) {
    return;
  }
  else if (pic_pair_p(pair->cdr)) {

    /* shared objects */
    if ((it = kh_get(l, lh, pic_ptr(pair->cdr))) != kh_end(lh) && kh_val(lh, it) != -1) {
      xfprintf(pic, p->file, " . ");

      kh_put(v, vh, pic_ptr(pair->cdr), &ret);
      if (ret == 0) {           /* if exists */
        xfprintf(pic, p->file, "#%d#", kh_val(lh, it));
        return;
      }
      xfprintf(pic, p->file, "#%d=", kh_val(lh, it));
    }
    else {
      xfprintf(pic, p->file, " ");
    }

    write_pair_help(p, pic_pair_ptr(pair->cdr));

    if (p->op == OP_WRITE) {
      if ((it = kh_get(l, lh, pic_ptr(pair->cdr))) != kh_end(lh) && kh_val(lh, it) != -1) {
        it = kh_get(v, vh, pic_ptr(pair->cdr));
        kh_del(v, vh, it);
      }
    }
    return;
  }
  else {
    xfprintf(pic, p->file, " . ");
    write_core(p, pair->cdr);
  }
}
Ejemplo n.º 3
0
static void
write_pair(struct writer_control *p, struct pic_pair *pair)
{
  pic_state *pic = p->pic;
  xFILE *file = p->file;
  pic_sym *tag;

  if (pic_pair_p(pair->cdr) && pic_nil_p(pic_cdr(pic, pair->cdr)) && pic_sym_p(pair->car)) {
    tag = pic_sym_ptr(pair->car);
    if (tag == pic->sQUOTE) {
      xfprintf(pic, file, "'");
      write_core(p, pic_car(pic, pair->cdr));
      return;
    }
    else if (tag == pic->sUNQUOTE) {
      xfprintf(pic, file, ",");
      write_core(p, pic_car(pic, pair->cdr));
      return;
    }
    else if (tag == pic->sUNQUOTE_SPLICING) {
      xfprintf(pic, file, ",@");
      write_core(p, pic_car(pic, pair->cdr));
      return;
    }
    else if (tag == pic->sQUASIQUOTE) {
      xfprintf(pic, file, "`");
      write_core(p, pic_car(pic, pair->cdr));
      return;
    }
    else if (tag == pic->sSYNTAX_QUOTE) {
      xfprintf(pic, file, "#'");
      write_core(p, pic_car(pic, pair->cdr));
      return;
    }
    else if (tag == pic->sSYNTAX_UNQUOTE) {
      xfprintf(pic, file, "#,");
      write_core(p, pic_car(pic, pair->cdr));
      return;
    }
    else if (tag == pic->sSYNTAX_UNQUOTE_SPLICING) {
      xfprintf(pic, file, "#,@");
      write_core(p, pic_car(pic, pair->cdr));
      return;
    }
    else if (tag == pic->sSYNTAX_QUASIQUOTE) {
      xfprintf(pic, file, "#`");
      write_core(p, pic_car(pic, pair->cdr));
      return;
    }
  }
  xfprintf(pic, file, "(");
  write_pair_help(p, pair);
  xfprintf(pic, file, ")");
}
Ejemplo n.º 4
0
static void
write_pair_help(pic_state *pic, pic_value pair, pic_value port, struct writer_control *p)
{
  pic_value cdr = pic_cdr(pic, pair);

  write_core(pic, pic_car(pic, pair), port, p);

  if (pic_nil_p(pic, cdr)) {
    return;
  }
  else if (pic_pair_p(pic, cdr) && ! is_shared_object(pic, cdr, p)) {
    pic_fprintf(pic, port, " ");
    write_pair_help(pic, cdr, port, p);
  }
  else {
    pic_fprintf(pic, port, " . ");
    write_core(pic, cdr, port, p);
  }
}
Ejemplo n.º 5
0
static void
write_pair(pic_state *pic, pic_value pair, pic_value port, struct writer_control *p)
{
  pic_value tag;

  if (pic_pair_p(pic, pic_cdr(pic, pair)) && pic_nil_p(pic, pic_cddr(pic, pair)) && pic_sym_p(pic, pic_car(pic, pair))) {
    tag = pic_car(pic, pair);
    if (EQ(tag, "quote")) {
      pic_fprintf(pic, port, "'");
      write_core(pic, pic_cadr(pic, pair), port, p);
      return;
    }
    else if (EQ(tag, "unquote")) {
      pic_fprintf(pic, port, ",");
      write_core(pic, pic_cadr(pic, pair), port, p);
      return;
    }
    else if (EQ(tag, "unquote-splicing")) {
      pic_fprintf(pic, port, ",@");
      write_core(pic, pic_cadr(pic, pair), port, p);
      return;
    }
    else if (EQ(tag, "quasiquote")) {
      pic_fprintf(pic, port, "`");
      write_core(pic, pic_cadr(pic, pair), port, p);
      return;
    }
    else if (EQ(tag, "syntax-quote")) {
      pic_fprintf(pic, port, "#'");
      write_core(pic, pic_cadr(pic, pair), port, p);
      return;
    }
    else if (EQ(tag, "syntax-unquote")) {
      pic_fprintf(pic, port, "#,");
      write_core(pic, pic_cadr(pic, pair), port, p);
      return;
    }
    else if (EQ(tag, "syntax-unquote-splicing")) {
      pic_fprintf(pic, port, "#,@");
      write_core(pic, pic_cadr(pic, pair), port, p);
      return;
    }
    else if (EQ(tag, "syntax-quasiquote")) {
      pic_fprintf(pic, port, "#`");
      write_core(pic, pic_cadr(pic, pair), port, p);
      return;
    }
  }
  pic_fprintf(pic, port, "(");
  write_pair_help(pic, pair, port, p);
  pic_fprintf(pic, port, ")");
}
Ejemplo n.º 6
0
static void
write_value(pic_state *pic, pic_value obj, pic_value port, int mode, int op)
{
  struct writer_control p;

  writer_control_init(pic, &p, mode, op);

  traverse(pic, obj, &p);

  write_core(pic, obj, port, &p);
}
Ejemplo n.º 7
0
static void
write_dict(pic_state *pic, pic_value dict, pic_value port, struct writer_control *p)
{
  pic_value key, val;
  int it = 0;

  pic_fprintf(pic, port, "#.(dictionary");
  while (pic_dict_next(pic, dict, &it, &key, &val)) {
    pic_fprintf(pic, port, " '%s ", pic_sym(pic, key));
    write_core(pic, val, port, p);
  }
  pic_fprintf(pic, port, ")");
}
Ejemplo n.º 8
0
static void
write_dict(struct writer_control *p, struct pic_dict *dict)
{
  pic_state *pic = p->pic;
  xFILE *file = p->file;
  pic_sym *sym;
  khiter_t it;

  xfprintf(pic, file, "#.(dictionary");
  pic_dict_for_each (sym, dict, it) {
    xfprintf(pic, file, " '%s ", pic_symbol_name(pic, sym));
    write_core(p, pic_dict_ref(pic, dict, sym));
  }
Ejemplo n.º 9
0
static void
write_vec(pic_state *pic, pic_value vec, pic_value port, struct writer_control *p)
{
  int i, len = pic_vec_len(pic, vec);

  pic_fprintf(pic, port, "#(");
  for (i = 0; i < len; ++i) {
    write_core(pic, pic_vec_ref(pic, vec, i), port, p);
    if (i + 1 < len) {
      pic_fprintf(pic, port, " ");
    }
  }
  pic_fprintf(pic, port, ")");
}
Ejemplo n.º 10
0
static void
write_vec(struct writer_control *p, pic_vec *vec)
{
  pic_state *pic = p->pic;
  xFILE *file = p->file;
  size_t i;

  xfprintf(pic, file, "#(");
  for (i = 0; i < vec->len; ++i) {
    write_core(p, vec->data[i]);
    if (i + 1 < vec->len) {
      xfprintf(pic, file, " ");
    }
  }
  xfprintf(pic, file, ")");
}
Ejemplo n.º 11
0
Archivo: socket.c Proyecto: mattn/h2o
void h2o_socket__write_pending(h2o_socket_t *sock)
{
    assert(sock->_cb.write != NULL);
    assert(sock->_wreq.cnt != 0);

    /* write */
    if (write_core(sock->fd, &sock->_wreq.bufs, &sock->_wreq.cnt) != 0
        || sock->_wreq.cnt == 0) {
        /* either completed or failed */
        wreq_free_buffer_if_allocated(sock);
        if (sock->_wreq.cnt != 0) {
            /* pending data exists -> was an error */
            sock->_wreq.cnt = 0; /* clear it ! */
            sock->_flags |= H2O_SOCKET_FLAG_IS_WRITE_ERROR;
        }
        h2o_socket__link_to_pending(sock);
        h2o_socket__link_to_statechanged(sock); /* might need to disable the write polling */
    }
}