* cygtls.cc (_cygtls::set_state): Delete.
(_cygtls::reset_exception): Ditto.
(_cygtls::init_thread): Set initialized state directly here.
(_cygtls::push): Remove exception argument. Don't treat exceptions specially.
* cygtls.h (_cygtls::push): Ditto.
(_cygtls::isinitialized): Don't treat exceptions specially.
(_cygtls::reset_exception): Delete.
(_cygtls::set_state): Ditto.
(_cygtls::handle_exceptions): Don't push ebp on the stack prior to calling
sig_send. Just set incyg instead.
(_cygtls::interrupt_setup): Accommodate _cygtls::push argument change.
(_cygtls::interrupt_now): Ditto.
(setup_handler): Don't treat exceptions specially.
* gendef (longjmp): Always zero incyg flag.
+2005-12-05 Christopher Faylor <cgf@timesys.com>
+
+ Remove unneeded whitespace.
+ * cygtls.cc (_cygtls::set_state): Delete.
+ (_cygtls::reset_exception): Ditto.
+ (_cygtls::init_thread): Set initialized state directly here.
+ (_cygtls::push): Remove exception argument. Don't treat exceptions
+ specially.
+ * cygtls.h (_cygtls::push): Ditto.
+ (_cygtls::isinitialized): Don't treat exceptions specially.
+ (_cygtls::reset_exception): Delete.
+ (_cygtls::set_state): Ditto.
+ (_cygtls::handle_exceptions): Don't push ebp on the stack prior to
+ calling sig_send. Just set incyg instead.
+ (_cygtls::interrupt_setup): Accommodate _cygtls::push argument change.
+ (_cygtls::interrupt_now): Ditto.
+ (setup_handler): Don't treat exceptions specially.
+ * gendef (longjmp): Always zero incyg flag.
+
2005-12-04 Corinna Vinschen <corinna@vinschen.de>
* environ.cc (spenvs): Add "windir" as an "always export" variable
}
return console_count;
}
-
+
void
init_cygheap::close_ctty ()
{
sentry::lock.init ("sentry_lock");
}
-void
-_cygtls::set_state (bool is_exception)
-{
- initialized = CYGTLS_INITIALIZED + is_exception;
-}
-
-void
-_cygtls::reset_exception ()
-{
- if (initialized == CYGTLS_EXCEPTION)
- {
-#ifdef DEBUGGING
- debug_printf ("resetting stack after an exception stack %p, stackptr %p", stack, stackptr);
-#endif
- set_state (false);
- }
-}
-
/* Two calls to get the stack right... */
void
_cygtls::call (DWORD (*func) (void *, void *), void *arg)
init_exception_handler (handle_exceptions);
}
+ initialized = CYGTLS_INITIALIZED;
locals.exitsock = INVALID_SOCKET;
- set_state (false);
errno_addr = &(local_clib._errno);
if ((void *) func == (void *) cygthread::stub
}
void
-_cygtls::push (__stack_t addr, bool exception)
+_cygtls::push (__stack_t addr)
{
- if (exception)
- lock ();
*stackptr++ = (__stack_t) addr;
- if (exception)
- unlock ();
- set_state (exception);
}
#define BAD_IX ((size_t) -1)
#endif
#define CYGTLS_INITIALIZED 0x43227
-#define CYGTLS_EXCEPTION (0x43227 + true)
#define CYGTLSMAGIC "D0Ub313v31nm&G1c?";
#ifndef CYG_MAX_PATH
static void call2 (DWORD (*) (void *, void *), void *, void *) __attribute__ ((regparm (3)));
static struct _cygtls *find_tls (int sig);
void remove (DWORD);
- void push (__stack_t, bool) __attribute__ ((regparm (3)));
+ void push (__stack_t) __attribute__ ((regparm (2)));
__stack_t pop () __attribute__ ((regparm (1)));
- bool isinitialized () const {return initialized == CYGTLS_INITIALIZED || initialized == CYGTLS_EXCEPTION;}
- bool in_exception () const {return initialized == CYGTLS_EXCEPTION;}
- void set_state (bool);
- void reset_exception ();
+ bool isinitialized () const {return initialized == CYGTLS_INITIALIZED;}
bool interrupt_now (CONTEXT *, int, void *, struct sigaction&)
__attribute__((regparm(3)));
void __stdcall interrupt_setup (int sig, void *handler,
}
if (!res)
+#if 1
+ de->d_ino = 0;
+#else
{
/* Compute d_ino by combining filename hash with the directory hash
(which was stored in dir->__d_dirhash when opendir was called). */
}
de->__ino32 = de->d_ino; // for legacy applications
}
+#endif
return res;
}
si.si_addr = (void *) in->Eip;
si.si_errno = si.si_pid = si.si_uid = 0;
- me.push ((__stack_t) ebp, true);
+ me.incyg++;
sig_send (NULL, si, &me); // Signal myself
+ me.incyg--;
e->ExceptionFlags = 0;
return 0;
}
void __stdcall
_cygtls::interrupt_setup (int sig, void *handler, struct sigaction& siga)
{
- push ((__stack_t) sigdelayed, false);
+ push ((__stack_t) sigdelayed);
deltamask = (siga.sa_mask | SIGTOMASK (sig)) & ~SIG_NONMASKABLE;
sa_flags = siga.sa_flags;
func = (void (*) (int)) handler;
_cygtls::interrupt_now (CONTEXT *ctx, int sig, void *handler,
struct sigaction& siga)
{
- push ((__stack_t) ctx->Eip, false);
+ push ((__stack_t) ctx->Eip);
interrupt_setup (sig, handler, siga);
ctx->Eip = pop ();
SetThreadContext (*this, ctx); /* Restart the thread in a new location */
for (int i = 0; i < CALL_HANDLER_RETRY; i++)
{
tls->lock ();
- if (tls->incyg || tls->in_exception ())
+ if (tls->incyg)
{
- sigproc_printf ("controlled interrupt. incyg %d, exception %d, stackptr %p, stack %p, stackptr[-1] %p",
- tls->incyg, tls->in_exception (), tls->stackptr, tls->stack, tls->stackptr[-1]);
- tls->reset_exception ();
+ sigproc_printf ("controlled interrupt. stackptr %p, stack %p, stackptr[-1] %p",
+ tls->stackptr, tls->stack, tls->stackptr[-1]);
tls->interrupt_setup (sig, handler, siga);
interrupted = true;
tls->unlock ();
ResumeThread (hth);
break;
}
- if (tls->incyg || tls->in_exception () || tls->spinning || tls->locked ())
- sigproc_printf ("incyg %d, in_exception %d, spinning %d, locked %d\n",
- tls->incyg, tls->in_exception (), tls->spinning, tls->locked ());
+ if (tls->incyg || tls->spinning || tls->locked ())
+ sigproc_printf ("incyg %d, spinning %d, locked %d\n",
+ tls->incyg, tls->spinning, tls->locked ());
else
{
cx.ContextFlags = CONTEXT_CONTROL | CONTEXT_INTEGER;
handler = (void *) thissig.sa_handler;
else if (tls)
return 1;
- else
+ else
handler = NULL;
if (si.si_signo == SIGKILL)
movl 44(%edi),%eax # get old signal stack
movl %eax,$tls::stackptr(%ebx) # restore
decl $tls::stacklock(%ebx) # relinquish lock
+ xorl %eax,%eax
+ movl %eax,$tls::incyg(%ebx) # we're definitely not in cygwin anymore
movl 12(%ebp),%eax
testl %eax,%eax
BOOL (*VirtualProtEx)(HANDLE, PVOID, SIZE_T, DWORD, PDWORD);
};
-mmap_func_t mmap_funcs_9x =
+mmap_func_t mmap_funcs_9x =
{
CreateMapping9x,
MapView9x,
VirtualProtEx9x
};
-mmap_func_t mmap_funcs_nt =
+mmap_func_t mmap_funcs_nt =
{
CreateMappingNT,
MapViewNT,
fhandler_base *alloc_fh ();
void free_fh (fhandler_base *fh);
-
+
DWORD gen_protect (bool create = false) const
{ return ::gen_protect (get_prot (), get_flags (), create); }
DWORD gen_access () const
bool ret = false;
SetResourceLock (LOCK_MMAP_LIST, WRITE_LOCK | READ_LOCK, "mprotect");
-
+
/* Iterate through the map, protect pages between addr and addr+len
in all maps. */
list *map_list;
requested locking region fits in. Unfortunately I don't know
any function which would return the currently locked pages of
a process (no go with NtQueryVirtualMemory).
-
+
So, except for the border cases, what we do here is something
really embarrassing. We raise the working set by 64K at a time
and retry, until either we fail to raise the working set size
&& (mbi.Protect == PAGE_READWRITE
|| mbi.Protect == PAGE_EXECUTE_READWRITE))
{
- /* A PAGE_WRITECOPY page which has been written to is
+ /* A PAGE_WRITECOPY page which has been written to is
set to PAGE_READWRITE, but that's an incompatible
protection to set the page to. */
mbi.Protect &= ~PAGE_READWRITE;
The workaround is described in KB article 248611. Add a new
registry DWORD value HKLM/System/CurrentControlSet/Services/...
... Tcpip/Parameters/DisableUserTOSSetting, set to 0, and reboot.
-
+
FIXME: Maybe we should simply fake that IP_TOS could be set
successfully, if DisableUserTOSSetting is not set to 0 on W2K
and above? */