{
devset = (fh_devices) shared_console_info[unit]->tty_min_state.getntty ();
_tc = &(shared_console_info[unit]->tty_min_state);
- if (!created)
- {
- while (con.owner > MAX_PID)
- Sleep (1);
- pinfo p (con.owner);
- if (!p)
- con.owner = myself->pid;
- }
}
dev ().parse (devset);
set_handle (NULL);
set_output_handle (NULL);
+ setup_io_mutex ();
+ acquire_output_mutex (mutex_timeout);
+
+ do
+ {
+ pinfo p (con.owner);
+ if (!p)
+ con.owner = myself->pid;
+ }
+ while (false);
+
/* Open the input handle as handle_ */
bool err = false;
DWORD resume_pid = attach_console (con.owner, &err);
if (err)
{
+ release_output_mutex ();
set_errno (EACCES);
return 0;
}
if (h == INVALID_HANDLE_VALUE)
{
+ release_output_mutex ();
__seterrno ();
return 0;
}
resume_pid = attach_console (con.owner, &err);
if (err)
{
+ release_output_mutex ();
set_errno (EACCES);
return 0;
}
if (h == INVALID_HANDLE_VALUE)
{
+ release_output_mutex ();
__seterrno ();
return 0;
}
set_output_handle (h);
handle_set.output_handle = h;
+ release_output_mutex ();
+
wpbuf.init ();
- setup_io_mutex ();
handle_set.input_mutex = input_mutex;
handle_set.output_mutex = output_mutex;
}
}
- release_output_mutex ();
-
- if (shared_console_info[unit] && con.owner == myself->pid
- && master_thread_started)
+ if (shared_console_info[unit] && con.owner == myself->pid)
{
- char name[MAX_PATH];
- shared_name (name, CONS_THREAD_SYNC, get_minor ());
- thread_sync_event = OpenEvent (MAXIMUM_ALLOWED, FALSE, name);
- con.owner = MAX_PID + 1;
- WaitForSingleObject (thread_sync_event, INFINITE);
- CloseHandle (thread_sync_event);
+ if (master_thread_started)
+ {
+ char name[MAX_PATH];
+ shared_name (name, CONS_THREAD_SYNC, get_minor ());
+ thread_sync_event = OpenEvent (MAXIMUM_ALLOWED, FALSE, name);
+ con.owner = MAX_PID + 1;
+ WaitForSingleObject (thread_sync_event, INFINITE);
+ CloseHandle (thread_sync_event);
+ }
con.owner = 0;
}
- CloseHandle (input_mutex);
- input_mutex = NULL;
- CloseHandle (output_mutex);
- output_mutex = NULL;
-
CloseHandle (get_handle ());
CloseHandle (get_output_handle ());
|| get_device () == (dev_t) myself->ctty))
free_console ();
+ release_output_mutex ();
+
+ CloseHandle (input_mutex);
+ input_mutex = NULL;
+ CloseHandle (output_mutex);
+ output_mutex = NULL;
+
if (shared_console_info[unit] && myself->ctty != tc ()->ntty)
{
UnmapViewOfFile ((void *) shared_console_info[unit]);