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 ZBX_MUTEX_MODBUS, 51 ZBX_MUTEX_TREND_FUNC, 52 /* NOTE: Do not forget to sync changes here with mutex names in diag_add_locks_info()! */ 53 ZBX_MUTEX_COUNT 54 } 55 zbx_mutex_name_t; 56 57 typedef enum 58 { 59 ZBX_RWLOCK_CONFIG = 0, 60 ZBX_RWLOCK_VALUECACHE, 61 ZBX_RWLOCK_COUNT, 62 } 63 zbx_rwlock_name_t; 64 65 #ifdef HAVE_PTHREAD_PROCESS_SHARED 66 # define ZBX_MUTEX_NULL NULL 67 # define ZBX_RWLOCK_NULL NULL 68 69 # define zbx_rwlock_wrlock(rwlock) __zbx_rwlock_wrlock(__FILE__, __LINE__, rwlock) 70 # define zbx_rwlock_rdlock(rwlock) __zbx_rwlock_rdlock(__FILE__, __LINE__, rwlock) 71 # define zbx_rwlock_unlock(rwlock) __zbx_rwlock_unlock(__FILE__, __LINE__, rwlock) 72 73 typedef pthread_mutex_t * zbx_mutex_t; 74 typedef pthread_rwlock_t * zbx_rwlock_t; 75 76 void __zbx_rwlock_wrlock(const char *filename, int line, zbx_rwlock_t rwlock); 77 void __zbx_rwlock_rdlock(const char *filename, int line, zbx_rwlock_t rwlock); 78 void __zbx_rwlock_unlock(const char *filename, int line, zbx_rwlock_t rwlock); 79 void zbx_rwlock_destroy(zbx_rwlock_t *rwlock); 80 void zbx_locks_disable(void); 81 #else /* fallback to semaphores if read-write locks are not available */ 82 # define ZBX_RWLOCK_NULL -1 83 # define ZBX_MUTEX_NULL -1 84 85 # define zbx_rwlock_wrlock(rwlock) __zbx_mutex_lock(__FILE__, __LINE__, rwlock) 86 # define zbx_rwlock_rdlock(rwlock) __zbx_mutex_lock(__FILE__, __LINE__, rwlock) 87 # define zbx_rwlock_unlock(rwlock) __zbx_mutex_unlock(__FILE__, __LINE__, rwlock) 88 # define zbx_rwlock_destroy(rwlock) zbx_mutex_destroy(rwlock) 89 90 typedef int zbx_mutex_t; 91 typedef int zbx_rwlock_t; 92 #endif 93 int zbx_locks_create(char **error); 94 int zbx_rwlock_create(zbx_rwlock_t *rwlock, zbx_rwlock_name_t name, char **error); 95 zbx_mutex_t zbx_mutex_addr_get(zbx_mutex_name_t mutex_name); 96 zbx_rwlock_t zbx_rwlock_addr_get(zbx_rwlock_name_t rwlock_name); 97 #endif /* _WINDOWS */ 98 # define zbx_mutex_lock(mutex) __zbx_mutex_lock(__FILE__, __LINE__, mutex) 99 # define zbx_mutex_unlock(mutex) __zbx_mutex_unlock(__FILE__, __LINE__, mutex) 100 101 int zbx_mutex_create(zbx_mutex_t *mutex, zbx_mutex_name_t name, char **error); 102 void __zbx_mutex_lock(const char *filename, int line, zbx_mutex_t mutex); 103 void __zbx_mutex_unlock(const char *filename, int line, zbx_mutex_t mutex); 104 void zbx_mutex_destroy(zbx_mutex_t *mutex); 105 106 #ifdef _WINDOWS 107 zbx_mutex_name_t zbx_mutex_create_per_process_name(const zbx_mutex_name_t prefix); 108 #endif 109 110 #endif /* ZABBIX_MUTEXS_H */ 111