1 /*---------------------------------------------------------------------------*
2   Project:  TwlSDK - CARD - libraries
3   File:     card_hook.c
4 
5   Copyright 2008 Nintendo. All rights reserved.
6 
7   These coded instructions, statements, and computer programs contain
8   proprietary information of Nintendo of America Inc. and/or Nintendo
9   Company Ltd., and are protected by Federal copyright law. They may
10   not be disclosed to third parties or copied or duplicated in any form,
11   in whole or in part, without the prior written consent of Nintendo.
12 
13   $Date:: 2008-04-21#$
14   $Rev: 5625 $
15   $Author: yosizaki $
16 
17  *---------------------------------------------------------------------------*/
18 
19 
20 #include <nitro/card/common.h>
21 
22 
23 /*---------------------------------------------------------------------------*/
24 /* Variables */
25 
26 static CARDHookContext *CARDiHookChain = NULL;
27 
28 
29 /*---------------------------------------------------------------------------*/
30 /* Functions */
31 
32 /*---------------------------------------------------------------------------*
33   Name:         CARDi_RegisterHook
34 
35   Description:  Registers an internal event hook for the CARD library
36 
37   Arguments:    hook: Hook structure used for registration
38                 callback: Callback function called when an event occurs
39                 arg: Callback argument
40 
41   Returns:      None.
42  *---------------------------------------------------------------------------*/
CARDi_RegisterHook(CARDHookContext * hook,CARDHookFunction callback,void * arg)43 void CARDi_RegisterHook(CARDHookContext *hook, CARDHookFunction callback, void *arg)
44 {
45     OSIntrMode  bak = OS_DisableInterrupts();
46     hook->callback = callback;
47     hook->userdata = arg;
48     hook->next = CARDiHookChain;
49     CARDiHookChain = hook;
50     (void)OS_RestoreInterrupts(bak);
51 }
52 
53 /*---------------------------------------------------------------------------*
54   Name:         CARDi_UnregisterHook
55 
56   Description:  Deallocates an internal event hook of the CARD library
57 
58   Arguments:    hook: Hook structure used for registration.
59 
60   Returns:      None.
61  *---------------------------------------------------------------------------*/
CARDi_UnregisterHook(CARDHookContext * hook)62 void CARDi_UnregisterHook(CARDHookContext *hook)
63 {
64     OSIntrMode  bak = OS_DisableInterrupts();
65     CARDHookContext **pp;
66     for (pp = &CARDiHookChain; *pp; pp = &(*pp)->next)
67     {
68         if (*pp == hook)
69         {
70             *pp = (*pp)->next;
71             break;
72         }
73     }
74     (void)OS_RestoreInterrupts(bak);
75 }
76 
77 /*---------------------------------------------------------------------------*
78   Name:         CARDi_NotifyEvent
79 
80   Description:  Notifies an internal event for the CARD library
81 
82   Arguments:    event: Occurred event
83                 arg: Argument for each event
84 
85   Returns:      None.
86  *---------------------------------------------------------------------------*/
CARDi_NotifyEvent(CARDEvent event,void * arg)87 void CARDi_NotifyEvent(CARDEvent event, void *arg)
88 {
89     OSIntrMode  bak = OS_DisableInterrupts();
90     CARDHookContext **pp = &CARDiHookChain;
91     while (*pp)
92     {
93         CARDHookContext *hook = *pp;
94         if (hook->callback)
95         {
96             (*hook->callback)(hook->userdata, event, arg);
97         }
98         // Consider cases where the hook is deallocated in the callback
99         if (*pp == hook)
100         {
101             pp = &(*pp)->next;
102         }
103     }
104     (void)OS_RestoreInterrupts(bak);
105 }
106