void ump_arch_close(void) { _ump_osu_lock_auto_init(&ump_lock_arch, _UMP_OSU_LOCKFLAG_DEFAULT, 0, 0); /* Check that the lock was initialized */ if (NULL == ump_lock_arch) { UMP_DEBUG_PRINT(1, ("UMP: ump_arch_close() failed to init lock\n")); return; } /* Attempt to obtain a lock */ if (_UMP_OSU_ERR_OK != _ump_osu_lock_wait(ump_lock_arch, _UMP_OSU_LOCKMODE_RW)) { UMP_DEBUG_PRINT(1, ("UMP: ump_arch_close() failed to acquire lock\n")); return; } UMP_DEBUG_ASSERT(0 < ump_ref_count, ("UMP: ump_arch_close() called while no references exist")); if (ump_ref_count > 0) { ump_ref_count--; if (0 == ump_ref_count) { _ump_osu_errcode_t retval = _ump_uku_close(&ump_uk_ctx); UMP_DEBUG_ASSERT(retval == _UMP_OSU_ERR_OK, ("UMP: Failed to close UMP interface")); UMP_IGNORE(retval); ump_uk_ctx = NULL; _ump_osu_lock_signal(ump_lock_arch, _UMP_OSU_LOCKMODE_RW); _ump_osu_lock_term(ump_lock_arch); /* Not 100% thread safe, since another thread can already be waiting for this lock in ump_arch_open() */ ump_lock_arch = NULL; return; } } /* Signal the lock so someone else can use it */ _ump_osu_lock_signal(ump_lock_arch, _UMP_OSU_LOCKMODE_RW); }