1baacf047SPaolo Bonzini /*
2baacf047SPaolo Bonzini * Notifier lists
3baacf047SPaolo Bonzini *
4baacf047SPaolo Bonzini * Copyright IBM, Corp. 2010
5baacf047SPaolo Bonzini *
6baacf047SPaolo Bonzini * Authors:
7baacf047SPaolo Bonzini * Anthony Liguori <aliguori@us.ibm.com>
8baacf047SPaolo Bonzini *
9baacf047SPaolo Bonzini * This work is licensed under the terms of the GNU GPL, version 2. See
10baacf047SPaolo Bonzini * the COPYING file in the top-level directory.
11baacf047SPaolo Bonzini *
12baacf047SPaolo Bonzini * Contributions after 2012-01-13 are licensed under the terms of the
13baacf047SPaolo Bonzini * GNU GPL, version 2 or (at your option) any later version.
14baacf047SPaolo Bonzini */
15baacf047SPaolo Bonzini
16aafd7584SPeter Maydell #include "qemu/osdep.h"
17baacf047SPaolo Bonzini #include "qemu/notify.h"
18baacf047SPaolo Bonzini
notifier_list_init(NotifierList * list)19baacf047SPaolo Bonzini void notifier_list_init(NotifierList *list)
20baacf047SPaolo Bonzini {
21baacf047SPaolo Bonzini QLIST_INIT(&list->notifiers);
22baacf047SPaolo Bonzini }
23baacf047SPaolo Bonzini
notifier_list_add(NotifierList * list,Notifier * notifier)24baacf047SPaolo Bonzini void notifier_list_add(NotifierList *list, Notifier *notifier)
25baacf047SPaolo Bonzini {
26baacf047SPaolo Bonzini QLIST_INSERT_HEAD(&list->notifiers, notifier, node);
27baacf047SPaolo Bonzini }
28baacf047SPaolo Bonzini
notifier_remove(Notifier * notifier)29baacf047SPaolo Bonzini void notifier_remove(Notifier *notifier)
30baacf047SPaolo Bonzini {
31baacf047SPaolo Bonzini QLIST_REMOVE(notifier, node);
32baacf047SPaolo Bonzini }
33baacf047SPaolo Bonzini
notifier_list_notify(NotifierList * list,void * data)34baacf047SPaolo Bonzini void notifier_list_notify(NotifierList *list, void *data)
35baacf047SPaolo Bonzini {
36baacf047SPaolo Bonzini Notifier *notifier, *next;
37baacf047SPaolo Bonzini
38baacf047SPaolo Bonzini QLIST_FOREACH_SAFE(notifier, &list->notifiers, node, next) {
39baacf047SPaolo Bonzini notifier->notify(notifier, data);
40baacf047SPaolo Bonzini }
41baacf047SPaolo Bonzini }
425dae8e5fSStefan Hajnoczi
notifier_list_empty(NotifierList * list)43374752a2SPaul Durrant bool notifier_list_empty(NotifierList *list)
44374752a2SPaul Durrant {
45374752a2SPaul Durrant return QLIST_EMPTY(&list->notifiers);
46374752a2SPaul Durrant }
47374752a2SPaul Durrant
notifier_with_return_list_init(NotifierWithReturnList * list)485dae8e5fSStefan Hajnoczi void notifier_with_return_list_init(NotifierWithReturnList *list)
495dae8e5fSStefan Hajnoczi {
505dae8e5fSStefan Hajnoczi QLIST_INIT(&list->notifiers);
515dae8e5fSStefan Hajnoczi }
525dae8e5fSStefan Hajnoczi
notifier_with_return_list_add(NotifierWithReturnList * list,NotifierWithReturn * notifier)535dae8e5fSStefan Hajnoczi void notifier_with_return_list_add(NotifierWithReturnList *list,
545dae8e5fSStefan Hajnoczi NotifierWithReturn *notifier)
555dae8e5fSStefan Hajnoczi {
565dae8e5fSStefan Hajnoczi QLIST_INSERT_HEAD(&list->notifiers, notifier, node);
575dae8e5fSStefan Hajnoczi }
585dae8e5fSStefan Hajnoczi
notifier_with_return_remove(NotifierWithReturn * notifier)595dae8e5fSStefan Hajnoczi void notifier_with_return_remove(NotifierWithReturn *notifier)
605dae8e5fSStefan Hajnoczi {
615dae8e5fSStefan Hajnoczi QLIST_REMOVE(notifier, node);
625dae8e5fSStefan Hajnoczi }
635dae8e5fSStefan Hajnoczi
notifier_with_return_list_notify(NotifierWithReturnList * list,void * data,Error ** errp)64*be19d836SSteve Sistare int notifier_with_return_list_notify(NotifierWithReturnList *list, void *data,
65*be19d836SSteve Sistare Error **errp)
665dae8e5fSStefan Hajnoczi {
675dae8e5fSStefan Hajnoczi NotifierWithReturn *notifier, *next;
685dae8e5fSStefan Hajnoczi int ret = 0;
695dae8e5fSStefan Hajnoczi
705dae8e5fSStefan Hajnoczi QLIST_FOREACH_SAFE(notifier, &list->notifiers, node, next) {
71*be19d836SSteve Sistare ret = notifier->notify(notifier, data, errp);
725dae8e5fSStefan Hajnoczi if (ret != 0) {
735dae8e5fSStefan Hajnoczi break;
745dae8e5fSStefan Hajnoczi }
755dae8e5fSStefan Hajnoczi }
765dae8e5fSStefan Hajnoczi return ret;
775dae8e5fSStefan Hajnoczi }
78