* cygtls.h (exitsock): New element.

(exitsock_sin): Ditto.
* cygtls.cc (_cygtls::init_thread): Initialize exitsock to invalid handle.
(_cygtls::call2): Close exitsock if it is valid.
* select.cc (struct socketinf): Remove sin element.
(start_thread_socket): Initialize one SOCK_DGRAM socket per thread instead of
(apparently) expensive opening and closing of socket with each select call.
(socket_cleanup): Send a byte to the exitsock socket as a way to potentially
signal a waiting-for-socket thread to exit.
* tlsoffsets.h: Regenerate.
This commit is contained in:
Christopher Faylor 2004-10-11 02:21:31 +00:00
parent 8d712c8c3e
commit 1cda132258
5 changed files with 137 additions and 127 deletions

View File

@ -1,9 +1,23 @@
2004-10-10 Christopher Faylor <cgf@timesys.com>
* cygtls.h (exitsock): New element.
(exitsock_sin): Ditto.
* cygtls.cc (_cygtls::init_thread): Initialize exitsock to invalid handle.
(_cygtls::call2): Close exitsock if it is valid.
* select.cc (struct socketinf): Remove sin element.
(start_thread_socket): Initialize one SOCK_DGRAM socket per thread
instead of (apparently) expensive opening and closing of socket with
each select call.
(socket_cleanup): Send a byte to the exitsock socket as a way to
potentially signal a waiting-for-socket thread to exit.
* tlsoffsets.h: Regenerate.
2004-10-07 Corinna Vinschen <corinna@vinschen.de> 2004-10-07 Corinna Vinschen <corinna@vinschen.de>
* cygheap.h (class cygheap_user): Add psystemroot member and * cygheap.h (class cygheap_user): Add psystemroot member and
env_systemroot method. env_systemroot method.
* environ.cc (struct spenv): Add add_always member. * environ.cc (struct spenv): Add add_always member.
(spenvs): Accomodate new add_always member. Add (spenvs): Accommodate new add_always member. Add
cygheap_user::env_systemroot method to SYSTEMROOT entry. cygheap_user::env_systemroot method to SYSTEMROOT entry.
(build_env): Check add_always member when adding missing environment (build_env): Check add_always member when adding missing environment
variables from spenvs. variables from spenvs.
@ -46,7 +60,7 @@
(path_conv::isdisk): Delete method. (path_conv::isdisk): Delete method.
(path_conv::set_isdisk): Ditto. (path_conv::set_isdisk): Ditto.
* path.cc (path_conv::check): Do not call set_isdisk. * path.cc (path_conv::check): Do not call set_isdisk.
* uinfo.cc(pwdgrp::load): Do not call pc.isdisk. * uinfo.cc(pwdgrp::load): Do not call pc.isdisk.
2004-09-28 Christopher Faylor <cgf@timesys.com> 2004-09-28 Christopher Faylor <cgf@timesys.com>
@ -1029,7 +1043,7 @@
* fhandler_tape.cc (mtinfo_drive::_set_pos): Take additional dont_wait * fhandler_tape.cc (mtinfo_drive::_set_pos): Take additional dont_wait
parameter. Use in call to SetTapePosition. parameter. Use in call to SetTapePosition.
(mtinfo_drive::set_pos): Accomodate _set_pos calls to above change. (mtinfo_drive::set_pos): Accommodate _set_pos calls to above change.
(mtinfo_drive::set_partition): Ditto. (mtinfo_drive::set_partition): Ditto.
* mtinfo.h (mtinfo_drive::_set_pos): Change declaration accordingly. * mtinfo.h (mtinfo_drive::_set_pos): Change declaration accordingly.
@ -1119,7 +1133,7 @@
2004-04-14 Corinna Vinschen <corinna@vinschen.de> 2004-04-14 Corinna Vinschen <corinna@vinschen.de>
* fhandler.cc (fhandler_base::open): Accomodate query_write_control * fhandler.cc (fhandler_base::open): Accommodate query_write_control
query_state. query_state.
(fhandler_base::fchown): New method. (fhandler_base::fchown): New method.
* fhandler.h: Declare fchown method in fhandler_base, * fhandler.h: Declare fchown method in fhandler_base,
@ -1305,7 +1319,7 @@
(fhandler_disk_file::readdir): Use pc.isencoded() directly. (fhandler_disk_file::readdir): Use pc.isencoded() directly.
* mtinfo.h (class mtinfo_drive): Const'ify all read accessor methods. * mtinfo.h (class mtinfo_drive): Const'ify all read accessor methods.
* path.cc (fsinfo_cnt): Add. * path.cc (fsinfo_cnt): Add.
(fs_info::update): Accomodate class changes. Evaluate file system (fs_info::update): Accommodate class changes. Evaluate file system
name specific flags right here. Add thread safety for reading and name specific flags right here. Add thread safety for reading and
writing global fsinfo array. writing global fsinfo array.
* path.h (enum path_types): Drop values for flags kept in fs already. * path.h (enum path_types): Drop values for flags kept in fs already.
@ -1394,7 +1408,7 @@
(fhandler_base::open_status): Ditto. (fhandler_base::open_status): Ditto.
(class fhandler_socket): Move status bits into private bitfield struct (class fhandler_socket): Move status bits into private bitfield struct
type status_flags. Change accessor methods appropriately. type status_flags. Change accessor methods appropriately.
* fhandler_socket.cc (fhandler_socket::fhandler_socket): Accomodate * fhandler_socket.cc (fhandler_socket::fhandler_socket): Accommodate
above status bit changes. above status bit changes.
* tty.h: Remove status bit enumerator. * tty.h: Remove status bit enumerator.
(TTYISSETF): Remove. (TTYISSETF): Remove.
@ -1414,7 +1428,7 @@
* fhandler.cc (fhandler_base::write): Use bool parameter in calls to * fhandler.cc (fhandler_base::write): Use bool parameter in calls to
set_did_lseek. set_did_lseek.
(fhandler_base::fhandler_base): Accomodate new status and open_status (fhandler_base::fhandler_base): Accommodate new status and open_status
constructor. constructor.
* fhandler.h: Remove status bit enumerator. * fhandler.h: Remove status bit enumerator.
(FHDEVN): Remove. (FHDEVN): Remove.
@ -1426,10 +1440,10 @@
(UNCONNECTED, CONNECT_PENDING, CONNECTED): Substitute by enum (UNCONNECTED, CONNECT_PENDING, CONNECTED): Substitute by enum
connect_state. connect_state.
(fhandler_base::status): Define as bitfield struct type status_flags. (fhandler_base::status): Define as bitfield struct type status_flags.
Remove unused flags entirely. Accomodate all status access methods. Remove unused flags entirely. Accommodate all status access methods.
(open_status): Define as bitfield struct type status_flags. (open_status): Define as bitfield struct type status_flags.
(fhandler_socket): Move socket related status bits to here. Redefine (fhandler_socket): Move socket related status bits to here. Redefine
had_connect_or_listen to be part of these status bits. Accomodate had_connect_or_listen to be part of these status bits. Accommodate
related access methods. related access methods.
* fhandler_disk_file.cc (fhandler_base::fstat_helper): Use pc.issymlink * fhandler_disk_file.cc (fhandler_base::fstat_helper): Use pc.issymlink
instead of dropped method get_symlink_p. instead of dropped method get_symlink_p.
@ -1476,7 +1490,7 @@
to allow calling get_nt_object_attribute in case a non-NULL handle to allow calling get_nt_object_attribute in case a non-NULL handle
is given. is given.
* security.h (get_file_attribute): Add handle to argument list. * security.h (get_file_attribute): Add handle to argument list.
* syscalls.cc (chown_worker): Accomodate new definition of * syscalls.cc (chown_worker): Accommodate new definition of
get_file_attribute. get_file_attribute.
2004-04-07 Pierre Humblet <pierre.humblet@ieee.org> 2004-04-07 Pierre Humblet <pierre.humblet@ieee.org>
@ -1624,7 +1638,7 @@
* net.cc (wsock_event::prepare): Reimplement using asynchronous I/O. * net.cc (wsock_event::prepare): Reimplement using asynchronous I/O.
(wsock_event::wait): Ditto. (wsock_event::wait): Ditto.
(wsock_event::release): New method. (wsock_event::release): New method.
* wsock_event.h (class wsock_event): Remove ovr member. Accomodate * wsock_event.h (class wsock_event): Remove ovr member. Accommodate
new implementation of prepare and wait methods. Add release method. new implementation of prepare and wait methods. Add release method.
2004-03-29 Thomas Pfaff <tpfaff@gmx.net> 2004-03-29 Thomas Pfaff <tpfaff@gmx.net>
@ -1926,7 +1940,7 @@
Handle ERROR_FILEMARK_DETECTED. Handle ERROR_FILEMARK_DETECTED.
* fhandler_tape.cc (TAPE_FUNC): Add comment that ERROR_BUS_RESET * fhandler_tape.cc (TAPE_FUNC): Add comment that ERROR_BUS_RESET
has still to be handled correctly. has still to be handled correctly.
(fhandler_dev_tape::open): Accomodate fact that get.mt_dsreg (fhandler_dev_tape::open): Accommodate fact that get.mt_dsreg
also contains density code. also contains density code.
(fhandler_dev_tape::ioctl): Rearrange slightly. Reset devbuf also on (fhandler_dev_tape::ioctl): Rearrange slightly. Reset devbuf also on
MTNOP, MTWSM, MTSETBLK, MTSETDRVBUFFER, MTSETPART and MTMKPART. MTNOP, MTWSM, MTSETBLK, MTSETDRVBUFFER, MTSETPART and MTMKPART.
@ -1975,12 +1989,12 @@
* fhandler_raw.cc (fhandler_dev_raw::write_file): New method, created * fhandler_raw.cc (fhandler_dev_raw::write_file): New method, created
from former static function. from former static function.
(fhandler_dev_raw::read_file): Ditto. (fhandler_dev_raw::read_file): Ditto.
(fhandler_dev_raw::writebuf): Accomodate the fact that no devbuf (fhandler_dev_raw::writebuf): Accommodate the fact that no devbuf
exists under variable block size condition. exists under variable block size condition.
(fhandler_dev_raw::raw_read): Ditto. Add local p pointer to simplify (fhandler_dev_raw::raw_read): Ditto. Add local p pointer to simplify
pointer arithmetic. pointer arithmetic.
(fhandler_dev_raw::raw_write): Always set devbufend to 0 when starting (fhandler_dev_raw::raw_write): Always set devbufend to 0 when starting
with writing. Accomodate the fact that no devbuf exists under with writing. Accommodate the fact that no devbuf exists under
variable block size condition. variable block size condition.
* fhandler_tape.cc: Various formatting changes. * fhandler_tape.cc: Various formatting changes.
(TAPE_FUNC): New macro. Use throughout as tape function loop. (TAPE_FUNC): New macro. Use throughout as tape function loop.
@ -2014,7 +2028,7 @@
(fhandler_dev_tape::tape_set_blocksize): Don't call tape_get_blocksize. (fhandler_dev_tape::tape_set_blocksize): Don't call tape_get_blocksize.
Error handling already done in fhandler_dev_tape::ioctl. Error handling already done in fhandler_dev_tape::ioctl.
(fhandler_dev_tape::tape_status): Remove local `dp' variable. (fhandler_dev_tape::tape_status): Remove local `dp' variable.
Accomodate logical tape reporting. Call tape_get_feature instead Accommodate logical tape reporting. Call tape_get_feature instead
of accessing feature words directly. of accessing feature words directly.
(fhandler_dev_tape::tape_compression): Use dp instead of calling (fhandler_dev_tape::tape_compression): Use dp instead of calling
GetTapeParameters. Fix resetting datcompression. GetTapeParameters. Fix resetting datcompression.
@ -2244,7 +2258,7 @@
* thread.cc (pthread::cancelable_wait): Rearrange slightly. * thread.cc (pthread::cancelable_wait): Rearrange slightly.
Add do_sig_wait parameter. Wait for signal_arrived if set to true. Add do_sig_wait parameter. Wait for signal_arrived if set to true.
Return WAIT_SIGNALED if signal arrived. Return WAIT_SIGNALED if signal arrived.
(pthread_cond::wait): Accomodate change to pthread::cancelable_wait. (pthread_cond::wait): Accommodate change to pthread::cancelable_wait.
(pthread::join): Ditto. (pthread::join): Ditto.
(semaphore::_timedwait): Ditto. (semaphore::_timedwait): Ditto.
(semaphore::_wait): Ditto. Change to return int to allow status (semaphore::_wait): Ditto. Change to return int to allow status

