annotate packages/io/fileio/current/src/select.cxx @ 1777:c16341b1bac6 default tip

* Added execute permissions to files missed in conversion from CVS
author alexs
date Mon, 12 Oct 2009 02:26:09 +0100
parents 4a515225541b
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 }
1697
4a515225541b 2004-07-23 Oyvind Harboe <oyvind.harboe@zylin.com>
nickg
parents: 1461
diff changeset
205
4a515225541b 2004-07-23 Oyvind Harboe <oyvind.harboe@zylin.com>
nickg
parents: 1461
diff changeset
206 if( error )
4a515225541b 2004-07-23 Oyvind Harboe <oyvind.harboe@zylin.com>
nickg
parents: 1461
diff changeset
207 break;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
208
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
209 if (num)
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
210 {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
211 // Found something, update user's sets
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
212 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
213 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
214 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
215 select_mutex.unlock();
410
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
216 CYG_FILEIO_DELIVER_SIGNALS( mask );
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
217 FILEIO_RETURN_VALUE(num);
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
218 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
219
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
220 Cyg_Scheduler::lock();
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
221
410
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
222 // 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
223 // 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
224
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
225 CYG_FILEIO_SIGMASK_SET( mask, &oldmask );
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 do
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
228 {
410
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
229
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
230 // 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
231 // 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
232 // 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
233 // will have been set pending.
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
234
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
235 if( CYG_FILEIO_SIGPENDING() )
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
236 {
410
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
237 // 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
238 // 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
239 // 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
240 // return.
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 error = EINTR;
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
243 break;
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
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
246 if( wake_count == selwake_count )
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
247 {
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
248 // 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
249 if (tv)
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
250 {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
251 // Special case of "poll"
410
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
252 if (ticks == 0)
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
253 {
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
254 error = EAGAIN;
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
255 break;
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
256 }
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
257
410
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
258 ticks += Cyg_Clock::real_time_clock->current_value();
281
fc52fa818b5f * src/select.cxx (select): Changed mechanism for calculating
nickg
parents: 210
diff changeset
259
410
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
260 if( !selwait.wait( ticks ) )
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
261 {
410
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
262 // 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
263 // 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
264 // EINTR, since we have been released.
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
265
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
266 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
267 {
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
268 error = EAGAIN;
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
269 break;
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 else error = EINTR;
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
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
274 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
275 }
410
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
276 else
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
277 {
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
278 // Wait forever (until something happens)
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
279
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
280 if( !selwait.wait() )
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
281 error = EINTR;
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
282 }
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
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
285 } while(0);
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
286
410
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
287 CYG_FILEIO_SIGMASK_SET( &oldmask, NULL );
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
288
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
289 Cyg_Scheduler::unlock();
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
290
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
291 } // while(!error)
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
292
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
293 select_mutex.unlock();
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
294
410
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
295 // 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
296 // 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
297 // error code.
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
298 // 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
299 // 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
300
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
301 if( error == EAGAIN )
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
302 FILEIO_RETURN_VALUE(0);
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
303 else if( error == EINTR )
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
304 CYG_FILEIO_DELIVER_SIGNALS( mask );
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
305
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
306 FILEIO_RETURN(error);
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
307 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
308
410
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
309 // -------------------------------------------------------------------------
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
310 // Select API function
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 __externC int
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
313 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
314 {
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
315 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
316 }
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 // -------------------------------------------------------------------------
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
319 // Pselect API function
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
320 //
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
321 // 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
322
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
323 __externC int
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
324 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
325 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
326 {
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
327 struct timeval tv;
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
328
1461
244c4e8297c2 * src/select.cxx: No need to make pselect() dependent on
jlarmour
parents: 1416
diff changeset
329 #ifndef CYGPKG_POSIX_SIGNALS
244c4e8297c2 * src/select.cxx: No need to make pselect() dependent on
jlarmour
parents: 1416
diff changeset
330 CYG_ASSERT( sigmask == NULL,
244c4e8297c2 * src/select.cxx: No need to make pselect() dependent on
jlarmour
parents: 1416
diff changeset
331 "pselect called with non-null sigmask without POSIX signal support"
244c4e8297c2 * src/select.cxx: No need to make pselect() dependent on
jlarmour
parents: 1416
diff changeset
332 );
244c4e8297c2 * src/select.cxx: No need to make pselect() dependent on
jlarmour
parents: 1416
diff changeset
333 #endif
244c4e8297c2 * src/select.cxx: No need to make pselect() dependent on
jlarmour
parents: 1416
diff changeset
334
410
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
335 if (ts != NULL)
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 tv.tv_sec = ts->tv_sec;
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
338 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
339 }
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
340
1416
786e2e6e3c3d * src/select.cxx (pselect): Fixed the pselect() call to correctly
asl
parents: 410
diff changeset
341 return cyg_pselect(nfd, in, out, ex, ts ? &tv : NULL, sigmask);
410
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
342 }
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
343
115
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 // Select support functions.
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 // -------------------------------------------------------------------------
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
348 // 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
349
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
350 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
351 {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
352 sip->si_info = 0;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
353 sip->si_thread = 0;
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
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 // 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
358 // the current thread for selection.
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 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
361 {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
362 sip->si_info = info;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
363 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
364 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
365
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 // 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
368 // 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
369
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
370 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
371 {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
372 // 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
373 // 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
374 // 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
375 // 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
376
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
377 Cyg_Scheduler::lock();
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
378
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
379 if( sip->si_thread != 0 )
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
380 {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
381 // 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
382 // 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
383 // 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
384 // 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
385 // 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
386
128
0c2b7be0d798 Merge from eCos master repository on 2000-10-12-08:46:24-BST
jlarmour
parents: 126
diff changeset
387 sip->si_thread = 0;
0c2b7be0d798 Merge from eCos master repository on 2000-10-12-08:46:24-BST
jlarmour
parents: 126
diff changeset
388 selwait.broadcast();
0c2b7be0d798 Merge from eCos master repository on 2000-10-12-08:46:24-BST
jlarmour
parents: 126
diff changeset
389 selwake_count++;
0c2b7be0d798 Merge from eCos master repository on 2000-10-12-08:46:24-BST
jlarmour
parents: 126
diff changeset
390
115
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
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
393 Cyg_Scheduler::unlock();
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
394 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
395
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
396 // -------------------------------------------------------------------------
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
397 // EOF select.cxx