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; }
/* 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; }