2005-05-25 17:50:25

by Chris Friesen

[permalink] [raw]
Subject: proper API for sched_setaffinity ?

On my system (Mandrake 10.0) the man page for sched_setaffinity() lists
the prototype as:

int sched_setaffinity(pid_t pid, unsigned int len, unsigned long
*mask);


But /usr/include/sched.h gives it as

extern int sched_setaffinity (__pid_t __pid, __const cpu_set_t *__mask)

Which is correct?

Chris


2005-05-25 18:33:41

by Christoph Hellwig

[permalink] [raw]
Subject: Re: proper API for sched_setaffinity ?

On Wed, May 25, 2005 at 11:50:16AM -0600, Chris Friesen wrote:
> On my system (Mandrake 10.0) the man page for sched_setaffinity() lists
> the prototype as:
>
> int sched_setaffinity(pid_t pid, unsigned int len, unsigned long
> *mask);
>
>
> But /usr/include/sched.h gives it as
>
> extern int sched_setaffinity (__pid_t __pid, __const cpu_set_t *__mask)
>
> Which is correct?

The first is the syscall, the second is an API glibc folks invented and put
into libc while beeing on crack.

2005-05-25 18:42:35

by Sergey Vlasov

[permalink] [raw]
Subject: Re: proper API for sched_setaffinity ?

On Wed, 25 May 2005 11:50:16 -0600 Chris Friesen wrote:

> On my system (Mandrake 10.0) the man page for sched_setaffinity() lists
> the prototype as:
>
> int sched_setaffinity(pid_t pid, unsigned int len, unsigned long
> *mask);
>
>
> But /usr/include/sched.h gives it as
>
> extern int sched_setaffinity (__pid_t __pid, __const cpu_set_t *__mask)
>
> Which is correct?

Here "man sched_setaffinity" says:

HISTORY
The affinity syscalls were introduced in Linux kernel 2.5.8. The
library calls were introduced in glibc 2.3, and are still in glibc
2.3.2. Later glibc 2.3.2 development versions changed this interface to
one without the len field, and still later versions reverted again. The
glibc prototype is now

/* Set the CPU affinity for a task */
extern int sched_setaffinity (pid_t pid, size_t cpusetsize,
const cpu_set_t *cpuset);

/* Get the CPU affinity for a task */
extern int sched_getaffinity (pid_t pid, size_t cpusetsize,
cpu_set_t *cpuset);

So looks like you have a version of glibc with a broken interface (and
2.3.5 here has correct prototypes).


Attachments:
(No filename) (1.21 kB)
(No filename) (189.00 B)
Download all attachments

2005-05-26 09:03:07

by Pádraig Brady

[permalink] [raw]
Subject: Re: proper API for sched_setaffinity ?

Chris Friesen wrote:
> On my system (Mandrake 10.0) the man page for sched_setaffinity() lists
> the prototype as:
>
> int sched_setaffinity(pid_t pid, unsigned int len, unsigned long
> *mask);
>
>
> But /usr/include/sched.h gives it as
>
> extern int sched_setaffinity (__pid_t __pid, __const cpu_set_t *__mask)
>
> Which is correct?

The sched_setaffinity interface really is very messy:
http://mail.linux.ie/pipermail/ilug/2004-November/019784.html
API changes in same minor version of glibc should just not happen.

--
P?draig Brady - http://www.pixelbeat.org
--