[DAPL2] DAPL Counters & 2.0.3 extensions to support counter retrieval.
[mirror/winof/.git] / ulp / dapl2 / dapl / common / dapl_evd_free.c
1 /*\r
2  * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved.\r
3  *\r
4  * This Software is licensed under one of the following licenses:\r
5  *\r
6  * 1) under the terms of the "Common Public License 1.0" a copy of which is\r
7  *    available from the Open Source Initiative, see\r
8  *    http://www.opensource.org/licenses/cpl.php.\r
9  *\r
10  * 2) under the terms of the "The BSD License" a copy of which is\r
11  *    available from the Open Source Initiative, see\r
12  *    http://www.opensource.org/licenses/bsd-license.php.\r
13  *\r
14  * 3) under the terms of the "GNU General Public License (GPL) Version 2" a\r
15  *    copy of which is available from the Open Source Initiative, see\r
16  *    http://www.opensource.org/licenses/gpl-license.php.\r
17  *\r
18  * Licensee has the right to choose one of the above licenses.\r
19  *\r
20  * Redistributions of source code must retain the above copyright\r
21  * notice and one of the license notices.\r
22  *\r
23  * Redistributions in binary form must reproduce both the above copyright\r
24  * notice, one of the license notices in the documentation\r
25  * and/or other materials provided with the distribution.\r
26  */\r
27 \r
28 /**********************************************************************\r
29  *\r
30  * MODULE: dapl_evd_free.c\r
31  *\r
32  * PURPOSE: Event management\r
33  * Description: Interfaces in this file are completely described in\r
34  *        the DAPL 1.1 API, Chapter 6, section 3\r
35  *\r
36  * $Id:$\r
37  **********************************************************************/\r
38 \r
39 #include "dapl.h"\r
40 #include "dapl_evd_util.h"\r
41 #include "dapl_ia_util.h"\r
42 #include "dapl_cno_util.h"              /* for __KDAPL__ */\r
43 \r
44 /*\r
45  * dapl_evd_free\r
46  *\r
47  * DAPL Requirements Version xxx, 6.3.2.2\r
48  *\r
49  * Destroy a specific instance of the Event Dispatcher\r
50  *\r
51  * Input:\r
52  *     evd_handle\r
53  *\r
54  * Output:\r
55  *     None\r
56  *\r
57  * Returns:\r
58  *     DAT_SUCCESS\r
59  *     DAT_INVALID_HANDLE\r
60  *     DAT_INVALID_STATE\r
61  */\r
62 DAT_RETURN DAT_API dapl_evd_free (\r
63     IN    DAT_EVD_HANDLE    evd_handle)\r
64 \r
65 {\r
66     DAPL_EVD    *evd_ptr;\r
67     DAPL_CNO    *cno_ptr;\r
68     DAT_RETURN  dat_status;\r
69 \r
70     dapl_dbg_log (DAPL_DBG_TYPE_API, "dapl_evd_free (%p)\n", evd_handle);\r
71 \r
72     dat_status = DAT_SUCCESS;\r
73     evd_ptr = (DAPL_EVD *)evd_handle;\r
74 \r
75     if (DAPL_BAD_HANDLE (evd_handle, DAPL_MAGIC_EVD))\r
76     {\r
77         dat_status = DAT_ERROR (DAT_INVALID_HANDLE, 0);\r
78         goto bail;\r
79     }\r
80 \r
81     DAPL_CNTR(evd_ptr->header.owner_ia, DCNT_IA_EVD_FREE);\r
82 \r
83     if (dapl_os_atomic_read (&evd_ptr->evd_ref_count) != 0)\r
84     {\r
85         dat_status = DAT_ERROR (DAT_INVALID_STATE, DAT_INVALID_STATE_EVD_IN_USE);\r
86         goto bail;\r
87     }\r
88 \r
89     /* obtain the cno_ptr before the evd is released, which must occur\r
90      * before deallocating the CNO\r
91      */\r
92     cno_ptr = evd_ptr->cno_ptr;\r
93 \r
94     dapl_ia_unlink_evd (evd_ptr->header.owner_ia, evd_ptr);\r
95 \r
96     dat_status = dapls_evd_dealloc (evd_ptr);\r
97     if (dat_status != DAT_SUCCESS)\r
98     {\r
99         dapl_ia_link_evd (evd_ptr->header.owner_ia, evd_ptr);\r
100     }\r
101 \r
102 #if defined(__KDAPL__)\r
103     if (cno_ptr != NULL)\r
104     {\r
105         if (dapl_os_atomic_read (&cno_ptr->cno_ref_count) > 0 || cno_ptr->cno_waiters > 0)\r
106         {\r
107             dat_status = DAT_ERROR (DAT_INVALID_STATE,\r
108                                     DAT_INVALID_STATE_EVD_IN_USE);\r
109             goto bail;\r
110         }\r
111         dapl_ia_unlink_cno (cno_ptr->header.owner_ia, cno_ptr);\r
112         dapl_cno_dealloc (cno_ptr);\r
113     }\r
114 #else\r
115     if (cno_ptr != NULL)\r
116     {\r
117         if (dapl_os_atomic_read(&cno_ptr->cno_ref_count) == 0 && cno_ptr->cno_waiters > 0)\r
118         {\r
119             /*\r
120              * Last reference on the CNO, trigger a notice. See\r
121              * uDAPL 1.1 spec 6.3.2.3\r
122              */\r
123             dapl_internal_cno_trigger (cno_ptr, NULL);\r
124         }\r
125     }\r
126 #endif  /* defined(__KDAPL__) */\r
127 \r
128 bail:\r
129     if ( dat_status )\r
130         dapl_dbg_log (DAPL_DBG_TYPE_RTN,\r
131                         "dapl_evd_free () returns 0x%x\n", dat_status);\r
132 \r
133     return dat_status;\r
134 }\r
135 \r
136 /*\r
137  * Local variables:\r
138  *  c-indent-level: 4\r
139  *  c-basic-offset: 4\r
140  *  tab-width: 8\r
141  * End:\r
142  */\r