cc_int32 ccs_callback_release (ccs_callback_t io_callback)
{
    cc_int32 err = ccNoError;
    
    if (!err && io_callback) {
	ccs_client_t client = NULL;

	if (io_callback->pending) {
	    err = ccs_server_send_reply (io_callback->reply_pipe, 
					 io_callback->invalid_object_err, NULL);
	    
	    io_callback->pending = 0;
	}
	
	if (!err) {
	    err = ccs_server_client_for_pipe (io_callback->client_pipe, &client);
	}
	
	if (!err && client) {
	    /* if client object still has a reference to us, remove it */
	    err = ccs_client_remove_callback (client, io_callback);
	}
	
	if (!err) {
	    ccs_pipe_release (io_callback->client_pipe);
	    ccs_pipe_release (io_callback->reply_pipe);
	    free (io_callback);
	}

	ccs_server_unref();
    }
    
    return cci_check_error (err);    
}
static cc_int32 ccs_list_iterator_object_release (cci_array_object_t io_list_iterator)
{
    cc_int32 err = ccNoError;
    ccs_list_iterator_t list_iterator = (ccs_list_iterator_t) io_list_iterator;
    
    if (!io_list_iterator) { err = ccErrBadParam; }
    
    if (!err && ccs_pipe_valid (list_iterator->client_pipe)) {
	ccs_client_t client = NULL;

        err = ccs_server_client_for_pipe (list_iterator->client_pipe, &client);
        
        if (!err && client) {
	    /* if client object still has a reference to us, remove it */
	    err = ccs_client_remove_iterator (client, list_iterator);
        }
    }
    
    if (!err) {
        ccs_pipe_release (list_iterator->client_pipe);
        cci_identifier_release (list_iterator->identifier);
        free (io_list_iterator);
    }
    
    return err;    
}
cc_int32 ccs_list_iterator_invalidate (ccs_list_iterator_t io_list_iterator)
{
    cc_int32 err = ccNoError;
    ccs_list_iterator_t list_iterator = (ccs_list_iterator_t) io_list_iterator;
    
    if (!io_list_iterator) { err = ccErrBadParam; }
    
    if (!err) {
        /* Client owner died.  Remove client reference and then the iterator. */
        if (ccs_pipe_valid (list_iterator->client_pipe)) { 
            ccs_pipe_release (list_iterator->client_pipe);
            list_iterator->client_pipe = CCS_PIPE_NULL;
        }
        
        err = ccs_list_iterator_release (io_list_iterator);
    }
    
    return err;        
}