Question

I would like aio to signal to my program when a read operation completes, and according to this page, such notification can be received by either a signal sent by the kernel, or by starting a thread running a user function. Either behavior can be selected by setting the right value of sigev_notify.

I gave it a try and soon discover that even when set to receive the notification by signal, another thread was created.

(gdb) info threads
  Id   Target Id         Frame 
  2    Thread 0x7ffff7ff9700 (LWP 6347) "xnotify" 0x00007ffff7147e50 in gettimeofday () from /lib64/libc.so.6
* 1    Thread 0x7ffff7fc3720 (LWP 6344) "xnotify" 0x0000000000401834 in update (this=0x7fffffffdc00)

The doc also states that: The implementation of these functions can be done using support in the kernel (if available) or using an implementation based on threads at userlevel. I would like to have no thread at all, is this possible?

I checked on my kernel, and that looks okay:

qdii@localhost /home/qdii $ grep -i aio /usr/src/linux/.config
CONFIG_AIO=y

Is it possible to run aio without any (userland) thread at all (apart from the main one, of course)?

EDIT: I digged deeper into it. librt seems to provide a collection of aio functions: looking through the glibc sources exposed something fishy: inside /rt/aio_read.c is a function stub :

int aio_read (struct aiocb *aiocbp)
{
  __set_errno (ENOSYS);
  return -1;
}

stub_warning (aio_read)

I found a first relevant implementation in the subdirectory sysdeps/pthread, which directly called __aio_enqueue_request(..., LIO_READ), which in turn created pthreads. But as I was wondering why there would be a stup in that case, I thought maybe the stub could be implemented by the linux kernel itself, and that pthread implementation would be some sort of fallback code.

Grepping aio_read through my /usr/src/linux directory gives a lot of results, which I’m trying to understand now.

Was it helpful?

Solution

I found out that there are actually two really different aio libraries: one is part of glibc, included in librt, and performs asynchronous access by using pthreads. The other aio library implements the same interface as the first one, but is built upon the linux kernel itself and can use signals to run asynchronously.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top