kthread: проверка состояния потока

Взгляд изнутри

Модератор: Модераторы разделов

IMB
Сообщения: 2503
ОС: Debian

kthread: проверка состояния потока

Сообщение IMB »

Доброго дня!

Код: Выделить всё

static bool is_blink;

#define BLINK_TIMEOUT 100

static int thread_fn(void *data)
{
        is_blink = true;

        while (!kthread_should_stop()) {
                set_gpio(gpio, true);
                msleep(BLINK_TIMEOUT);
                set_gpio(gpio, false);
                msleep(BLINK_TIMEOUT);
        }

        is_blink = false;

        return 0;
}

static struct task_struct *task;

static ssize_t dozor_ioctl(struct file *file, unsigned int num,
                                unsigned long param)
{
        if (_IOC_TYPE(num) != 'D')
                return -ENOIOCTLCMD;

        switch (num) {
        case DOZOR_LED_ON:
                if (is_blink) {
                        kthread_stop(task);
                        msleep(BLINK_TIMEOUT * 2);
                }
                set_gpio(gpio, true);
                break;
        case DOZOR_LED_OFF:
                if (is_blink) {
                        kthread_stop(task);
                        msleep(BLINK_TIMEOUT * 2);
                }
                set_gpio(gpio, false);
                break;
        case DOZOR_LED_BLINK:
                task = kthread_run(thread_fn, NULL, "dozor_led");
                break;
        default:
                pr_err("Unknown IOCTL %u", num);
                return -EINVAL;
        }

        return 0;
}

Как без использования дополнительной переменной проверить состояние потока?
Спасибо.
Спасибо сказали:

Аватара пользователя
Olej
Сообщения: 659
ОС: Fedora, Mint, Debian, QNX

Re: kthread: проверка состояния потока

Сообщение Olej »

IMB писал(а):
18.02.2016 10:13

Код: Выделить всё

static struct task_struct *task;

Как без использования дополнительной переменной проверить состояние потока?


В принципе, вам нужна структура task_struct для вашего потока в циклическом списке задач ядра:
struct task_struct {
volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */
...
pid_t pid;
...
}
Она может быть найдена:

Код: Выделить всё

struct task_struct *find_task_by_vpid( pid_t nr );
struct task_struct *pid_task( struct pid *pid, enum pid_type );
struct task_struct *get_pid_task( struct pid *pid, enum pid_type );


P.S. Ну, или тем более, если она уже есть у вас в коде.
Спасибо сказали:

Аватара пользователя
Stauffenberg
Сообщения: 2023
Статус: ☮ PEACE ☮
ОС: открытая и свободная

Re: kthread: проверка состояния потока

Сообщение Stauffenberg »

IMB писал(а):
18.02.2016 10:13
Как без использования дополнительной переменной проверить состояние потока?

Почему именно без использования дополнительной переменной?
Labor omnia vincit

"Debugging is twice as hard as writing the code in the first place.
Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.” (Brian Kernighan)
Спасибо сказали: