1 /* 2 * General functionality supporting file notifications. 3 * 4 * Copyright (C) 2021 Paul Boddie <paul@boddie.org.uk> 5 * 6 * This program is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU General Public License as 8 * published by the Free Software Foundation; either version 2 of 9 * the License, or (at your option) any later version. 10 * 11 * This program is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 * GNU General Public License for more details. 15 * 16 * You should have received a copy of the GNU General Public License 17 * along with this program; if not, write to the Free Software 18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, 19 * Boston, MA 02110-1301, USA 20 */ 21 22 #include "file_notifier_registry.h" 23 24 25 26 FileNotifierRegistry::FileNotifierRegistry() 27 { 28 } 29 30 31 32 /* Obtain a file-specific notification manager. */ 33 34 FileNotification *FileNotifierRegistry::_get(fileid_t fileid) 35 { 36 FileNotifiers::iterator entry = _notifiers.find(fileid); 37 38 if (entry != _notifiers.end()) 39 return _notifiers[fileid]; 40 else 41 return NULL; 42 } 43 44 /* Register a notification manager for the given 'fileid'. */ 45 46 void FileNotifierRegistry::attach(fileid_t fileid) 47 { 48 std::lock_guard<std::mutex> guard(_lock); 49 50 FileNotification *notifier = _get(fileid); 51 52 if (notifier == NULL) 53 { 54 notifier = new FileNotification; 55 _notifiers[fileid] = notifier; 56 } 57 58 notifier->attach(); 59 } 60 61 /* Detach from and potentially remove a notification manager for the given 62 'fileid'. */ 63 64 void FileNotifierRegistry::detach(fileid_t fileid) 65 { 66 std::lock_guard<std::mutex> guard(_lock); 67 68 FileNotification *notifier = _get(fileid); 69 70 if ((notifier != NULL) && (!notifier->detach())) 71 { 72 _notifiers.erase(fileid); 73 delete notifier; 74 } 75 } 76 77 /* Obtain a file-specific notification manager. */ 78 79 FileNotification *FileNotifierRegistry::get(fileid_t fileid) 80 { 81 std::lock_guard<std::mutex> guard(_lock); 82 83 return _get(fileid); 84 } 85 86 // vim: tabstop=4 expandtab shiftwidth=4