View File

@ -92,6 +92,10 @@ _cygtls::call2 (DWORD (*func) (void *, void *), void *arg, void *buf)
_my_tls.init_thread (buf, func); _my_tls.init_thread (buf, func);
DWORD res = func (arg, buf); DWORD res = func (arg, buf);
_my_tls.remove (INFINITE); _my_tls.remove (INFINITE);
// FIXME: Need some sort of atthreadexit function to allow things like
// select to control this themselves
if (_my_tls.locals.exitsock != INVALID_SOCKET)
closesocket (_my_tls.locals.exitsock);
ExitThread (res); ExitThread (res);
} }
@ -114,6 +118,7 @@ _cygtls::init_thread (void *x, DWORD (*func) (void *, void *))
} }
local_clib._current_locale = "C"; local_clib._current_locale = "C";
locals.process_logmask = LOG_UPTO (LOG_DEBUG); locals.process_logmask = LOG_UPTO (LOG_DEBUG);
locals.exitsock = INVALID_SOCKET;
} }
set_state (false); set_state (false);

View File

@ -16,6 +16,8 @@ details. */
#define _NOMNTENT_FUNCS #define _NOMNTENT_FUNCS
#include <mntent.h> #include <mntent.h>
#undef _NOMNTENT_FUNCS #undef _NOMNTENT_FUNCS
#define USE_SYS_TYPES_FD_SET
#include <winsock.h>
#define CYGTLS_INITIALIZED 0x43227 #define CYGTLS_INITIALIZED 0x43227
#define CYGTLS_EXCEPTION (0x43227 + true) #define CYGTLS_EXCEPTION (0x43227 + true)
@ -61,6 +63,10 @@ struct _local_storage
char mnt_fsname[CYG_MAX_PATH]; char mnt_fsname[CYG_MAX_PATH];
char mnt_dir[CYG_MAX_PATH]; char mnt_dir[CYG_MAX_PATH];
/* select.cc */
SOCKET exitsock;
struct sockaddr_in exitsock_sin;
/* strerror */ /* strerror */
char strerror_buf[20]; char strerror_buf[20];

