1 /* 2 * $Id$ 3 * 4 * Copyright (C) 2012 Smile Communications, jason.penton@smilecoms.com 5 * Copyright (C) 2012 Smile Communications, richard.good@smilecoms.com 6 * 7 * The initial version of this code was written by Dragos Vingarzan 8 * (dragos(dot)vingarzan(at)fokus(dot)fraunhofer(dot)de and the 9 * Fruanhofer Institute. It was and still is maintained in a separate 10 * branch of the original SER. We are therefore migrating it to 11 * Kamailio/SR and look forward to maintaining it from here on out. 12 * 2011/2012 Smile Communications, Pty. Ltd. 13 * ported/maintained/improved by 14 * Jason Penton (jason(dot)penton(at)smilecoms.com and 15 * Richard Good (richard(dot)good(at)smilecoms.com) as part of an 16 * effort to add full IMS support to Kamailio/SR using a new and 17 * improved architecture 18 * 19 * NB: Alot of this code was originally part of OpenIMSCore, 20 * FhG Fokus. 21 * Copyright (C) 2004-2006 FhG Fokus 22 * Thanks for great work! This is an effort to 23 * break apart the various CSCF functions into logically separate 24 * components. We hope this will drive wider use. We also feel 25 * that in this way the architecture is more complete and thereby easier 26 * to manage in the Kamailio/SR environment 27 * 28 * This file is part of Kamailio, a free SIP server. 29 * 30 * Kamailio is free software; you can redistribute it and/or modify 31 * it under the terms of the GNU General Public License as published by 32 * the Free Software Foundation; either version 2 of the License, or 33 * (at your option) any later version 34 * 35 * Kamailio is distributed in the hope that it will be useful, 36 * but WITHOUT ANY WARRANTY; without even the implied warranty of 37 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 38 * GNU General Public License for more details. 39 * 40 * You should have received a copy of the GNU General Public License 41 * along with this program; if not, write to the Free Software 42 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 43 * 44 */ 45 46 #ifndef HSLOT_H 47 #define HSLOT_H 48 49 #include "../../core/locking.h" 50 #include "../../core/atomic/atomic_common.h" 51 52 #include "udomain.h" 53 #include "impurecord.h" 54 55 56 struct udomain; 57 struct impurecord; 58 59 60 typedef struct hslot { 61 int n; /*!< Number of elements in the collision slot */ 62 struct impurecord* first; /*!< First element in the list */ 63 struct impurecord* last; /*!< Last element in the list */ 64 struct udomain* d; /*!< Domain we belong to */ 65 #ifdef GEN_LOCK_T_PREFERED 66 gen_lock_t *lock; /*!< Lock for hash entry - fastlock */ 67 #else 68 int lockidx; /*!< Lock index for hash entry - the rest*/ 69 #endif 70 atomic_t locker_pid; 71 int recursive_lock_level; 72 73 } hslot_t; 74 75 /*! \brief 76 * Initialize slot structure 77 */ 78 void init_slot(struct udomain* _d, hslot_t* _s, int n); 79 80 81 /*! \brief 82 * Deinitialize given slot structure 83 */ 84 void deinit_slot(hslot_t* _s); 85 86 87 /*! \brief 88 * Add an element to slot linked list 89 */ 90 void slot_add(hslot_t* _s, struct impurecord* _r); 91 92 93 /*! \brief 94 * Remove an element from slot linked list 95 */ 96 void slot_rem(hslot_t* _s, struct impurecord* _r); 97 98 99 /*! 100 * \brief Initialize locks for the hash table 101 * \return 0 on success, -1 on failure 102 */ 103 int ul_init_locks(void); 104 105 106 /*! 107 * \brief Destroy all locks on the list 108 */ 109 void ul_unlock_locks(void); 110 void ul_destroy_locks(void); 111 112 #ifndef GEN_LOCK_T_PREFERED 113 void ul_lock_idx(int idx); 114 void ul_release_idx(int idx); 115 #endif 116 117 #endif /* HSLOT_H */ 118