Warning: This file is not a C or C++ file. It does not have highlighting.

1#ifndef _HURD_FD_H
2#include_next <hurd/fd.h>
3
4#ifndef _ISOMAC
5#include <libc-lock.h>
6
7struct _hurd_fd_port_use_data
8 {
9 struct hurd_fd *d;
10 struct hurd_userlink ulink, ctty_ulink;
11 io_t port, ctty;
12 };
13
14extern void _hurd_fd_port_use_cleanup (void *arg);
15
16/* Like HURD_DPORT_USE, but cleans fd on cancel. */
17#define HURD_DPORT_USE_CANCEL(fd, expr) \
18 HURD_FD_USE ((fd), HURD_FD_PORT_USE_CANCEL (descriptor, (expr)))
19
20/* Like HURD_FD_PORT_USE, but cleans fd on cancel. */
21#define HURD_FD_PORT_USE_CANCEL(fd, expr) \
22 ({ error_t __result; \
23 struct _hurd_fd_port_use_data __d; \
24 io_t port, ctty; \
25 void *__crit; \
26 __d.d = (fd); \
27 __crit = _hurd_critical_section_lock (); \
28 __spin_lock (&__d.d->port.lock); \
29 if (__d.d->port.port == MACH_PORT_NULL) \
30 { \
31 __spin_unlock (&__d.d->port.lock); \
32 _hurd_critical_section_unlock (__crit); \
33 __result = EBADF; \
34 } \
35 else \
36 { \
37 __d.ctty = ctty = _hurd_port_get (&__d.d->ctty, &__d.ctty_ulink); \
38 __d.port = port = _hurd_port_locked_get (&__d.d->port, &__d.ulink); \
39 __libc_cleanup_push (_hurd_fd_port_use_cleanup, &__d); \
40 _hurd_critical_section_unlock (__crit); \
41 __result = (expr); \
42 __libc_cleanup_pop (1); \
43 } \
44 __result; })
45
46libc_hidden_proto (_hurd_intern_fd)
47libc_hidden_proto (_hurd_fd_error)
48libc_hidden_proto (_hurd_fd_error_signal)
49# ifdef _HURD_FD_H_HIDDEN_DEF
50libc_hidden_def (_hurd_fd_error)
51libc_hidden_def (_hurd_fd_error_signal)
52# endif
53#endif
54#endif
55

Warning: This file is not a C or C++ file. It does not have highlighting.

source code of glibc/sysdeps/hurd/include/hurd/fd.h