mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 20:12:31 +01:00
8dd2e5b8d9
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
90 lines
2.5 KiB
C
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;
|
|
}
|
|
|