diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2006-07-25 17:02:36 +0000 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2006-07-25 17:02:36 +0000 |
commit | 79097ba627bfef4357a686d4186062f1a5f0ee09 (patch) | |
tree | 71717aba04d49492f531b3eac4c4162771875cd7 | |
parent | 5a594c2b199e8a7ef90ebd2be88bc4e0194c2eee (diff) | |
download | newlib-79097ba627bfef4357a686d4186062f1a5f0ee09.zip newlib-79097ba627bfef4357a686d4186062f1a5f0ee09.tar.gz newlib-79097ba627bfef4357a686d4186062f1a5f0ee09.tar.bz2 |
* cygtls.h: Drop socket related includes.
(struct _local_storage): Remove exitsock and exitsock_sin. Add
select_sockevt.
* cygtls.cc: Accomodate above change throughout.
* fhandler.h (class fhandler_socket): Make wsock_evt public.
* fhandler_socket.cc (fhandler_socket::fhandler_socket): Accomodate
reordering members.
(fhandler_socket::evaluate_events): Drop FD_CONNECT event as soon as
it gets read once. Never remove FD_WRITE event here.
(fhandler_socket::wait_for_events): Wait 50 ms instead of INFINITE for
socket events.
(fhandler_socket::accept): Fix conditional. Set wsock_events members
of accepted socket to useful start values.
(fhandler_socket::recv_internal): Always drop FD_READ/FD_OOB events from
wsock_events after the call to WSARecvFrom.
(fhandler_socket::send_internal): Drop FD_WRITE event from wsock_events
if the call to WSASendTo fails with WSAEWOULDBLOCK. Fix return value
condition.
* select.cc (struct socketinf): Change to accomodate using socket event
handling.
(peek_socket): Use event handling for peeking socket.
(thread_socket): Ditto.
(start_thread_socket): Ditto.
(socket_cleanup): Same here.
* tlsoffsets.h: Regenerate.
-rw-r--r-- | winsup/cygwin/ChangeLog | 28 | ||||
-rw-r--r-- | winsup/cygwin/cygtls.cc | 12 | ||||
-rw-r--r-- | winsup/cygwin/cygtls.h | 7 | ||||
-rw-r--r-- | winsup/cygwin/fhandler.h | 6 | ||||
-rw-r--r-- | winsup/cygwin/fhandler_socket.cc | 62 | ||||
-rw-r--r-- | winsup/cygwin/select.cc | 213 | ||||
-rw-r--r-- | winsup/cygwin/tlsoffsets.h | 98 |
7 files changed, 193 insertions, 233 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 9b6a3f2..144957a 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,31 @@ +2006-07-25 Corinna Vinschen <corinna@vinschen.de> + + * cygtls.h: Drop socket related includes. + (struct _local_storage): Remove exitsock and exitsock_sin. Add + select_sockevt. + * cygtls.cc: Accomodate above change throughout. + * fhandler.h (class fhandler_socket): Make wsock_evt public. + * fhandler_socket.cc (fhandler_socket::fhandler_socket): Accomodate + reordering members. + (fhandler_socket::evaluate_events): Drop FD_CONNECT event as soon as + it gets read once. Never remove FD_WRITE event here. + (fhandler_socket::wait_for_events): Wait 50 ms instead of INFINITE for + socket events. + (fhandler_socket::accept): Fix conditional. Set wsock_events members + of accepted socket to useful start values. + (fhandler_socket::recv_internal): Always drop FD_READ/FD_OOB events from + wsock_events after the call to WSARecvFrom. + (fhandler_socket::send_internal): Drop FD_WRITE event from wsock_events + if the call to WSASendTo fails with WSAEWOULDBLOCK. Fix return value + condition. + * select.cc (struct socketinf): Change to accomodate using socket event + handling. + (peek_socket): Use event handling for peeking socket. + (thread_socket): Ditto. + (start_thread_socket): Ditto. + (socket_cleanup): Same here. + * tlsoffsets.h: Regenerate. + 2006-07-23 Christopher Faylor <cgf@timesys.com> * include/cygwin/version.h: Bump DLL minor version number to 22. diff --git a/winsup/cygwin/cygtls.cc b/winsup/cygwin/cygtls.cc index e03175a..ce794cd 100644 --- a/winsup/cygwin/cygtls.cc +++ b/winsup/cygwin/cygtls.cc @@ -106,7 +106,7 @@ _cygtls::init_thread (void *x, DWORD (*func) (void *, void *)) thread_id = GetCurrentThreadId (); initialized = CYGTLS_INITIALIZED; - locals.exitsock = INVALID_SOCKET; + locals.select_sockevt = INVALID_HANDLE_VALUE; errno_addr = &(local_clib._errno); if ((void *) func == (void *) cygthread::stub @@ -137,7 +137,7 @@ _cygtls::fixup_after_fork () sig = 0; } stacklock = spinning = 0; - locals.exitsock = INVALID_SOCKET; + locals.select_sockevt = INVALID_HANDLE_VALUE; wq.thread_ev = NULL; } @@ -152,7 +152,7 @@ void _cygtls::remove (DWORD wait) { initialized = 0; - if (!locals.exitsock || exit_state >= ES_FINAL) + if (!locals.select_sockevt || exit_state >= ES_FINAL) return; debug_printf ("wait %p", wait); @@ -160,10 +160,10 @@ _cygtls::remove (DWORD wait) { /* FIXME: Need some sort of atthreadexit function to allow things like select to control this themselves. */ - if (locals.exitsock != INVALID_SOCKET) + if (locals.select_sockevt != INVALID_HANDLE_VALUE) { - closesocket (locals.exitsock); - locals.exitsock = (SOCKET) NULL; + CloseHandle (locals.select_sockevt); + locals.select_sockevt = (HANDLE) NULL; } free_local (process_ident); free_local (ntoa_buf); diff --git a/winsup/cygwin/cygtls.h b/winsup/cygwin/cygtls.h index 97800a7..d42ccc6 100644 --- a/winsup/cygwin/cygtls.h +++ b/winsup/cygwin/cygtls.h @@ -18,10 +18,6 @@ details. */ #undef _NOMNTENT_FUNCS #include <setjmp.h> #include <exceptions.h> -#ifndef _WINSOCK_H -#include <netinet/in.h> -typedef unsigned int SOCKET; -#endif #define CYGTLS_INITIALIZED 0xc763173f @@ -69,8 +65,7 @@ struct _local_storage char mnt_dir[CYG_MAX_PATH]; /* select.cc */ - SOCKET exitsock; - struct sockaddr_in exitsock_sin; + HANDLE select_sockevt; /* strerror */ char strerror_buf[sizeof ("Unknown error 4294967295")]; diff --git a/winsup/cygwin/fhandler.h b/winsup/cygwin/fhandler.h index afcd6db..6468560 100644 --- a/winsup/cygwin/fhandler.h +++ b/winsup/cygwin/fhandler.h @@ -387,13 +387,13 @@ class fhandler_socket: public fhandler_base int type; int connect_secret[4]; - HANDLE wsock_mtx; - HANDLE wsock_evt; wsa_event *wsock_events; + HANDLE wsock_mtx; public: + HANDLE wsock_evt; bool init_events (); - private: int evaluate_events (const long event_mask, long &events, bool erase); + private: int wait_for_events (const long event_mask); void release_events (); diff --git a/winsup/cygwin/fhandler_socket.cc b/winsup/cygwin/fhandler_socket.cc index f20ee09..68cf8b5 100644 --- a/winsup/cygwin/fhandler_socket.cc +++ b/winsup/cygwin/fhandler_socket.cc @@ -130,9 +130,9 @@ get_inet_addr (const struct sockaddr *in, int inlen, fhandler_socket::fhandler_socket () : fhandler_base (), + wsock_events (NULL), wsock_mtx (NULL), wsock_evt (NULL), - wsock_events (NULL), sun_path (NULL), status () { @@ -540,9 +540,10 @@ fhandler_socket::evaluate_events (const long event_mask, long &events, ret = SOCKET_ERROR; } wsock_events->connect_errorcode = 0; + wsock_events->events &= ~FD_CONNECT; } if (erase) - wsock_events->events &= ~(events & ~FD_CLOSE); + wsock_events->events &= ~(events & ~(FD_WRITE | FD_CLOSE)); } UNLOCK_EVENTS; @@ -567,7 +568,7 @@ fhandler_socket::wait_for_events (const long event_mask) } WSAEVENT ev[2] = { wsock_evt, signal_arrived }; - switch (WSAWaitForMultipleEvents (2, ev, FALSE, INFINITE, FALSE)) + switch (WSAWaitForMultipleEvents (2, ev, FALSE, 50, FALSE)) { case WSA_WAIT_TIMEOUT: case WSA_WAIT_EVENT_0: @@ -1107,9 +1108,9 @@ fhandler_socket::accept (struct sockaddr *peer, int *len) int res = 0; while (!(res = wait_for_events (FD_ACCEPT | FD_CLOSE)) - && (res = ::accept (get_socket (), peer, len)) == WSAEWOULDBLOCK) + && (res = ::accept (get_socket (), peer, len)) == SOCKET_ERROR + && WSAGetLastError () == WSAEWOULDBLOCK) ; - if (res == (int) INVALID_SOCKET) set_winsock_errno (); else @@ -1140,6 +1141,9 @@ fhandler_socket::accept (struct sockaddr *peer, int *len) } } } + /* No locking necessary at this point. */ + sock->wsock_events->events = wsock_events->events | FD_WRITE; + sock->wsock_events->owner = wsock_events->owner; sock->connect_state (connected); res = res_fd; } @@ -1253,19 +1257,29 @@ fhandler_socket::recv_internal (WSABUF *wsabuf, DWORD wsacnt, DWORD flags, { ssize_t res = 0; DWORD ret = 0; + int evt_mask = FD_READ | ((flags & MSG_OOB) ? FD_OOB : 0); flags &= MSG_WINMASK; if (flags & MSG_PEEK) - res = WSARecvFrom (get_socket (), wsabuf, wsacnt, &ret, - &flags, from, fromlen, NULL, NULL); + { + LOCK_EVENTS; + res = WSARecvFrom (get_socket (), wsabuf, wsacnt, &ret, + &flags, from, fromlen, NULL, NULL); + wsock_events->events &= ~evt_mask; + UNLOCK_EVENTS; + } else { - int evt_mask = FD_READ | FD_CLOSE - | ((flags & MSG_OOB) ? FD_OOB : 0); - while ((res = WSARecvFrom (get_socket (), wsabuf, wsacnt, &ret, - &flags, from, fromlen, NULL, NULL)) == -1 - && WSAGetLastError () == WSAEWOULDBLOCK - && !(res = wait_for_events (evt_mask))) + do + { + LOCK_EVENTS; + res = WSARecvFrom (get_socket (), wsabuf, wsacnt, &ret, + &flags, from, fromlen, NULL, NULL); + wsock_events->events &= ~evt_mask; + UNLOCK_EVENTS; + } + while (res && WSAGetLastError () == WSAEWOULDBLOCK + && !(res = wait_for_events (evt_mask | FD_CLOSE))) ; } @@ -1355,15 +1369,23 @@ fhandler_socket::send_internal (struct _WSABUF *wsabuf, DWORD wsacnt, int flags, const struct sockaddr *to, int tolen) { int res = 0; - DWORD ret = 0; - while ((res = WSASendTo (get_socket (), wsabuf, wsacnt, &ret, - flags & MSG_WINMASK, to, tolen, NULL, NULL)) == -1 - && WSAGetLastError () == WSAEWOULDBLOCK - && !(res = wait_for_events (FD_WRITE | FD_CLOSE))) - ; + DWORD ret = 0, err = 0; + + do + { + LOCK_EVENTS; + if ((res = WSASendTo (get_socket (), wsabuf, wsacnt, &ret, + flags & MSG_WINMASK, to, tolen, NULL, NULL)) + && (err = WSAGetLastError ()) == WSAEWOULDBLOCK) + wsock_events->events &= ~FD_WRITE; + UNLOCK_EVENTS; + } + while (res && err && !(res = wait_for_events (FD_WRITE | FD_CLOSE))); if (res == SOCKET_ERROR) set_winsock_errno (); + else + res = ret; /* Special handling for EPIPE and SIGPIPE. @@ -1377,8 +1399,6 @@ fhandler_socket::send_internal (struct _WSABUF *wsabuf, DWORD wsacnt, int flags, if (! (flags & MSG_NOSIGNAL)) raise (SIGPIPE); } - else - res = ret; return res; } diff --git a/winsup/cygwin/select.cc b/winsup/cygwin/select.cc index 5383aa9..4df27b2 100644 --- a/winsup/cygwin/select.cc +++ b/winsup/cygwin/select.cc @@ -1260,105 +1260,69 @@ fhandler_base::select_except (select_record *s) return s; } -struct socketinf - { - cygthread *thread; - winsock_fd_set readfds, writefds, exceptfds; - SOCKET exitsock; - select_record *start; - }; - static int peek_socket (select_record *me, bool) { - winsock_fd_set ws_readfds, ws_writefds, ws_exceptfds; - struct timeval tv = {0, 0}; - WINSOCK_FD_ZERO (&ws_readfds); - WINSOCK_FD_ZERO (&ws_writefds); - WINSOCK_FD_ZERO (&ws_exceptfds); - - HANDLE h; - set_handle_or_return_if_not_open (h, me); - select_printf ("considering handle %p", h); - - if (me->read_selected && !me->read_ready) - { - select_printf ("adding read fd_set %s, fd %d", me->fh->get_name (), - me->fd); - WINSOCK_FD_SET (h, &ws_readfds); - } - if (me->write_selected && !me->write_ready) - { - select_printf ("adding write fd_set %s, fd %d", me->fh->get_name (), - me->fd); - WINSOCK_FD_SET (h, &ws_writefds); - } - if ((me->except_selected || me->except_on_write) && !me->except_ready) - { - select_printf ("adding except fd_set %s, fd %d", me->fh->get_name (), - me->fd); - WINSOCK_FD_SET (h, &ws_exceptfds); - } - int r; - if ((me->read_selected && !me->read_ready) - || (me->write_selected && !me->write_ready) - || ((me->except_selected || me->except_on_write) && !me->except_ready)) + fhandler_socket *fh = (fhandler_socket *) me->fh; + long events; + long evt_mask = (FD_CLOSE + | (me->read_selected ? (FD_READ | FD_ACCEPT) : 0) + | (me->write_selected ? (FD_WRITE | FD_CONNECT) : 0) + | (me->except_selected ? (FD_OOB | FD_CONNECT) : 0)); + int ret = fh->evaluate_events (evt_mask, events, false); + if (me->read_selected) + me->read_ready |= !!(events & (FD_READ | FD_ACCEPT | FD_CLOSE)); + if (me->write_selected) { - r = WINSOCK_SELECT (0, &ws_readfds, &ws_writefds, &ws_exceptfds, &tv); - select_printf ("WINSOCK_SELECT returned %d", r); - if (r == -1) - { - select_printf ("error %d", WSAGetLastError ()); - set_winsock_errno (); - return 0; - } - if (WINSOCK_FD_ISSET (h, &ws_readfds)) - me->read_ready = true; - if (WINSOCK_FD_ISSET (h, &ws_writefds)) + if ((events & FD_CONNECT) && !ret) me->write_ready = true; - if (WINSOCK_FD_ISSET (h, &ws_exceptfds)) - me->except_ready = true; + else + me->write_ready |= !!(events & (FD_WRITE | FD_CLOSE)); } + if (me->except_selected) + me->except_ready |= ret || !!(events & (FD_OOB | FD_CLOSE)); + return me->read_ready || me->write_ready || me->except_ready; } static int start_thread_socket (select_record *, select_stuff *); +struct socketinf + { + cygthread *thread; + int num_w4; + HANDLE w4[MAXIMUM_WAIT_OBJECTS]; + select_record *start; + }; + static DWORD WINAPI thread_socket (void *arg) { socketinf *si = (socketinf *) arg; + bool event = false; - select_printf ("stuff_start %p", &si->start); - int r = WINSOCK_SELECT (0, &si->readfds, &si->writefds, &si->exceptfds, NULL); - select_printf ("Win32 select returned %d", r); - if (r == -1) - select_printf ("error %d", WSAGetLastError ()); - select_record *s = si->start; - while ((s = s->next)) - if (s->startup == start_thread_socket) - { - HANDLE h = s->fh->get_handle (); - select_printf ("s %p, testing fd %d (%s)", s, s->fd, s->fh->get_name ()); - if (WINSOCK_FD_ISSET (h, &si->readfds)) - { - select_printf ("read_ready"); - s->read_ready = true; - } - if (WINSOCK_FD_ISSET (h, &si->writefds)) - { - select_printf ("write_ready"); - s->write_ready = true; - } - if (WINSOCK_FD_ISSET (h, &si->exceptfds)) + select_printf ("stuff_start %p", si->start); + while (!event) + { + for (select_record *s = si->start; (s = s->next); ) + if (s->startup == start_thread_socket) + if (peek_socket (s, false)) + event = true; + if (!event) + { + switch (WaitForMultipleObjects (si->num_w4, si->w4, FALSE, 50)) { - select_printf ("except_ready"); - s->except_ready = true; + case WAIT_OBJECT_0: + case WAIT_FAILED: + goto out; + case WAIT_TIMEOUT: + default: + break; } } - - if (WINSOCK_FD_ISSET (si->exitsock, &si->readfds)) - select_printf ("saw exitsock read"); + } +out: + select_printf ("leaving thread_socket"); return 0; } @@ -1374,68 +1338,29 @@ start_thread_socket (select_record *me, select_stuff *stuff) } si = new socketinf; - WINSOCK_FD_ZERO (&si->readfds); - WINSOCK_FD_ZERO (&si->writefds); - WINSOCK_FD_ZERO (&si->exceptfds); select_record *s = &stuff->start; + if (_my_tls.locals.select_sockevt != INVALID_HANDLE_VALUE) + si->w4[0] = _my_tls.locals.select_sockevt; + else if (!(si->w4[0] = CreateEvent (&sec_none_nih, TRUE, FALSE, NULL))) + return 1; + else + _my_tls.locals.select_sockevt = si->w4[0]; + si->num_w4 = 1; while ((s = s->next)) if (s->startup == start_thread_socket) { - HANDLE h = s->fh->get_handle (); - select_printf ("Handle %p", h); - if (s->read_selected && !s->read_ready) - { - WINSOCK_FD_SET (h, &si->readfds); - select_printf ("Added to readfds"); - } - if (s->write_selected && !s->write_ready) - { - WINSOCK_FD_SET (h, &si->writefds); - select_printf ("Added to writefds"); - } - if ((s->except_selected || s->except_on_write) && !s->except_ready) - { - WINSOCK_FD_SET (h, &si->exceptfds); - select_printf ("Added to exceptfds"); - } - } - - if (_my_tls.locals.exitsock != INVALID_SOCKET) - si->exitsock = _my_tls.locals.exitsock; - else - { - si->exitsock = socket (AF_INET, SOCK_DGRAM, IPPROTO_UDP); - if (si->exitsock == INVALID_SOCKET) - { - set_winsock_errno (); - select_printf ("cannot create socket, %E"); - return 0; - } - int sin_len = sizeof (_my_tls.locals.exitsock_sin); - memset (&_my_tls.locals.exitsock_sin, 0, sin_len); - _my_tls.locals.exitsock_sin.sin_family = AF_INET; - _my_tls.locals.exitsock_sin.sin_addr.s_addr = htonl (INADDR_LOOPBACK); - if (bind (si->exitsock, (struct sockaddr *) &_my_tls.locals.exitsock_sin, sin_len) < 0) - { - select_printf ("cannot bind socket %p, %E", si->exitsock); + HANDLE evt = ((fhandler_socket *) me->fh)->wsock_evt; + /* No event/socket should show up multiple times. */ + for (int i = 1; i < si->num_w4; ++i) + if (si->w4[i] == evt) + goto continue_outer_loop; + if (si->num_w4 < MAXIMUM_WAIT_OBJECTS) + si->w4[si->num_w4++] = evt; + else /* for now */ goto err; - } - - if (getsockname (si->exitsock, (struct sockaddr *) &_my_tls.locals.exitsock_sin, &sin_len) < 0) - { - select_printf ("getsockname error"); - goto err; - } - if (wincap.has_set_handle_information ()) - SetHandleInformation ((HANDLE) si->exitsock, HANDLE_FLAG_INHERIT, 0); - /* else - too bad? */ - select_printf ("opened new socket %p", si->exitsock); - _my_tls.locals.exitsock = si->exitsock; - } - - select_printf ("exitsock %p", si->exitsock); - WINSOCK_FD_SET ((HANDLE) si->exitsock, &si->readfds); + continue_outer_loop: + ; + } stuff->device_specific_socket = (void *) si; si->start = &stuff->start; select_printf ("stuff_start %p", &stuff->start); @@ -1444,8 +1369,7 @@ start_thread_socket (select_record *me, select_stuff *stuff) return 1; err: - set_winsock_errno (); - closesocket (si->exitsock); + CloseHandle (si->w4[0]); return 0; } @@ -1456,17 +1380,10 @@ socket_cleanup (select_record *, select_stuff *stuff) select_printf ("si %p si->thread %p", si, si ? si->thread : NULL); if (si && si->thread) { - char buf[] = ""; - int res = sendto (_my_tls.locals.exitsock, buf, 1, 0, - (sockaddr *) &_my_tls.locals.exitsock_sin, - sizeof (_my_tls.locals.exitsock_sin)); - select_printf ("sent a byte to exitsock %p, res %d", _my_tls.locals.exitsock, res); + SetEvent (si->w4[0]); /* Wait for thread to go away */ si->thread->detach (); - /* empty the socket */ - select_printf ("reading a byte from exitsock %p", si->exitsock); - res = recv (si->exitsock, buf, 1, 0); - select_printf ("recv returned %d", res); + ResetEvent (si->w4[0]); stuff->device_specific_socket = NULL; delete si; } diff --git a/winsup/cygwin/tlsoffsets.h b/winsup/cygwin/tlsoffsets.h index 3ee4822..5fa884e 100644 --- a/winsup/cygwin/tlsoffsets.h +++ b/winsup/cygwin/tlsoffsets.h @@ -1,6 +1,6 @@ //;# autogenerated: Do not edit. -//; $tls::sizeof__cygtls = 4212; +//; $tls::sizeof__cygtls = 4196; //; $tls::func = -12700; //; $tls::pfunc = 0; //; $tls::el = -12696; @@ -39,30 +39,30 @@ //; $tls::p__dontuse = 420; //; $tls::locals = -11216; //; $tls::plocals = 1484; -//; $tls::_ctinfo = -9584; -//; $tls::p_ctinfo = 3116; -//; $tls::andreas = -9580; -//; $tls::pandreas = 3120; -//; $tls::wq = -9572; -//; $tls::pwq = 3128; -//; $tls::prev = -9544; -//; $tls::pprev = 3156; -//; $tls::next = -9540; -//; $tls::pnext = 3160; -//; $tls::sig = -9536; -//; $tls::psig = 3164; -//; $tls::incyg = -9532; -//; $tls::pincyg = 3168; -//; $tls::spinning = -9528; -//; $tls::pspinning = 3172; -//; $tls::stacklock = -9524; -//; $tls::pstacklock = 3176; -//; $tls::stackptr = -9520; -//; $tls::pstackptr = 3180; -//; $tls::stack = -9516; -//; $tls::pstack = 3184; -//; $tls::initialized = -8492; -//; $tls::pinitialized = 4208; +//; $tls::_ctinfo = -9600; +//; $tls::p_ctinfo = 3100; +//; $tls::andreas = -9596; +//; $tls::pandreas = 3104; +//; $tls::wq = -9588; +//; $tls::pwq = 3112; +//; $tls::prev = -9560; +//; $tls::pprev = 3140; +//; $tls::next = -9556; +//; $tls::pnext = 3144; +//; $tls::sig = -9552; +//; $tls::psig = 3148; +//; $tls::incyg = -9548; +//; $tls::pincyg = 3152; +//; $tls::spinning = -9544; +//; $tls::pspinning = 3156; +//; $tls::stacklock = -9540; +//; $tls::pstacklock = 3160; +//; $tls::stackptr = -9536; +//; $tls::pstackptr = 3164; +//; $tls::stack = -9532; +//; $tls::pstack = 3168; +//; $tls::initialized = -8508; +//; $tls::pinitialized = 4192; //; __DATA__ #define tls_func (-12700) @@ -103,27 +103,27 @@ #define tls_p__dontuse (420) #define tls_locals (-11216) #define tls_plocals (1484) -#define tls__ctinfo (-9584) -#define tls_p_ctinfo (3116) -#define tls_andreas (-9580) -#define tls_pandreas (3120) -#define tls_wq (-9572) -#define tls_pwq (3128) -#define tls_prev (-9544) -#define tls_pprev (3156) -#define tls_next (-9540) -#define tls_pnext (3160) -#define tls_sig (-9536) -#define tls_psig (3164) -#define tls_incyg (-9532) -#define tls_pincyg (3168) -#define tls_spinning (-9528) -#define tls_pspinning (3172) -#define tls_stacklock (-9524) -#define tls_pstacklock (3176) -#define tls_stackptr (-9520) -#define tls_pstackptr (3180) -#define tls_stack (-9516) -#define tls_pstack (3184) -#define tls_initialized (-8492) -#define tls_pinitialized (4208) +#define tls__ctinfo (-9600) +#define tls_p_ctinfo (3100) +#define tls_andreas (-9596) +#define tls_pandreas (3104) +#define tls_wq (-9588) +#define tls_pwq (3112) +#define tls_prev (-9560) +#define tls_pprev (3140) +#define tls_next (-9556) +#define tls_pnext (3144) +#define tls_sig (-9552) +#define tls_psig (3148) +#define tls_incyg (-9548) +#define tls_pincyg (3152) +#define tls_spinning (-9544) +#define tls_pspinning (3156) +#define tls_stacklock (-9540) +#define tls_pstacklock (3160) +#define tls_stackptr (-9536) +#define tls_pstackptr (3164) +#define tls_stack (-9532) +#define tls_pstack (3168) +#define tls_initialized (-8508) +#define tls_pinitialized (4192) |