LINUX.ORG.RU

Проверка типов параметров makecontext

 , makecontext,


0

1

Запутавшись в обратных вызовах, приобщился я к новой религии - Сопрограммы! Но вот осталась одна досадная мелочь, мешающая ощутить счастье в полной мере: контроль типов параметров makecontext. В примере ниже параметр «a» передается с ошибкой. Как сделать, чтобы компилятор об этом сообщил?

$ cat makecontext.c

#include <stdio.h>
#include <ucontext.h>

void foo (const char *f, int a, int *ret)
{
    *ret = printf (f, a);
}

void test (void)
{
    unsigned int a = 10;
    int *ret;
    ucontext_t c;

    makecontext (&c, foo, 3, "foo %d", a, &ret);
}

$ gcc -c -Wall makecontext.c

makecontext.c: In function ‘test’:
makecontext.c:15: warning: passing argument 2 of ‘makecontext’ from incompatible pointer type
/usr/include/ucontext.h:48: note: expected ‘void (*)(void)’ but argument is of type ‘void (*)(const char *, int,  int *)’

Ну, и, пятница, же... В каких проектах используются сопрограммы? putty, samba, ещё? Какие субъективные впечатления и объективные результаты от использования сопрограмм?

★★

1. Почему бы не использовать posix threads вместо этих извращений с контекстами?
2. В мане же написано, что все аргументы makecontext после argc должны иметь тип int, а Вы передаёте указатели, - так нельзя

Sorcerer ★★★★★
()
Ответ на: комментарий от Sorcerer

1. Почему бы не использовать posix threads вместо этих извращений с контекстами?

Потому что нити и сопрограммы - это две большие разницы. Я использую и нити, и сопрограммы, и обратные вызовы в одной программе. Всему свое место. Здесь я не буду обсуждать в чем между ними разница, что «лучше», и какие у меня сексуальные предпочтения.

2. В мане же написано, что все аргументы makecontext после argc должны иметь тип int, а Вы передаёте указатели, - так нельзя

Да. Согласен. Нельзя.

Но! Возмущен! Нужно!

А посему вопрос удваивается. Компилятор должен выдать ошибку, что sizeof (f) <> sizeof (int). Сейчас я многие обертки вокруг сопрограмм делаю руками, в т. ч. это. Лень, да и забыть можно. Вот бы компилятор сам меня оберегал.

fopen ★★
() автор топика
Ответ на: комментарий от Sorcerer

Говоришь, «нельзя». Почитай, что пацаны делают http://www.rethinkdb.com/blog/making-coroutines-fast/. Мне еще не до оптимизаций, но их подход мне нравится! Я знаю, что за свои действия мне придется чем-то заплатить, но мой велик должен мне нравиться.

fopen ★★
() автор топика

Я пишу так:

makecontext(&ctx, reinterpret_cast<void (*)()>(Start), 1, this);

В FreeBSD работает: там по 64-битным регистрам (для 64-битной платформы) раскладывается до 6 аргументов (прибито гвоздями). Как в Linux — не смотрел, ибо не нужен. Видел пляски с бубном в виде передачи указателя двумя int-ами.

А вообще, makecontext() задепрекейтили из-за несовместимости с C99. Пишите на ассемблере :)

anonymous
()

ещё забыл

makecontext() без предварительной инициализации с помощью getcontext() не работает. Начиная с мусора в указателе стека, и заканчивая мусорным же состоянием CPU на момент вызова.

ЗЫЖ шо за фошызм с 600 секунд на моём лоре?

anonymous
()
Ответ на: комментарий от anonymous

Ну, у меня в целях линукс, 32 бит, встроенное ПО. Так что не колышет. Но что будет завтра, не знаю. Приходится следить за темой. Меня поразила причина «obsolescent»! Да, мало где используется, да, проблемы с нитями, но превращать сишечку в бейсик... Посмотрел список изменений нового стандарта С, как там последний называется, С2013, блин. Ничего нужного! Щас модно откатывать версии программ, типа, gnome 3 -> 2, или udev форкать. А я за «void f()» и makecontext новые стандарты использовать не буду.

fopen ★★
() автор топика
Ответ на: ещё забыл от anonymous

да getcontext нужен, пример сделан только для компиляции, меня волнует сейчас только время компиляции.

ЗЫ. 600 сек. Фошисты.

fopen ★★
() автор топика

Зачем это делать вручную? Есть же библиотеки.

В каких проектах используются сопрограммы? putty, samba, ещё?

qemu

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Библиотеки меня не устраивают. Большинство из них только переключают контекст, либо интерфейс не устраивает. Видел одну, интерфейс (идея) понравился, но у нее свой главный цикл и обертки вокруг ввода-вывода, и как с ней интегрироваться не понял. А еще лицензия имеет значение.

Поэтому у меня своя обертка вокруг swapcontext, с картами и девчонками, естессно.

fopen ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.