Mercurial > ecos
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 |
| 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 | 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 | 86 // Get a flag based on the thread's unique ID. Note: In a system with a large |
| 87 // number of threads, the same flag may be used by more than one thread. | |
| 88 #define SELECT_WAIT_FLAG_GET() (1 << (Cyg_Thread::self()->get_unique_id() \ | |
| 89 & (sizeof (Cyg_FlagValue) * NBBY - 1))) | |
| 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 | 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 | 96 // A flag is used to block a thread until data from the device is available. This |
| 97 // prevents all threads from waking up at the same time and polling for changes. | |
| 98 // Each thread is allocated a flag bit via the SELECT_WAIT_FLAG_GET() macro when | |
| 99 // the thread registers for selection via cyg_selrecord (). The flag is stored in | |
| 100 // the driver's select info block. Only those threads specified via the flags in | |
| 101 // the select info are woken up by cyg_selwakeup (). | |
| 102 // If there are more than 32 threads in the system, then there is a chance that | |
| 103 // cyg_selwakeup () may wake up more than one thread. Each thread then polls for | |
| 104 // changes. | |
| 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 | 160 Cyg_FlagValue myFlag = SELECT_WAIT_FLAG_GET (); |
| 161 int maxFdIndex = __howmany(nfd, __NFDBITS); // size of fd sets | |
| 162 | |
| 163 // Make sure the nfd < FD_SETSIZE, a value greater than FD_SETSIZE | |
| 164 // would break the results sets | |
| 165 if(nfd > FD_SETSIZE) | |
| 166 { | |
| 167 FILEIO_RETURN(EINVAL); | |
| 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 | 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 | 192 if (selection[mode]) |
| 193 { | |
| 194 fd_mask *fds_bits = selection[mode]->fds_bits; | |
| 195 int index, fdbase; | |
| 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 | 198 fd_mask mask = fds_bits[index]; |
| 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 | 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 | 203 fp = cyg_fp_get( fd ); |
| 204 if( fp == NULL ) | |
| 205 { | |
| 206 error = EBADF; | |
| 207 break; | |
| 208 } | |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
diff
changeset
|
209 |
| 1853 | 210 if ((*fp->f_ops->fo_select)(fp, mode_type[mode], 0)) |
| 211 { | |
| 212 FD_SET(fd, result[mode]); | |
| 213 num++; | |
| 214 } | |
| 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 | 221 |
| 1853 | 222 if (error) |
| 1697 | 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 | 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 | 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 | 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 | 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 | 374 Cyg_Scheduler::lock(); |
| 375 sip->si_waitFlag |= SELECT_WAIT_FLAG_GET (); | |
| 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 | 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 | 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 | 389 // If the flag is still present, this selection has not fired before. |
| 390 // Only wake up the threads waiting on the flags specified in si_waitFlag. | |
| 391 // There is no need to wake threads that are not waiting for this data. | |
| 392 select_flag.setbits (sip->si_waitFlag); | |
| 393 sip->si_waitFlag = 0; // clear all flags | |
| 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 |