View File

@ -11,11 +11,8 @@ 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. */
/* /* The following line means that the BSD socket definitions for
* The following line means that the BSD socket fd_set, FD_ISSET etc. are used in this file. */
* definitions for fd_set, FD_ISSET etc. are used in this
* file.
*/
#define __INSIDE_CYGWIN_NET__ #define __INSIDE_CYGWIN_NET__
@ -43,6 +40,8 @@ details. */
#include "tty.h" #include "tty.h"
#include "cygthread.h" #include "cygthread.h"
#include "ntdll.h" #include "ntdll.h"
#include "cygtls.h"
#include <asm/byteorder.h>
/* /*
* All these defines below should be in sys/types.h * All these defines below should be in sys/types.h
@ -1211,7 +1210,6 @@ struct socketinf
cygthread *thread; cygthread *thread;
winsock_fd_set readfds, writefds, exceptfds; winsock_fd_set readfds, writefds, exceptfds;
SOCKET exitsock; SOCKET exitsock;
struct sockaddr_in sin;
select_record *start; select_record *start;
}; };
@ -1306,12 +1304,9 @@ thread_socket (void *arg)
if (WINSOCK_FD_ISSET (si->exitsock, &si->readfds)) if (WINSOCK_FD_ISSET (si->exitsock, &si->readfds))
select_printf ("saw exitsock read"); select_printf ("saw exitsock read");
return 0; return 0;
} }
extern "C" unsigned long htonl (unsigned long);
static int static int
start_thread_socket (select_record *me, select_stuff *stuff) start_thread_socket (select_record *me, select_stuff *stuff)
{ {
@ -1350,36 +1345,43 @@ start_thread_socket (select_record *me, select_stuff *stuff)
} }
} }
if ((si->exitsock = socket (PF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) if (_my_tls.locals.exitsock != INVALID_SOCKET)
{ {
set_winsock_errno (); char buf[1];
select_printf ("cannot create socket, %E"); si->exitsock = _my_tls.locals.exitsock;
return -1; select_printf ("read a byte from %p", si->exitsock);
recv (si->exitsock, buf, 1, 0);
} }
/* Allow rapid reuse of the port. */ else
int tmp = 1;
(void) setsockopt (si->exitsock, SOL_SOCKET, SO_REUSEADDR, (char *) &tmp, sizeof (tmp));
int sin_len = sizeof (si->sin);
memset (&si->sin, 0, sizeof (si->sin));
si->sin.sin_family = AF_INET;
si->sin.sin_addr.s_addr = htonl (INADDR_LOOPBACK);
if (bind (si->exitsock, (struct sockaddr *) &si->sin, sizeof (si->sin)) < 0)
{ {
select_printf ("cannot bind socket, %E"); si->exitsock = _my_tls.locals.exitsock = socket (AF_INET, SOCK_DGRAM, IPPROTO_UDP);
goto err; if (_my_tls.locals.exitsock == INVALID_SOCKET)
} {
set_winsock_errno ();
select_printf ("cannot create socket, %E");
return -1;
}
#if 0
/* Allow rapid reuse of the port. */
int tmp = 1;
(void) setsockopt (si->exitsock, SOL_SOCKET, SO_REUSEADDR, (char *) &tmp, sizeof (tmp));
#endif
if (getsockname (si->exitsock, (struct sockaddr *) &si->sin, &sin_len) < 0) int sin_len = sizeof (_my_tls.locals.exitsock_sin);
{ memset (&_my_tls.locals.exitsock_sin, 0, sin_len);
select_printf ("getsockname error"); _my_tls.locals.exitsock_sin.sin_family = AF_INET;
goto err; _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);
goto err;
}
if (listen (si->exitsock, 1)) if (getsockname (si->exitsock, (struct sockaddr *) &_my_tls.locals.exitsock_sin, &sin_len) < 0)
{ {
select_printf ("listen failed, %E"); select_printf ("getsockname error");
goto err; goto err;
}
} }
select_printf ("exitsock %p", si->exitsock); select_printf ("exitsock %p", si->exitsock);
@ -1405,30 +1407,13 @@ socket_cleanup (select_record *, select_stuff *stuff)
select_printf ("si %p si->thread %p", si, si ? si->thread : NULL); select_printf ("si %p si->thread %p", si, si ? si->thread : NULL);
if (si && si->thread) if (si && si->thread)
{ {
select_printf ("connection to si->exitsock %p", si->exitsock); char buf[] = "";
SOCKET s = socket (AF_INET, SOCK_STREAM, 0); int res = sendto (_my_tls.locals.exitsock, buf, 1, 0,
(sockaddr *) &_my_tls.locals.exitsock_sin,
/* Set LINGER with 0 timeout for hard close */ sizeof (_my_tls.locals.exitsock_sin));
struct linger tmp = {1, 0}; /* On, 0 delay */ select_printf ("sent a byte to the exit sock %p, res %d", _my_tls.locals.exitsock, res);
(void) setsockopt (s, SOL_SOCKET, SO_LINGER, (char *)&tmp, sizeof (tmp));
(void) setsockopt (si->exitsock, SOL_SOCKET, SO_LINGER, (char *)&tmp, sizeof (tmp));
/* Connecting to si->exitsock will cause any executing select to wake
up. When this happens then the exitsock condition will cause the
thread to terminate. */
if (connect (s, (struct sockaddr *) &si->sin, sizeof (si->sin)) < 0)
{
set_winsock_errno ();
select_printf ("connect failed");
/* FIXME: now what? */
}
shutdown (s, SD_BOTH);
closesocket (s);
/* Wait for thread to go away */ /* Wait for thread to go away */
si->thread->detach (); si->thread->detach ();
shutdown (si->exitsock, SD_BOTH);
closesocket (si->exitsock);
stuff->device_specific_socket = NULL; stuff->device_specific_socket = NULL;
delete si; delete si;
} }

