annotate packages/io/fileio/current/src/select.cxx @ 3292:7f8e529b4d82 default tip

Fix FREESCALE_EDMA_NBYTES_MLOFFYES_MLOFF() so it works with negative offsets.
author vae
date Wed, 29 Apr 2015 23:31:48 +0000
parents 74dbf4c3f2e1
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 //==========================================================================
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2086
diff changeset
8 // ####ECOSGPLCOPYRIGHTBEGIN####
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2086
diff changeset
9 // -------------------------------------------
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2086
diff changeset
10 // This file is part of eCos, the Embedded Configurable Operating System.
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2086
diff changeset
11 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 174
diff changeset
12 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2086
diff changeset
13 // eCos is free software; you can redistribute it and/or modify it under
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2086
diff changeset
14 // the terms of the GNU General Public License as published by the Free
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2086
diff changeset
15 // Software Foundation; either version 2 or (at your option) any later
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2086
diff changeset
16 // version.
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 174
diff changeset
17 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2086
diff changeset
18 // eCos is distributed in the hope that it will be useful, but WITHOUT
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2086
diff changeset
19 // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2086
diff changeset
20 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2086
diff changeset
21 // for more details.
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 174
diff changeset
22 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2086
diff changeset
23 // You should have received a copy of the GNU General Public License
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2086
diff changeset
24 // along with eCos; if not, write to the Free Software Foundation, Inc.,
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2086
diff changeset
25 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 174
diff changeset
26 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2086
diff changeset
27 // As a special exception, if other files instantiate templates or use
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2086
diff changeset
28 // macros or inline functions from this file, or you compile this file
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2086
diff changeset
29 // and link it with other works to produce a work based on this file,
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2086
diff changeset
30 // this file does not by itself cause the resulting work to be covered by
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2086
diff changeset
31 // the GNU General Public License. However the source code for this file
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2086
diff changeset
32 // must still be made available in accordance with section (3) of the GNU
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2086
diff changeset
33 // General Public License v2.
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 174
diff changeset
34 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2086
diff changeset
35 // This exception does not invalidate any other reasons why a work based
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2086
diff changeset
36 // on this file might be covered by the GNU General Public License.
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2086
diff changeset
37 // -------------------------------------------
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2086
diff changeset
38 // ####ECOSGPLCOPYRIGHTEND####
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
39 //==========================================================================
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
40 //#####DESCRIPTIONBEGIN####
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 // Author(s): nickg
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
43 // Contributors: nickg
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
44 // Date: 2000-05-25
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
45 // Purpose: Fileio select() support
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
46 // Description: Support for select().
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
47 //
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
48 //
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 //####DESCRIPTIONEND####
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 //==========================================================================
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 #include <pkgconf/hal.h>
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
56 #include <pkgconf/kernel.h>
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
57 #include <pkgconf/io_fileio.h>
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
58
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
59 #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
60 #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
61 #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
62
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 128
diff changeset
63 #include <stdarg.h> // for fcntl()
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
64
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
65 #include "fio.h" // Private header
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
66
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 128
diff changeset
67 #include <sys/select.h> // select header
2086
7a7813d1e957 * src/select.cxx: Needs sys/time.h for struct timeval.
asl
parents: 1864
diff changeset
68 #include <sys/time.h>
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 128
diff changeset
69
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
70 #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
71 #include <cyg/kernel/thread.hxx> // thread definitions
1853
abab6e075ce3 * include/fileio.h: Changed si_thread to si_waitFlag
asl
parents: 1782
diff changeset
72 #include <cyg/kernel/flag.hxx> // flag definitions
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
73 #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
74
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
75 #include <cyg/kernel/sched.inl>
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
76 #include <cyg/kernel/thread.inl>
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
77 #include <cyg/kernel/clock.inl>
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
78
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 // File object locking
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
81
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
82 #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
83
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
84 #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
85
1853
abab6e075ce3 * include/fileio.h: Changed si_thread to si_waitFlag
asl
parents: 1782
diff changeset
86 // Get a flag based on the thread's unique ID. Note: In a system with a large
abab6e075ce3 * include/fileio.h: Changed si_thread to si_waitFlag
asl
parents: 1782
diff changeset
87 // number of threads, the same flag may be used by more than one thread.
abab6e075ce3 * include/fileio.h: Changed si_thread to si_waitFlag
asl
parents: 1782
diff changeset
88 #define SELECT_WAIT_FLAG_GET() (1 << (Cyg_Thread::self()->get_unique_id() \
abab6e075ce3 * include/fileio.h: Changed si_thread to si_waitFlag
asl
parents: 1782
diff changeset
89 & (sizeof (Cyg_FlagValue) * NBBY - 1)))
abab6e075ce3 * include/fileio.h: Changed si_thread to si_waitFlag
asl
parents: 1782
diff changeset
90
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
91 //==========================================================================
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
92 // Local variables
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
93
1853
abab6e075ce3 * include/fileio.h: Changed si_thread to si_waitFlag
asl
parents: 1782
diff changeset
94 static volatile cyg_uint32 selwake_count = 0;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
95
1853
abab6e075ce3 * include/fileio.h: Changed si_thread to si_waitFlag
asl
parents: 1782
diff changeset
96 // A flag is used to block a thread until data from the device is available. This
abab6e075ce3 * include/fileio.h: Changed si_thread to si_waitFlag
asl
parents: 1782
diff changeset
97 // prevents all threads from waking up at the same time and polling for changes.
abab6e075ce3 * include/fileio.h: Changed si_thread to si_waitFlag
asl
parents: 1782
diff changeset
98 // Each thread is allocated a flag bit via the SELECT_WAIT_FLAG_GET() macro when
abab6e075ce3 * include/fileio.h: Changed si_thread to si_waitFlag
asl
parents: 1782
diff changeset
99 // the thread registers for selection via cyg_selrecord (). The flag is stored in
abab6e075ce3 * include/fileio.h: Changed si_thread to si_waitFlag
asl
parents: 1782
diff changeset
100 // the driver's select info block. Only those threads specified via the flags in
abab6e075ce3 * include/fileio.h: Changed si_thread to si_waitFlag
asl
parents: 1782
diff changeset
101 // the select info are woken up by cyg_selwakeup ().
abab6e075ce3 * include/fileio.h: Changed si_thread to si_waitFlag
asl
parents: 1782
diff changeset
102 // If there are more than 32 threads in the system, then there is a chance that
abab6e075ce3 * include/fileio.h: Changed si_thread to si_waitFlag
asl
parents: 1782
diff changeset
103 // cyg_selwakeup () may wake up more than one thread. Each thread then polls for
abab6e075ce3 * include/fileio.h: Changed si_thread to si_waitFlag
asl
parents: 1782
diff changeset
104 // changes.
abab6e075ce3 * include/fileio.h: Changed si_thread to si_waitFlag
asl
parents: 1782
diff changeset
105 static Cyg_Flag select_flag 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
106
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
107 //==========================================================================
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
108 // Timeval to ticks conversion support
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 // 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
111 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
112
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
113 static cyg_bool converters_initialized = false;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
114
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
115 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
116 {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
117 if( !converters_initialized )
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
118 {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
119 // Create the converters we need.
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
120 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
121 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
122
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
123 converters_initialized = true;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
124 }
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 // Short circuit zero timeval
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
127 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
128 {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
129 return 0;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
130 }
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 seconds field to ticks.
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
133 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
134
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
135 // 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
136 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
137
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
138 return ticks;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
139 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
140
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
141 //==========================================================================
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
142 // Select API function
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
143
410
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
144 static int
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
145 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
146 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
147 {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
148 FILEIO_ENTRY();
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
149
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
150 int error = ENOERR;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
151 int fd, mode, num;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
152 cyg_file *fp;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
153 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
154 fd_set *selection[3], *result[3];
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
155 cyg_tick_count ticks;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
156 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
157 cyg_uint32 wake_count;
410
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
158 sigset_t oldmask;
1864
6c587ae20117 * src/select.cxx (cyg_pselect): We need the oldmask under all
asl
parents: 1853
diff changeset
159
1853
abab6e075ce3 * include/fileio.h: Changed si_thread to si_waitFlag
asl
parents: 1782
diff changeset
160 Cyg_FlagValue myFlag = SELECT_WAIT_FLAG_GET ();
abab6e075ce3 * include/fileio.h: Changed si_thread to si_waitFlag
asl
parents: 1782
diff changeset
161 int maxFdIndex = __howmany(nfd, __NFDBITS); // size of fd sets
abab6e075ce3 * include/fileio.h: Changed si_thread to si_waitFlag
asl
parents: 1782
diff changeset
162
abab6e075ce3 * include/fileio.h: Changed si_thread to si_waitFlag
asl
parents: 1782
diff changeset
163 // Make sure the nfd < FD_SETSIZE, a value greater than FD_SETSIZE
abab6e075ce3 * include/fileio.h: Changed si_thread to si_waitFlag
asl
parents: 1782
diff changeset
164 // would break the results sets
abab6e075ce3 * include/fileio.h: Changed si_thread to si_waitFlag
asl
parents: 1782
diff changeset
165 if(nfd > FD_SETSIZE)
abab6e075ce3 * include/fileio.h: Changed si_thread to si_waitFlag
asl
parents: 1782
diff changeset
166 {
abab6e075ce3 * include/fileio.h: Changed si_thread to si_waitFlag
asl
parents: 1782
diff changeset
167 FILEIO_RETURN(EINVAL);
abab6e075ce3 * include/fileio.h: Changed si_thread to si_waitFlag
asl
parents: 1782
diff changeset
168 }
410
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
169
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
170 FD_ZERO(&in_res);
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
171 FD_ZERO(&out_res);
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
172 FD_ZERO(&ex_res);
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 // Set up sets
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
175 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
176 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
177 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
178
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
179 // Compute end time
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
180 if (tv)
281
fc52fa818b5f * src/select.cxx (select): Changed mechanism for calculating
nickg
parents: 210
diff changeset
181 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
182 else ticks = 0;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
183
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
184 // 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
185 while (!error)
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 wake_count = selwake_count;
1853
abab6e075ce3 * include/fileio.h: Changed si_thread to si_waitFlag
asl
parents: 1782
diff changeset
188
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
189 num = 0; // Total file descriptors "ready"
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
190 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
191 {
1853
abab6e075ce3 * include/fileio.h: Changed si_thread to si_waitFlag
asl
parents: 1782
diff changeset
192 if (selection[mode])
abab6e075ce3 * include/fileio.h: Changed si_thread to si_waitFlag
asl
parents: 1782
diff changeset
193 {
abab6e075ce3 * include/fileio.h: Changed si_thread to si_waitFlag
asl
parents: 1782
diff changeset
194 fd_mask *fds_bits = selection[mode]->fds_bits;
abab6e075ce3 * include/fileio.h: Changed si_thread to si_waitFlag
asl
parents: 1782
diff changeset
195 int index, fdbase;
abab6e075ce3 * include/fileio.h: Changed si_thread to si_waitFlag
asl
parents: 1782
diff changeset
196 for(index = 0, fdbase = 0; !error && index < maxFdIndex; index++, fdbase += __NFDBITS)
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
197 {
1853
abab6e075ce3 * include/fileio.h: Changed si_thread to si_waitFlag
asl
parents: 1782
diff changeset
198 fd_mask mask = fds_bits[index];
abab6e075ce3 * include/fileio.h: Changed si_thread to si_waitFlag
asl
parents: 1782
diff changeset
199 for(fd = fdbase; mask != 0; fd++, mask >>= 1)
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
200 {
1853
abab6e075ce3 * include/fileio.h: Changed si_thread to si_waitFlag
asl
parents: 1782
diff changeset
201 if(mask & 1)
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
202 {
1853
abab6e075ce3 * include/fileio.h: Changed si_thread to si_waitFlag
asl
parents: 1782
diff changeset
203 fp = cyg_fp_get( fd );
abab6e075ce3 * include/fileio.h: Changed si_thread to si_waitFlag
asl
parents: 1782
diff changeset
204 if( fp == NULL )
abab6e075ce3 * include/fileio.h: Changed si_thread to si_waitFlag
asl
parents: 1782
diff changeset
205 {
abab6e075ce3 * include/fileio.h: Changed si_thread to si_waitFlag
asl
parents: 1782
diff changeset
206 error = EBADF;
abab6e075ce3 * include/fileio.h: Changed si_thread to si_waitFlag
asl
parents: 1782
diff changeset
207 break;
abab6e075ce3 * include/fileio.h: Changed si_thread to si_waitFlag
asl
parents: 1782
diff changeset
208 }
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
209
1853
abab6e075ce3 * include/fileio.h: Changed si_thread to si_waitFlag
asl
parents: 1782
diff changeset
210 if ((*fp->f_ops->fo_select)(fp, mode_type[mode], 0))
abab6e075ce3 * include/fileio.h: Changed si_thread to si_waitFlag
asl
parents: 1782
diff changeset
211 {
abab6e075ce3 * include/fileio.h: Changed si_thread to si_waitFlag
asl
parents: 1782
diff changeset
212 FD_SET(fd, result[mode]);
abab6e075ce3 * include/fileio.h: Changed si_thread to si_waitFlag
asl
parents: 1782
diff changeset
213 num++;
abab6e075ce3 * include/fileio.h: Changed si_thread to si_waitFlag
asl
parents: 1782
diff changeset
214 }
abab6e075ce3 * include/fileio.h: Changed si_thread to si_waitFlag
asl
parents: 1782
diff changeset
215 cyg_fp_free( fp );
115
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 }
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 }
1697
4a515225541b 2004-07-23 Oyvind Harboe <oyvind.harboe@zylin.com>
nickg
parents: 1461
diff changeset
221
1853
abab6e075ce3 * include/fileio.h: Changed si_thread to si_waitFlag
asl
parents: 1782
diff changeset
222 if (error)
1697
4a515225541b 2004-07-23 Oyvind Harboe <oyvind.harboe@zylin.com>
nickg
parents: 1461
diff changeset
223 break;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
224
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
225 if (num)
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
226 {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
227 // Found something, update user's sets
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
228 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
229 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
230 if (ex) FD_COPY( &ex_res, ex );
410
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
231 CYG_FILEIO_DELIVER_SIGNALS( mask );
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
232 FILEIO_RETURN_VALUE(num);
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
233 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
234
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
235 Cyg_Scheduler::lock();
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 // 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
238 // 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
239
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
240 CYG_FILEIO_SIGMASK_SET( mask, &oldmask );
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 do
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
243 {
410
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 // 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
246 // 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
247 // 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
248 // will have been set pending.
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
249
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
250 if( CYG_FILEIO_SIGPENDING() )
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
251 {
410
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
252 // 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
253 // 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
254 // 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
255 // return.
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
256
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
257 error = EINTR;
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
258 break;
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
259 }
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
260
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
261 if( wake_count == selwake_count )
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 // 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
264 if (tv)
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
265 {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
266 // Special case of "poll"
410
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
267 if (ticks == 0)
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
268 {
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
269 error = EAGAIN;
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
270 break;
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
271 }
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 ticks += Cyg_Clock::real_time_clock->current_value();
281
fc52fa818b5f * src/select.cxx (select): Changed mechanism for calculating
nickg
parents: 210
diff changeset
274
1853
abab6e075ce3 * include/fileio.h: Changed si_thread to si_waitFlag
asl
parents: 1782
diff changeset
275 if( !select_flag.wait (myFlag, Cyg_Flag::OR, ticks) )
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
276 {
410
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
277 // 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
278 // 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
279 // EINTR, since we have been released.
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
280
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
281 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
282 {
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
283 error = EAGAIN;
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
284 break;
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
285 }
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
286 else error = EINTR;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
287 }
410
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
288
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
289 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
290 }
410
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
291 else
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
292 {
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
293 // Wait forever (until something happens)
1853
abab6e075ce3 * include/fileio.h: Changed si_thread to si_waitFlag
asl
parents: 1782
diff changeset
294 if( !select_flag.wait (myFlag, Cyg_Flag::OR) )
410
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
295 error = EINTR;
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
296 }
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
297 }
410
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
298
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
299 } while(0);
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
300
410
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
301 CYG_FILEIO_SIGMASK_SET( &oldmask, NULL );
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 Cyg_Scheduler::unlock();
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 } // while(!error)
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
306
410
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
307 // 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
308 // 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
309 // error code.
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
310 // 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
311 // 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
312
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
313 if( error == EAGAIN )
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
314 FILEIO_RETURN_VALUE(0);
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
315 else if( error == EINTR )
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
316 CYG_FILEIO_DELIVER_SIGNALS( mask );
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
317
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
318 FILEIO_RETURN(error);
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
319 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
320
410
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 // Select API function
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
323
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
324 __externC int
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
325 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
326 {
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
327 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
328 }
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 // -------------------------------------------------------------------------
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
331 // Pselect API function
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 // 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
334
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
335 __externC int
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
336 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
337 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
338 {
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
339 struct timeval tv;
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
340
1461
244c4e8297c2 * src/select.cxx: No need to make pselect() dependent on
jlarmour
parents: 1416
diff changeset
341 #ifndef CYGPKG_POSIX_SIGNALS
244c4e8297c2 * src/select.cxx: No need to make pselect() dependent on
jlarmour
parents: 1416
diff changeset
342 CYG_ASSERT( sigmask == NULL,
244c4e8297c2 * src/select.cxx: No need to make pselect() dependent on
jlarmour
parents: 1416
diff changeset
343 "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
344 );
244c4e8297c2 * src/select.cxx: No need to make pselect() dependent on
jlarmour
parents: 1416
diff changeset
345 #endif
244c4e8297c2 * src/select.cxx: No need to make pselect() dependent on
jlarmour
parents: 1416
diff changeset
346
410
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
347 if (ts != NULL)
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
348 {
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
349 tv.tv_sec = ts->tv_sec;
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
350 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
351 }
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
352
1416
786e2e6e3c3d * src/select.cxx (pselect): Fixed the pselect() call to correctly
asl
parents: 410
diff changeset
353 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
354 }
064536ee7f68 * src/fio.h: Added macros to deal with signal handling. These will
nickg
parents: 281
diff changeset
355
115
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 // Select support functions.
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
358
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 // 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
361
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
362 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
363 {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
364 sip->si_info = 0;
1853
abab6e075ce3 * include/fileio.h: Changed si_thread to si_waitFlag
asl
parents: 1782
diff changeset
365 sip->si_waitFlag = 0;
115
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
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
368 // -------------------------------------------------------------------------
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
369 // cyg_selrecord() is called when a client device needs to register
1853
abab6e075ce3 * include/fileio.h: Changed si_thread to si_waitFlag
asl
parents: 1782
diff changeset
370 // the current thread for selection. Save the flag that identifies the thread.
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
371 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
372 {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
373 sip->si_info = info;
1853
abab6e075ce3 * include/fileio.h: Changed si_thread to si_waitFlag
asl
parents: 1782
diff changeset
374 Cyg_Scheduler::lock();
abab6e075ce3 * include/fileio.h: Changed si_thread to si_waitFlag
asl
parents: 1782
diff changeset
375 sip->si_waitFlag |= SELECT_WAIT_FLAG_GET ();
abab6e075ce3 * include/fileio.h: Changed si_thread to si_waitFlag
asl
parents: 1782
diff changeset
376 Cyg_Scheduler::unlock();
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
377 }
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 // -------------------------------------------------------------------------
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
380 // cyg_selwakeup() is called when the client device matches the select
1853
abab6e075ce3 * include/fileio.h: Changed si_thread to si_waitFlag
asl
parents: 1782
diff changeset
381 // criterion, and needs to wake up a thread.
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
382 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
383 {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
384 // 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
385 Cyg_Scheduler::lock();
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
386
1853
abab6e075ce3 * include/fileio.h: Changed si_thread to si_waitFlag
asl
parents: 1782
diff changeset
387 if( sip->si_waitFlag != 0 )
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
388 {
1853
abab6e075ce3 * include/fileio.h: Changed si_thread to si_waitFlag
asl
parents: 1782
diff changeset
389 // If the flag is still present, this selection has not fired before.
abab6e075ce3 * include/fileio.h: Changed si_thread to si_waitFlag
asl
parents: 1782
diff changeset
390 // Only wake up the threads waiting on the flags specified in si_waitFlag.
abab6e075ce3 * include/fileio.h: Changed si_thread to si_waitFlag
asl
parents: 1782
diff changeset
391 // There is no need to wake threads that are not waiting for this data.
abab6e075ce3 * include/fileio.h: Changed si_thread to si_waitFlag
asl
parents: 1782
diff changeset
392 select_flag.setbits (sip->si_waitFlag);
abab6e075ce3 * include/fileio.h: Changed si_thread to si_waitFlag
asl
parents: 1782
diff changeset
393 sip->si_waitFlag = 0; // clear all flags
abab6e075ce3 * include/fileio.h: Changed si_thread to si_waitFlag
asl
parents: 1782
diff changeset
394 select_flag.maskbits (sip->si_waitFlag);
128
0c2b7be0d798 Merge from eCos master repository on 2000-10-12-08:46:24-BST
jlarmour
parents: 126
diff changeset
395 selwake_count++;
115
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 Cyg_Scheduler::unlock();
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
398 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
399
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
400 // -------------------------------------------------------------------------
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff changeset
401 // EOF select.cxx