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