9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * CDDL HEADER START
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * The contents of this file are subject to the terms of the
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Common Development and Distribution License (the "License").
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * You may not use this file except in compliance with the License.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * or http://www.opensolaris.org/os/licensing.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * See the License for the specific language governing permissions
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * and limitations under the License.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * When distributing Covered Code, include this CDDL HEADER in each
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * If applicable, add the following below this CDDL HEADER, with the
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * fields enclosed by brackets "[]" replaced with your own identifying
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * information: Portions Copyright [yyyy] [name of copyright owner]
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * CDDL HEADER END
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Use is subject to license terms.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * MODULE: dapl_osd.c
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * PURPOSE: Operating System Dependent layer
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Description:
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Provide OS dependent functions with a canonical DAPL
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * interface. Designed to be portable and hide OS specific quirks
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * of common functions.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * $Id: dapl_osd.c,v 1.26 2003/07/31 14:04:18 jlentini Exp $
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include "dapl_osd.h"
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include "dapl.h"
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include "dapl_hca_util.h"
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include "dapl_ia_util.h"
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include "dapl_rmr_util.h"
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include "dapl_lmr_util.h"
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include "dapl_pz_util.h"
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include "dapl_ep_util.h"
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include "dapl_cr_util.h"
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include "dapl_evd_util.h"
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include "dapl_sp_util.h"
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include "dapl_adapter_util.h"
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include "dapl_provider.h"
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include "dapl_hash.h"
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include "dapl_debug.h"
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include <sys/time.h>
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include <stdlib.h> /* needed for getenv() */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include <pthread.h> /* needed for pthread_atfork() */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include <signal.h> /* needed for thread setup */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic void dapls_osd_fork_cleanup(void);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * dapl_osd_init
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Do Linux initialization:
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * - Set up fork handler to clean up DAPL resources in the child
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * process after a fork().
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Input:
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * none
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Returns:
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * DAT_SUCCESS
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorvoid
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylordapl_os_init()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor int status;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Set up fork control
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor status = pthread_atfork(NULL, NULL, dapls_osd_fork_cleanup);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (status != 0) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_dbg_log(DAPL_DBG_TYPE_WARN,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor "WARNING: pthread_atfork %d\n", status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * dapl_os_get_time
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Return 64 bit value of current time in microseconds.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Input:
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * loc User location to place current time
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Returns:
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * DAT_SUCCESS
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill TaylorDAT_RETURN
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylordapl_os_get_time(
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor OUT DAPL_OS_TIMEVAL * loc)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor struct timeval tv;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor struct timezone tz;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (void) gettimeofday(&tv, &tz);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *loc = ((DAT_UINT64)(tv.tv_sec) * 1000000L) + (DAT_UINT64) tv.tv_usec;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (DAT_SUCCESS);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * dapl_os_get__env_bool
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Return boolean value of passed in environment variable: 1 if present,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * 0 if not
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Input:
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Returns:
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * TRUE or FALSE
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorint
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylordapl_os_get_env_bool(
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor char *env_str)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor char *env_var;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor env_var = getenv(env_str);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (env_var != NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (1);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (0);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * dapl_os_get_env_val
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Update val to value of passed in environment variable if present
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Input:
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * env_str
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * def_val default value if environment variable does not exist
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Returns:
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * TRUE or FALSE
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorint
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylordapl_os_get_env_val(
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor char *env_str,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor int def_val)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor char *env_var;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor env_var = getenv(env_str);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (env_var != NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor def_val = strtol(env_var, NULL, 0);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (def_val);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Wait object routines
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * dapl_os_wait_object_init
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Initialize a wait object
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Input:
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * wait_obj
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Returns:
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * DAT_SUCCESS
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * DAT_INTERNAL_ERROR
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill TaylorDAT_RETURN
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylordapl_os_wait_object_init(
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor IN DAPL_OS_WAIT_OBJECT *wait_obj)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor wait_obj->signaled = DAT_FALSE;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (0 != pthread_cond_init(&wait_obj->cv, NULL)) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (DAT_ERROR(DAT_INTERNAL_ERROR, 0));
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Always returns 0. */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (void) pthread_mutex_init(&wait_obj->lock, NULL);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (DAT_SUCCESS);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Wait on the supplied wait object, up to the specified time_out.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * A timeout of DAT_TIMEOUT_INFINITE will wait indefinitely.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Timeout should be specified in micro seconds.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Functional returns:
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * DAT_SUCCESS -- another thread invoked dapl_os_wait object_wakeup
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * DAT_INVALID_STATE -- someone else is already waiting in this wait
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * object.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * only one waiter is allowed at a time.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * DAT_ABORT -- another thread invoked dapl_os_wait_object_destroy
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * DAT_TIMEOUT -- the specified time limit was reached.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill TaylorDAT_RETURN
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylordapl_os_wait_object_wait(
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor IN DAPL_OS_WAIT_OBJECT *wait_obj,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor IN DAT_TIMEOUT timeout_val)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAT_RETURN dat_status;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor int pthread_status;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor struct timespec future;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dat_status = DAT_SUCCESS;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor pthread_status = 0;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (timeout_val != DAT_TIMEOUT_INFINITE) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor struct timeval now;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor struct timezone tz;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor unsigned int microsecs;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (void) gettimeofday(&now, &tz);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor microsecs = now.tv_usec + (timeout_val % 1000000);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (microsecs > 1000000) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor now.tv_sec = now.tv_sec + timeout_val / 1000000 + 1;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor now.tv_usec = microsecs - 1000000;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor } else {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor now.tv_sec = now.tv_sec + timeout_val / 1000000;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor now.tv_usec = microsecs;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Convert timeval to timespec */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor future.tv_sec = now.tv_sec;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor future.tv_nsec = now.tv_usec * 1000;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (void) pthread_mutex_lock(&wait_obj->lock);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor while (wait_obj->signaled == DAT_FALSE && pthread_status == 0) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor pthread_status = pthread_cond_timedwait(
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &wait_obj->cv, &wait_obj->lock, &future);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * No need to reset &future if we go around the loop;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * It's an absolute time.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Reset the signaled status if we were woken up. */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (pthread_status == 0) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor wait_obj->signaled = DAT_FALSE;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (void) pthread_mutex_unlock(&wait_obj->lock);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor } else {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (void) pthread_mutex_lock(&wait_obj->lock);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor while (wait_obj->signaled == DAT_FALSE && pthread_status == 0) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor pthread_status = pthread_cond_wait(
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &wait_obj->cv, &wait_obj->lock);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Reset the signaled status if we were woken up. */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (pthread_status == 0) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor wait_obj->signaled = DAT_FALSE;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (void) pthread_mutex_unlock(&wait_obj->lock);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (ETIMEDOUT == pthread_status) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dat_status = DAT_ERROR(DAT_TIMEOUT_EXPIRED, 0);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor } else if (0 != pthread_status) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dat_status = DAT_ERROR(DAT_INTERNAL_ERROR, 0);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (dat_status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * dapl_os_wait_object_wakeup
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Wakeup a thread waiting on a wait object
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Input:
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * wait_obj
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Returns:
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * DAT_SUCCESS
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * DAT_INTERNAL_ERROR
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill TaylorDAT_RETURN
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylordapl_os_wait_object_wakeup(
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor IN DAPL_OS_WAIT_OBJECT *wait_obj)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (void) pthread_mutex_lock(&wait_obj->lock);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor wait_obj->signaled = DAT_TRUE;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (void) pthread_mutex_unlock(&wait_obj->lock);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (0 != pthread_cond_signal(&wait_obj->cv)) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (DAT_ERROR(DAT_INTERNAL_ERROR, 0));
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (DAT_SUCCESS);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * dapl_os_wait_object_destroy
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Destroy a wait object
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Input:
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * wait_obj
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Returns:
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * DAT_SUCCESS
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * DAT_INTERNAL_ERROR
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill TaylorDAT_RETURN
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylordapl_os_wait_object_destroy(
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor IN DAPL_OS_WAIT_OBJECT *wait_obj)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (0 != pthread_cond_destroy(&wait_obj->cv)) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (DAT_ERROR(DAT_INTERNAL_ERROR, 0));
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (0 != pthread_mutex_destroy(&wait_obj->lock)) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (DAT_ERROR(DAT_INTERNAL_ERROR, 0));
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (DAT_SUCCESS);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * dapls_osd_fork_cleanup
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Update val to value of passed in environment variable if present
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Input:
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * env_str
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * val Updated if environment variable exists
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Returns:
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * TRUE or FALSE
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorvoid
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylordapls_osd_fork_cleanup(void)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAPL_PROVIDER_LIST_NODE *cur_node;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAPL_HCA *hca_ptr;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAPL_IA *ia_ptr;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAPL_LMR *lmr_ptr;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAPL_RMR *rmr_ptr;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAPL_PZ *pz_ptr;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAPL_CR *cr_ptr;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAPL_EP *ep_ptr;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAPL_EVD *evd_ptr;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAT_EP_PARAM *param;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAPL_SP *sp_ptr;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor while (NULL != g_dapl_provider_list.head) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor cur_node = g_dapl_provider_list.head;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor g_dapl_provider_list.head = cur_node->next;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor hca_ptr = (DAPL_HCA *) cur_node->data.extension;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Walk the list of IA ptrs & clean up. This is purposely
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * a destructive list walk, we really don't want to preserve
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * any of it.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor while (!dapl_llist_is_empty(&hca_ptr->ia_list_head)) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ia_ptr = (DAPL_IA *)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_llist_peek_head(&hca_ptr->ia_list_head);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * The rest of the cleanup code is similar to
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * dapl_ia_close, the big difference is that we don't
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * release IB resources, only memory; the underlying IB
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * subsystem doesn't deal with fork at all, so leave
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * IB handles alone.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor while (!dapl_llist_is_empty(&ia_ptr->rmr_list_head)) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor rmr_ptr = (DAPL_RMR *)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_llist_peek_head(&ia_ptr->
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor rmr_list_head);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (rmr_ptr->param.lmr_triplet.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor virtual_address != 0) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (void) dapl_os_atomic_dec(&rmr_ptr->
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor lmr->lmr_ref_count);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor rmr_ptr->param.lmr_triplet.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor virtual_address = 0;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_os_atomic_dec(&rmr_ptr->pz->pz_ref_count);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_ia_unlink_rmr(rmr_ptr->header.owner_ia,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor rmr_ptr);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_rmr_dealloc(rmr_ptr);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor while (!dapl_llist_is_empty(&ia_ptr->rsp_list_head)) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor sp_ptr = (DAPL_SP *) dapl_llist_peek_head(
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &ia_ptr->rsp_list_head);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_os_atomic_dec(&((DAPL_EVD *)sp_ptr->
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor evd_handle)->evd_ref_count);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapls_ia_unlink_sp(ia_ptr, sp_ptr);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapls_sp_free_sp(sp_ptr);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor while (!dapl_llist_is_empty(&ia_ptr->ep_list_head)) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ep_ptr = (DAPL_EP *) dapl_llist_peek_head(
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &ia_ptr->ep_list_head);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor param = &ep_ptr->param;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (param->pz_handle != NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_os_atomic_dec(&((DAPL_PZ *)param->
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor pz_handle)->pz_ref_count);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (param->recv_evd_handle != NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_os_atomic_dec(&((DAPL_EVD *)param->
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor recv_evd_handle)->evd_ref_count);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (param->request_evd_handle) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_os_atomic_dec(&((DAPL_EVD *)param->
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor request_evd_handle)->evd_ref_count);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (param->connect_evd_handle != NULL) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_os_atomic_dec(&((DAPL_EVD *)param->
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor connect_evd_handle)->evd_ref_count);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* ...and free the resource */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_ia_unlink_ep(ia_ptr, ep_ptr);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_ep_dealloc(ep_ptr);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor while (!dapl_llist_is_empty(&ia_ptr->lmr_list_head)) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor lmr_ptr = (DAPL_LMR *) dapl_llist_peek_head(
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &ia_ptr->lmr_list_head);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (void) dapls_hash_remove(lmr_ptr->header.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor owner_ia->hca_ptr->lmr_hash_table,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor lmr_ptr->param.lmr_context, NULL);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor pz_ptr = (DAPL_PZ *) lmr_ptr->param.pz_handle;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_os_atomic_dec(&pz_ptr->pz_ref_count);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_ia_unlink_lmr(lmr_ptr->header.owner_ia,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor lmr_ptr);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_lmr_dealloc(lmr_ptr);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor while (!dapl_llist_is_empty(&ia_ptr->psp_list_head)) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor sp_ptr = (DAPL_SP *) dapl_llist_peek_head(
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &ia_ptr->psp_list_head);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor while (!dapl_llist_is_empty(&sp_ptr->
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor cr_list_head)) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor cr_ptr = (DAPL_CR *)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_llist_peek_head(
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &sp_ptr->cr_list_head);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_sp_remove_cr(sp_ptr, cr_ptr);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapls_cr_free(cr_ptr);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapls_ia_unlink_sp(ia_ptr, sp_ptr);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_os_atomic_dec(&((DAPL_EVD *)sp_ptr->
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor evd_handle)->evd_ref_count);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapls_sp_free_sp(sp_ptr);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor while (!dapl_llist_is_empty(&ia_ptr->pz_list_head)) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor pz_ptr = (DAPL_PZ *)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_llist_peek_head(&ia_ptr->pz_list_head);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_ia_unlink_pz(pz_ptr->header.owner_ia,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor pz_ptr);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_pz_dealloc(pz_ptr);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor while (!dapl_llist_is_empty(&ia_ptr->evd_list_head)) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor evd_ptr = (DAPL_EVD *) dapl_llist_peek_head(
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor &ia_ptr->evd_list_head);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_ia_unlink_evd(evd_ptr->header.owner_ia,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor evd_ptr);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * reset the cq_handle to avoid having it
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * removed
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor evd_ptr->ib_cq_handle = IB_INVALID_HANDLE;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (void) dapls_evd_dealloc(evd_ptr);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_hca_unlink_ia(ia_ptr->hca_ptr, ia_ptr);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * asycn error evd was taken care of above, reset the
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * pointer
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ia_ptr->async_error_evd = NULL;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapls_ia_free(ia_ptr);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor } /* end while( ia_ptr != NULL ) */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_os_free(cur_node, sizeof (DAPL_PROVIDER_LIST_NODE));
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor } /* end while (NULL != g_dapl_provider_list.head) */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Local variables:
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * c-indent-level: 4
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * c-basic-offset: 4
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * tab-width: 8
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * End:
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */