µOS++ IIIe Reference 7.0.0
The third edition of µOS++, a POSIX inspired open source framework, written in C++
Loading...
Searching...
No Matches
os::posix::file_descriptors_manager Class Reference

File descriptors manager static class.<cmsis-plus/posix-io/file-descriptors-manager.h> More...

#include <file-descriptors-manager.h>

Public Member Functions

Constructors & Destructor
 file_descriptors_manager (std::size_t size)
 
 ~file_descriptors_manager ()
 

Static Public Member Functions

Public Static Member Functions
static size_t size (void)
 
static bool valid (int fildes)
 
static class ioio (int fildes)
 
static class socketsocket (int fildes)
 
static int allocate (class io *io)
 
static int assign (file_descriptor_t fildes, class io *io)
 
static int deallocate (file_descriptor_t fildes)
 
static size_t used (void)
 

Detailed Description

Definition at line 58 of file file-descriptors-manager.h.

Constructor & Destructor Documentation

◆ file_descriptors_manager()

os::posix::file_descriptors_manager::file_descriptors_manager ( std::size_t  size)

Definition at line 58 of file file-descriptors-manager.cpp.

59 {
60 trace::printf ("file_descriptors_manager::%s(%d)=%p\n", __func__, size,
61 this);
62
63 assert (size > 0);
64
65 size__ = size + reserved__; // Add space for standard files.
66 descriptors_array__ = new class io*[size__];
67
68 for (std::size_t i = 0; i < file_descriptors_manager::size (); ++i)
69 {
70#pragma GCC diagnostic push
71#if defined(__clang__)
72#pragma clang diagnostic ignored "-Wunsafe-buffer-usage"
73#endif
74 descriptors_array__[i] = nullptr;
75#pragma GCC diagnostic pop
76 }
77 }
int printf(const char *format,...)
Write a formatted string to the trace device.
Definition trace.cpp:59

References os::trace::printf(), and size().

◆ ~file_descriptors_manager()

os::posix::file_descriptors_manager::~file_descriptors_manager ( )

Definition at line 79 of file file-descriptors-manager.cpp.

80 {
81 trace::printf ("file_descriptors_manager::%s(%) @%p\n", __func__, this);
82
83 delete[] descriptors_array__;
84 size__ = 0;
85 }

References os::trace::printf().

Member Function Documentation

◆ allocate()

int os::posix::file_descriptors_manager::allocate ( class io io)
static

Definition at line 117 of file file-descriptors-manager.cpp.

118 {
119#if defined(OS_TRACE_POSIX_IO_FILE_DESCRIPTORS_MANAGER)
120 trace::printf ("file_descriptors_manager::%s(%p)\n", __func__, io);
121#endif
122
123 if (io->file_descriptor () >= 0)
124 {
125 // Already allocated
126 errno = EBUSY;
127 return -1;
128 }
129
130 for (std::size_t i = reserved__; i < size__; ++i)
131 {
132#pragma GCC diagnostic push
133#if defined(__clang__)
134#pragma clang diagnostic ignored "-Wunsafe-buffer-usage"
135#endif
136 if (descriptors_array__[i] == nullptr)
137 {
138 descriptors_array__[i] = io;
139 io->file_descriptor (static_cast<int> (i));
140#if defined(OS_TRACE_POSIX_IO_FILE_DESCRIPTORS_MANAGER)
141 trace::printf ("file_descriptors_manager::%s(%p) fd=%d\n",
142 __func__, io, i);
143#endif
144 return static_cast<int> (i);
145 }
146#pragma GCC diagnostic pop
147 }
148
149 // Too many files open in system.
150 errno = ENFILE;
151 return -1;
152 }
file_descriptor_t file_descriptor(void) const
Definition io.h:452

References os::posix::io::file_descriptor(), and os::trace::printf().

Referenced by os::posix::io::alloc_file_descriptor().

◆ assign()

int os::posix::file_descriptors_manager::assign ( file_descriptor_t  fildes,
class io io 
)
static

Definition at line 155 of file file-descriptors-manager.cpp.

156 {
157 if ((fildes < 0) || (static_cast<std::size_t> (fildes) >= size__))
158 {
159 errno = EBADF;
160 return -1;
161 }
162
163 if (io->file_descriptor () >= 0)
164 {
165 // Already allocated
166 errno = EBUSY;
167 return -1;
168 }
169
170#pragma GCC diagnostic push
171#if defined(__clang__)
172#pragma clang diagnostic ignored "-Wunsafe-buffer-usage"
173#endif
174 descriptors_array__[fildes] = io;
175#pragma GCC diagnostic pop
176 io->file_descriptor (fildes);
177 return fildes;
178 }

