]> andersk Git - moira.git/blame - gdb/gdb_trans.c
added copyright message
[moira.git] / gdb / gdb_trans.c
CommitLineData
5580185e 1/*
2 * $Source$
3 * $Header$
4 */
5
6#ifndef lint
7static char *rcsid_gdb_trans_c = "$Header$";
8#endif lint
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30/************************************************************************/
31/*
32/* gdb_trans.c
33/*
34/* GDB - Data Transport Services Routines (Part 1)
35/*
36/* Author: Noah Mendelsohn
37/* Copyright: 1986 MIT Project Athena
0a5ff702 38/* For copying and distribution information, please see
39/* the file <mit-copyright.h>.
5580185e 40/*
41/* These routines implement layer 6 of the Client Library
42/* Specification of the GDB system, as well as the facilities
43/* outlined in the GDB Protocol Specification. (Part 1 of 2)
44/*
45/* Some of the routines specified are actually implemented as
46/* macros defined in gdb.h.
47/*
48/************************************************************************/
49
0a5ff702 50#include <mit-copyright.h>
5580185e 51#include <sys/types.h>
52#include <strings.h>
53#include <stdio.h>
54#include <varargs.h>
55#include <errno.h>
56extern int errno;
57#include "gdb.h"
58
59\f
60/************************************************************************/
61/*
62/* OPERATION Manipulation
63/*
64/* The routines in this section provide services for creating
65/* and manipulating GDB queueable operations.
66/*
67/************************************************************************/
68
69 /*----------------------------------------------------------*/
70 /*
71 /* create_operation (create_operation)
72 /*
73 /* Allocates space for an operation descriptor and
74 /* returns a pointer to it. Initialize the eyecatcher
75 /* so that in the future we can prove by inspection that
76 /* this really is an operation descriptor.
77 /*
78 /*----------------------------------------------------------*/
79
80OPERATION
81create_operation()
82{
83 register OPERATION op;
84 GDB_INIT_CHECK
85 op = (OPERATION)db_alloc(sizeof(OPERATION_DATA));
86 op->status = OP_NOT_STARTED; /* things like */
87 /* reset_operation */
88 /* want valid status */
89 /* at all times*/
90 op->id = GDB_OP_ID;
91 return op;
92}
93
94 /*----------------------------------------------------------*/
95 /*
96 /* reset_operation (reset_operation)
97 /*
98 /* Sets the status of an operation to OP_NOT_STARTED
99 /*
100 /*----------------------------------------------------------*/
101
102int
103reset_operation(op)
104OPERATION op;
105{
106 register int status;
107
108 GDB_CHECK_OP(op, "reset_operation")
109
110 status = OP_STATUS(op);
111 if (status == OP_QUEUED ||
112 status == OP_RUNNING)
113 GDB_GIVEUP("gdb:reset_operation invalid on running operation")
114 op->status = OP_NOT_STARTED;
115}
116
117 /*----------------------------------------------------------*/
118 /*
119 /* delete_operation(delete_operation)
120 /*
121 /* Frees an operation descriptor.
122 /*
123 /*----------------------------------------------------------*/
124
125int
126delete_operation(op)
127OPERATION op;
128{
129 GDB_CHECK_OP(op, "delete_operation");
130 op->id = -1;
131 db_free((char *)op, sizeof(OPERATION_DATA));
132}
133
134 /*----------------------------------------------------------*/
135 /*
136 /* initialize_operation(initialize_operation)
137 /*
138 /* Initialize the data in an operation descriptor
139 /* based on the supplied parameters.
140 /*
141 /*----------------------------------------------------------*/
142
143int
144initialize_operation(operation, init_function, arg, cancel_function)
145OPERATION operation; /* initialize this */
146int (*init_function)(); /* function to call when */
147 /* starting operation */
148char *arg; /* arg to pass to init and */
149 /* continue routines */
150int (*cancel_function)(); /* call this function */
151 /* when cancelling the op. */
152 /* may be NULL, may not */
153 /* be elided */
154{
155 register OPERATION op = operation; /* just for speed */
156
157 GDB_CHECK_OP(op, "initialize_operation")
158
159
160 /*
161 * Fill in boilerplate - same for all newly initialized ops.
162 */
163 op->next = op->prev = NULL; /* it's not in a queue yet */
164 op->tag = (-1); /* not tagged until queued */
165 op->status = OP_NOT_STARTED;
166 op->flags = 0;
167 op->result = (-1); /* result is not valid until */
168 /* status is OP_COMPLETE. */
169 /* All users of result field */
170 /* are expected to treat -1 */
171 /* invalid */
172 op->halfcon = NULL; /* not queued yet */
173
174 /*
175 * Fill in supplied parameters
176 */
177 op->arg = arg;
178 op->fcn.init = init_function;
179 op->cancel = cancel_function;
180
181 return;
182}
183
184 /*----------------------------------------------------------*/
185 /*
186 /* create_list_of_operations (create_list_of_operations)
187 /*
188 /* Allocates and fills in a data structure which
189 /* contains a list of operations. This list is
190 /* suitable for passing to op_select.
191 /*
192 /* The facilities of <varargs.h> are used to parse
193 /* the variable length parameter list to this function.
194 /* See "man 3 varargs" for details.
195 /*
196 /*----------------------------------------------------------*/
197
198/*VARARGS1*/
199
200LIST_OF_OPERATIONS
201create_list_of_operations(count, va_alist)
202int count;
203va_dcl
204{
205 va_list ap; /* the control structure */
206 /* for varargs parsing */
207
208 register int i;
209 register LIST_OF_OPERATIONS newlist; /* newly allocated list */
210
211 /*
212 * Allocate the new list of operations, initialize its count.
213 */
214 newlist = (LIST_OF_OPERATIONS)
215 db_alloc(size_of_list_of_operations(count));
216 newlist->count = count;
217
218 /*
219 * Using the facilities of varargs.h, pick up the operations
220 * and put them in the list.
221 */
222 va_start(ap);
223 for (i=0; i<count; i++) {
224 newlist->op[i] = va_arg(ap, OPERATION);
225 GDB_CHECK_OP((newlist->op[i]), "create_list_of_operations")
226 }
227 va_end(ap);
228
229 return newlist;
230}
231
232 /*----------------------------------------------------------*/
233 /*
234 /* delete_list_of_operations(delete_list_of_operations)
235 /*
236 /* Deallocate the space for a list of operations.
237 /*
238 /*----------------------------------------------------------*/
239
240int
241delete_list_of_operations(op_list)
242LIST_OF_OPERATIONS op_list;
243{
244 db_free((char *)op_list, size_of_list_of_operations(op_list->count));
245}
246\f
247/************************************************************************/
248/*
249/* OPERATION QUEUE MANIPULATION
250/*
251/* Routines to queue (initiate) and track completion of GDB
252/* operations.
253/*
254/************************************************************************/
255
256 /*----------------------------------------------------------*/
257 /*
258 /* op_select(op_select)
259 /*
260 /* This function is an analog of the standard Berkeley
261 /* select system call. It provides all the functions
262 /* of select, but in addition, it awaits completion
263 /* of a specified list of queued gdb operations.
264 /*
265 /* This function returns when any combination of the
266 /* following are found to be true:
267 /*
268 /* 1) Any of the designated operations has completed
269 /* or terminated prematurely.
270 /*
271 /* 2) Activity is detected on any of the explictly supplied
272 /* file descriptors or the supplied timer has expired.
273 /*
274 /* The count returned is only for file descriptors
275 /* explicitly listed. Completed operatons may be detected
276 /* by checking OP_STATUS for each of the operations in
277 /* the list. File descriptors controlled by CONNECTIONS
278 /* should never be passed explictly in the bit maps to
279 /* this routine. Only user controlled file descriptors
280 /* may be explictly selected.
281 /*
282 /* Return code summary:
283 /*
284 /* -2 One or more listed operations completed.
285 /* Timer did not ring (as far as we could
286 /* tell), other fd's did not complete, or
287 /* we didn't get far enough to bother
288 /* looking. (see fairness below.)
289 /*
290 /* -1 An error was returned on select of a
291 /* user supplied socket. errno has the
292 /* error code.
293 /*
294 /* 0 The timer rang. Some operations may
295 /* be complete, but it's unlikely.
296 /*
297 /* >0 This many user supplied fd's were
298 /* satisfied--same as for select.
299 /* Operations in the list may also have
300 /* completed.
301 /*
302 /* Fairness is not guaranteed. This routine tends to
303 /* favor activity on CONNECTIONs. In particular, if
304 /* some operation(s) in the list can be completed
305 /* synchronously, a real select is never done to
306 /* check on the file descriptors.
307 /*
308 /*----------------------------------------------------------*/
309
310int
311op_select(op_list, nfds, readfds, writefds, exceptfds, timeout)
312LIST_OF_OPERATIONS op_list;
313int nfds;
314fd_set *readfds, *writefds, *exceptfds;
315struct timeval *timeout;
316{
317 int rc; /* return code holder */
318 fd_set rfds, wfds, efds; /* local copys of read */
319 /* write, and exception */
320 /* fd's */
321
322 /*
323 * Make sure that any activity which can be done immediately is
324 * indeed done now--we may not have to wait at all.
325 */
326 (void) gdb_fastprogress(); /*<==FIX (check to make sure this is OK)*/
327
328 /*
329 * Loop checking for termination conditions, and if none arise,
330 * use con_select to make wait for one or more of the
331 * connections to wake up and do the appropriate processing.
332 */
333 while (TRUE) {
334 /*
335 * If any of the queue operations have completed,
336 * then just return now.
337 */
338 if (gdb_list_complete(op_list))
339 return (-2); /* no fd's satisfied here */
340
341 /*
342 * Use con_select to await all the appropriate events
343 */
344 g_fd_copy(nfds, readfds, &rfds);
345 g_fd_copy(nfds, writefds, &wfds);
346 g_fd_copy(nfds, exceptfds, &efds);
347
348 rc = con_select(nfds, &rfds, &wfds, &efds, timeout);
349
350 /*
351 * At this point, either some of the supplied fd's have
352 * been satisfied(rc>0), or the timer has rung (rc=0),
353 * an error was returned from select on a user specified socket
354 * (-1) or none of these (-2). In any case, there may
355 * have been progress on one of the connections, and
356 * con_select will already have progressed as far as
357 * possible before returning. Now, decide what to
358 * do, given the return code.
359 */
360 if (rc>= (-1)) {
361 /*
362 * Return updated bit-maps to caller.
363 */
364 g_fd_copy(nfds, &rfds, readfds);
365 g_fd_copy(nfds, &wfds, writefds);
366 g_fd_copy(nfds, &efds, exceptfds);
367 return rc;
368 }
369 }
370}
371\f
372 /*----------------------------------------------------------*/
373 /*
374 /* op_select_all(op_select_all)
375 /*
376 /* Similar to op_select_any, but returns (-1) only
377 /* in the case that all of the designated descriptors
378 /* are OP_COMPLETE or OP_CANCELLED.
379 /*
380 /*----------------------------------------------------------*/
381
382int
383op_select_all(op_list, nfds, readfds, writefds, exceptfds, timeout)
384LIST_OF_OPERATIONS op_list;
385int nfds;
386fd_set *readfds, *writefds, *exceptfds;
387struct timeval *timeout;
388{
389 register int i;
390 int rc = -1;
391 register int left = op_list->count;
392
393 /*
394 * take care of those which are already complete by decrementing
395 * and reseting them
396 */
397
398 for (i=0; i<op_list->count; i++) {
399 if (op_list->op[i]->status==OP_COMPLETE) {
400 op_list->op[i]->flags |= OPF_MARKED_COMPLETE;
401 op_list->op[i]->status = OP_MARKED;
402 /* so op_select_any won't */
403 /* fall right through*/
404
405 left--;
406 continue;
407 }
408 if (op_list->op[i]->status==OP_CANCELLED) {
409 op_list->op[i]->flags |= OPF_MARKED_CANCELLED;
410 op_list->op[i]->status = OP_MARKED;
411 /* so op_select_any won't */
412 /* fall right through*/
413
414 left--;
415 }
416 }
417
418
419 /*
420 * As long as there are incomplete operations left in the list,
421 * keep calling op_select_any
422 */
423 while (left) {
424 rc = op_select(op_list, nfds, readfds, writefds, exceptfds,
425 timeout);
426 if (rc>=0)
427 break;
428 for (i=0; i<op_list->count; i++) {
429 if (op_list->op[i]->status==OP_COMPLETE) {
430 op_list->op[i]->flags |= OPF_MARKED_COMPLETE;
431 op_list->op[i]->status = OP_MARKED;
432 /* so op_select_any won't */
433 /* fall right through*/
434
435 left--;
436 continue;
437 }
438 if (op_list->op[i]->status==OP_CANCELLED) {
439 op_list->op[i]->flags |= OPF_MARKED_CANCELLED;
440 op_list->op[i]->status = OP_MARKED;
441 /* so op_select_any won't */
442 /* fall right through*/
443
444 left--;
445 }
446 }
447 }
448
449 /*
450 * Clean up the marked operations and return
451 */
452 for (i=0; i<op_list->count; i++) {
453 if (op_list->op[i]->status==OP_MARKED) {
454 op_list->op[i]->status = (op_list->op[i]->flags &
455 OPF_MARKED_COMPLETE) ?
456 OP_COMPLETE :
457 OP_CANCELLED;
458 op_list->op[i]->flags &= ~(OPF_MARKED_COMPLETE |
459 OPF_MARKED_CANCELLED);
460 }
461 }
462
463 return rc;
464
465}
466\f
467/************************************************************************/
468/*
469/* Internal transport layer routines, not called directly
470/* from client library.
471/*
472/************************************************************************/
473
474 /*----------------------------------------------------------*/
475 /*
476 /* gdb_list_complete
477 /*
478 /* Given a list of gdb operations, return TRUE if any
479 /* of them are complete, otherwise return FALSE.
480 /*
481 /*----------------------------------------------------------*/
482
483int
484gdb_list_complete(op_list)
485LIST_OF_OPERATIONS op_list;
486{
487 register int i;
488 register int status;
489 register LIST_OF_OPERATIONS oplist = op_list; /* for speed */
490 int count = oplist -> count;
491
492 for (i=0; i<count; i++) {
493 status = OP_STATUS(oplist->op[i]);
494 if (status == OP_COMPLETE ||
495 status == OP_CANCELLED)
496 return TRUE;
497 }
498
499 return FALSE;
500}
501
502 /*----------------------------------------------------------*/
503 /*
504 /* g_fd_copy
505 /*
506 /* Copy one set of fd masks to another.
507 /*
508 /*----------------------------------------------------------*/
509
510g_fd_copy(nfds, source, targ)
511int nfds;
512fd_set *source, *targ;
513{
514 register int i;
515 register int n = howmany(nfds, NFDBITS); /* number of words for */
516 /* this many fd's */
517
518 for (i=0; i<n; i++)
519 targ->fds_bits[i] = source->fds_bits[i];
520}
521 /*----------------------------------------------------------*/
522 /*
523 /* g_fd_or_and_copy
524 /*
525 /* Or two sets of file descriptor masks together and
526 /* copy to a third. Parameters are:
527 /*
528 /* 1) First mask count
529 /* 2) Second mask count
530 /* 3) pointer to first mask
531 /* 4) Pointer to second mask
532 /* 5) Pointer to output mask
533 /*
534 /*----------------------------------------------------------*/
535
536g_fd_or_and_copy(nfds1, nfds2 , source1, source2, targ)
537int nfds1, nfds2;
538fd_set *source1, *source2, *targ;
539{
540 register int i;
541 fd_set *longer; /* points to whichever */
542 /* of the two masks is */
543 /* longer */
544 int tot_words = howmany(max(nfds1,nfds2), NFDBITS);
545 int shared_words = howmany(min(nfds1,nfds2), NFDBITS);
546
547
548 /*
549 * For words which exist in both masks, or the bits together
550 */
551 for (i=0; i<shared_words; i++)
552 targ->fds_bits[i] = source1->fds_bits[i] |
553 source2->fds_bits[i];
554 /*
555 * Copy the rest of whichever is longer
556 */
557 longer = (nfds1>nfds2) ? source1 : source2;
558
559 while (i<tot_words) {
560 targ->fds_bits[i] = longer->fds_bits[i];
561 i++;
562 }
563
564 return;
565}
566
567 /*----------------------------------------------------------*/
568 /*
569 /* g_compute_return_fds
570 /*
571 /* When con_select returns, the count it gives back
572 /* applies only to user supplied fd's, not those
573 /* relating to connections. Unfortunately, select
574 /* gives back both in the masks it returns. Here we
575 /* fix only the count to reflect the fact that we will be
576 /* turning off bits when and if they are returned.
577 /*
578 /* We can assume here that the masks provided are as long
579 /* as merged_nfds, which means they are at least as long
580 /* as gdb_mfd.
581 /*
582 /*----------------------------------------------------------*/
583
584int
585g_compute_return_fds(select_count, rfds, wfds, efds)
586int select_count; /* count of 1 bits as */
587 /* returned from select */
588fd_set *rfds, *wfds, *efds; /* read, write, and except */
589 /* maps as returned from */
590 /* select */
591{
592 register int i;
593 register int return_count = select_count; /* the value we'll return */
594 register int words; /* number of words in each */
595 /* of the connection masks */
596
597
598 /*
599 * Since we can only decrement the count, there's no sense doing
600 * any work if it's already 0;
601 */
602 if (return_count == 0)
603 return 0;
604 /*
605 * Figure out how many words we have to look at to get all the
606 * bits covered by connection masks.
607 */
608 words = howmany(gdb_mfd, NFDBITS);
609
610 /*
611 * For words which are involved in the connection masks, check
612 * for matches and decrement the count accordingly. Stop when
613 * the count hits 0 or we're out of words.
614 */
615 for (i=0; i<words && (return_count>0) ; i++) {
616 return_count -= g_bitcount((unsigned int)
617 (gdb_crfds.fds_bits[i] &
618 rfds->fds_bits[i]));
619 return_count -= g_bitcount((unsigned int)
620 (gdb_cwfds.fds_bits[i] &
621 wfds->fds_bits[i]));
622 return_count -= g_bitcount((unsigned int)
623 (gdb_cefds.fds_bits[i] &
624 efds->fds_bits[i]));
625 }
626
627 return return_count;
628}
629
630 /*----------------------------------------------------------*/
631 /*
632 /* g_fd_reset_conbits
633 /*
634 /* Given a user supplied fd bit mask and a connection
635 /* related bit mask, turn off any of the connection related
636 /* bits in the user mask, and copy the result to a supplied
637 /* target.
638 /*
639 /* 1) User mask count
640 /* 2) Connection mask count
641 /* 3) Pointer to user mask
642 /* 4) Pointer to connection mask
643 /* 5) Pointer to output mask
644 /*
645 /* Output is always the same length as the user mask.
646 /*
647 /*----------------------------------------------------------*/
648
649
650g_fd_reset_conbits(nfds, con_nfds , source, conbits, targ)
651int nfds, con_nfds;
652fd_set *source, *conbits, *targ;
653{
654 register int i;
655 register int tot_words = howmany(nfds, NFDBITS); /* this rtn never*/
656 /* returns a mask longer */
657 /* than nfds */
658 register int shared_words = howmany(min(nfds, con_nfds), NFDBITS);
659
660
661 /*
662 * For words which exist in both masks, turn off bits from conmask
663 */
664 for (i=0; i<shared_words; i++)
665 targ->fds_bits[i] = source->fds_bits[i] &
666 ~(conbits->fds_bits[i]);
667 /*
668 * Copy the rest of source, if any
669 */
670 if (tot_words > shared_words)
671 while (i<tot_words) {
672 targ->fds_bits[i] = source->fds_bits[i];
673 i++;
674 }
675
676 return;
677}
678
679\f
680/************************************************************************/
681/*
682/* CONNECTION MANIPULATION
683/*
684/* Routines to control data transmission on gdb connections.
685/*
686/************************************************************************/
687
688 /*----------------------------------------------------------*/
689 /*
690 /* con_select (con_select)
691 /*
692 /* This operation has exactly the same semantics as the select
693 /* system call, except that (1) it implicitly selects all file
694 /* descriptors controlled by connections, as well as those
695 /* explictly specified and (2) it allows transmission and
696 /* receipt to progress on all connections and (3) it considers
697 /* a connection to be selected iff a transmission operation
698 /* which had been pending becomes complete. One may consider
699 /* that con_select turns the fd's controlled by sockets into
700 /* packet streams rather than byte streams. Note also that
701 /* this operation differs from a traditional select and an
702 /* op_select in that it is not robust against waiting for
703 /* connections with pre-completed activity. This could be
704 /* added, but since it's an internal routine anyway, it seems
705 /* not to be worthwhile. Also, this routine presumes that all
706 /* possible progress has been made before con_select is invoked.
707 /*
708 /* This operation hangs in a select. If activity is
709 /* discovered on any of the sockets controlled by the database
710 /* library, then the corresponding input is read and
711 /* appropriate processing is done. If any of the transmission
712 /* operations which had been pending on one of these
713 /* connections completes, then con_select may return. In
714 /* fact, con_select attempts to complete any further
715 /* connection related activity which can be done without
716 /* blocking, but con_select never blocks AFTER a transmission
717 /* operation has gone complete.
718 /*
719 /* If activity is detected on any of the file descriptors
720 /* supplied by the user, then a count and bit fields are
721 /* returned just as for select. (Activity on database sockets
722 /* is never reflected in either count or bitfields.) Timeout
723 /* causes a return, as with select. Upon return, the program
724 /* must check for competion or termination on all of the
725 /* connections in which he/she is interested, for activity on
726 /* the selected file descriptors, and for timeouts, if
727 /* requested, since any or all of these may be reported
728 /* together.
729 /*
730 /* Return values for con_select: >0 same as for select, 0 time
731 /* expired, -1, error in select on user fd, -2, connections
732 /* have progressed but nothing else of interest.
733 /*
734 /*
735 /*----------------------------------------------------------*/
736
737int
738con_select(nfds, readfds, writefds, exceptfds, timeout)
739int nfds;
740fd_set *readfds, *writefds, *exceptfds;
741struct timeval *timeout;
742{
743 int merged_nfds; /* the index of the last */
744 /* file desc we care about.*/
745 int select_fds; /* number of file */
746 /* returned from select */
747 /* descriptors */
748 int return_fds; /* fds count to be returned */
749 /* to the user */
750 int complete_count; /* number of connections on */
751 /* which operations have */
752
753 /* completed */
754
755 /*
756 * figure out highest number file descriptor to worry about
757 */
758 merged_nfds = max(nfds, gdb_mfd); /* the number we control */
759 /* or last one the user */
760 /* supplied, whichevere is */
761 /* higher */
762 /*
763 * Loop waiting for activity to occur and processing it as appropriate.
764 * Note that the order of the tests, calls to select, and gdb_progress
765 * in this code is critical. Think it through before you change it
766 * to make sure that progress is always made when possible, and that
767 * returns are always made when needed.
768 */
769 while (TRUE) {
770 /*
771 * Prepare working copies of the file descriptor maps
772 * based on the ones supplied by the caller, as well as
773 * all the descriptors used by connections. The latter
774 * are mapped in the gdb_c?fds global variables.
775 */
776 g_fd_or_and_copy(nfds,gdb_mfd,readfds,&gdb_crfds,&last_crfds);
777 g_fd_or_and_copy(nfds,gdb_mfd,writefds,&gdb_cwfds,&last_cwfds);
778 g_fd_or_and_copy(nfds,gdb_mfd,exceptfds,&gdb_cefds,&last_cefds);
779 /*
780 * Use select to wait for something to happen. Compute
781 * number select would have returned if connection related
782 * fd's had not been supplied.
783 */
784 select_fds = select(merged_nfds, &last_crfds, &last_cwfds, &last_cefds,
785 timeout);
786 /*
787 * There are some messy things we have to worry about here:
788 *
789 * 1) Select could return an error. In particular, some
790 * versions of Unix will return -1 with EBADF if one
791 * of the sockets has closed. We should call a
792 * procedure here to see if this has happened to one
793 * of ours.
794 *
795 * 2) Other versions of Unix will claim that there is activity
796 * on our socket when in fact the other end is closed.
797 * We will leave it to gdb_move_data to try the select
798 * and make the appropriate decision.
799 *
800 * Yes folks, messy but true. If we got an error (case 1),
801 * then let's see if we get the same error when we're only
802 * looking at the caller's fd's.
803 *
804 */
805 return_fds = 0;
806 if (select_fds < 0)
807 if ( errno != EBADF)
808 return -1;
809 else {
810 g_fd_or_and_copy(nfds,0,readfds,&gdb_crfds,&last_crfds);
811 g_fd_or_and_copy(nfds,0,writefds,&gdb_cwfds,&last_cwfds);
812 g_fd_or_and_copy(nfds,0,exceptfds,&gdb_cefds,&last_cefds);
813 if (select(nfds, &last_crfds, &last_cwfds, &last_cefds,
814 &gdb_notime)<0) {
815 g_fd_copy(nfds, &last_crfds, readfds);
816 g_fd_copy(nfds, &last_cwfds, writefds);
817 g_fd_copy(nfds, &last_cefds, exceptfds);
818 return -1; /* select EBADF */
819 } else {
820 /*
821 * We should close the connection here
822 */
823 GDB_GIVEUP("con_select: EBADF on GDB controlled file.")
824 }
825 }
826 else {
827 return_fds = g_compute_return_fds(select_fds,
828 &last_crfds, &last_cwfds, &last_cefds);
829 }
830 /*
831 * If some connection related descriptors were selected, then
832 * try to make progress on them. Find out if any new operations
833 * could be completed.
834 */
835 if (select_fds != return_fds)
836 complete_count = gdb_fastprogress();
837 else
838 complete_count = 0;
839 /*
840 * Now, based on the number of operations complete,
841 * the number of user file descriptors satisfied, and
842 * the possible return of a timeout from select, decide
843 * whether to return to the caller. Note that timeout
844 * is identified by select_fds == 0.
845 */
846 if (complete_count > 0 || /* operations are complete */
847 return_fds >0 || /* user files satisfied */
848 select_fds ==0) { /* timeout in select */
849 /*
850 * Connection related fd bits are never returned
851 * to the caller. Reset them. The count of bits
852 * was already adjusted appropriately above. I don't
853 * think there's too much wasted effort in this,
854 * but we should watch it if profiling indicates
855 * lots of time being spent computing in con_select.
856 * Put the updated bit masks in the caller supplied
857 * maps.
858 */
859 g_fd_reset_conbits(nfds,gdb_mfd,&last_crfds,&gdb_crfds,
860 readfds);
861 g_fd_reset_conbits(nfds,gdb_mfd,&last_cwfds,&gdb_cwfds,
862 writefds);
863 g_fd_reset_conbits(nfds,gdb_mfd,&last_cefds,&gdb_cefds,
864 exceptfds);
865 if (select_fds ==0)
866 return 0; /* real timeout */
867 if (return_fds ==0) /* something must have */
868 /* completed, but our */
869 /* count looks like a */
870 /* timeout*/
871 return (-2); /* only connections have */
872 /* somethine complete */
873 else
874 return return_fds;
875 }
876 }
877}
This page took 2.182698 seconds and 5 git commands to generate.