summaryrefslogtreecommitdiff
path: root/src/libdcache/dcache_node_add.c
blob: a9cc5393ce7e36556b39cfb0e6cd1dce87a3498a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/* ISC license. */

#include <skalibs/avltree.h>

#include "dcache-internal.h"

int dcache_node_add (dcache *z, uint32_t i)
{
  dcache_node *node = DNODE(z, i) ;
  if (!avltree_insert(&z->by_key, i)) return 0 ;
  if (node->sa.len < node->sa.a) return 1 ;
  if (!avltree_insert(&z->by_entry, i)) goto err0 ;
  if (!avltree_insert(&z->by_expire, i)) goto err1 ;
  return 1 ;

 err1:
  avltree_delete(&z->by_entry, &node->entry) ;
 err0:
  avltree_delete(&z->by_key, node->sa.s) ;
  return 0 ;
}