1025c32ffcd9f682cd761a836fe8798738d1648f2David Turner/*
2025c32ffcd9f682cd761a836fe8798738d1648f2David Turner * Notifier lists
3025c32ffcd9f682cd761a836fe8798738d1648f2David Turner *
4025c32ffcd9f682cd761a836fe8798738d1648f2David Turner * Copyright IBM, Corp. 2010
5025c32ffcd9f682cd761a836fe8798738d1648f2David Turner *
6025c32ffcd9f682cd761a836fe8798738d1648f2David Turner * Authors:
7025c32ffcd9f682cd761a836fe8798738d1648f2David Turner *  Anthony Liguori   <aliguori@us.ibm.com>
8025c32ffcd9f682cd761a836fe8798738d1648f2David Turner *
9025c32ffcd9f682cd761a836fe8798738d1648f2David Turner * This work is licensed under the terms of the GNU GPL, version 2.  See
10025c32ffcd9f682cd761a836fe8798738d1648f2David Turner * the COPYING file in the top-level directory.
11025c32ffcd9f682cd761a836fe8798738d1648f2David Turner *
12025c32ffcd9f682cd761a836fe8798738d1648f2David Turner */
13025c32ffcd9f682cd761a836fe8798738d1648f2David Turner
14025c32ffcd9f682cd761a836fe8798738d1648f2David Turner#ifndef QEMU_NOTIFY_H
15025c32ffcd9f682cd761a836fe8798738d1648f2David Turner#define QEMU_NOTIFY_H
16025c32ffcd9f682cd761a836fe8798738d1648f2David Turner
17031d655004e505a15e92580a16a181d1d247c4d5David 'Digit' Turner#include "qemu/queue.h"
18025c32ffcd9f682cd761a836fe8798738d1648f2David Turner
19025c32ffcd9f682cd761a836fe8798738d1648f2David Turnertypedef struct Notifier Notifier;
20025c32ffcd9f682cd761a836fe8798738d1648f2David Turner
21025c32ffcd9f682cd761a836fe8798738d1648f2David Turnerstruct Notifier
22025c32ffcd9f682cd761a836fe8798738d1648f2David Turner{
232184d300da3cbf971fadc095edfa9537f371f9d1David 'Digit' Turner    void (*notify)(Notifier *notifier, void *data);
242184d300da3cbf971fadc095edfa9537f371f9d1David 'Digit' Turner    QLIST_ENTRY(Notifier) node;
25025c32ffcd9f682cd761a836fe8798738d1648f2David Turner};
26025c32ffcd9f682cd761a836fe8798738d1648f2David Turner
27025c32ffcd9f682cd761a836fe8798738d1648f2David Turnertypedef struct NotifierList
28025c32ffcd9f682cd761a836fe8798738d1648f2David Turner{
292184d300da3cbf971fadc095edfa9537f371f9d1David 'Digit' Turner    QLIST_HEAD(, Notifier) notifiers;
30025c32ffcd9f682cd761a836fe8798738d1648f2David Turner} NotifierList;
31025c32ffcd9f682cd761a836fe8798738d1648f2David Turner
32025c32ffcd9f682cd761a836fe8798738d1648f2David Turner#define NOTIFIER_LIST_INITIALIZER(head) \
332184d300da3cbf971fadc095edfa9537f371f9d1David 'Digit' Turner    { QLIST_HEAD_INITIALIZER((head).notifiers) }
34025c32ffcd9f682cd761a836fe8798738d1648f2David Turner
35025c32ffcd9f682cd761a836fe8798738d1648f2David Turnervoid notifier_list_init(NotifierList *list);
36025c32ffcd9f682cd761a836fe8798738d1648f2David Turner
37025c32ffcd9f682cd761a836fe8798738d1648f2David Turnervoid notifier_list_add(NotifierList *list, Notifier *notifier);
38025c32ffcd9f682cd761a836fe8798738d1648f2David Turner
392184d300da3cbf971fadc095edfa9537f371f9d1David 'Digit' Turnervoid notifier_remove(Notifier *notifier);
40025c32ffcd9f682cd761a836fe8798738d1648f2David Turner
412184d300da3cbf971fadc095edfa9537f371f9d1David 'Digit' Turnervoid notifier_list_notify(NotifierList *list, void *data);
422184d300da3cbf971fadc095edfa9537f371f9d1David 'Digit' Turner
432184d300da3cbf971fadc095edfa9537f371f9d1David 'Digit' Turner/* Same as Notifier but allows .notify() to return errors */
442184d300da3cbf971fadc095edfa9537f371f9d1David 'Digit' Turnertypedef struct NotifierWithReturn NotifierWithReturn;
452184d300da3cbf971fadc095edfa9537f371f9d1David 'Digit' Turner
462184d300da3cbf971fadc095edfa9537f371f9d1David 'Digit' Turnerstruct NotifierWithReturn {
472184d300da3cbf971fadc095edfa9537f371f9d1David 'Digit' Turner    /**
482184d300da3cbf971fadc095edfa9537f371f9d1David 'Digit' Turner     * Return 0 on success (next notifier will be invoked), otherwise
492184d300da3cbf971fadc095edfa9537f371f9d1David 'Digit' Turner     * notifier_with_return_list_notify() will stop and return the value.
502184d300da3cbf971fadc095edfa9537f371f9d1David 'Digit' Turner     */
512184d300da3cbf971fadc095edfa9537f371f9d1David 'Digit' Turner    int (*notify)(NotifierWithReturn *notifier, void *data);
522184d300da3cbf971fadc095edfa9537f371f9d1David 'Digit' Turner    QLIST_ENTRY(NotifierWithReturn) node;
532184d300da3cbf971fadc095edfa9537f371f9d1David 'Digit' Turner};
542184d300da3cbf971fadc095edfa9537f371f9d1David 'Digit' Turner
552184d300da3cbf971fadc095edfa9537f371f9d1David 'Digit' Turnertypedef struct NotifierWithReturnList {
562184d300da3cbf971fadc095edfa9537f371f9d1David 'Digit' Turner    QLIST_HEAD(, NotifierWithReturn) notifiers;
572184d300da3cbf971fadc095edfa9537f371f9d1David 'Digit' Turner} NotifierWithReturnList;
582184d300da3cbf971fadc095edfa9537f371f9d1David 'Digit' Turner
592184d300da3cbf971fadc095edfa9537f371f9d1David 'Digit' Turner#define NOTIFIER_WITH_RETURN_LIST_INITIALIZER(head) \
602184d300da3cbf971fadc095edfa9537f371f9d1David 'Digit' Turner    { QLIST_HEAD_INITIALIZER((head).notifiers) }
612184d300da3cbf971fadc095edfa9537f371f9d1David 'Digit' Turner
622184d300da3cbf971fadc095edfa9537f371f9d1David 'Digit' Turnervoid notifier_with_return_list_init(NotifierWithReturnList *list);
632184d300da3cbf971fadc095edfa9537f371f9d1David 'Digit' Turner
642184d300da3cbf971fadc095edfa9537f371f9d1David 'Digit' Turnervoid notifier_with_return_list_add(NotifierWithReturnList *list,
652184d300da3cbf971fadc095edfa9537f371f9d1David 'Digit' Turner                                   NotifierWithReturn *notifier);
662184d300da3cbf971fadc095edfa9537f371f9d1David 'Digit' Turner
672184d300da3cbf971fadc095edfa9537f371f9d1David 'Digit' Turnervoid notifier_with_return_remove(NotifierWithReturn *notifier);
682184d300da3cbf971fadc095edfa9537f371f9d1David 'Digit' Turner
692184d300da3cbf971fadc095edfa9537f371f9d1David 'Digit' Turnerint notifier_with_return_list_notify(NotifierWithReturnList *list,
702184d300da3cbf971fadc095edfa9537f371f9d1David 'Digit' Turner                                     void *data);
71025c32ffcd9f682cd761a836fe8798738d1648f2David Turner
72025c32ffcd9f682cd761a836fe8798738d1648f2David Turner#endif
73