Пример #1
0
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;
}
Пример #2
0
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;
}
Пример #3
0
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" );
		}
	}
}
Пример #4
0
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;
}