From 09e20e8fcfcc45ed18cf1ca9e6738c82bd1f9dce Mon Sep 17 00:00:00 2001 From: "Michael I. Bushnell" Date: Mon, 19 Jun 1995 21:17:18 +0000 Subject: (fshelp_set_active): Implement new interface. --- libfshelp/set-active.c | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) (limited to 'libfshelp/set-active.c') diff --git a/libfshelp/set-active.c b/libfshelp/set-active.c index af5dcc89..5cf3ec38 100644 --- a/libfshelp/set-active.c +++ b/libfshelp/set-active.c @@ -19,13 +19,48 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "fshelp.h" +#include error_t fshelp_set_active (struct transbox *box, - mach_port_t active) + mach_port_t active, + int excl, int goaway, int flags) { + error_t error; + + start_over: + if (excl && box->active != MACH_PORT_NULL) + return EBUSY; + + if (goaway && box->active != MACH_PORT_NULL) + { + fsys_t control; + + error = fshelp_fetch_control (box, &control); + if (error) + return error; + + mutex_unlock (box->lock); + error = fsys_goaway (control, flags); + mutex_lock (box->lock); + if (error) + { + mach_port_deallocate (mach_task_self (), control); + return error; + } + + /* If it changed while we were unlocked, better start over. */ + if (box->active != control) + { + mach_port_deallocate (mach_task_self (), control); + goto start_over; + } + mach_port_deallocate (mach_task_self (), control); + } + if (box->active != MACH_PORT_NULL) mach_port_deallocate (mach_task_self (), box->active); + box->active = active; return 0; } -- cgit v1.2.3