comparison src/event/ngx_event_openssl.c @ 1743:4fc402c3ec73

optimize rbtree initialization and insert
author Igor Sysoev <igor@sysoev.ru>
date Mon, 17 Dec 2007 08:52:00 +0000
parents 36548ad85be1
children 427d442e1ad8
comparison
equal deleted inserted replaced
1742:268b81386fe4 1743:4fc402c3ec73
1239 sentinel = ngx_slab_alloc(shpool, sizeof(ngx_rbtree_node_t)); 1239 sentinel = ngx_slab_alloc(shpool, sizeof(ngx_rbtree_node_t));
1240 if (sentinel == NULL) { 1240 if (sentinel == NULL) {
1241 return NGX_ERROR; 1241 return NGX_ERROR;
1242 } 1242 }
1243 1243
1244 ngx_rbtree_sentinel_init(sentinel); 1244 ngx_rbtree_init(cache->session_rbtree, sentinel,
1245 1245 ngx_ssl_session_rbtree_insert_value);
1246 cache->session_rbtree->root = sentinel;
1247 cache->session_rbtree->sentinel = sentinel;
1248 cache->session_rbtree->insert = ngx_ssl_session_rbtree_insert_value;
1249 1246
1250 shm_zone->data = cache; 1247 shm_zone->data = cache;
1251 1248
1252 return NGX_OK; 1249 return NGX_OK;
1253 } 1250 }
1623 1620
1624 static void 1621 static void
1625 ngx_ssl_session_rbtree_insert_value(ngx_rbtree_node_t *temp, 1622 ngx_ssl_session_rbtree_insert_value(ngx_rbtree_node_t *temp,
1626 ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel) 1623 ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel)
1627 { 1624 {
1628 ngx_ssl_sess_id_t *sess_id, *sess_id_temp; 1625 ngx_rbtree_node_t **p;
1626 ngx_ssl_sess_id_t *sess_id, *sess_id_temp;
1629 1627
1630 for ( ;; ) { 1628 for ( ;; ) {
1631 1629
1632 if (node->key < temp->key) { 1630 if (node->key < temp->key) {
1633 1631
1634 if (temp->left == sentinel) { 1632 p = &temp->left;
1635 temp->left = node;
1636 break;
1637 }
1638
1639 temp = temp->left;
1640 1633
1641 } else if (node->key > temp->key) { 1634 } else if (node->key > temp->key) {
1642 1635
1643 if (temp->right == sentinel) { 1636 p = &temp->right;
1644 temp->right = node;
1645 break;
1646 }
1647
1648 temp = temp->right;
1649 1637
1650 } else { /* node->key == temp->key */ 1638 } else { /* node->key == temp->key */
1651 1639
1652 sess_id = (ngx_ssl_sess_id_t *) node; 1640 sess_id = (ngx_ssl_sess_id_t *) node;
1653 sess_id_temp = (ngx_ssl_sess_id_t *) temp; 1641 sess_id_temp = (ngx_ssl_sess_id_t *) temp;
1654 1642
1655 if (ngx_memn2cmp(sess_id->id, sess_id_temp->id, 1643 p = (ngx_memn2cmp(sess_id->id, sess_id_temp->id,
1656 (size_t) node->data, (size_t) temp->data) 1644 (size_t) node->data, (size_t) temp->data)
1657 < 0) 1645 < 0) ? &temp->left : &temp->right;
1658 { 1646 }
1659 if (temp->left == sentinel) { 1647
1660 temp->left = node; 1648 if (*p == sentinel) {
1661 break; 1649 break;
1662 } 1650 }
1663 1651
1664 temp = temp->left; 1652 temp = *p;
1665 1653 }
1666 } else { 1654
1667 1655 *p = node;
1668 if (temp->right == sentinel) {
1669 temp->right = node;
1670 break;
1671 }
1672
1673 temp = temp->right;
1674 }
1675 }
1676 }
1677
1678 node->parent = temp; 1656 node->parent = temp;
1679 node->left = sentinel; 1657 node->left = sentinel;
1680 node->right = sentinel; 1658 node->right = sentinel;
1681 ngx_rbt_red(node); 1659 ngx_rbt_red(node);
1682 } 1660 }