Mercurial > ecos
annotate packages/io/fileio/current/src/select.cxx @ 410:064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
call into the POSIX package if it is present, but are null if it
is not.
* src/select.cxx: Renamed original select() to cyg_pselect() and
added select() and pselect() routine from POSIX-200X to call
it. Reorganized code a little and added calls to macros to deal
with signal delivery and detection.
* cdl/fileio.cdl:
* tests/pselect.c: New test added to verify the signal masking and
delivery behaviour of pselect().
* tests/select.c: Fixed up some printfs to make it a little tidier.
| author | nickg |
|---|---|
| date | Mon, 11 Nov 2002 23:58:53 +0000 |
| parents | fc52fa818b5f |
| children | 786e2e6e3c3d |
| rev | line source |
|---|---|
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
1 //========================================================================== |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
2 // |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
3 // select.cxx |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
4 // |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
5 // Fileio select() support |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
6 // |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
7 //========================================================================== |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
174
diff
changeset
|
8 //####ECOSGPLCOPYRIGHTBEGIN#### |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
174
diff
changeset
|
9 // ------------------------------------------- |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
174
diff
changeset
|
10 // This file is part of eCos, the Embedded Configurable Operating System. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
174
diff
changeset
|
11 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. |
|
410
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
12 // Copyright (C) 2002 Nick Garnett |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
174
diff
changeset
|
13 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
174
diff
changeset
|
14 // eCos is free software; you can redistribute it and/or modify it under |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
174
diff
changeset
|
15 // the terms of the GNU General Public License as published by the Free |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
174
diff
changeset
|
16 // Software Foundation; either version 2 or (at your option) any later version. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
174
diff
changeset
|
17 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
174
diff
changeset
|
18 // eCos is distributed in the hope that it will be useful, but WITHOUT ANY |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
174
diff
changeset
|
19 // WARRANTY; without even the implied warranty of MERCHANTABILITY or |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
174
diff
changeset
|
20 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
174
diff
changeset
|
21 // for more details. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
174
diff
changeset
|
22 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
174
diff
changeset
|
23 // You should have received a copy of the GNU General Public License along |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
174
diff
changeset
|
24 // with eCos; if not, write to the Free Software Foundation, Inc., |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
174
diff
changeset
|
25 // 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
174
diff
changeset
|
26 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
174
diff
changeset
|
27 // As a special exception, if other files instantiate templates or use macros |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
174
diff
changeset
|
28 // or inline functions from this file, or you compile this file and link it |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
174
diff
changeset
|
29 // with other works to produce a work based on this file, this file does not |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
174
diff
changeset
|
30 // by itself cause the resulting work to be covered by the GNU General Public |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
174
diff
changeset
|
31 // License. However the source code for this file must still be made available |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
174
diff
changeset
|
32 // in accordance with section (3) of the GNU General Public License. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
174
diff
changeset
|
33 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
174
diff
changeset
|
34 // This exception does not invalidate any other reasons why a work based on |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
174
diff
changeset
|
35 // this file might be covered by the GNU General Public License. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
174
diff
changeset
|
36 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
174
diff
changeset
|
37 // Alternative licenses for eCos may be arranged by contacting Red Hat, Inc. |
|
210
d2c90368aeef
Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents:
208
diff
changeset
|
38 // at http://sources.redhat.com/ecos/ecos-license/ |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
174
diff
changeset
|
39 // ------------------------------------------- |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
174
diff
changeset
|
40 //####ECOSGPLCOPYRIGHTEND#### |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
41 //========================================================================== |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
42 //#####DESCRIPTIONBEGIN#### |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
43 // |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
44 // Author(s): nickg |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
45 // Contributors: nickg |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
46 // Date: 2000-05-25 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
47 // Purpose: Fileio select() support |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
48 // Description: Support for select(). |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
49 // |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
50 // |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
51 // |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
52 // |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
53 //####DESCRIPTIONEND#### |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
54 // |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
55 //========================================================================== |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
56 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
57 #include <pkgconf/hal.h> |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
58 #include <pkgconf/kernel.h> |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
59 #include <pkgconf/io_fileio.h> |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
60 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
61 #include <cyg/kernel/ktypes.h> // base kernel types |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
62 #include <cyg/infra/cyg_trac.h> // tracing macros |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
63 #include <cyg/infra/cyg_ass.h> // assertion macros |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
64 |
|
174
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
128
diff
changeset
|
65 #include <stdarg.h> // for fcntl() |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
66 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
67 #include "fio.h" // Private header |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
68 |
|
174
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
128
diff
changeset
|
69 #include <sys/select.h> // select header |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
128
diff
changeset
|
70 |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
71 #include <cyg/kernel/sched.hxx> // scheduler definitions |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
72 #include <cyg/kernel/thread.hxx> // thread definitions |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
73 #include <cyg/kernel/mutex.hxx> // mutex definitions |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
74 #include <cyg/kernel/clock.hxx> // clock definitions |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
75 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
76 #include <cyg/kernel/sched.inl> |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
77 #include <cyg/kernel/thread.inl> |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
78 #include <cyg/kernel/clock.inl> |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
79 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
80 //========================================================================== |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
81 // File object locking |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
82 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
83 #define LOCK_FILE( fp ) cyg_file_lock( fp ) |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
84 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
85 #define UNLOCK_FILE( fp ) cyg_file_unlock( fp ) |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
86 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
87 //========================================================================== |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
88 // Local variables |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
89 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
90 // Mutex for serializing select processing. This essntially controls |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
91 // access to the contents of the selinfo structures embedded in the |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
92 // client system data structures. |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
174
diff
changeset
|
93 static Cyg_Mutex select_mutex CYGBLD_ATTRIB_INIT_PRI(CYG_INIT_IO_FS); |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
94 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
95 // Condition variable where any thread that is waiting for a select to |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
96 // fire is suspended. Note that select is not intended to be a real time |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
97 // operation. Whenever any selectable event occurs, all selecting threads |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
98 // will be resumed. They must then rescan their selectees and resuspend if |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
99 // necessary. |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
174
diff
changeset
|
100 static Cyg_Condition_Variable selwait( select_mutex ) CYGBLD_ATTRIB_INIT_PRI(CYG_INIT_IO_FS); |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
101 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
102 static volatile cyg_uint32 selwake_count = 0; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
103 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
104 //========================================================================== |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
105 // Timeval to ticks conversion support |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
106 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
107 // Converters from sec and us to ticks |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
108 static struct Cyg_Clock::converter us_converter, sec_converter; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
109 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
110 static cyg_bool converters_initialized = false; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
111 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
112 externC cyg_tick_count cyg_timeval_to_ticks( const struct timeval *tv ) |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
113 { |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
114 if( !converters_initialized ) |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
115 { |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
116 // Create the converters we need. |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
117 Cyg_Clock::real_time_clock->get_other_to_clock_converter( 1000, &us_converter ); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
118 Cyg_Clock::real_time_clock->get_other_to_clock_converter( 1000000000, &sec_converter ); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
119 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
120 converters_initialized = true; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
121 } |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
122 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
123 // Short circuit zero timeval |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
124 if( tv->tv_sec == 0 && tv->tv_usec == 0 ) |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
125 { |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
126 return 0; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
127 } |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
128 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
129 // Convert the seconds field to ticks. |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
130 cyg_tick_count ticks = Cyg_Clock::convert( tv->tv_sec, &sec_converter ); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
131 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
132 // Convert the nanoseconds. This will round down to nearest whole tick. |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
133 ticks += Cyg_Clock::convert( (cyg_tick_count)tv->tv_usec, &us_converter ); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
134 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
135 return ticks; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
136 } |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
137 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
138 //========================================================================== |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
139 // Select API function |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
140 |
|
410
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
141 static int |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
142 cyg_pselect(int nfd, fd_set *in, fd_set *out, fd_set *ex, |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
143 struct timeval *tv, const sigset_t *mask) |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
144 { |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
145 FILEIO_ENTRY(); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
146 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
147 int error = ENOERR; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
148 int fd, mode, num; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
149 cyg_file *fp; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
150 fd_set in_res, out_res, ex_res; // Result sets |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
151 fd_set *selection[3], *result[3]; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
152 cyg_tick_count ticks; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
153 int mode_type[] = {CYG_FREAD, CYG_FWRITE, 0}; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
154 cyg_uint32 wake_count; |
|
410
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
155 sigset_t oldmask; |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
156 |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
157 FD_ZERO(&in_res); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
158 FD_ZERO(&out_res); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
159 FD_ZERO(&ex_res); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
160 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
161 // Set up sets |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
162 selection[0] = in; result[0] = &in_res; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
163 selection[1] = out; result[1] = &out_res; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
164 selection[2] = ex; result[2] = &ex_res; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
165 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
166 // Compute end time |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
167 if (tv) |
|
281
fc52fa818b5f
* src/select.cxx (select): Changed mechanism for calculating
nickg
parents:
210
diff
changeset
|
168 ticks = cyg_timeval_to_ticks( tv ); |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
169 else ticks = 0; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
170 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
171 // Lock the mutex |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
172 select_mutex.lock(); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
173 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
174 // Scan sets for possible I/O until something found, timeout or error. |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
175 while (!error) |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
176 { |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
177 wake_count = selwake_count; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
178 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
179 num = 0; // Total file descriptors "ready" |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
180 for (mode = 0; !error && mode < 3; mode++) |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
181 { |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
182 if (selection[mode]) { |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
183 for (fd = 0; !error && fd < nfd; fd++) |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
184 { |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
185 if (FD_ISSET(fd, selection[mode])) |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
186 { |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
187 fp = cyg_fp_get( fd ); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
188 if( fp == NULL ) |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
189 { |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
190 error = EBADF; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
191 break; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
192 } |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
193 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
194 if ((*fp->f_ops->fo_select)(fp, mode_type[mode], 0)) |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
195 { |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
196 FD_SET(fd, result[mode]); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
197 num++; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
198 } |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
199 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
200 cyg_fp_free( fp ); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
201 } |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
202 } |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
203 } |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
204 } |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
205 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
206 if (num) |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
207 { |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
208 // Found something, update user's sets |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
209 if (in) FD_COPY( &in_res, in ); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
210 if (out) FD_COPY( &out_res, out ); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
211 if (ex) FD_COPY( &ex_res, ex ); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
212 select_mutex.unlock(); |
|
410
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
213 CYG_FILEIO_DELIVER_SIGNALS( mask ); |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
214 FILEIO_RETURN_VALUE(num); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
215 } |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
216 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
217 Cyg_Scheduler::lock(); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
218 |
|
410
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
219 // Switch to the supplied signal mask. This will permit delivery |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
220 // of any signals that might terminate this select operation. |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
221 |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
222 CYG_FILEIO_SIGMASK_SET( mask, &oldmask ); |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
223 |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
224 do |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
225 { |
|
410
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
226 |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
227 // We need to see if any signals have been posted while we |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
228 // were testing all those files. The handlers will not |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
229 // have run because we have ASRs inhibited but the signal |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
230 // will have been set pending. |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
231 |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
232 if( CYG_FILEIO_SIGPENDING() ) |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
233 { |
|
410
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
234 // There are pending signals so we need to terminate |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
235 // the select operation and return EINTR. Handlers for |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
236 // the pending signals will be called just before we |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
237 // return. |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
238 |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
239 error = EINTR; |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
240 break; |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
241 } |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
242 |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
243 if( wake_count == selwake_count ) |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
244 { |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
245 // Nothing found, see if we want to wait |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
246 if (tv) |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
247 { |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
248 // Special case of "poll" |
|
410
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
249 if (ticks == 0) |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
250 { |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
251 error = EAGAIN; |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
252 break; |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
253 } |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
254 |
|
410
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
255 ticks += Cyg_Clock::real_time_clock->current_value(); |
|
281
fc52fa818b5f
* src/select.cxx (select): Changed mechanism for calculating
nickg
parents:
210
diff
changeset
|
256 |
|
410
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
257 if( !selwait.wait( ticks ) ) |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
258 { |
|
410
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
259 // A non-standard wakeup, if the current time is equal to |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
260 // or past the timeout, return zero. Otherwise return |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
261 // EINTR, since we have been released. |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
262 |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
263 if( Cyg_Clock::real_time_clock->current_value() >= ticks ) |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
264 { |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
265 error = EAGAIN; |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
266 break; |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
267 } |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
268 else error = EINTR; |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
269 } |
|
410
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
270 |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
271 ticks -= Cyg_Clock::real_time_clock->current_value(); |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
272 } |
|
410
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
273 else |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
274 { |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
275 // Wait forever (until something happens) |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
276 |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
277 if( !selwait.wait() ) |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
278 error = EINTR; |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
279 } |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
280 } |
|
410
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
281 |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
282 } while(0); |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
283 |
|
410
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
284 CYG_FILEIO_SIGMASK_SET( &oldmask, NULL ); |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
285 |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
286 Cyg_Scheduler::unlock(); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
287 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
288 } // while(!error) |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
289 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
290 select_mutex.unlock(); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
291 |
|
410
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
292 // If the error code is EAGAIN, this means that a timeout has |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
293 // happened. We return zero in that case, rather than a proper |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
294 // error code. |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
295 // If the error code is EINTR, then a signal may be pending |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
296 // delivery. Call back into the POSIX package to handle it. |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
297 |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
298 if( error == EAGAIN ) |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
299 FILEIO_RETURN_VALUE(0); |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
300 else if( error == EINTR ) |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
301 CYG_FILEIO_DELIVER_SIGNALS( mask ); |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
302 |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
303 FILEIO_RETURN(error); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
304 } |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
305 |
|
410
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
306 // ------------------------------------------------------------------------- |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
307 // Select API function |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
308 |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
309 __externC int |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
310 select(int nfd, fd_set *in, fd_set *out, fd_set *ex, struct timeval *tv) |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
311 { |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
312 return cyg_pselect(nfd, in, out, ex, tv, NULL); |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
313 } |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
314 |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
315 // ------------------------------------------------------------------------- |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
316 // Pselect API function |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
317 // |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
318 // This is derived from the POSIX-200X specification. |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
319 |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
320 #ifdef CYGPKG_POSIX |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
321 |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
322 __externC int |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
323 pselect(int nfd, fd_set *in, fd_set *out, fd_set *ex, |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
324 const struct timespec *ts, const sigset_t *sigmask) |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
325 { |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
326 struct timeval tv; |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
327 |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
328 if (ts != NULL) |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
329 { |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
330 tv.tv_sec = ts->tv_sec; |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
331 tv.tv_usec = ts->tv_nsec/1000; |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
332 } |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
333 |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
334 return cyg_pselect(nfd, in, out, ex, &tv, sigmask); |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
335 } |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
336 |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
337 #endif |
|
064536ee7f68
* src/fio.h: Added macros to deal with signal handling. These will
nickg
parents:
281
diff
changeset
|
338 |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
339 //========================================================================== |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
340 // Select support functions. |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
341 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
342 // ------------------------------------------------------------------------- |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
343 // cyg_selinit() is used to initialize a selinfo structure |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
344 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
345 void cyg_selinit( struct CYG_SELINFO_TAG *sip ) |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
346 { |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
347 sip->si_info = 0; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
348 sip->si_thread = 0; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
349 } |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
350 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
351 // ------------------------------------------------------------------------- |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
352 // cyg_selrecord() is called when a client device needs to register |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
353 // the current thread for selection. |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
354 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
355 void cyg_selrecord( CYG_ADDRWORD info, struct CYG_SELINFO_TAG *sip ) |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
356 { |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
357 sip->si_info = info; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
358 sip->si_thread = (CYG_ADDRESS)Cyg_Thread::self(); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
359 } |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
360 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
361 // ------------------------------------------------------------------------- |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
362 // cyg_selwakeup() is called when the client device matches the select |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
363 // criterion, and needs to wake up a selector. |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
364 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
365 void cyg_selwakeup( struct CYG_SELINFO_TAG *sip ) |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
366 { |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
367 // We don't actually use the si_info field of selinfo at present. |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
368 // A potential use would be to select one of several selwait condition |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
369 // variables to signal. However, that would only be necessary if we |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
370 // end up having lots of threads in select. |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
371 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
372 Cyg_Scheduler::lock(); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
373 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
374 if( sip->si_thread != 0 ) |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
375 { |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
376 // If the thread pointer is still present, this selection has |
|
128
0c2b7be0d798
Merge from eCos master repository on 2000-10-12-08:46:24-BST
jlarmour
parents:
126
diff
changeset
|
377 // not been fired before. We just wake up all threads waiting, |
|
0c2b7be0d798
Merge from eCos master repository on 2000-10-12-08:46:24-BST
jlarmour
parents:
126
diff
changeset
|
378 // regardless of whether they are waiting for this event or |
|
0c2b7be0d798
Merge from eCos master repository on 2000-10-12-08:46:24-BST
jlarmour
parents:
126
diff
changeset
|
379 // not. This avoids any race conditions, and is consistent |
|
0c2b7be0d798
Merge from eCos master repository on 2000-10-12-08:46:24-BST
jlarmour
parents:
126
diff
changeset
|
380 // with the behaviour of the BSD kernel. |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
381 |
|
128
0c2b7be0d798
Merge from eCos master repository on 2000-10-12-08:46:24-BST
jlarmour
parents:
126
diff
changeset
|
382 sip->si_thread = 0; |
|
0c2b7be0d798
Merge from eCos master repository on 2000-10-12-08:46:24-BST
jlarmour
parents:
126
diff
changeset
|
383 selwait.broadcast(); |
|
0c2b7be0d798
Merge from eCos master repository on 2000-10-12-08:46:24-BST
jlarmour
parents:
126
diff
changeset
|
384 selwake_count++; |
|
0c2b7be0d798
Merge from eCos master repository on 2000-10-12-08:46:24-BST
jlarmour
parents:
126
diff
changeset
|
385 |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
386 } |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
387 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
388 Cyg_Scheduler::unlock(); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
389 } |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
390 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
391 // ------------------------------------------------------------------------- |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
392 // EOF select.cxx |
