Branch data Line data Source code
1 : :
2 : : #include "gwrl/event.h"
3 : :
4 : 461 : void gwrl_wake(gwrl * rl) {
5 : 461 : if(flisset(rl->flags,GWRL_SLEEPING)) {
6 : 2 : ssize_t res = 0;
7 : 2 : while(1) {
8 : 2 : res = write(rl->fds[1],"wake",4);
9 [ - + ][ # # ]: 2 : if(res < 0 && errno == EINTR) continue;
10 : 2 : break;
11 : : }
12 : 2 : }
13 : 461 : }
14 : :
15 : 22 : void gwrl_wake_init(gwrl * rl) {
16 : 22 : gwrlsrc * fsrc = NULL;
17 [ - + ]: 22 : while((pipe((int *)rl->fds)) < 0) {
18 : 0 : gwprintsyserr("(3FG9D) pipe error",errno);
19 : 0 : }
20 : 22 : fcntl(rl->fds[0],F_SETFL,O_NONBLOCK);
21 : 22 : fcntl(rl->fds[1],F_SETFL,O_NONBLOCK);
22 : 22 : fsrc = gwrl_src_file_create((fileid_t)rl->fds[0],GWRL_RD,&gwrl_wake_activity,NULL);
23 [ - + ]: 22 : if(!fsrc) {
24 : 0 : gwerr("(3FDli) gwrl_wake_init couldn't create file input source");
25 : 0 : return;
26 : : }
27 : 22 : gwrl_src_add(rl,fsrc);
28 : 22 : }
29 : :
30 : 4 : void gwrl_wake_free(gwrl * rl) {
31 : 4 : close((int)rl->fds[0]);
32 : 4 : close((int)rl->fds[1]);
33 : 4 : }
34 : :
35 : 2 : void gwrl_wake_activity(gwrl * rl, gwrlevt * evt) {
36 : 2 : int res = 0;
37 : 2 : bool reinit = false;
38 : 2 : if(flisset(evt->flags,GWRL_RD)) {
39 : 2 : char buf[4];
40 : 2 : while(1) {
41 : 4 : res = read(evt->fd,buf,4);
42 [ + + ]: 4 : if(res > 0) continue;
43 [ + - ][ - + ]: 2 : if(res <= 0 && errno != EAGAIN && errno != EWOULDBLOCK) reinit = true;
[ # # ]
44 : 2 : break;
45 : : }
46 [ - + ]: 2 : if(reinit) {
47 : 0 : close(rl->fds[0]);
48 : 0 : close(rl->fds[1]);
49 : 0 : gwrl_src_del(rl,evt->src,NULL,true);
50 : 0 : gwrl_wake_init(rl);
51 : 0 : }
52 : 2 : }
53 : 2 : }
|