View File

@ -1,113 +1,113 @@
//;# autogenerated: Do not edit. //;# autogenerated: Do not edit.
//; $tls::sizeof__cygtls = 3912; //; $tls::sizeof__cygtls = 3932;
//; $tls::func = -3912; //; $tls::func = -3932;
//; $tls::pfunc = 0; //; $tls::pfunc = 0;
//; $tls::saved_errno = -3908; //; $tls::saved_errno = -3928;
//; $tls::psaved_errno = 4; //; $tls::psaved_errno = 4;
//; $tls::sa_flags = -3904; //; $tls::sa_flags = -3924;
//; $tls::psa_flags = 8; //; $tls::psa_flags = 8;
//; $tls::oldmask = -3900; //; $tls::oldmask = -3920;
//; $tls::poldmask = 12; //; $tls::poldmask = 12;
//; $tls::deltamask = -3896; //; $tls::deltamask = -3916;
//; $tls::pdeltamask = 16; //; $tls::pdeltamask = 16;
//; $tls::event = -3892; //; $tls::event = -3912;
//; $tls::pevent = 20; //; $tls::pevent = 20;
//; $tls::errno_addr = -3888; //; $tls::errno_addr = -3908;
//; $tls::perrno_addr = 24; //; $tls::perrno_addr = 24;
//; $tls::initialized = -3884; //; $tls::initialized = -3904;
//; $tls::pinitialized = 28; //; $tls::pinitialized = 28;
//; $tls::sigmask = -3880; //; $tls::sigmask = -3900;
//; $tls::psigmask = 32; //; $tls::psigmask = 32;
//; $tls::sigwait_mask = -3876; //; $tls::sigwait_mask = -3896;
//; $tls::psigwait_mask = 36; //; $tls::psigwait_mask = 36;
//; $tls::sigwait_info = -3872; //; $tls::sigwait_info = -3892;
//; $tls::psigwait_info = 40; //; $tls::psigwait_info = 40;
//; $tls::threadkill = -3868; //; $tls::threadkill = -3888;
//; $tls::pthreadkill = 44; //; $tls::pthreadkill = 44;
//; $tls::infodata = -3864; //; $tls::infodata = -3884;
//; $tls::pinfodata = 48; //; $tls::pinfodata = 48;
//; $tls::tid = -3716; //; $tls::tid = -3736;
//; $tls::ptid = 196; //; $tls::ptid = 196;
//; $tls::local_clib = -3712; //; $tls::local_clib = -3732;
//; $tls::plocal_clib = 200; //; $tls::plocal_clib = 200;
//; $tls::__dontuse = -3712; //; $tls::__dontuse = -3732;
//; $tls::p__dontuse = 200; //; $tls::p__dontuse = 200;
//; $tls::locals = -2648; //; $tls::locals = -2668;
//; $tls::plocals = 1264; //; $tls::plocals = 1264;
//; $tls::wq = -1080; //; $tls::wq = -1080;
//; $tls::pwq = 2832; //; $tls::pwq = 2852;
//; $tls::prev = -1052; //; $tls::prev = -1052;
//; $tls::pprev = 2860; //; $tls::pprev = 2880;
//; $tls::next = -1048; //; $tls::next = -1048;
//; $tls::pnext = 2864; //; $tls::pnext = 2884;
//; $tls::stackptr = -1044; //; $tls::stackptr = -1044;
//; $tls::pstackptr = 2868; //; $tls::pstackptr = 2888;
//; $tls::sig = -1040; //; $tls::sig = -1040;
//; $tls::psig = 2872; //; $tls::psig = 2892;
//; $tls::incyg = -1036; //; $tls::incyg = -1036;
//; $tls::pincyg = 2876; //; $tls::pincyg = 2896;
//; $tls::spinning = -1032; //; $tls::spinning = -1032;
//; $tls::pspinning = 2880; //; $tls::pspinning = 2900;
//; $tls::stacklock = -1028; //; $tls::stacklock = -1028;
//; $tls::pstacklock = 2884; //; $tls::pstacklock = 2904;
//; $tls::stack = -1024; //; $tls::stack = -1024;
//; $tls::pstack = 2888; //; $tls::pstack = 2908;
//; $tls::padding = 0; //; $tls::padding = 0;
//; $tls::ppadding = 3912; //; $tls::ppadding = 3932;
//; __DATA__ //; __DATA__
#define tls_func (-3912) #define tls_func (-3932)
#define tls_pfunc (0) #define tls_pfunc (0)
#define tls_saved_errno (-3908) #define tls_saved_errno (-3928)
#define tls_psaved_errno (4) #define tls_psaved_errno (4)
#define tls_sa_flags (-3904) #define tls_sa_flags (-3924)
#define tls_psa_flags (8) #define tls_psa_flags (8)
#define tls_oldmask (-3900) #define tls_oldmask (-3920)
#define tls_poldmask (12) #define tls_poldmask (12)
#define tls_deltamask (-3896) #define tls_deltamask (-3916)
#define tls_pdeltamask (16) #define tls_pdeltamask (16)
#define tls_event (-3892) #define tls_event (-3912)
#define tls_pevent (20) #define tls_pevent (20)
#define tls_errno_addr (-3888) #define tls_errno_addr (-3908)
#define tls_perrno_addr (24) #define tls_perrno_addr (24)
#define tls_initialized (-3884) #define tls_initialized (-3904)
#define tls_pinitialized (28) #define tls_pinitialized (28)
#define tls_sigmask (-3880) #define tls_sigmask (-3900)
#define tls_psigmask (32) #define tls_psigmask (32)
#define tls_sigwait_mask (-3876) #define tls_sigwait_mask (-3896)
#define tls_psigwait_mask (36) #define tls_psigwait_mask (36)
#define tls_sigwait_info (-3872) #define tls_sigwait_info (-3892)
#define tls_psigwait_info (40) #define tls_psigwait_info (40)
#define tls_threadkill (-3868) #define tls_threadkill (-3888)
#define tls_pthreadkill (44) #define tls_pthreadkill (44)
#define tls_infodata (-3864) #define tls_infodata (-3884)
#define tls_pinfodata (48) #define tls_pinfodata (48)
#define tls_tid (-3716) #define tls_tid (-3736)
#define tls_ptid (196) #define tls_ptid (196)
#define tls_local_clib (-3712) #define tls_local_clib (-3732)
#define tls_plocal_clib (200) #define tls_plocal_clib (200)
#define tls___dontuse (-3712) #define tls___dontuse (-3732)
#define tls_p__dontuse (200) #define tls_p__dontuse (200)
#define tls_locals (-2648) #define tls_locals (-2668)
#define tls_plocals (1264) #define tls_plocals (1264)
#define tls_wq (-1080) #define tls_wq (-1080)
#define tls_pwq (2832) #define tls_pwq (2852)
#define tls_prev (-1052) #define tls_prev (-1052)
#define tls_pprev (2860) #define tls_pprev (2880)
#define tls_next (-1048) #define tls_next (-1048)
#define tls_pnext (2864) #define tls_pnext (2884)
#define tls_stackptr (-1044) #define tls_stackptr (-1044)
#define tls_pstackptr (2868) #define tls_pstackptr (2888)
#define tls_sig (-1040) #define tls_sig (-1040)
#define tls_psig (2872) #define tls_psig (2892)
#define tls_incyg (-1036) #define tls_incyg (-1036)
#define tls_pincyg (2876) #define tls_pincyg (2896)
#define tls_spinning (-1032) #define tls_spinning (-1032)
#define tls_pspinning (2880) #define tls_pspinning (2900)
#define tls_stacklock (-1028) #define tls_stacklock (-1028)
#define tls_pstacklock (2884) #define tls_pstacklock (2904)
#define tls_stack (-1024) #define tls_stack (-1024)
#define tls_pstack (2888) #define tls_pstack (2908)
#define tls_padding (0) #define tls_padding (0)
#define tls_ppadding (3912) #define tls_ppadding (3932)