static node_t *node_put(tree_t *tree, node_t *p, node_t *child) { if (IS_NIL(p)) p = child; else { int d = tree->compare(child->key, p->key); if (d == 0) return NULL; if (d < 0) { node_t *q = node_put(tree, p->left, child); if (!q) return NULL; p->left = q; } else { node_t *q = node_put(tree, p->right, child); if (!q) return NULL; p->right = q; } p = node_split(node_skew(p)); } return p; }
static Node *node_put(Node *h, Key_T key, Val_T val) { if (h == NULL) { h = malloc(sizeof(Node)); node_init2(h, key, val); return h; } int i; if (node_isLeaf(h)) { for (i = 0; i != h->num - 1; i++) { int cmp = keycmp(key, h->keys[i]); if (cmp < 0) { node_doPut(h, i, key, val); } } } for (i = 0; i != h->num - 1; i++) { int cmp = keycmp(key, h->keys[i]); if (cmp < 0) { h->childs[i] = node_put(h->childs[i], key, val); return h; } else if (cmp == 0) { printf("warning: not support same key=%d\n", key); return h; } } h->childs[i] = node_put(h->childs[i], key, val); return h; }
void tcp_newconn( void ) { struct epoll_event ev; ITEM *listItem = NULL; TCP_NODE *n = NULL; int connfd; IP c_addr; socklen_t c_addrlen = sizeof( IP ); for( ;; ) { /* Prepare incoming connection */ memset( ( char * ) &c_addr, '\0', c_addrlen ); /* Accept */ connfd = accept( _main->tcp->sockfd, ( struct sockaddr * ) &c_addr, &c_addrlen ); if( connfd < 0 ) { if( errno == EAGAIN || errno == EWOULDBLOCK ) { break; } else { fail( strerror( errno ) ); } } /* New connection: Create node object */ if( ( listItem = node_put() ) == NULL ) { info( NULL, "The linked list reached its limits" ); node_disconnect( connfd ); break; } /* Store data */ n = list_value( listItem ); n->connfd = connfd; memcpy( &n->c_addr, &c_addr, c_addrlen ); n->c_addrlen = c_addrlen; /* Non blocking */ if( tcp_nonblocking( n->connfd ) < 0 ) { fail( "tcp_nonblocking() failed" ); } ev.events = EPOLLET | EPOLLIN | EPOLLONESHOT; ev.data.ptr = listItem; if( epoll_ctl( _main->tcp->epollfd, EPOLL_CTL_ADD, n->connfd, &ev ) == -1 ) { info( NULL, strerror( errno ) ); fail( "tcp_newconn: epoll_ctl( ) failed" ); } } }
node_t *tree_put(tree_t *tree, const int key, node_t *node) { node_t *p; node->key = key; node->level = 1; node->right = node->left = NIL; p = node_put(tree, tree->root, node); if (p) { tree->root = p; tree->node_num++; } return p; }