Giacomo Tesio
f9b2e9aba4
Awake can now interrupt several blocking syscalls (even during note handling). Among others, it can interrupt await, pread and pwrite. It cannot interrupt several others for different reasons: - awake cannot be interrupted by awake; - syscalls like remove and create can be used for kernel comunication and it would be hard to know if the effect occurred in the receiving fs if they were interrupted; - other syscalls do not need awake since they just provide access to kernel infos (eg seek or fd2path) NOTE: awakes registered before a note cannot occur during the note handling and will be deferred till the next call to noted.
68 lines
1.4 KiB
C
68 lines
1.4 KiB
C
/*
|
|
* This file is part of Jehanne.
|
|
*
|
|
* Copyright (C) 2017 Giacomo Tesio <giacomo@tesio.it>
|
|
*
|
|
* Jehanne is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, version 2 of the License.
|
|
*
|
|
* Jehanne is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with Jehanne. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
#include <u.h>
|
|
#include <lib9.h>
|
|
|
|
int done;
|
|
int waited;
|
|
|
|
void
|
|
handler(void *v, char *s)
|
|
{
|
|
int i;
|
|
if(strcmp(s, "stop") == 0){
|
|
done = 1;
|
|
}else{
|
|
print("waiting after %s", s);
|
|
for(i = 0; i < 1000*1000; ++i)
|
|
if(i % 4999 == 0)
|
|
print(".");
|
|
print("\n");
|
|
print("wait after %s terminated\n", s);
|
|
waited++;
|
|
}
|
|
noted(NCONT);
|
|
}
|
|
|
|
void
|
|
main(int argc, char**argv)
|
|
{
|
|
int fd;
|
|
if(argc > 1){
|
|
fd = ocreate(argv[1], OWRITE, 0666);
|
|
dup(fd, 1);
|
|
close(fd);
|
|
}
|
|
|
|
if (notify(handler)){
|
|
fprint(2, "%r\n");
|
|
exits("notify fails");
|
|
}
|
|
|
|
print("note handler installed\n");
|
|
|
|
while(!done)
|
|
sleep(100);
|
|
if(waited == 2){
|
|
print("PASS\n");
|
|
exits("PASS");
|
|
}
|
|
print("%d notes received\n");
|
|
exits("FAIL");
|
|
}
|