| /*************************************************************************** |
| * Copyright 1995 Michael Veksler. mveksler@vnet.ibm.com |
| *************************************************************************** |
| * File: generic_hash.h |
| * Purpose : dynamically growing hash, may use shared or local memory. |
| *************************************************************************** |
| */ |
| #ifndef _GENERIC_HASH_H_ |
| #define _GENERIC_HASH_H_ |
| |
| #include "wintypes.h" |
| #include "shm_block.h" |
| #include "win.h" |
| /* default hash values */ |
| #define HASH_LOAD 70 |
| #define HASH_MEM_ALLOC (HASH_PTR (*)(int size)) malloc |
| #define HASH_MEM_FREE (void (*)(HASH_PTR)) free |
| #define HASH_MEM_ACCESS access_local_hash |
| #define HASH_REALLOC_JUMPS 1.5 /* Relative size of the new memory */ |
| #define MIN_HASH 13 |
| |
| typedef union { |
| char string[1]; |
| WORD words[1]; |
| DWORD dwords[1]; |
| char *ptr; |
| SEGPTR segptr; |
| } HASH_VAL; |
| |
| typedef struct hash_item_struct { |
| DWORD key; |
| HASH_VAL data; |
| } HASH_ITEM; |
| |
| /* point to the hash structure */ |
| typedef union { |
| HASH_ITEM* ptr; /* Local pointer */ |
| REL_PTR rel; /* IPC relative address */ |
| SEGPTR segptr; /* Universal (can be IPC or local) */ |
| } HASH_PTR; |
| |
| typedef struct hash_share_struct { |
| int total_items; /* total number of items (array size) */ |
| int free_items; /* number of free items (excluding deleted) */ |
| int deleted_items; /* number of deleted items */ |
| int ptr_updates; /* Number of updates to `items' pointer */ |
| /* (of items) - used for intecepting */ |
| /* changes to the pointer. */ |
| HASH_PTR items; /* pointer to the items */ |
| } HASH_SHARED; |
| typedef BOOL32 HASH_ITEM_TEST(HASH_VAL *value, HASH_VAL *seeked_data); |
| |
| /* NOTE: |
| * 1. Keys 0 and -1 are reserved. |
| * 2. none of these items should be accessed directly, use existing |
| * functions. If they are not enough, add a new function. |
| */ |
| typedef struct hash_container_struct { |
| int bytes_per_item; |
| int maximum_load; /* in percents (0..100) default is 70 */ |
| int min_free_items; /* minimum free items before reallocating |
| (Function of maximum_load) */ |
| |
| int last_ptr_update; /* to be compared with shared.ptr_updates */ |
| BOOL32 shared_was_malloced; /* Need that to know how to destroy hash */ |
| |
| /* This is an optional handler. |
| * If not NULL, this function is used for distinguishing between |
| * different data with the same key (key field holds integer and |
| * is too short for long keys like strings). |
| */ |
| HASH_ITEM_TEST *is_correct_item; |
| |
| /* Handlers used for reallocating memory |
| * [by allocating new data and then freeing old data] |
| */ |
| HASH_PTR (*allocate_mem)(int size); |
| void (*free_mem)(HASH_PTR); |
| |
| /* Translator from HASH_PTR construct to a regular pointer. |
| use HASH_MEM_ACCESS, if no translation is needed */ |
| HASH_ITEM *(*access_mem)(HASH_PTR); |
| |
| HASH_ITEM *items; |
| HASH_SHARED *shared; /* Things to be on shared memory. */ |
| } HASH_CONTAINER; |
| |
| |
| /********** Hash maintenance functions ***********/ |
| |
| |
| |
| /* Attach existing & running remote (i.e. shared) hash. |
| * Attach the items using the data stored in "shared" |
| */ |
| HASH_CONTAINER *attach_remote_hash(HASH_SHARED *shared, int bytes_per_datum, |
| HASH_ITEM *(*access_mem)(HASH_PTR)); |
| |
| |
| HASH_CONTAINER *create_remote_hash(HASH_SHARED *shared, |
| int bytes_per_datum, |
| int total_items, |
| HASH_PTR (*allocate_mem)(int size), |
| HASH_ITEM *(*access_mem)(HASH_PTR)); |
| /* hash constructor: create brand new hash (not on shared memory) */ |
| HASH_CONTAINER *create_hash(int bytes_per_datum, int total_items); |
| |
| /* set the extra handlers to non default values */ |
| void set_hash_handlers(HASH_CONTAINER *hash, |
| HASH_ITEM_TEST *is_correct_item, |
| HASH_PTR (*allocate_mem)(int size), |
| void (*free_mem)(HASH_PTR), |
| HASH_ITEM *(*access_mem)(HASH_PTR)); |
| |
| /* set extra parameters */ |
| void set_hash_parameters(HASH_CONTAINER *hash, int load); |
| |
| /* hash destructors */ |
| void destroy_hash(HASH_CONTAINER *hash); |
| void detach_hash(HASH_CONTAINER *hash); |
| |
| |
| /********** Hash usage *************/ |
| |
| /* All following functions have the same format: |
| * hash- the hash structure to use |
| * key- used as primary means to get to the entry. |
| * data- 1. a secondary key (used only if `is_correct_item' is set). |
| * 2. data to store. (for hash_add_item). |
| */ |
| HASH_VAL *hash_locate_item(HASH_CONTAINER* hash,int key, HASH_VAL* seeked_data); |
| BOOL32 hash_add_item(HASH_CONTAINER* hash, int key, HASH_VAL* data); |
| BOOL32 hash_delete_item(HASH_CONTAINER* hash, int key, HASH_VAL* seeked_data); |
| |
| |
| void *ret_null(); /* function returning null (used for */ |
| /* disabling memory reallocation) */ |
| |
| /* access function used by local (non IPC) memory */ |
| HASH_ITEM *access_local_hash(HASH_PTR ptr); |
| |
| #endif /* _GENERIC_HASH_H_ */ |