1 #ifndef _HURD_PORT_H 2 #include_next <hurd/port.h> 3 4 #ifndef _ISOMAC 5 #include <libc-lock.h> 6 7 struct _hurd_port_use_data 8 { 9 struct hurd_port *p; 10 struct hurd_userlink link; 11 mach_port_t port; 12 }; 13 14 extern void _hurd_port_use_cleanup (void *arg); 15 16 /* Like HURD_PORT_USE, but cleans fd on cancel. */ 17 #define HURD_PORT_USE_CANCEL(portcell, expr) \ 18 ({ struct _hurd_port_use_data __d; \ 19 mach_port_t port; \ 20 __typeof(expr) __result; \ 21 void *__crit; \ 22 __d.p = (portcell); \ 23 __crit = _hurd_critical_section_lock (); \ 24 __d.port = port = _hurd_port_get (__d.p, &__d.link); \ 25 __libc_cleanup_push (_hurd_port_use_cleanup, &__d); \ 26 _hurd_critical_section_unlock (__crit); \ 27 __result = (expr); \ 28 __libc_cleanup_pop (1); \ 29 __result; }) 30 31 libc_hidden_proto (_hurd_port_locked_get) 32 libc_hidden_proto (_hurd_port_locked_set) 33 #ifdef _HURD_PORT_H_HIDDEN_DEF 34 libc_hidden_def (_hurd_port_locked_get) 35 libc_hidden_def (_hurd_port_locked_set) 36 #endif 37 #endif 38 #endif 39