int tc_epoll_create(tc_event_loop_t *loop) { int efd = -1; tc_event_t **evs; struct epoll_event *events = NULL; tc_epoll_multiplex_io_t *io; evs = tc_pcalloc(loop->pool, loop->size * sizeof(tc_event_t *)); if (evs == NULL) { return TC_EVENT_ERROR; } io = tc_palloc(loop->pool, sizeof(tc_epoll_multiplex_io_t)); if (io == NULL) { goto bad; } efd = epoll_create(MAX_FD_NUM); if(efd == -1) { tc_log_info(LOG_ERR, 0, "epoll_create failed!"); goto bad; } events = tc_pcalloc(loop->pool, (MAX_FD_NUM * sizeof(struct epoll_event))); if(events == NULL) { tc_log_info(LOG_ERR, 0, "tc_pcalloc struct epoll_event failed!"); goto bad; } io->max_fd = -1; io->efd = efd; io->events = events; io->evs = evs; loop->io = io; return TC_EVENT_OK; bad: tc_pfree(loop->pool, evs); tc_pfree(loop->pool, io); tc_pfree(loop->pool, events); if (efd != -1) { close(efd); } return TC_EVENT_ERROR; }
static bool check_pack_needed_for_recons(tc_sess_t *s, tc_iph_t *ip, tc_tcph_t *tcp) { uint16_t size_tcp; p_link_node ln; unsigned char *payload, command, *pkt; mysql_table_item_t *item; if (s->cur_pack.cont_len > 0) { size_tcp = tcp->doff << 2; payload = (unsigned char *) ((char *) tcp + size_tcp); /* skip packet length */ payload = payload + 3; /* skip packet number */ payload = payload + 1; command = payload[0]; if (command != COM_STMT_PREPARE) { return false; } item = hash_find(ctx.table, s->hash_key); if (!item) { item = tc_pcalloc(ctx.pool, sizeof(mysql_table_item_t)); if (item != NULL) { item->list = link_list_create(ctx.pool); if (item->list != NULL) { hash_add(ctx.table, ctx.pool, s->hash_key, item); if (ctx.table->total > MAX_TABLE_ITEM_NUM) { tc_log_info(LOG_INFO, 0, "too many items in ctx.table"); } } else { tc_log_info(LOG_ERR, 0, "list create err"); return false; } } else { tc_log_info(LOG_ERR, 0, "mysql item create err"); return false; } } if (item->list->size > MAX_SP_SIZE) { tc_log_info(LOG_INFO, 0, "too many prepared stmts for a session"); return false; } tc_log_debug1(LOG_INFO, 0, "push packet:%u", ntohs(s->src_port)); pkt = (unsigned char *) cp_fr_ip_pack(ctx.pool, ip); ln = link_node_malloc(ctx.pool, pkt); ln->key = ntohl(tcp->seq); link_list_append_by_order(item->list, ln); item->tot_cont_len += s->cur_pack.cont_len; return true; } return false; }
p_link_node link_node_malloc(tc_pool_t *pool, void *data) { p_link_node p; p = (p_link_node) tc_pcalloc(pool, sizeof(link_node)); if (p != NULL) { p->data = data; } return p; }
link_list * link_list_create(tc_pool_t *pool) { link_list *l = (link_list *) tc_pcalloc(pool, sizeof(link_list)); if (l != NULL) { l->size = 0; l->head.next = &(l->head); l->head.prev = &(l->head); } return l; }
hash_table * hash_create(tc_pool_t *pool, uint32_t size) { size_t i; hash_table *ht = (hash_table *) tc_pcalloc(pool, sizeof(hash_table)); if (ht != NULL) { ht->pool = pool; ht->size = size; ht->lists = (link_list **) tc_pcalloc(pool, size * sizeof(link_list *)); if (ht->lists != NULL) { for (i = 0; i < size; i++) { ht->lists[i] = link_list_create(pool); } } else { tc_log_info(LOG_ERR, errno, "can't calloc memory for hash lists"); ht = NULL; } } else { tc_log_info(LOG_ERR, errno, "can't calloc memory for hash table"); } return ht; }
static int proc_when_sess_created(tc_sess_t *s) { tc_mysql_session *data = s->data; if (data == NULL) { data = (tc_mysql_session *) tc_pcalloc(s->pool, sizeof(tc_mysql_session)); if (data) { s->data = data; } } else { tc_memzero(data, sizeof(tc_mysql_session)); } return TC_OK; }
void delay_table_add(uint64_t key, struct msg_server_s *msg) { tc_pool_t *pool; p_link_node ln; delay_sess_t *s; struct msg_server_s *cmsg; s = (delay_sess_t *) hash_find(table, key); if (s == NULL) { pool = tc_create_pool(TC_DEFAULT_POOL_SIZE, 0); if (pool != NULL) { s = (delay_sess_t *) tc_pcalloc(pool, sizeof(delay_sess_t)); if (s != NULL) { s->key = key; s->pool = pool; s->msg_list = link_list_create(s->pool); s->evt = tc_event_add_timer(s->pool, OUTPUT_INTERVAL, s, tc_delay_del_obs); msg_ls_cnt++; hash_add(table, s->pool, key, s); } else { return; } } else { return; } } cmsg = copy_message(s->pool, msg); if (cmsg != NULL) { ln = link_node_malloc(s->pool, (void *) cmsg); link_list_append(s->msg_list, ln); msg_item_cnt++; } }