1 /* 2 ** Zabbix 3 ** Copyright (C) 2001-2021 Zabbix SIA 4 ** 5 ** This program is free software; you can redistribute it and/or modify 6 ** it under the terms of the GNU General Public License as published by 7 ** the Free Software Foundation; either version 2 of the License, or 8 ** (at your option) any later version. 9 ** 10 ** This program is distributed in the hope that it will be useful, 11 ** but WITHOUT ANY WARRANTY; without even the implied warranty of 12 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 ** GNU General Public License for more details. 14 ** 15 ** You should have received a copy of the GNU General Public License 16 ** along with this program; if not, write to the Free Software 17 ** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 18 **/ 19 20 #ifndef ZABBIX_MUTEXS_H 21 #define ZABBIX_MUTEXS_H 22 23 #ifdef _WINDOWS 24 # define ZBX_MUTEX_NULL NULL 25 26 # define ZBX_MUTEX_LOG zbx_mutex_create_per_process_name(L"ZBX_MUTEX_LOG") 27 # define ZBX_MUTEX_PERFSTAT zbx_mutex_create_per_process_name(L"ZBX_MUTEX_PERFSTAT") 28 29 typedef wchar_t * zbx_mutex_name_t; 30 typedef HANDLE zbx_mutex_t; 31 #else /* not _WINDOWS */ 32 typedef enum 33 { 34 ZBX_MUTEX_LOG = 0, 35 ZBX_MUTEX_CACHE, 36 ZBX_MUTEX_TRENDS, 37 ZBX_MUTEX_CACHE_IDS, 38 ZBX_MUTEX_SELFMON, 39 ZBX_MUTEX_CPUSTATS, 40 ZBX_MUTEX_DISKSTATS, 41 ZBX_MUTEX_ITSERVICES, 42 ZBX_MUTEX_VALUECACHE, 43 ZBX_MUTEX_VMWARE, 44 ZBX_MUTEX_SQLITE3, 45 ZBX_MUTEX_PROCSTAT, 46 ZBX_MUTEX_PROXY_HISTORY, 47 #ifdef HAVE_VMINFO_T_UPDATES 48 ZBX_MUTEX_KSTAT, 49 #endif 50 /* NOTE: Do not forget to sync changes here with mutex names in diag_add_locks_info()! */ 51 ZBX_MUTEX_COUNT 52 } 53 zbx_mutex_name_t; 54 55 typedef enum 56 { 57 ZBX_RWLOCK_CONFIG = 0, 58 ZBX_RWLOCK_VALUECACHE, 59 ZBX_RWLOCK_COUNT, 60 } 61 zbx_rwlock_name_t; 62 63 #ifdef HAVE_PTHREAD_PROCESS_SHARED 64 # define ZBX_MUTEX_NULL NULL 65 # define ZBX_RWLOCK_NULL NULL 66 67 # define zbx_rwlock_wrlock(rwlock) __zbx_rwlock_wrlock(__FILE__, __LINE__, rwlock) 68 # define zbx_rwlock_rdlock(rwlock) __zbx_rwlock_rdlock(__FILE__, __LINE__, rwlock) 69 # define zbx_rwlock_unlock(rwlock) __zbx_rwlock_unlock(__FILE__, __LINE__, rwlock) 70 71 typedef pthread_mutex_t * zbx_mutex_t; 72 typedef pthread_rwlock_t * zbx_rwlock_t; 73 74 void __zbx_rwlock_wrlock(const char *filename, int line, zbx_rwlock_t rwlock); 75 void __zbx_rwlock_rdlock(const char *filename, int line, zbx_rwlock_t rwlock); 76 void __zbx_rwlock_unlock(const char *filename, int line, zbx_rwlock_t rwlock); 77 void zbx_rwlock_destroy(zbx_rwlock_t *rwlock); 78 void zbx_locks_disable(void); 79 #else /* fallback to semaphores if read-write locks are not available */ 80 # define ZBX_RWLOCK_NULL -1 81 # define ZBX_MUTEX_NULL -1 82 83 # define zbx_rwlock_wrlock(rwlock) __zbx_mutex_lock(__FILE__, __LINE__, rwlock) 84 # define zbx_rwlock_rdlock(rwlock) __zbx_mutex_lock(__FILE__, __LINE__, rwlock) 85 # define zbx_rwlock_unlock(rwlock) __zbx_mutex_unlock(__FILE__, __LINE__, rwlock) 86 # define zbx_rwlock_destroy(rwlock) zbx_mutex_destroy(rwlock) 87 88 typedef int zbx_mutex_t; 89 typedef int zbx_rwlock_t; 90 #endif 91 int zbx_locks_create(char **error); 92 int zbx_rwlock_create(zbx_rwlock_t *rwlock, zbx_rwlock_name_t name, char **error); 93 zbx_mutex_t zbx_mutex_addr_get(zbx_mutex_name_t mutex_name); 94 zbx_rwlock_t zbx_rwlock_addr_get(zbx_rwlock_name_t rwlock_name); 95 #endif /* _WINDOWS */ 96 # define zbx_mutex_lock(mutex) __zbx_mutex_lock(__FILE__, __LINE__, mutex) 97 # define zbx_mutex_unlock(mutex) __zbx_mutex_unlock(__FILE__, __LINE__, mutex) 98 99 int zbx_mutex_create(zbx_mutex_t *mutex, zbx_mutex_name_t name, char **error); 100 void __zbx_mutex_lock(const char *filename, int line, zbx_mutex_t mutex); 101 void __zbx_mutex_unlock(const char *filename, int line, zbx_mutex_t mutex); 102 void zbx_mutex_destroy(zbx_mutex_t *mutex); 103 104 #ifdef _WINDOWS 105 zbx_mutex_name_t zbx_mutex_create_per_process_name(const zbx_mutex_name_t prefix); 106 #endif 107 108 #endif /* ZABBIX_MUTEXS_H */ 109