Files
QNX/lib/asyncmsg/asyncmsg_channel_destroy.c
2025-08-20 19:02:58 +08:00

76 lines
1.9 KiB
C

/*
* $QNXLicenseC:
* Copyright 2007, QNX Software Systems. All Rights Reserved.
*
* You must obtain a written license from and pay applicable license fees to QNX
* Software Systems before you may reproduce, modify or distribute this software,
* or any work that includes all or part of this software. Free development
* licenses are available for evaluation and non-commercial purposes. For more
* information visit http://licensing.qnx.com or email licensing@qnx.com.
*
* This file may contain contributions from others. Please review this entire
* file for other proprietary rights or license notices, as well as the QNX
* Development Suite License Guide at http://licensing.qnx.com/license-guide/
* for other information.
* $
*/
#include <stdlib.h>
#include "asyncmsg_priv.h"
int asyncmsg_channel_destroy(int chid)
{
struct _asyncmsg_channel_context *acc;
if (ChannelDestroy(chid) == -1) {
return -1;
}
if ((acc = _asyncmsg_handle(chid, _ASYNCMSG_HANDLE_DELETE | _ASYNCMSG_HANDLE_CHANNEL, 0)) == NULL)
{
return -1;
}
/* how do we destroy mutex safely ? */
pthread_mutex_destroy(&acc->mutex);
if (acc->free) {
if (!acc->recvbuf_cb) {
struct _asyncmsg_get_header *ahp;
while (ahp = acc->free) {
acc->free = ahp->next;
asyncmsg_free(ahp);
}
} else {
int i, n;
void **buffs, *single_buf;
if ((buffs = alloca(acc->num_free * sizeof(void *))) == NULL) {
buffs = &single_buf;
n = 1;
} else {
n = acc->num_free;
}
do {
for (i = 0; i < n; i++) {
buffs[i] = acc->free;
acc->free = acc->free->next;
}
acc->recvbuf_cb(acc->buffer_size + sizeof(iov_t) + sizeof(struct _asyncmsg_get_header),
n, buffs, ASYNCMSG_RECVBUF_FREE);
acc->num_free -= n;
} while (acc->num_free);
}
}
free(acc->iovs);
free(acc);
return 0;
}
__SRCVERSION("asyncmsg_channel_destroy.c $Rev: 153052 $");