/** * Delete the list (including its elements). */ void list_delete (list_t l) { for (element_t e = l->head, n; e != NULL; e = n) { n = e->next; list_delete_element (l, e); } free (l); }
int32_t event_unsubscribe(struct event *const event, const event_id_t id) { /* get byte and bit number of the given event in the event mask */ const uint8_t position = id >> 3; const uint8_t mask = 1 << (id & 0x7); const struct event *current; uint8_t i; ASSERT(event && (id < EVENT_MAX_AMOUNT)); if (!(event->mask[position] & mask)) { return ERR_NO_CHANGE; /* Already unsubscribed */ } event->mask[position] &= ~mask; /* Check if there are more subscribers */ for ((current = (const struct event *)list_get_head(&events)); current; current = (const struct event *)list_get_next_element(current)) { if (current->mask[position] & mask) { break; } } if (!current) { subscribed[position] &= ~mask; } /* Remove event from the list. Can be unsave, document it! */ for (i = 0; i < ARRAY_SIZE(event->mask); i++) { if (event->mask[i]) { return ERR_NONE; } } list_delete_element(&events, event); return ERR_NONE; }