/* 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;
}
Exemple #2
0
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;
}
Exemple #3
0
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;
};