References os::posix::io::file_descriptor().

◆ deallocate()

int os::posix::file_descriptors_manager::deallocate ( file_descriptor_t  fildes)
static

Definition at line 181 of file file-descriptors-manager.cpp.

182 {
183#if defined(OS_TRACE_POSIX_IO_FILE_DESCRIPTORS_MANAGER)
184 trace::printf ("file_descriptors_manager::%s(%d)\n", __func__, fildes);
185#endif
186
187 if ((fildes < 0) || (static_cast<std::size_t> (fildes) >= size__))
188 {
189 errno = EBADF;
190 return -1;
191 }
192
193#pragma GCC diagnostic push
194#if defined(__clang__)
195#pragma clang diagnostic ignored "-Wunsafe-buffer-usage"
196#endif
197 descriptors_array__[fildes]->clear_file_descriptor ();
198 descriptors_array__[fildes] = nullptr;
199#pragma GCC diagnostic pop
200 return 0;
201 }

References os::trace::printf().

Referenced by os::posix::io::close().

◆ io()

io * os::posix::file_descriptors_manager::io ( int  fildes)
static

Definition at line 90 of file file-descriptors-manager.cpp.

91 {
92 // Check if valid descriptor or buffer not yet initialised
93 if ((fildes < 0) || (static_cast<std::size_t> (fildes) >= size__)
94 || (descriptors_array__ == nullptr))
95 {
96 return nullptr;
97 }
98#pragma GCC diagnostic push
99#if defined(__clang__)
100#pragma clang diagnostic ignored "-Wunsafe-buffer-usage"
101#endif
102 return descriptors_array__[fildes];
103#pragma GCC diagnostic pop
104 }

Referenced by __posix_close(), __posix_fcntl(), __posix_fstat(), __posix_fstatvfs(), __posix_fsync(), __posix_ftruncate(), __posix_ioctl(), __posix_isatty(), __posix_lseek(), __posix_read(), __posix_tcdrain(), __posix_tcflush(), __posix_tcgetattr(), __posix_tcsendbreak(), __posix_tcsetattr(), __posix_write(), and __posix_writev().

◆ size()

size_t os::posix::file_descriptors_manager::size ( void  )
inlinestatic

Definition at line 168 of file file-descriptors-manager.h.

169 {
170 return size__;
171 }

Referenced by file_descriptors_manager(), and used().

◆ socket()

socket * os::posix::file_descriptors_manager::socket ( int  fildes)
static

Definition at line 204 of file file-descriptors-manager.cpp.

205 {
206 assert ((fildes >= 0) && (static_cast<std::size_t> (fildes) < size__));
207#pragma GCC diagnostic push
208#if defined(__clang__)
209#pragma clang diagnostic ignored "-Wunsafe-buffer-usage"
210#endif
211 auto* const io = descriptors_array__[fildes];
212#pragma GCC diagnostic pop
213 if (io->get_type () != static_cast<posix::io::type_t> (io::type::socket))
214 {
215 return nullptr;
216 }
217 return reinterpret_cast<class socket*> (io);
218 }
static class socket * socket(int fildes)
unsigned int type_t
Definition io.h:125
type_t get_type(void) const
Definition io.h:434

References os::posix::io::get_type(), and os::posix::io::socket.

Referenced by __posix_accept(), __posix_bind(), __posix_connect(), __posix_getpeername(), __posix_getsockname(), __posix_getsockopt(), __posix_listen(), __posix_recv(), __posix_recvfrom(), __posix_recvmsg(), __posix_send(), __posix_sendmsg(), __posix_sendto(), __posix_setsockopt(), __posix_shutdown(), and __posix_sockatmark().

◆ used()

size_t os::posix::file_descriptors_manager::used ( void  )
static

Definition at line 221 of file file-descriptors-manager.cpp.

222 {
223 std::size_t count = reserved__;
224 for (std::size_t i = reserved__; i < file_descriptors_manager::size ();
225 ++i)
226 {
227#pragma GCC diagnostic push
228#if defined(__clang__)
229#pragma clang diagnostic ignored "-Wunsafe-buffer-usage"
230#endif
231 if (descriptors_array__[i] != nullptr)
232 {
233 ++count;
234 }
235#pragma GCC diagnostic pop
236 }
237 return count;
238 }

References size().

◆ valid()

bool os::posix::file_descriptors_manager::valid ( int  fildes)
static

Definition at line 107 of file file-descriptors-manager.cpp.

108 {
109 if ((fildes < 0) || (static_cast<std::size_t> (fildes) >= size__))
110 {
111 return false;
112 }
113 return true;
114 }

The documentation for this class was generated from the following files: