4
* Code for abstracting locks in IPMI
6
* Author: MontaVista Software, Inc.
7
* Corey Minyard <minyard@mvista.com>
10
* Copyright 2004 MontaVista Software Inc.
12
* This program is free software; you can redistribute it and/or
13
* modify it under the terms of the GNU Lesser General Public License
14
* as published by the Free Software Foundation; either version 2 of
15
* the License, or (at your option) any later version.
18
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
19
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
20
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
23
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
24
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
25
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
26
* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
27
* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
* You should have received a copy of the GNU Lesser General Public
30
* License along with this program; if not, write to the Free
31
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
37
#include <OpenIPMI/ipmi_debug.h>
39
#include <OpenIPMI/internal/ipmi_malloc.h>
40
#include <OpenIPMI/internal/ipmi_locks.h>
44
os_hnd_lock_t *ll_lock;
48
int __ipmi_debug_locks = 0;
51
ipmi_create_lock_os_hnd(os_handler_t *os_hnd, ipmi_lock_t **new_lock)
56
lock = ipmi_mem_alloc(sizeof(*lock));
60
lock->os_hnd = os_hnd;
61
if (lock->os_hnd && lock->os_hnd->create_lock) {
62
rv = lock->os_hnd->create_lock(lock->os_hnd, &(lock->ll_lock));
76
void ipmi_destroy_lock(ipmi_lock_t *lock)
79
lock->os_hnd->destroy_lock(lock->os_hnd, lock->ll_lock);
83
void ipmi_lock(ipmi_lock_t *lock)
86
lock->os_hnd->lock(lock->os_hnd, lock->ll_lock);
89
void ipmi_unlock(ipmi_lock_t *lock)
92
lock->os_hnd->unlock(lock->os_hnd, lock->ll_lock);
97
os_hnd_rwlock_t *ll_lock;
102
ipmi_create_rwlock_os_hnd(os_handler_t *os_hnd, ipmi_rwlock_t **new_lock)
107
lock = ipmi_mem_alloc(sizeof(*lock));
111
lock->os_hnd = os_hnd;
112
if (lock->os_hnd && lock->os_hnd->create_lock) {
113
rv = lock->os_hnd->create_rwlock(lock->os_hnd, &(lock->ll_lock));
119
lock->ll_lock = NULL;
127
void ipmi_destroy_rwlock(ipmi_rwlock_t *lock)
130
lock->os_hnd->destroy_rwlock(lock->os_hnd, lock->ll_lock);
134
void ipmi_rwlock_read_lock(ipmi_rwlock_t *lock)
137
lock->os_hnd->read_lock(lock->os_hnd, lock->ll_lock);
140
void ipmi_rwlock_read_unlock(ipmi_rwlock_t *lock)
143
lock->os_hnd->read_unlock(lock->os_hnd, lock->ll_lock);
146
void ipmi_rwlock_write_lock(ipmi_rwlock_t *lock)
149
lock->os_hnd->write_lock(lock->os_hnd, lock->ll_lock);
152
void ipmi_rwlock_write_unlock(ipmi_rwlock_t *lock)
155
lock->os_hnd->write_unlock(lock->os_hnd, lock->ll_lock);
158
#ifdef IPMI_CHECK_LOCKS
159
/* Set a breakpoint here to detect locking errors. */
161
ipmi_report_lock_error(os_handler_t *handler, char *str)
163
handler->log(handler, IPMI_LOG_WARNING, "%s", str);
167
ipmi_check_lock(ipmi_lock_t *lock, char *str)
169
if ((!DEBUG_LOCKS) || (!lock) || (!lock->ll_lock))
172
if (! lock->os_hnd->is_locked(lock->os_hnd, lock->ll_lock))
173
IPMI_REPORT_LOCK_ERROR(lock->os_hnd, str);