mariadb/pstack/linuxthreads.c
unknown 8dd2e5b8d9 Added all changes from old 4.0 version:
PSTACK, libmysqld and MySQL filesystem
UPDATE ... ORDER BY
DELETE ... ORDER BY
New faster fulltext handling
Faster compressed keys



Makefile.am:
  Added support for pstack and libmysqld_dir
acconfig.h:
  MySQL filesystem and PSTACK
acinclude.m4:
  MySQL File system
client/mysql.cc:
  Support for --xml
configure.in:
  Pstack, MySQL FS and libmysqld_dir
include/ft_global.h:
  Faster fulltext
include/my_pthread.h:
  Made c++ safe
include/myisam.h:
  Update for faster fulltext
include/mysql_com.h:
  new my_net_read()
include/violite.h:
  libmysqld
libmysql/net.c:
  New protocol that supports big packets
myisam/Makefile.am:
  Faster fulltext
myisam/ft_parser.c:
  Faster fulltext
myisam/ft_search.c:
  Faster fulltext
myisam/ft_update.c:
  Faster fulltext
myisam/ftdefs.h:
  Faster fulltext
myisam/mi_check.c:
  Faster fulltext
myisam/mi_open.c:
  Faster compressed keys
myisam/mi_search.c:
  Faster compressed keys
myisam/mi_update.c:
  Faster compressed keys
myisam/myisamdef.h:
  Faster compressed keys
myisam/sort.c:
  Faster compressed keys
mysql-test/mysql-test-run.sh:
  --skip-innobase and --skip-bdb
sql/ChangeLog:
  Changelog
sql/Makefile.am:
  PSTACK
sql/mysql_priv.h:
  New ORDER BY options and libmysqld
sql/mysqld.cc:
  PSTACK
sql/net_serv.cc:
  New protocol that supports big packets
sql/share/estonian/errmsg.txt:
  New error messages
sql/sql_base.cc:
  Better list_open_tabels
sql/sql_delete.cc:
  ORDER BY for delete
sql/sql_lex.cc:
  Added language convertation of all strings
sql/sql_parse.cc:
  Changes for libmysqld
  Use new ORDER BY options
sql/sql_show.cc:
  Character set convertations
  Use new list_open_tables function.
sql/sql_update.cc:
  UPDATE ... ORDER BY
sql/sql_yacc.yy:
  Clean up symbol definitions
  DELETE .. ORDER BY
  UPDATE .. ORDER BY
sql/table.h:
  new OPEN_TABLE_LIST structure
BitKeeper/etc/logging_ok:
  Logging to logging@openlogging.org accepted
2001-04-11 13:04:03 +02:00

90 lines
2.5 KiB
C

/* $Header$ */
/*
* LinuxThreads specific stuff.
*/
#include <sys/types.h>
#include <assert.h>
#include <limits.h> /* PTHREAD_THREADS_MAX */
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <sched.h>
#include "linuxthreads.h"
#define AT_INT(intval) *((int32_t*)(intval))
/*
* Internal LinuxThreads variables.
* Official interface exposed to GDB.
*/
#if 1
extern volatile int __pthread_threads_debug;
extern volatile char __pthread_handles;
extern char __pthread_initial_thread;
/*extern volatile Elf32_Sym* __pthread_manager_thread;*/
extern const int __pthread_sizeof_handle;
extern const int __pthread_offsetof_descr;
extern const int __pthread_offsetof_pid;
extern volatile int __pthread_handles_num;
#endif /* 0 */
/*
* Notify others.
*/
int
linuxthreads_notify_others( const int signotify)
{
const pid_t mypid = getpid();
//const pthread_t mytid = pthread_self();
int i;
int threadcount = 0;
int threads[PTHREAD_THREADS_MAX];
int pid;
TRACE_FPRINTF((stderr, "theadcount:%d\n", __pthread_handles_num));
if (__pthread_handles_num==2) {
/* no threads beside the initial thread */
return 0;
}
/*assert(maxthreads>=3);
assert(maxthreads>=__pthread_handles_num+2);*/
// take the initial thread with us
pid = AT_INT(&__pthread_initial_thread + __pthread_offsetof_pid);
if (pid!=mypid && pid!=0)
threads[threadcount++] = pid;
// don't know why, but always handles[0]==handles[1]
for (i=1; i<__pthread_handles_num; ++i) {
const int descr = AT_INT(&__pthread_handles+i*__pthread_sizeof_handle+__pthread_offsetof_descr);
assert(descr!=0);
pid = AT_INT(descr+__pthread_offsetof_pid);
if (pid!=mypid && pid!=0)
threads[threadcount++] = pid;
}
/* TRACE_FPRINTF((stderr, "Stopping threads...")); */
//for (i=0; i<threadcount; ++i) {
// /* TRACE_FPRINTF((stderr, "%d ", threads[i])); */
// fflush(stdout);
// kill(threads[i], SIGSTOP); /* Tell thread to stop */
//}
/* TRACE_FPRINTF((stderr, " done!\n")); */
for (i=0; i<threadcount; ++i) {
TRACE_FPRINTF((stderr, "--- NOTIFYING %d\n", threads[i]));
kill(threads[i], signotify); /* Tell to print stack trace */
/* TRACE_FPRINTF((stderr, "--- WAITING FOR %d\n", threads[i])); */
/*pause(); Wait for confirmation. */
}
for (i=0; i<threadcount; ++i)
sched_yield();
for (i=0; i<threadcount; ++i) {
TRACE_FPRINTF((stderr, "--- KILLING %d\n", threads[i]));
kill(threads[i], SIGKILL); /* Tell thread die :) */
}
return __pthread_handles_num;
}