int mdeg_unregister(mdeg_handle_t hdl) { mdeg_clnt_t *clnt; mdeg_handle_t mdh; /* should never be called from a callback */ ASSERT(!taskq_member(mdeg.taskq, curthread)); rw_enter(&mdeg.rwlock, RW_WRITER); /* lookup the client */ if ((clnt = mdeg_get_client(hdl)) == NULL) { rw_exit(&mdeg.rwlock); return (MDEG_FAILURE); } MDEG_DBG("client unregistered (0x%lx):\n", hdl); MDEG_DUMP_CLNT(clnt); /* save the handle to prevent reuse */ mdh = clnt->hdl; bzero(clnt, sizeof (mdeg_clnt_t)); clnt->hdl = mdh; mdeg.nclnts--; rw_exit(&mdeg.rwlock); return (MDEG_SUCCESS); }
int mdeg_unregister(mdeg_handle_t hdl) { mdeg_clnt_t *clnt; mdeg_handle_t mdh; /* * If the RW lock is held, a client is calling * unregister from its own callback. */ if (RW_LOCK_HELD(&mdeg.rwlock)) { MDEG_DBG("mdeg_unregister: rwlock already held\n"); return (MDEG_FAILURE); } /* lookup the client */ if ((clnt = mdeg_get_client(hdl)) == NULL) { return (MDEG_FAILURE); } rw_enter(&mdeg.rwlock, RW_WRITER); MDEG_DBG("client unregistered (0x%lx):\n", hdl); MDEG_DUMP_CLNT(clnt); /* save the handle to prevent reuse */ mdh = clnt->hdl; bzero(clnt, sizeof (mdeg_clnt_t)); clnt->hdl = mdh; mdeg.nclnts--; rw_exit(&mdeg.rwlock); return (MDEG_SUCCESS); }