text: /*
   * %CopyrightBegin%
   * 
   * Copyright Ericsson AB 1998-2011. All Rights Reserved.
   * 
   * The contents of this file are subject to the Erlang Public License,
   * Version 1.1, (the "License"); you may not use this file except in
   * compliance with the License. You should have received a copy of the
   * Erlang Public License along with this software. If not, it can be
   * retrieved online at http://www.erlang.org/.
   * 
   * Software distributed under the License is distributed on an "AS IS"
   * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
   * the License for the specific language governing rights and limitations
   * under the License.
   * 
   * %CopyrightEnd%
   */
  
  #ifndef _DB_HASH_H
  #define _DB_HASH_H
  
  #include "erl_db_util.h" /* DbTerm & DbTableCommon */
  
  typedef struct fixed_deletion {
      int slot;
      struct fixed_deletion *next;
  } FixedDeletion;
  
  typedef struct hash_db_term {
      struct  hash_db_term* next;  /* next bucket */
      HashValue  hvalue;        /* stored hash value */
      DbTerm dbterm;         /* The actual term */
  } HashDbTerm;
  
  #define DB_HASH_LOCK_CNT 16
  typedef struct db_table_hash_fine_locks {
      union {
  	erts_smp_rwmtx_t lck;
  	byte _cache_line_alignment[64];
      }lck_vec[DB_HASH_LOCK_CNT];
  } DbTableHashFineLocks;
  
  typedef struct db_table_hash {
      DbTableCommon common;
  
      erts_smp_atomic_t segtab;  /* The segment table (struct segment**) */
      erts_smp_atomic_t szm;     /* current size mask. */
      
      /* SMP: nslots and nsegs are protected by is_resizing or table write lock */
      int nslots;       /* Total number of slots */
      int nsegs;        /* Size of segment table */
  
      /* List of slots where elements have been deleted while table was fixed */
      erts_smp_atomic_t fixdel;  /* (FixedDeletion*) */	
      erts_smp_atomic_t nactive; /* Number of "active" slots */
      erts_smp_atomic_t is_resizing; /* grow/shrink in progress */
  #ifdef ERTS_SMP
      DbTableHashFineLocks* locks;
  #endif
  #ifdef VALGRIND
      struct ext_segment* top_ptr_to_segment_with_active_segtab;
  #endif
  } DbTableHash;
  
  
  /*
  ** Function prototypes, looks the same (except the suffix) for all 
  ** table types. The process is always an [in out] parameter.
  */
  void db_initialize_hash(void);
  void db_unfix_table_hash(DbTableHash *tb /* [in out] */);
  Uint db_kept_items_hash(DbTableHash *tb);
  
  /* Interface for meta pid table */
  int db_create_hash(Process *p, 
  		   DbTable *tbl /* [in out] */);
  
  int db_put_hash(DbTable *tbl, Eterm obj, int key_clash_fail);
  
  int db_get_hash(Process *p, DbTable *tbl, Eterm key, Eterm *ret);
  
  int db_erase_hash(DbTable *tbl, Eterm key, Eterm *ret);
  
  int db_get_element_array(DbTable *tbl, 
  			 Eterm key,
  			 int ndex, 
  			 Eterm *ret,
  			 int *num_ret); 
  
  int db_erase_bag_exact2(DbTable *tbl, Eterm key, Eterm value);
  
  /* not yet in method table */
  int db_mark_all_deleted_hash(DbTable *tbl);
  
  typedef struct {
      float avg_chain_len;
      float std_dev_chain_len;
      float std_dev_expected;
      int max_chain_len;
      int min_chain_len;
  }DbHashStats;
  
  void db_calc_stats_hash(DbTableHash* tb, DbHashStats*);
  
  #endif /* _DB_HASH_H */
  