| /*************************************************************************** | |
| * 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_ */ |