Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(876)

Side by Side Diff: gdb/ser-base.c

Issue 11969036: Merge GDB 7.5.1 (Closed) Base URL: http://git.chromium.org/native_client/nacl-gdb.git@master
Patch Set: Created 7 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « gdb/score-tdep.c ('k') | gdb/ser-mingw.c » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* Generic serial interface functions. 1 /* Generic serial interface functions.
2 2
3 Copyright (C) 1992-1996, 1998-2001, 2003-2012 Free Software 3 Copyright (C) 1992-1996, 1998-2001, 2003-2012 Free Software
4 Foundation, Inc. 4 Foundation, Inc.
5 5
6 This file is part of GDB. 6 This file is part of GDB.
7 7
8 This program is free software; you can redistribute it and/or modify 8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by 9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or 10 the Free Software Foundation; either version 3 of the License, or
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
116 if (scb->async_state == FD_SCHEDULED) 116 if (scb->async_state == FD_SCHEDULED)
117 fprintf_unfiltered (gdb_stdlog, "[fd%d->timer-scheduled]\n", 117 fprintf_unfiltered (gdb_stdlog, "[fd%d->timer-scheduled]\n",
118 scb->fd); 118 scb->fd);
119 break; 119 break;
120 } 120 }
121 } 121 }
122 scb->async_state = next_state; 122 scb->async_state = next_state;
123 } 123 }
124 } 124 }
125 125
126 /* Run the SCB's async handle, and reschedule, if the handler doesn't
127 close SCB. */
128
129 static void
130 run_async_handler_and_reschedule (struct serial *scb)
131 {
132 int is_open;
133
134 /* Take a reference, so a serial_close call within the handler
135 doesn't make SCB a dangling pointer. */
136 serial_ref (scb);
137
138 /* Run the handler. */
139 scb->async_handler (scb, scb->async_context);
140
141 is_open = serial_is_open (scb);
142 serial_unref (scb);
143
144 /* Get ready for more, if not already closed. */
145 if (is_open)
146 reschedule (scb);
147 }
148
126 /* FD_EVENT: This is scheduled when the input FIFO is empty (and there 149 /* FD_EVENT: This is scheduled when the input FIFO is empty (and there
127 is no pending error). As soon as data arrives, it is read into the 150 is no pending error). As soon as data arrives, it is read into the
128 input FIFO and the client notified. The client should then drain 151 input FIFO and the client notified. The client should then drain
129 the FIFO using readchar(). If the FIFO isn't immediatly emptied, 152 the FIFO using readchar(). If the FIFO isn't immediatly emptied,
130 push_event() is used to nag the client until it is. */ 153 push_event() is used to nag the client until it is. */
131 154
132 static void 155 static void
133 fd_event (int error, void *context) 156 fd_event (int error, void *context)
134 { 157 {
135 struct serial *scb = context; 158 struct serial *scb = context;
(...skipping 15 matching lines...) Expand all
151 else if (nr > 0) 174 else if (nr > 0)
152 { 175 {
153 scb->bufcnt = nr; 176 scb->bufcnt = nr;
154 scb->bufp = scb->buf; 177 scb->bufp = scb->buf;
155 } 178 }
156 else 179 else
157 { 180 {
158 scb->bufcnt = SERIAL_ERROR; 181 scb->bufcnt = SERIAL_ERROR;
159 } 182 }
160 } 183 }
161 scb->async_handler (scb, scb->async_context); 184 run_async_handler_and_reschedule (scb);
162 reschedule (scb);
163 } 185 }
164 186
165 /* PUSH_EVENT: The input FIFO is non-empty (or there is a pending 187 /* PUSH_EVENT: The input FIFO is non-empty (or there is a pending
166 error). Nag the client until all the data has been read. In the 188 error). Nag the client until all the data has been read. In the
167 case of errors, the client will need to close or de-async the 189 case of errors, the client will need to close or de-async the
168 device before naging stops. */ 190 device before naging stops. */
169 191
170 static void 192 static void
171 push_event (void *context) 193 push_event (void *context)
172 { 194 {
173 struct serial *scb = context; 195 struct serial *scb = context;
174 196
175 scb->async_state = NOTHING_SCHEDULED; /* Timers are one-off */ 197 scb->async_state = NOTHING_SCHEDULED; /* Timers are one-off */
176 scb->async_handler (scb, scb->async_context); 198 run_async_handler_and_reschedule (scb);
177 /* re-schedule */
178 reschedule (scb);
179 } 199 }
180 200
181 /* Wait for input on scb, with timeout seconds. Returns 0 on success, 201 /* Wait for input on scb, with timeout seconds. Returns 0 on success,
182 otherwise SERIAL_TIMEOUT or SERIAL_ERROR. */ 202 otherwise SERIAL_TIMEOUT or SERIAL_ERROR. */
183 203
184 static int 204 static int
185 ser_base_wait_for (struct serial *scb, int timeout) 205 ser_base_wait_for (struct serial *scb, int timeout)
186 { 206 {
187 while (1) 207 while (1)
188 { 208 {
(...skipping 342 matching lines...) Expand 10 before | Expand all | Expand 10 after
531 delete_file_handler (scb->fd); 551 delete_file_handler (scb->fd);
532 break; 552 break;
533 case NOTHING_SCHEDULED: 553 case NOTHING_SCHEDULED:
534 break; 554 break;
535 default: /* TIMER SCHEDULED */ 555 default: /* TIMER SCHEDULED */
536 delete_timer (scb->async_state); 556 delete_timer (scb->async_state);
537 break; 557 break;
538 } 558 }
539 } 559 }
540 } 560 }
OLDNEW
« no previous file with comments | « gdb/score-tdep.c ('k') | gdb/ser-mingw.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698