1 /* Event pipe for GDB, the GNU debugger. 2 3 Copyright (C) 2021-2023 Free Software Foundation, Inc. 4 5 This file is part of GDB. 6 7 This program is free software; you can redistribute it and/or modify 8 it under the terms of the GNU General Public License as published by 9 the Free Software Foundation; either version 3 of the License, or 10 (at your option) any later version. 11 12 This program is distributed in the hope that it will be useful, 13 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 GNU General Public License for more details. 16 17 You should have received a copy of the GNU General Public License 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */ 19 20 #include "gdbsupport/common-defs.h" 21 #include "gdbsupport/event-pipe.h" 22 #include "gdbsupport/filestuff.h" 23 24 #include <errno.h> 25 #include <fcntl.h> 26 #include <unistd.h> 27 28 event_pipe::~event_pipe () 29 { 30 if (is_open ()) 31 close_pipe (); 32 } 33 34 /* See event-pipe.h. */ 35 36 bool 37 event_pipe::open_pipe () 38 { 39 if (is_open ()) 40 return false; 41 42 if (gdb_pipe_cloexec (m_fds) == -1) 43 return false; 44 45 if (fcntl (m_fds[0], F_SETFL, O_NONBLOCK) == -1 46 || fcntl (m_fds[1], F_SETFL, O_NONBLOCK) == -1) 47 { 48 close_pipe (); 49 return false; 50 } 51 52 return true; 53 } 54 55 /* See event-pipe.h. */ 56 57 void 58 event_pipe::close_pipe () 59 { 60 ::close (m_fds[0]); 61 ::close (m_fds[1]); 62 m_fds[0] = -1; 63 m_fds[1] = -1; 64 } 65 66 /* See event-pipe.h. */ 67 68 void 69 event_pipe::flush () 70 { 71 int ret; 72 char buf; 73 74 do 75 { 76 ret = read (m_fds[0], &buf, 1); 77 } 78 while (ret >= 0 || (ret == -1 && errno == EINTR)); 79 } 80 81 /* See event-pipe.h. */ 82 83 void 84 event_pipe::mark () 85 { 86 int ret; 87 88 /* It doesn't really matter what the pipe contains, as long we end 89 up with something in it. Might as well flush the previous 90 left-overs. */ 91 flush (); 92 93 do 94 { 95 ret = write (m_fds[1], "+", 1); 96 } 97 while (ret == -1 && errno == EINTR); 98 99 /* Ignore EAGAIN. If the pipe is full, the event loop will already 100 be awakened anyway. */ 101 } 102