Rick,
these code excerpts may explain the problem:
/***********************************************************************
Returns the local storage struct for a thread. */
static
thr_local_t*
thr_local_get(
/*==========*/
/* out: local storage */
os_thread_id_t id) /* in: thread id of the thread */
{
thr_local_t* local;
try_again:
ut_ad(thr_local_hash);
ut_ad(mutex_own(&thr_local_mutex));
/* Look for the local struct in the hash table */
local = NULL;
HASH_SEARCH(hash, thr_local_hash, os_thread_conv_id_to_ulint(id),
local, local->id == id);
if (local == NULL) {
mutex_exit(&thr_local_mutex);
thr_local_create();
mutex_enter(&thr_local_mutex);
goto try_again;
}
ut_ad(local->magic_n == THR_LOCAL_MAGIC_N);
return(local);
}
/***********************************************************************
Creates a local storage struct for the calling new thread. */
void
thr_local_create(void)
/*==================*/
{
thr_local_t* local;
if (thr_local_hash == NULL) {
thr_local_init();
}
local = mem_alloc(sizeof(thr_local_t));
local->id = os_thread_get_curr_id();
local->handle = os_thread_get_curr();
local->magic_n = THR_LOCAL_MAGIC_N;
local->in_ibuf = FALSE;
mutex_enter(&thr_local_mutex);
HASH_INSERT(thr_local_t, hash, thr_local_hash,
os_thread_conv_id_to_ulint(os_thread_get_curr_id()),
local);
mutex_exit(&thr_local_mutex);
}
/*********************************************************************
Returns the thread identifier of current thread. */
os_thread_id_t
os_thread_get_curr_id(void)
/*=======================*/
{
#ifdef __WIN__
return(GetCurrentThreadId());
#else
pthread_t pthr;
pthr = pthread_self();
/* TODO: in the future we have to change os_thread_id
to pthread_t; the following cast may work in a wrong way on some
systems if pthread_t is a struct; this is just a quick fix
for HP-UX to eliminate a compiler warning */
return(*(os_thread_id_t*)((void*) (&pthr)));
#endif
}
If pthread_t is a struct where the first field does NOT determine the thread
uniquely, then our hash table will be confused. The above definition code
assumes pthread_t is either a pointer, or a struct where the first field
determines the thread uniquely.
Fix: os_thread_id_t is now an unsigned long int. Change it to a struct.
Compare these structs with the comparison functions provided in the pthreads
standard Posix functions, I think there are appropriate functions in it to
determine if two variables of type pthread_t represent the same thread.
Check also that the unsigned long int representation is not used anywhere to
determine the identity of pthread_t.
For example, in the code:
HASH_SEARCH(hash, thr_local_hash, os_thread_conv_id_to_ulint(id),
local, local->id == id);
the comparison local->id == id should be replaced with someting like
pthreads_are_identical(local->id, id).
This has to be changed in the InnoDB code some time. I cannot promise a date
yet. Thank you for bringing this up!
Best regards,
Heikki Tuuri
Innobase Oy
---
Order technical MySQL/InnoDB support at https://order.mysql.com/
See http://www.innodb.com for the online manual and latest news on InnoDB
----- Original Message -----
From: "Rick Flower" <[EMAIL PROTECTED]>
To: "MySQL Mailing List" <[EMAIL PROTECTED]>
Cc: "Heikki Tuuri" <[EMAIL PROTECTED]>
Sent: Friday, July 19, 2002 12:58 AM
Subject: Re: Innodb startup hangs on AIX 4.3.3 when built with IBM's
VisualAge C/C++ compiler 5.0.x
> [ MySQL ]
>
> Here's some additional data now that I've rebuilt using "--enable-debug"
or
> whatever the configure option is.
>
> Here's what GDB is claiming is happening after it ran for about 2 minutes
> (after initial startup when NO files needed to be created)
>
> (gdb) where
> #0 thr_local_get (id=60) at thr0loc.c:75
> #1 0x1022f98c in thr_local_get_in_ibuf_field () at thr0loc.c:145
> #2 0x101c1b74 in ibuf_inside () at ibuf0ibuf.c:223
> #3 0x101bc59c in fil_io (type=537082596, sync=271108496,
> space_id=804396760, block_offset=804396764, byte_offset=804396784,
> len=804396776, buf=0x2ff21ed4,
> message=0xdeadbeef) at fil0fil.c:1105
> #4 0x1020609c in trx_sys_doublewrite_restore_corrupt_pages () at
> trx0sys.c:281
> #5 0x10189180 in innobase_start_or_create_for_mysql () at
srv0start.c:1093
> #6 0x10181e4c in innobase_init () at ha_innobase.cc:463
> #7 0x1001350c in ha_init () at handler.cc:161
> #8 0x10051120 in main (argc=21, argv=0x20052a70) at mysqld.cc:1899
> #9 0x10000204 in __start ()
> (gdb)
>
>
> It appears to be running in a loop as can be seen below.. I found a
comment
> indicating something about it possibly running out of file handles, and
> have included a LSOF output for this process as well :
>
> % lsof -p22014
> COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
> mysqld 22014 mysql cwd VDIR 43,4 512 262153 /test2
> (/dev/test2lv)
> mysqld 22014 mysql 0u VCHR 38,7 0t2353 168294 /dev/pts/7
> mysqld 22014 mysql 1w VREG 43,4 792 262156 /test2
> (/dev/test2lv)
> mysqld 22014 mysql 2w VREG 43,4 792 262156 /test2
> (/dev/test2lv)
> mysqld 22014 mysql 3u IPv4 0x7028e2dc 0t0 TCP *:3306 (LISTEN)
> mysqld 22014 mysql 4u unix 10,7 0t0 70 /tmp/mysql.sock
>
>
> 75 in thr0loc.c
> (gdb)
> 77 in thr0loc.c
> (gdb)
> 79 in thr0loc.c
> (gdb)
> 72 in thr0loc.c
> (gdb)
> 81 in thr0loc.c
> (gdb)
> 74 in thr0loc.c
> (gdb)
> 75 in thr0loc.c
> (gdb)
> 77 in thr0loc.c
> (gdb)
> 79 in thr0loc.c
> (gdb)
> 72 in thr0loc.c
> (gdb)
> 81 in thr0loc.c
> (gdb)
> 74 in thr0loc.c
> (gdb)
> 75 in thr0loc.c
> (gdb)
> 77 in thr0loc.c
> (gdb)
> 79 in thr0loc.c
> (gdb)
> 72 in thr0loc.c
> (gdb)
> 81 in thr0loc.c
> (gdb)
> 74 in thr0loc.c
> (gdb)
> 75 in thr0loc.c
---------------------------------------------------------------------
Before posting, please check:
http://www.mysql.com/manual.php (the manual)
http://lists.mysql.com/ (the list archive)
To request this thread, e-mail <[EMAIL PROTECTED]>
To unsubscribe, e-mail <[EMAIL PROTECTED]>
Trouble unsubscribing? Try: http://lists.mysql.com/php/unsubscribe.php