6 #include "pthread_impl.h"
8 static void dummy(void)
12 weak_alias(dummy, __aio_wake);
14 static void notify_signal(struct sigevent *sev)
17 .si_signo = sev->sigev_signo,
18 .si_value = sev->sigev_value,
19 .si_code = SI_ASYNCIO,
20 .si_pid = __pthread_self()->pid,
23 __syscall(SYS_rt_sigqueueinfo, si.si_pid, si.si_signo, &si);
26 static void *io_thread(void *p)
29 int fd = cb->aio_fildes;
30 void *buf = (void *)cb->aio_buf;
31 size_t len = cb->aio_nbytes;
32 off_t off = cb->aio_offset;
33 int op = cb->aio_lio_opcode;
34 struct sigevent sev = cb->aio_sigevent;
37 if (op == LIO_WRITE) {
38 if ( (fcntl(fd, F_GETFL) & O_APPEND)
39 ||((ret = pwrite(fd, buf, len, off))<0 && errno==ESPIPE) )
40 ret = write(fd, buf, len);
41 } else if (op == LIO_READ) {
42 if ( (ret = pread(fd, buf, len, off))<0 && errno==ESPIPE )
43 ret = read(fd, buf, len);
49 if (ret < 0) a_store(&cb->__err, errno);
50 else a_store(&cb->__err, 0);
54 switch (cb->aio_sigevent.sigev_notify) {
59 sev.sigev_notify_function(sev.sigev_value);
66 static int new_req(struct aiocb *cb)
73 if (cb->aio_sigevent.sigev_notify == SIGEV_THREAD) {
74 if (cb->aio_sigevent.sigev_notify_attributes)
75 a = *cb->aio_sigevent.sigev_notify_attributes;
77 pthread_attr_init(&a);
79 pthread_attr_init(&a);
80 pthread_attr_setstacksize(&a, PAGE_SIZE);
81 pthread_attr_setguardsize(&a, 0);
83 pthread_attr_setdetachstate(&a, PTHREAD_CREATE_DETACHED);
85 pthread_sigmask(SIG_BLOCK, &set, &set);
86 cb->__err = EINPROGRESS;
87 if (pthread_create(&td, &a, io_thread, cb)) {
91 pthread_sigmask(SIG_SETMASK, &set, 0);
97 int aio_read(struct aiocb *cb)
99 cb->aio_lio_opcode = LIO_READ;
103 int aio_write(struct aiocb *cb)
105 cb->aio_lio_opcode = LIO_WRITE;