mirror of
git://sourceware.org/git/newlib-cygwin.git
synced 2025-02-28 12:05:47 +08:00
* syscalls.cc (mount): Don't check win32_path when doing cygdrive mount.
This commit is contained in:
parent
cc9f0cf0af
commit
e2bc5017fa
@ -1,3 +1,8 @@
|
|||||||
|
2003-08-27 Christopher Faylor <cgf@redhat.com>
|
||||||
|
|
||||||
|
* syscalls.cc (mount): Don't check win32_path when doing cygdrive
|
||||||
|
mount.
|
||||||
|
|
||||||
2003-08-27 Christopher Faylor <cgf@redhat.com>
|
2003-08-27 Christopher Faylor <cgf@redhat.com>
|
||||||
|
|
||||||
* specdir: Correctly remove temporary directory prior to use.
|
* specdir: Correctly remove temporary directory prior to use.
|
||||||
|
@ -510,6 +510,7 @@ LoadDLLfunc (IsProcessorFeaturePresent, 4, kernel32);
|
|||||||
LoadDLLfuncEx (Process32First, 8, kernel32, 1)
|
LoadDLLfuncEx (Process32First, 8, kernel32, 1)
|
||||||
LoadDLLfuncEx (Process32Next, 8, kernel32, 1)
|
LoadDLLfuncEx (Process32Next, 8, kernel32, 1)
|
||||||
LoadDLLfuncEx (SignalObjectAndWait, 16, kernel32, 1)
|
LoadDLLfuncEx (SignalObjectAndWait, 16, kernel32, 1)
|
||||||
|
LoadDLLfuncEx (SwitchToThread, 0, kernel32, 1)
|
||||||
LoadDLLfunc (TryEnterCriticalSection, 4, kernel32)
|
LoadDLLfunc (TryEnterCriticalSection, 4, kernel32)
|
||||||
|
|
||||||
LoadDLLfuncEx (waveOutGetNumDevs, 0, winmm, 1)
|
LoadDLLfuncEx (waveOutGetNumDevs, 0, winmm, 1)
|
||||||
|
@ -18,12 +18,12 @@ class cygthread
|
|||||||
LPTHREAD_START_ROUTINE func;
|
LPTHREAD_START_ROUTINE func;
|
||||||
VOID *arg;
|
VOID *arg;
|
||||||
bool is_freerange;
|
bool is_freerange;
|
||||||
static DWORD main_thread_id;
|
|
||||||
static bool exiting;
|
static bool exiting;
|
||||||
static DWORD WINAPI stub (VOID *);
|
static DWORD WINAPI stub (VOID *);
|
||||||
static DWORD WINAPI simplestub (VOID *);
|
static DWORD WINAPI simplestub (VOID *);
|
||||||
void terminate_thread ();
|
void terminate_thread ();
|
||||||
public:
|
public:
|
||||||
|
static DWORD main_thread_id;
|
||||||
static const char * name (DWORD = 0);
|
static const char * name (DWORD = 0);
|
||||||
cygthread (LPTHREAD_START_ROUTINE, LPVOID, const char *);
|
cygthread (LPTHREAD_START_ROUTINE, LPVOID, const char *);
|
||||||
cygthread () {};
|
cygthread () {};
|
||||||
|
@ -785,10 +785,9 @@ setup_handler (int sig, void *handler, struct sigaction& siga)
|
|||||||
CONTEXT cx;
|
CONTEXT cx;
|
||||||
bool interrupted = false;
|
bool interrupted = false;
|
||||||
sigthread *th = NULL; // Initialization needed to shut up gcc
|
sigthread *th = NULL; // Initialization needed to shut up gcc
|
||||||
int prio = INFINITE;
|
|
||||||
|
|
||||||
if (sigsave.sig)
|
if (sigsave.sig)
|
||||||
goto set_pending;
|
goto out;
|
||||||
|
|
||||||
for (int i = 0; i < CALL_HANDLER_RETRY; i++)
|
for (int i = 0; i < CALL_HANDLER_RETRY; i++)
|
||||||
{
|
{
|
||||||
@ -823,7 +822,18 @@ setup_handler (int sig, void *handler, struct sigaction& siga)
|
|||||||
SuspendThread on itself then just queue the signal. */
|
SuspendThread on itself then just queue the signal. */
|
||||||
|
|
||||||
EnterCriticalSection (&mainthread.lock);
|
EnterCriticalSection (&mainthread.lock);
|
||||||
|
#ifndef DEBUGGING
|
||||||
sigproc_printf ("suspending mainthread");
|
sigproc_printf ("suspending mainthread");
|
||||||
|
#else
|
||||||
|
cx.ContextFlags = CONTEXT_CONTROL | CONTEXT_INTEGER;
|
||||||
|
if (!GetThreadContext (hth, &cx))
|
||||||
|
memset (&cx, 0, sizeof cx);
|
||||||
|
#if 0
|
||||||
|
if ((cx.Eip & 0xff000000) == 0x77000000)
|
||||||
|
try_to_debug ();
|
||||||
|
#endif
|
||||||
|
sigproc_printf ("suspending mainthread PC %p", cx.Eip);
|
||||||
|
#endif
|
||||||
res = SuspendThread (hth);
|
res = SuspendThread (hth);
|
||||||
/* Just release the lock now since we hav suspended the main thread and it
|
/* Just release the lock now since we hav suspended the main thread and it
|
||||||
definitely can't be grabbing it now. This will have to change, of course,
|
definitely can't be grabbing it now. This will have to change, of course,
|
||||||
@ -866,13 +876,6 @@ setup_handler (int sig, void *handler, struct sigaction& siga)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((DWORD) prio != INFINITE)
|
|
||||||
{
|
|
||||||
/* Reset the priority so we can finish this off quickly. */
|
|
||||||
SetThreadPriority (GetCurrentThread (), WAIT_SIG_PRIORITY);
|
|
||||||
prio = INFINITE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (th)
|
if (th)
|
||||||
{
|
{
|
||||||
interrupted = interrupt_on_return (th, sig, handler, siga);
|
interrupted = interrupt_on_return (th, sig, handler, siga);
|
||||||
@ -888,20 +891,11 @@ setup_handler (int sig, void *handler, struct sigaction& siga)
|
|||||||
if (interrupted)
|
if (interrupted)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if ((DWORD) prio != INFINITE && !mainthread.frame)
|
|
||||||
prio = low_priority_sleep (SLEEP_0_STAY_LOW);
|
|
||||||
sigproc_printf ("couldn't interrupt. trying again.");
|
sigproc_printf ("couldn't interrupt. trying again.");
|
||||||
}
|
}
|
||||||
|
|
||||||
set_pending:
|
out:
|
||||||
if (interrupted)
|
sigproc_printf ("signal %d %sdelivered", sig, interrupted ? "" : "not ");
|
||||||
{
|
|
||||||
if ((DWORD) prio != INFINITE)
|
|
||||||
SetThreadPriority (GetCurrentThread (), WAIT_SIG_PRIORITY);
|
|
||||||
sigproc_printf ("signal successfully delivered");
|
|
||||||
}
|
|
||||||
|
|
||||||
sigproc_printf ("returning %d", interrupted);
|
|
||||||
return interrupted;
|
return interrupted;
|
||||||
}
|
}
|
||||||
#endif /* i386 */
|
#endif /* i386 */
|
||||||
|
@ -8,6 +8,7 @@ This software is a copyrighted work licensed under the terms of the
|
|||||||
Cygwin license. Please consult the file "CYGWIN_LICENSE" for
|
Cygwin license. Please consult the file "CYGWIN_LICENSE" for
|
||||||
details. */
|
details. */
|
||||||
|
|
||||||
|
#define _WIN32_WINNT 0x400
|
||||||
#include "winsup.h"
|
#include "winsup.h"
|
||||||
#include "cygerrno.h"
|
#include "cygerrno.h"
|
||||||
#include <sys/errno.h>
|
#include <sys/errno.h>
|
||||||
@ -16,6 +17,7 @@ details. */
|
|||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
#include <winbase.h>
|
#include <winbase.h>
|
||||||
#include <winnls.h>
|
#include <winnls.h>
|
||||||
|
#include "cygthread.h"
|
||||||
|
|
||||||
long tls_ix = -1;
|
long tls_ix = -1;
|
||||||
|
|
||||||
@ -306,13 +308,27 @@ low_priority_sleep (DWORD secs)
|
|||||||
staylow = true;
|
staylow = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
int main_prio = GetThreadPriority (hMainThread);
|
if (!secs && wincap.has_switch_to_thread ())
|
||||||
if (curr_prio != main_prio)
|
{
|
||||||
/* Force any threads in normal priority to be scheduled */
|
for (int i = 0; i < 10; i++)
|
||||||
SetThreadPriority (thisthread, main_prio);
|
SwitchToThread ();
|
||||||
Sleep (secs);
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int new_prio;
|
||||||
|
if (GetCurrentThreadId () == cygthread::main_thread_id)
|
||||||
|
new_prio = THREAD_PRIORITY_LOWEST;
|
||||||
|
else
|
||||||
|
new_prio = GetThreadPriority (hMainThread);
|
||||||
|
|
||||||
|
if (curr_prio != new_prio)
|
||||||
|
/* Force any threads in normal priority to be scheduled */
|
||||||
|
SetThreadPriority (thisthread, new_prio);
|
||||||
|
Sleep (secs);
|
||||||
|
|
||||||
|
if (!staylow || curr_prio == new_prio)
|
||||||
|
SetThreadPriority (thisthread, curr_prio);
|
||||||
|
}
|
||||||
|
|
||||||
if (!staylow || curr_prio == main_prio)
|
|
||||||
SetThreadPriority (thisthread, curr_prio);
|
|
||||||
return curr_prio;
|
return curr_prio;
|
||||||
}
|
}
|
||||||
|
@ -2592,8 +2592,7 @@ mount (const char *win32_path, const char *posix_path, unsigned flags)
|
|||||||
{
|
{
|
||||||
int res = -1;
|
int res = -1;
|
||||||
|
|
||||||
if (check_null_empty_str_errno (win32_path)
|
if (check_null_empty_str_errno (posix_path))
|
||||||
|| check_null_empty_str_errno (posix_path))
|
|
||||||
/* errno set */;
|
/* errno set */;
|
||||||
else if (strpbrk (posix_path, "\\:"))
|
else if (strpbrk (posix_path, "\\:"))
|
||||||
set_errno (EINVAL);
|
set_errno (EINVAL);
|
||||||
@ -2605,7 +2604,7 @@ mount (const char *win32_path, const char *posix_path, unsigned flags)
|
|||||||
res = mount_table->write_cygdrive_info_to_registry (posix_path, flags);
|
res = mount_table->write_cygdrive_info_to_registry (posix_path, flags);
|
||||||
win32_path = NULL;
|
win32_path = NULL;
|
||||||
}
|
}
|
||||||
else
|
else if (!check_null_empty_str_errno (win32_path))
|
||||||
res = mount_table->add_item (win32_path, posix_path, flags, TRUE);
|
res = mount_table->add_item (win32_path, posix_path, flags, TRUE);
|
||||||
|
|
||||||
syscall_printf ("%d = mount (%s, %s, %p)", res, win32_path, posix_path, flags);
|
syscall_printf ("%d = mount (%s, %s, %p)", res, win32_path, posix_path, flags);
|
||||||
|
@ -1218,7 +1218,6 @@ wait_sig (VOID *self)
|
|||||||
if (!sig_handle (sig))
|
if (!sig_handle (sig))
|
||||||
{
|
{
|
||||||
saw_failed_interrupt = true;
|
saw_failed_interrupt = true;
|
||||||
sigproc_printf ("couldn't send signal %d", sig);
|
|
||||||
x = InterlockedIncrement (myself->getsigtodo (sig));
|
x = InterlockedIncrement (myself->getsigtodo (sig));
|
||||||
pending_signals = true;
|
pending_signals = true;
|
||||||
}
|
}
|
||||||
|
@ -49,7 +49,8 @@ static NO_COPY wincaps wincap_unknown = {
|
|||||||
supports_reading_modem_output_lines:false,
|
supports_reading_modem_output_lines:false,
|
||||||
needs_memory_protection:false,
|
needs_memory_protection:false,
|
||||||
pty_needs_alloc_console:false,
|
pty_needs_alloc_console:false,
|
||||||
has_terminal_services:false
|
has_terminal_services:false,
|
||||||
|
has_switch_to_thread:false
|
||||||
};
|
};
|
||||||
|
|
||||||
static NO_COPY wincaps wincap_95 = {
|
static NO_COPY wincaps wincap_95 = {
|
||||||
@ -90,7 +91,8 @@ static NO_COPY wincaps wincap_95 = {
|
|||||||
supports_reading_modem_output_lines:false,
|
supports_reading_modem_output_lines:false,
|
||||||
needs_memory_protection:false,
|
needs_memory_protection:false,
|
||||||
pty_needs_alloc_console:false,
|
pty_needs_alloc_console:false,
|
||||||
has_terminal_services:false
|
has_terminal_services:false,
|
||||||
|
has_switch_to_thread:false
|
||||||
};
|
};
|
||||||
|
|
||||||
static NO_COPY wincaps wincap_95osr2 = {
|
static NO_COPY wincaps wincap_95osr2 = {
|
||||||
@ -131,7 +133,8 @@ static NO_COPY wincaps wincap_95osr2 = {
|
|||||||
supports_reading_modem_output_lines:false,
|
supports_reading_modem_output_lines:false,
|
||||||
needs_memory_protection:false,
|
needs_memory_protection:false,
|
||||||
pty_needs_alloc_console:false,
|
pty_needs_alloc_console:false,
|
||||||
has_terminal_services:false
|
has_terminal_services:false,
|
||||||
|
has_switch_to_thread:false
|
||||||
};
|
};
|
||||||
|
|
||||||
static NO_COPY wincaps wincap_98 = {
|
static NO_COPY wincaps wincap_98 = {
|
||||||
@ -172,7 +175,8 @@ static NO_COPY wincaps wincap_98 = {
|
|||||||
supports_reading_modem_output_lines:false,
|
supports_reading_modem_output_lines:false,
|
||||||
needs_memory_protection:false,
|
needs_memory_protection:false,
|
||||||
pty_needs_alloc_console:false,
|
pty_needs_alloc_console:false,
|
||||||
has_terminal_services:false
|
has_terminal_services:false,
|
||||||
|
has_switch_to_thread:false
|
||||||
};
|
};
|
||||||
|
|
||||||
static NO_COPY wincaps wincap_98se = {
|
static NO_COPY wincaps wincap_98se = {
|
||||||
@ -213,7 +217,8 @@ static NO_COPY wincaps wincap_98se = {
|
|||||||
supports_reading_modem_output_lines:false,
|
supports_reading_modem_output_lines:false,
|
||||||
needs_memory_protection:false,
|
needs_memory_protection:false,
|
||||||
pty_needs_alloc_console:false,
|
pty_needs_alloc_console:false,
|
||||||
has_terminal_services:false
|
has_terminal_services:false,
|
||||||
|
has_switch_to_thread:false
|
||||||
};
|
};
|
||||||
|
|
||||||
static NO_COPY wincaps wincap_me = {
|
static NO_COPY wincaps wincap_me = {
|
||||||
@ -254,7 +259,8 @@ static NO_COPY wincaps wincap_me = {
|
|||||||
supports_reading_modem_output_lines:false,
|
supports_reading_modem_output_lines:false,
|
||||||
needs_memory_protection:false,
|
needs_memory_protection:false,
|
||||||
pty_needs_alloc_console:false,
|
pty_needs_alloc_console:false,
|
||||||
has_terminal_services:false
|
has_terminal_services:false,
|
||||||
|
has_switch_to_thread:false
|
||||||
};
|
};
|
||||||
|
|
||||||
static NO_COPY wincaps wincap_nt3 = {
|
static NO_COPY wincaps wincap_nt3 = {
|
||||||
@ -295,7 +301,8 @@ static NO_COPY wincaps wincap_nt3 = {
|
|||||||
supports_reading_modem_output_lines:true,
|
supports_reading_modem_output_lines:true,
|
||||||
needs_memory_protection:true,
|
needs_memory_protection:true,
|
||||||
pty_needs_alloc_console:true,
|
pty_needs_alloc_console:true,
|
||||||
has_terminal_services:false
|
has_terminal_services:false,
|
||||||
|
has_switch_to_thread:false
|
||||||
};
|
};
|
||||||
|
|
||||||
static NO_COPY wincaps wincap_nt4 = {
|
static NO_COPY wincaps wincap_nt4 = {
|
||||||
@ -336,7 +343,8 @@ static NO_COPY wincaps wincap_nt4 = {
|
|||||||
supports_reading_modem_output_lines:true,
|
supports_reading_modem_output_lines:true,
|
||||||
needs_memory_protection:true,
|
needs_memory_protection:true,
|
||||||
pty_needs_alloc_console:true,
|
pty_needs_alloc_console:true,
|
||||||
has_terminal_services:false
|
has_terminal_services:false,
|
||||||
|
has_switch_to_thread:true
|
||||||
};
|
};
|
||||||
|
|
||||||
static NO_COPY wincaps wincap_nt4sp4 = {
|
static NO_COPY wincaps wincap_nt4sp4 = {
|
||||||
@ -377,7 +385,8 @@ static NO_COPY wincaps wincap_nt4sp4 = {
|
|||||||
supports_reading_modem_output_lines:true,
|
supports_reading_modem_output_lines:true,
|
||||||
needs_memory_protection:true,
|
needs_memory_protection:true,
|
||||||
pty_needs_alloc_console:true,
|
pty_needs_alloc_console:true,
|
||||||
has_terminal_services:false
|
has_terminal_services:false,
|
||||||
|
has_switch_to_thread:true
|
||||||
};
|
};
|
||||||
|
|
||||||
static NO_COPY wincaps wincap_2000 = {
|
static NO_COPY wincaps wincap_2000 = {
|
||||||
@ -418,7 +427,8 @@ static NO_COPY wincaps wincap_2000 = {
|
|||||||
supports_reading_modem_output_lines:true,
|
supports_reading_modem_output_lines:true,
|
||||||
needs_memory_protection:true,
|
needs_memory_protection:true,
|
||||||
pty_needs_alloc_console:true,
|
pty_needs_alloc_console:true,
|
||||||
has_terminal_services:true
|
has_terminal_services:true,
|
||||||
|
has_switch_to_thread:true
|
||||||
};
|
};
|
||||||
|
|
||||||
static NO_COPY wincaps wincap_xp = {
|
static NO_COPY wincaps wincap_xp = {
|
||||||
@ -459,7 +469,8 @@ static NO_COPY wincaps wincap_xp = {
|
|||||||
supports_reading_modem_output_lines:true,
|
supports_reading_modem_output_lines:true,
|
||||||
needs_memory_protection:true,
|
needs_memory_protection:true,
|
||||||
pty_needs_alloc_console:true,
|
pty_needs_alloc_console:true,
|
||||||
has_terminal_services:true
|
has_terminal_services:true,
|
||||||
|
has_switch_to_thread:true
|
||||||
};
|
};
|
||||||
|
|
||||||
static NO_COPY wincaps wincap_2003 = {
|
static NO_COPY wincaps wincap_2003 = {
|
||||||
@ -500,7 +511,8 @@ static NO_COPY wincaps wincap_2003 = {
|
|||||||
supports_reading_modem_output_lines:true,
|
supports_reading_modem_output_lines:true,
|
||||||
needs_memory_protection:true,
|
needs_memory_protection:true,
|
||||||
pty_needs_alloc_console:true,
|
pty_needs_alloc_console:true,
|
||||||
has_terminal_services:true
|
has_terminal_services:true,
|
||||||
|
has_switch_to_thread:true
|
||||||
};
|
};
|
||||||
|
|
||||||
wincapc wincap;
|
wincapc wincap;
|
||||||
|
@ -51,6 +51,7 @@ struct wincaps
|
|||||||
unsigned needs_memory_protection : 1;
|
unsigned needs_memory_protection : 1;
|
||||||
unsigned pty_needs_alloc_console : 1;
|
unsigned pty_needs_alloc_console : 1;
|
||||||
unsigned has_terminal_services : 1;
|
unsigned has_terminal_services : 1;
|
||||||
|
unsigned has_switch_to_thread : 1;
|
||||||
};
|
};
|
||||||
|
|
||||||
class wincapc
|
class wincapc
|
||||||
@ -106,6 +107,7 @@ public:
|
|||||||
bool IMPLEMENT (needs_memory_protection)
|
bool IMPLEMENT (needs_memory_protection)
|
||||||
bool IMPLEMENT (pty_needs_alloc_console)
|
bool IMPLEMENT (pty_needs_alloc_console)
|
||||||
bool IMPLEMENT (has_terminal_services)
|
bool IMPLEMENT (has_terminal_services)
|
||||||
|
bool IMPLEMENT (has_switch_to_thread)
|
||||||
|
|
||||||
#undef IMPLEMENT
|
#undef IMPLEMENT
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user