1 /* 2 * Notifier lists 3 * 4 * Copyright IBM, Corp. 2010 5 * 6 * Authors: 7 * Anthony Liguori <aliguori@us.ibm.com> 8 * 9 * This work is licensed under the terms of the GNU GPL, version 2. See 10 * the COPYING file in the top-level directory. 11 * 12 * Contributions after 2012-01-13 are licensed under the terms of the 13 * GNU GPL, version 2 or (at your option) any later version. 14 */ 15 16 #include "qemu/osdep.h" 17 #include "qemu/notify.h" 18 19 void notifier_list_init(NotifierList *list) 20 { 21 QLIST_INIT(&list->notifiers); 22 } 23 24 void notifier_list_add(NotifierList *list, Notifier *notifier) 25 { 26 QLIST_INSERT_HEAD(&list->notifiers, notifier, node); 27 } 28 29 void notifier_remove(Notifier *notifier) 30 { 31 QLIST_REMOVE(notifier, node); 32 } 33 34 void notifier_list_notify(NotifierList *list, void *data) 35 { 36 Notifier *notifier, *next; 37 38 QLIST_FOREACH_SAFE(notifier, &list->notifiers, node, next) { 39 notifier->notify(notifier, data); 40 } 41 } 42 43 bool notifier_list_empty(NotifierList *list) 44 { 45 return QLIST_EMPTY(&list->notifiers); 46 } 47 48 void notifier_with_return_list_init(NotifierWithReturnList *list) 49 { 50 QLIST_INIT(&list->notifiers); 51 } 52 53 void notifier_with_return_list_add(NotifierWithReturnList *list, 54 NotifierWithReturn *notifier) 55 { 56 QLIST_INSERT_HEAD(&list->notifiers, notifier, node); 57 } 58 59 void notifier_with_return_remove(NotifierWithReturn *notifier) 60 { 61 QLIST_REMOVE(notifier, node); 62 } 63 64 int notifier_with_return_list_notify(NotifierWithReturnList *list, void *data, 65 Error **errp) 66 { 67 NotifierWithReturn *notifier, *next; 68 int ret = 0; 69 70 QLIST_FOREACH_SAFE(notifier, &list->notifiers, node, next) { 71 ret = notifier->notify(notifier, data, errp); 72 if (ret != 0) { 73 break; 74 } 75 } 76 return ret; 77 } 78