xbee_err xbee_rxFree(struct xbee_rxInfo *info) { if (!info) return XBEE_EMISSINGPARAM; xbee_ll_free(info->bufList, (void(*)(void*))xbee_pktFree); xsys_sem_destroy(&info->sem); free(info); return XBEE_ENONE; }
static xbee_err _xbee_pktFree(struct xbee_pkt *pkt) { xbee_ll_ext_item(pktList, pkt); xbee_ll_free(pkt->dataItems, (void(*)(void *))_xbee_pktDataKeyDestroy); free(pkt); return XBEE_ENONE; }
EXPORT FINI void xbee_fini(void) { #ifndef XBEE_NO_FINI /* clean up threads, so that they can't depend on anything we are about to free! */ if (threadList) { xbee_ll_free(threadList, (void(*)(void*))xbee_threadKillThis); threadList = NULL; } if (xbeeList) { xbee_ll_free(xbeeList, (void(*)(void*))xbee_shutdown); xbeeList = NULL; } if (conList) { xbee_ll_free(conList, (void(*)(void*))xbee_conEnd); conList = NULL; } if (pktList) { xbee_ll_free(pktList, (void(*)(void*))xbee_pktFree); pktList = NULL; } if (netDeadClientList) { xbee_ll_free(netDeadClientList, (void(*)(void*))xbee_netClientShutdown); netDeadClientList = NULL; } if (needsFree) { xbee_ll_free(needsFree, (void(*)(void*))free); needsFree = NULL; } #endif /* XBEE_NO_FINI */ }
xbee_err xbee_modeCleanup(struct xbee_modeConType *conTypes) { int i; if (!conTypes) return XBEE_EMISSINGPARAM; for (i = 0; conTypes[i].name; i++) { xbee_ll_free(conTypes[i].conList, (void(*)(void*))xbee_conFree); /* i know, casting to void* to avoid the const keyword is naughty... */ if (conTypes[i].nameNeedsFree) free((void*)conTypes[i].name); if (conTypes[i].rxHandler && conTypes[i].rxHandler->needsFree) free((void*)conTypes[i].rxHandler); if (conTypes[i].txHandler && conTypes[i].txHandler->needsFree) free((void*)conTypes[i].txHandler); } free(conTypes); return XBEE_ENONE; }
xbee_err xbee_pktDataKeyAdd(struct xbee_pkt *pkt, const char *key, int id, struct pkt_dataKey **retKey, void (*freeCallback)(void*)) { struct pkt_dataKey *k; xbee_err ret; if (!pkt || !key) return XBEE_EMISSINGPARAM; #ifndef XBEE_DISABLE_STRICT_OBJECTS if (xbee_pktValidate(pkt) != XBEE_ENONE) return XBEE_EINVAL; #endif /* XBEE_DISABLE_STRICT_OBJECTS */ if (xbee_pktDataKeyGet(pkt, key, id, &k) == XBEE_ENONE) { if (retKey) *retKey = k; return XBEE_EEXISTS; } if ((k = calloc(1, sizeof(*k))) == NULL) { return XBEE_ENOMEM; } ret = XBEE_ENONE; snprintf(k->name, PKT_DATAKEY_MAXLEN, "%s", key); k->id = id; k->freeCallback = freeCallback; if ((k->items = xbee_ll_alloc()) == NULL) { ret = XBEE_ENOMEM; goto die1; } if (xbee_ll_add_tail(pkt->dataItems, k) != XBEE_ENONE) { ret = XBEE_ELINKEDLIST; goto die2; } if (retKey) *retKey = k; goto done; die2: xbee_ll_free(k->items, NULL); die1: free(k); done: return ret; }
static xbee_err _xbee_pktDataKeyDestroy(struct pkt_dataKey *key) { xbee_ll_free(key->items, key->freeCallback); free(key); return XBEE_ENONE; }