/* the special case to remove a specific tasklet */ PyTaskletObject * slp_channel_remove(PyChannelObject *channel, PyTaskletObject *task, int *dir_out, PyTaskletObject **next) { /* note: we assume that the task is in the channel! */ int dir = channel->balance > 0 ? 1 : -1; assert(channel->balance); if (task) { assert(PyTasklet_Check(task)); assert(slp_channel_has_tasklet(channel, task)); } else { task = channel->head; assert(PyTasklet_Check(task)); } if (dir_out) *dir_out = dir; if (next) *next = task->next; channel->balance -= dir; SLP_HEADCHAIN_REMOVE(task, next, prev); task->flags.blocked = 0; return task; }
PyTaskletObject * slp_channel_remove_specific(PyChannelObject *channel, int dir, PyTaskletObject *task) { /* note: we assume that the task is in the channel! */ assert(PyTasklet_Check(task)); channel->balance -= dir; SLP_HEADCHAIN_REMOVE(task, next, prev); task->flags.blocked = 0; return task; }
PyTaskletObject * slp_channel_remove(PyChannelObject *channel, int dir) { PyTaskletObject *ret = channel->head; assert(PyTasklet_Check(ret)); channel->balance -= dir; SLP_HEADCHAIN_REMOVE(ret, next, prev); ret->flags.blocked = 0; return ret; };