#include <aio.h>
#include <errno.h>
-#include <limits.h>
#include <unistd.h>
#include <string.h>
#include "pthread_impl.h"
static int lio_wait(struct lio_state *st)
{
- int i, err, got_err;
+ int i, err, got_err = 0;
int cnt = st->cnt;
struct aiocb **cbs = st->cbs;
.si_signo = sev->sigev_signo,
.si_value = sev->sigev_value,
.si_code = SI_ASYNCIO,
- .si_pid = __pthread_self()->pid,
+ .si_pid = getpid(),
.si_uid = getuid()
};
__syscall(SYS_rt_sigqueueinfo, si.si_pid, si.si_signo, &si);
return 0;
}
-int lio_listio(int mode, struct aiocb *restrict const cbs[restrict], int cnt, struct sigevent *restrict sev)
+int lio_listio(int mode, struct aiocb *restrict const *restrict cbs, int cnt, struct sigevent *restrict sev)
{
int i, ret;
struct lio_state *st=0;
if (mode == LIO_WAIT) {
ret = lio_wait(st);
free(st);
- return 0;
+ return ret;
}
if (st) {
pthread_attr_t a;
- sigset_t set;
+ sigset_t set, set_old;
pthread_t td;
if (sev->sigev_notify == SIGEV_THREAD) {
}
pthread_attr_setdetachstate(&a, PTHREAD_CREATE_DETACHED);
sigfillset(&set);
- pthread_sigmask(SIG_BLOCK, &set, &set);
+ pthread_sigmask(SIG_BLOCK, &set, &set_old);
if (pthread_create(&td, &a, wait_thread, st)) {
free(st);
errno = EAGAIN;
return -1;
}
- pthread_sigmask(SIG_SETMASK, &set, 0);
+ pthread_sigmask(SIG_SETMASK, &set_old, 0);
}
return 0;
}
-