Пример #1
0
ph_hook_point_t *ph_hook_point_get(ph_string_t *name, bool create)
{
  ph_hook_point_t *hp = 0;

  ck_rwlock_read_lock(&rwlock);
  {
    ph_ht_lookup(&hook_hash, &name, &hp, false);
  }
  ck_rwlock_read_unlock(&rwlock);

  if (hp || !create) {
    return hp;
  }

  ck_rwlock_write_lock(&rwlock);
  {
    // Look again: someone may have populated while we were unlocked
    ph_ht_lookup(&hook_hash, &name, &hp, false);
    if (!hp) {
      hp = ph_mem_alloc(mt.hookpoint);
      if (hp) {
        if (ph_ht_set(&hook_hash, &name, &hp) != PH_OK) {
          ph_mem_free(mt.hookpoint, hp);
          hp = NULL;
        }
      }
    }
  }
  ck_rwlock_write_unlock(&rwlock);

  return hp;
}
Пример #2
0
/* called when ares creates a new socket */
static int sock_create_cb(ares_socket_t socket_fd, int type, void *data)
{
  ph_dns_channel_t *chan = data;
  ph_job_t *job = ph_mem_alloc(mt.job);

  ph_unused_parameter(type);

  if (!job) {
    return -1;
  }

  ph_job_init(job);
  job->callback = process_ares;
  job->data = chan;
  job->fd = socket_fd;

  if (ph_ht_set(&chan->sock_map, &socket_fd, &job) != PH_OK) {
    ph_mem_free(mt.job, job);
    return -1;
  }

  return 0;
}