#include <linux/futex.h>
#include <sys/time.h>
int futex(int *uaddr, int op, int valconst struct timespec * timeout , int *uaddr2, int val3);
futex руками
Код:
У меня же под Ubuntu x64, 2.6.28, gcc 4.3 уже при подключении первых двух хидеров начинаются глюки - timespec объявлен в <sys/time.h> и в <linux/time.h>, последний, видимо включается внутри <linux/futex.h>.
Ну это не беда, убрал <sys/time.h>, остальное затолкнул в своем хидере в отдельный неймспейс, вроде все ок - никаких конфликтов.
Вот только прототипа
Код:
int futex(int *uaddr, int op, int val, const struct timespec * timeout , int *uaddr2, int val3);
Гуглил, где-то "int futex(...)", где-то "int sys_futex(...)" -- один фиг.
Примерный код:
Код:
namespace cfutex
{
#include <linux/futex.h>
class CFutex
{
public:
long wait(void* addr, int waitif, const timespec * timeout)
{
return futex(....); // функция futex(....) не определена в текущей области видимости
}
};
}
{
#include <linux/futex.h>
class CFutex
{
public:
long wait(void* addr, int waitif, const timespec * timeout)
{
return futex(....); // функция futex(....) не определена в текущей области видимости
}
};
}
Скажите пожалуйста, с чем связано такое количество граблей (хотя бы то, что два хидера, указанные в мане у меня не совместимы без бубна) и что я делаю не правильно?
P.S. Предыдущая тема не создалась ввиду глюка, написать в нее сообщение не смог, просьба удалить. глюк здеся
Хм. Не сталкивался в плотную с futex`ами, но возможно стоит проверить выдает ли gcc -v строчку "--enable-linux-futex" ? То есть собран ли комплиятор с поддержкой этих самых futex`ов =)
NOTES
To reiterate, bare futexes are not intended as an easy-to-use abstraction for end-users. ([COLOR="Red"]There is no wrapper
function for this system call in glibc[/COLOR].) Implementors are expected to be assembly literate and to have read
the sources of the futex userspace library referenced below.
Так что man syscall, man 2 intro и syscall (SYS_futex, ...).
Ну то не так важно - опенсорсный проект, при всем уважении и не такие чудеса возможны.
Думаю, вариант с прямым вызовом syscall пройдет. еще раз спасибо за совет!