int callback_cancel(unsigned id) { callback_t *p; p = gCallBackFirst; while (p) { if (p->id == id) { if (p->prev) p->prev->next = p->next; else gCallBackFirst = p->next; if (p->next) p->next->prev = p->prev; else gCallBackLast = p->prev; free(p); findNotifyBits(); return 0; } p = p->next; } return pigif_callback_not_found; }
int callback_cancel(unsigned id) { callback_t *p; int pi; p = gCallBackFirst; while (p) { if (p->id == id) { pi = p->pi; if (p->prev) {p->prev->next = p->next;} else {gCallBackFirst = p->next;} if (p->next) {p->next->prev = p->prev;} else {gCallBackLast = p->prev;} free(p); findNotifyBits(pi); return 0; } p = p->next; } return pigif_callback_not_found; }
static int intCallback( int pi, unsigned user_gpio, unsigned edge, void *f, void *user, int ex) { static int id = 0; callback_t *p; if ((user_gpio >=0) && (user_gpio < 32) && (edge >=0) && (edge <= 2) && f) { /* prevent duplicates */ p = gCallBackFirst; while (p) { if ((p->pi == pi) && (p->gpio == user_gpio) && (p->edge == edge) && (p->f == f)) { return pigif_duplicate_callback; } p = p->next; } p = malloc(sizeof(callback_t)); if (p) { if (!gCallBackFirst) gCallBackFirst = p; p->id = id++; p->pi = pi; p->gpio = user_gpio; p->edge = edge; p->f = f; p->user = user; p->ex = ex; p->next = 0; p->prev = gCallBackLast; if (p->prev) (p->prev)->next = p; gCallBackLast = p; findNotifyBits(pi); return p->id; } return pigif_bad_malloc; } return pigif_bad_callback; }