Lely core libraries 1.9.2
handle.h
Go to the documentation of this file.
1
21#ifndef LELY_IO_INTERN_HANDLE_H_
22#define LELY_IO_INTERN_HANDLE_H_
23
24#include "io.h"
25#ifndef LELY_NO_ATOMICS
26#define LELY_NO_ATOMICS 1
27#ifndef LELY_NO_THREADS
28#include <lely/libc/stdatomic.h>
29#ifndef __STDC_NO_ATOMICS__
30#undef LELY_NO_ATOMICS
31#endif
32#endif
33#endif
34#ifndef LELY_NO_THREADS
35#include <lely/libc/threads.h>
36#endif
37
38struct io_handle_vtab;
39
41struct io_handle {
43 const struct io_handle_vtab *vtab;
45#ifndef LELY_NO_ATOMICS
46 atomic_size_t ref;
47#elif !defined(LELY_NO_THREADS) && defined(_WIN32)
48 volatile LONG ref;
49#else
50 size_t ref;
51#endif
53#ifdef _WIN32
54 HANDLE fd;
55#else
56 int fd;
57#endif
62 int flags;
63#ifndef LELY_NO_THREADS
65 mtx_t mtx;
66#endif
67};
68
69#ifdef __cplusplus
70extern "C" {
71#endif
72
79 int type;
81 size_t size;
83 void (*fini)(struct io_handle *handle);
85 int (*flags)(struct io_handle *handle, int flags);
87 ssize_t (*read)(struct io_handle *handle, void *buf, size_t nbytes);
89 ssize_t (*write)(struct io_handle *handle, const void *buf,
90 size_t nbytes);
92 int (*flush)(struct io_handle *handle);
94 io_off_t (*seek)(struct io_handle *handle, io_off_t offset, int whence);
96 ssize_t (*pread)(struct io_handle *handle, void *buf, size_t nbytes,
97 io_off_t offset);
99 ssize_t (*pwrite)(struct io_handle *handle, const void *buf,
100 size_t nbytes, io_off_t offset);
102 int (*purge)(struct io_handle *handle, int flags);
104 ssize_t (*recv)(struct io_handle *handle, void *buf, size_t nbytes,
105 io_addr_t *addr, int flags);
107 ssize_t (*send)(struct io_handle *handle, const void *buf,
108 size_t nbytes, const io_addr_t *addr, int flags);
110 struct io_handle *(*accept)(struct io_handle *handle, io_addr_t *addr);
112 int (*connect)(struct io_handle *handle, const io_addr_t *addr);
113};
114
123struct io_handle *io_handle_alloc(const struct io_handle_vtab *vtab);
124
126void io_handle_free(struct io_handle *handle);
127
132void io_handle_fini(struct io_handle *handle);
133
138void io_handle_destroy(struct io_handle *handle);
139
146#ifdef LELY_NO_THREADS
147#define io_handle_lock(handle)
148#else
149void io_handle_lock(struct io_handle *handle);
150#endif
151
153#ifdef LELY_NO_THREADS
154#define io_handle_unlock(handle)
155#else
156void io_handle_unlock(struct io_handle *handle);
157#endif
158
159#ifdef __cplusplus
160}
161#endif
162
163#endif // !LELY_IO_INTERN_HANDLE_H_
void io_handle_fini(struct io_handle *handle)
Finalizes an I/O device handle by invoking its fini method, if available.
Definition: handle.c:106
void io_handle_destroy(struct io_handle *handle)
Destroys an I/O device handle.
Definition: handle.c:128
void io_handle_free(struct io_handle *handle)
Frees an I/O device handle.
Definition: handle.c:116
struct io_handle * io_handle_alloc(const struct io_handle_vtab *vtab)
Allocates a new I/O device handle from a virtual table.
Definition: handle.c:77
void io_handle_unlock(struct io_handle *handle)
Unlocks a locked I/O device handle.
Definition: handle.c:147
void io_handle_lock(struct io_handle *handle)
Locks an unlocked I/O device handle, so the flags (and other device-specific fields) can safely be ac...
Definition: handle.c:139
int64_t io_off_t
A file offset type.
Definition: io.h:37
This is the internal header file of the I/O library.
This header file is part of the C11 and POSIX compatibility library; it includes <stdatomic....
An opaque network address type.
Definition: addr.h:30
The virtual table of an I/O device handle.
Definition: handle.h:74
int(* flush)(struct io_handle *handle)
A pointer to the flush method.
Definition: handle.h:92
void(* fini)(struct io_handle *handle)
A pointer to the fini method.
Definition: handle.h:83
int(* flags)(struct io_handle *handle, int flags)
A pointer to the static flags method.
Definition: handle.h:85
ssize_t(* send)(struct io_handle *handle, const void *buf, size_t nbytes, const io_addr_t *addr, int flags)
A pointer to the send method.
Definition: handle.h:107
ssize_t(* pread)(struct io_handle *handle, void *buf, size_t nbytes, io_off_t offset)
A pointer to the pread method.
Definition: handle.h:96
int(* purge)(struct io_handle *handle, int flags)
A pointer to the purge method.
Definition: handle.h:102
ssize_t(* write)(struct io_handle *handle, const void *buf, size_t nbytes)
A pointer to the write method.
Definition: handle.h:89
size_t size
The size (in bytes) of the handle struct.
Definition: handle.h:81
ssize_t(* read)(struct io_handle *handle, void *buf, size_t nbytes)
A pointer to the read method.
Definition: handle.h:87
int type
The type of the device (one of IO_TYPE_CAN, IO_TYPE_FILE, IO_TYPE_PIPE, IO_TYPE_SERIAL or IO_TYPE_SOC...
Definition: handle.h:79
io_off_t(* seek)(struct io_handle *handle, io_off_t offset, int whence)
A pointer to the seek method.
Definition: handle.h:94
int(* connect)(struct io_handle *handle, const io_addr_t *addr)
A pointer to the connect method.
Definition: handle.h:112
ssize_t(* pwrite)(struct io_handle *handle, const void *buf, size_t nbytes, io_off_t offset)
A pointer to the pwrite method.
Definition: handle.h:99
ssize_t(* recv)(struct io_handle *handle, void *buf, size_t nbytes, io_addr_t *addr, int flags)
A pointer to the recv method.
Definition: handle.h:104
An I/O device handle.
Definition: handle.h:41
int fd
The native file descriptor.
Definition: handle.h:56
size_t ref
The reference count.
Definition: handle.h:50
int flags
The I/O device flags (any combination of IO_FLAG_NO_CLOSE and IO_FLAG_NONBLOCK).
Definition: handle.h:62
mtx_t mtx
The mutex protecting flags (and other device-specific fields).
Definition: handle.h:65
const struct io_handle_vtab * vtab
A pointer to the virtual table.
Definition: handle.h:43
This header file is part of the C11 and POSIX compatibility library; it includes <threads....
ptrdiff_t ssize_t
Used for a count of bytes or an error indication.
Definition: types.h:43