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