mariadb/innobase/os/os0thread.c

277 lines
5.9 KiB
C
Raw Normal View History

2001-02-17 13:19:19 +01:00
/******************************************************
The interface to the operating system
process and thread control primitives
(c) 1995 Innobase Oy
Created 9/8/1995 Heikki Tuuri
*******************************************************/
#include "os0thread.h"
#ifdef UNIV_NONINL
#include "os0thread.ic"
#endif
#ifdef __WIN__
#include <windows.h>
#endif
#include "srv0srv.h"
2002-08-06 21:59:13 +02:00
/*******************************************************************
Compares two threads or thread ids for equality */
ibool
os_thread_eq(
/*=========*/
/* out: TRUE if equal */
os_thread_t a, /* in: OS thread or thread id */
os_thread_t b) /* in: OS thread or thread id */
2001-02-17 13:19:19 +01:00
{
#ifdef __WIN__
2002-08-06 21:59:13 +02:00
if (a == b) {
return(TRUE);
}
return(FALSE);
2001-02-17 13:19:19 +01:00
#else
2002-08-06 21:59:13 +02:00
if (pthread_equal(a, b)) {
return(TRUE);
}
2002-08-06 21:59:13 +02:00
return(FALSE);
#endif
}
2002-08-06 21:59:13 +02:00
/********************************************************************
Converts an OS thread or thread id to a ulint. It is NOT guaranteed that
the ulint is unique for the thread though! */
2002-08-06 21:59:13 +02:00
ulint
os_thread_pf(
/*=========*/
os_thread_t a)
{
#ifdef UNIV_HPUX
/* In HP-UX a pthread_t is a struct of 3 fields: field1, field2,
field3. We do not know if field1 determines the thread uniquely. */
2002-08-06 21:59:13 +02:00
return((ulint)(a.field1));
#else
2002-08-06 21:59:13 +02:00
return((ulint)a);
#endif
2002-08-06 21:59:13 +02:00
}
2001-02-17 13:19:19 +01:00
/*********************************************************************
2002-08-06 21:59:13 +02:00
Returns the thread identifier of current thread. Currently the thread
identifier is the thread handle itself. Note that in HP-UX pthread_t is
a struct of 3 fields. */
2001-02-17 13:19:19 +01:00
os_thread_id_t
os_thread_get_curr_id(void)
/*=======================*/
{
#ifdef __WIN__
2002-08-06 21:59:13 +02:00
return(GetCurrentThread());
2001-02-17 13:19:19 +01:00
#else
2002-08-06 21:59:13 +02:00
return(pthread_self());
2001-02-17 13:19:19 +01:00
#endif
}
/********************************************************************
Creates a new thread of execution. The execution starts from
the function given. The start function takes a void* parameter
and returns an ulint. */
os_thread_t
os_thread_create(
/*=============*/
/* out: handle to the thread */
ut0ut.c Fixes for 64-bit Linux, bug fixes, compiler warning fixes mem0pool.c Fixes for 64-bit Linux, bug fixes, compiler warning fixes os0file.c Fixes for 64-bit Linux, bug fixes, compiler warning fixes os0shm.c Fixes for 64-bit Linux, bug fixes, compiler warning fixes os0sync.c Fixes for 64-bit Linux, bug fixes, compiler warning fixes os0thread.c Fixes for 64-bit Linux, bug fixes, compiler warning fixes page0page.c Fixes for 64-bit Linux, bug fixes, compiler warning fixes que0que.c Fixes for 64-bit Linux, bug fixes, compiler warning fixes row0ins.c Fixes for 64-bit Linux, bug fixes, compiler warning fixes row0mysql.c Fixes for 64-bit Linux, bug fixes, compiler warning fixes row0sel.c Fixes for 64-bit Linux, bug fixes, compiler warning fixes row0upd.c Fixes for 64-bit Linux, bug fixes, compiler warning fixes row0vers.c Fixes for 64-bit Linux, bug fixes, compiler warning fixes srv0srv.c Fixes for 64-bit Linux, bug fixes, compiler warning fixes srv0start.c Fixes for 64-bit Linux, bug fixes, compiler warning fixes sync0arr.c Fixes for 64-bit Linux, bug fixes, compiler warning fixes sync0rw.c Fixes for 64-bit Linux, bug fixes, compiler warning fixes sync0sync.c Fixes for 64-bit Linux, bug fixes, compiler warning fixes trx0rec.c Fixes for 64-bit Linux, bug fixes, compiler warning fixes trx0trx.c Fixes for 64-bit Linux, bug fixes, compiler warning fixes srv0srv.h Fixes for 64-bit Linux, bug fixes, compiler warning fixes sync0rw.h Fixes for 64-bit Linux, bug fixes, compiler warning fixes sync0sync.h Fixes for 64-bit Linux, bug fixes, compiler warning fixes ut0dbg.h Fixes for 64-bit Linux, bug fixes, compiler warning fixes lock0lock.c Fixes for 64-bit Linux, bug fixes, compiler warning fixes log0log.c Fixes for 64-bit Linux, bug fixes, compiler warning fixes log0recv.c Fixes for 64-bit Linux, bug fixes, compiler warning fixes ibuf0ibuf.c Fixes for 64-bit Linux, bug fixes, compiler warning fixes buf0buf.h Fixes for 64-bit Linux, bug fixes, compiler warning fixes buf0buf.ic Fixes for 64-bit Linux, bug fixes, compiler warning fixes hash0hash.ic Fixes for 64-bit Linux, bug fixes, compiler warning fixes mach0data.ic Fixes for 64-bit Linux, bug fixes, compiler warning fixes mem0mem.h Fixes for 64-bit Linux, bug fixes, compiler warning fixes mem0pool.h Fixes for 64-bit Linux, bug fixes, compiler warning fixes mtr0mtr.h Fixes for 64-bit Linux, bug fixes, compiler warning fixes os0file.h Fixes for 64-bit Linux, bug fixes, compiler warning fixes os0sync.h Fixes for 64-bit Linux, bug fixes, compiler warning fixes os0sync.ic Fixes for 64-bit Linux, bug fixes, compiler warning fixes os0thread.h Fixes for 64-bit Linux, bug fixes, compiler warning fixes univ.i Fixes for 64-bit Linux, bug fixes, compiler warning fixes row0mysql.ic Fixes for 64-bit Linux, bug fixes, compiler warning fixes com0shm.c Fixes for 64-bit Linux, bug fixes, compiler warning fixes data0data.c Fixes for 64-bit Linux, bug fixes, compiler warning fixes data0type.c Fixes for 64-bit Linux, bug fixes, compiler warning fixes dict0crea.c Fixes for 64-bit Linux, bug fixes, compiler warning fixes dict0dict.c Fixes for 64-bit Linux, bug fixes, compiler warning fixes fil0fil.c Fixes for 64-bit Linux, bug fixes, compiler warning fixes fsp0fsp.c Fixes for 64-bit Linux, bug fixes, compiler warning fixes fut0lst.c Fixes for 64-bit Linux, bug fixes, compiler warning fixes btr0sea.c Fixes for 64-bit Linux, bug fixes, compiler warning fixes buf0buf.c Fixes for 64-bit Linux, bug fixes, compiler warning fixes buf0flu.c Fixes for 64-bit Linux, bug fixes, compiler warning fixes btr0btr.c Fixes for 64-bit Linux, bug fixes, compiler warning fixes btr0cur.c Fixes for 64-bit Linux, bug fixes, compiler warning fixes
2001-03-02 16:33:11 +01:00
#ifndef __WIN__
os_posix_f_t start_f,
#else
2001-02-17 13:19:19 +01:00
ulint (*start_f)(void*), /* in: pointer to function
from which to start */
ut0ut.c Fixes for 64-bit Linux, bug fixes, compiler warning fixes mem0pool.c Fixes for 64-bit Linux, bug fixes, compiler warning fixes os0file.c Fixes for 64-bit Linux, bug fixes, compiler warning fixes os0shm.c Fixes for 64-bit Linux, bug fixes, compiler warning fixes os0sync.c Fixes for 64-bit Linux, bug fixes, compiler warning fixes os0thread.c Fixes for 64-bit Linux, bug fixes, compiler warning fixes page0page.c Fixes for 64-bit Linux, bug fixes, compiler warning fixes que0que.c Fixes for 64-bit Linux, bug fixes, compiler warning fixes row0ins.c Fixes for 64-bit Linux, bug fixes, compiler warning fixes row0mysql.c Fixes for 64-bit Linux, bug fixes, compiler warning fixes row0sel.c Fixes for 64-bit Linux, bug fixes, compiler warning fixes row0upd.c Fixes for 64-bit Linux, bug fixes, compiler warning fixes row0vers.c Fixes for 64-bit Linux, bug fixes, compiler warning fixes srv0srv.c Fixes for 64-bit Linux, bug fixes, compiler warning fixes srv0start.c Fixes for 64-bit Linux, bug fixes, compiler warning fixes sync0arr.c Fixes for 64-bit Linux, bug fixes, compiler warning fixes sync0rw.c Fixes for 64-bit Linux, bug fixes, compiler warning fixes sync0sync.c Fixes for 64-bit Linux, bug fixes, compiler warning fixes trx0rec.c Fixes for 64-bit Linux, bug fixes, compiler warning fixes trx0trx.c Fixes for 64-bit Linux, bug fixes, compiler warning fixes srv0srv.h Fixes for 64-bit Linux, bug fixes, compiler warning fixes sync0rw.h Fixes for 64-bit Linux, bug fixes, compiler warning fixes sync0sync.h Fixes for 64-bit Linux, bug fixes, compiler warning fixes ut0dbg.h Fixes for 64-bit Linux, bug fixes, compiler warning fixes lock0lock.c Fixes for 64-bit Linux, bug fixes, compiler warning fixes log0log.c Fixes for 64-bit Linux, bug fixes, compiler warning fixes log0recv.c Fixes for 64-bit Linux, bug fixes, compiler warning fixes ibuf0ibuf.c Fixes for 64-bit Linux, bug fixes, compiler warning fixes buf0buf.h Fixes for 64-bit Linux, bug fixes, compiler warning fixes buf0buf.ic Fixes for 64-bit Linux, bug fixes, compiler warning fixes hash0hash.ic Fixes for 64-bit Linux, bug fixes, compiler warning fixes mach0data.ic Fixes for 64-bit Linux, bug fixes, compiler warning fixes mem0mem.h Fixes for 64-bit Linux, bug fixes, compiler warning fixes mem0pool.h Fixes for 64-bit Linux, bug fixes, compiler warning fixes mtr0mtr.h Fixes for 64-bit Linux, bug fixes, compiler warning fixes os0file.h Fixes for 64-bit Linux, bug fixes, compiler warning fixes os0sync.h Fixes for 64-bit Linux, bug fixes, compiler warning fixes os0sync.ic Fixes for 64-bit Linux, bug fixes, compiler warning fixes os0thread.h Fixes for 64-bit Linux, bug fixes, compiler warning fixes univ.i Fixes for 64-bit Linux, bug fixes, compiler warning fixes row0mysql.ic Fixes for 64-bit Linux, bug fixes, compiler warning fixes com0shm.c Fixes for 64-bit Linux, bug fixes, compiler warning fixes data0data.c Fixes for 64-bit Linux, bug fixes, compiler warning fixes data0type.c Fixes for 64-bit Linux, bug fixes, compiler warning fixes dict0crea.c Fixes for 64-bit Linux, bug fixes, compiler warning fixes dict0dict.c Fixes for 64-bit Linux, bug fixes, compiler warning fixes fil0fil.c Fixes for 64-bit Linux, bug fixes, compiler warning fixes fsp0fsp.c Fixes for 64-bit Linux, bug fixes, compiler warning fixes fut0lst.c Fixes for 64-bit Linux, bug fixes, compiler warning fixes btr0sea.c Fixes for 64-bit Linux, bug fixes, compiler warning fixes buf0buf.c Fixes for 64-bit Linux, bug fixes, compiler warning fixes buf0flu.c Fixes for 64-bit Linux, bug fixes, compiler warning fixes btr0btr.c Fixes for 64-bit Linux, bug fixes, compiler warning fixes btr0cur.c Fixes for 64-bit Linux, bug fixes, compiler warning fixes
2001-03-02 16:33:11 +01:00
#endif
2001-02-17 13:19:19 +01:00
void* arg, /* in: argument to start
function */
os_thread_id_t* thread_id __attribute__((unused)))
/* out: id of created
thread; currently this is
identical to the handle to
the thread */
2001-02-17 13:19:19 +01:00
{
#ifdef __WIN__
os_thread_t thread;
ulint win_thread_id;
2001-02-17 13:19:19 +01:00
thread = CreateThread(NULL, /* no security attributes */
0, /* default size stack */
(LPTHREAD_START_ROUTINE)start_f,
arg,
0, /* thread runs immediately */
&win_thread_id);
2001-02-17 13:19:19 +01:00
if (srv_set_thread_priorities) {
/* Set created thread priority the same as a normal query
in MYSQL: we try to prevent starvation of threads by
assigning same priority QUERY_PRIOR to all */
ut_a(SetThreadPriority(thread, srv_query_thread_priority));
}
*thread_id = thread;
2001-02-17 13:19:19 +01:00
return(thread);
#else
int ret;
os_thread_t pthread;
pthread_attr_t attr;
pthread_attr_init(&attr);
2001-02-17 13:19:19 +01:00
ret = pthread_create(&pthread, &attr, start_f, arg);
2001-02-17 13:19:19 +01:00
pthread_attr_destroy(&attr);
if (srv_set_thread_priorities) {
my_pthread_setprio(pthread, srv_query_thread_priority);
}
*thread_id = pthread;
2001-02-17 13:19:19 +01:00
return(pthread);
#endif
}
/*********************************************************************
Returns handle to the current thread. */
os_thread_t
os_thread_get_curr(void)
2002-08-06 21:59:13 +02:00
/*====================*/
2001-02-17 13:19:19 +01:00
{
#ifdef __WIN__
return(GetCurrentThread());
#else
return(pthread_self());
#endif
}
/*********************************************************************
Advises the os to give up remainder of the thread's time slice. */
void
os_thread_yield(void)
/*=================*/
{
#if defined(__WIN__)
2001-02-17 13:19:19 +01:00
Sleep(0);
#elif (defined(HAVE_SCHED_YIELD) && defined(HAVE_SCHED_H))
2001-04-18 22:49:25 +02:00
sched_yield();
#elif defined(HAVE_PTHREAD_YIELD_ZERO_ARG)
pthread_yield();
#elif defined(HAVE_PTHREAD_YIELD_ONE_ARG)
pthread_yield(0);
#else
os_thread_sleep(0);
2001-02-17 13:19:19 +01:00
#endif
}
/*********************************************************************
The thread sleeps at least the time given in microseconds. */
void
os_thread_sleep(
/*============*/
ulint tm) /* in: time in microseconds */
{
#ifdef __WIN__
Sleep(tm / 1000);
#else
struct timeval t;
t.tv_sec = tm / 1000000;
t.tv_usec = tm % 1000000;
2001-02-17 13:19:19 +01:00
select(0, NULL, NULL, NULL, &t);
#endif
}
/**********************************************************************
Sets a thread priority. */
void
os_thread_set_priority(
/*===================*/
os_thread_t handle, /* in: OS handle to the thread */
ulint pri) /* in: priority */
{
#ifdef __WIN__
int os_pri;
if (pri == OS_THREAD_PRIORITY_BACKGROUND) {
os_pri = THREAD_PRIORITY_BELOW_NORMAL;
} else if (pri == OS_THREAD_PRIORITY_NORMAL) {
os_pri = THREAD_PRIORITY_NORMAL;
} else if (pri == OS_THREAD_PRIORITY_ABOVE_NORMAL) {
os_pri = THREAD_PRIORITY_HIGHEST;
} else {
ut_error;
}
ut_a(SetThreadPriority(handle, os_pri));
#else
UT_NOT_USED(handle);
UT_NOT_USED(pri);
#endif
}
/**********************************************************************
Gets a thread priority. */
ulint
os_thread_get_priority(
/*===================*/
/* out: priority */
os_thread_t handle __attribute__((unused)))
/* in: OS handle to the thread */
2001-02-17 13:19:19 +01:00
{
#ifdef __WIN__
int os_pri;
ulint pri;
os_pri = GetThreadPriority(handle);
if (os_pri == THREAD_PRIORITY_BELOW_NORMAL) {
pri = OS_THREAD_PRIORITY_BACKGROUND;
} else if (os_pri == THREAD_PRIORITY_NORMAL) {
pri = OS_THREAD_PRIORITY_NORMAL;
} else if (os_pri == THREAD_PRIORITY_HIGHEST) {
pri = OS_THREAD_PRIORITY_ABOVE_NORMAL;
} else {
ut_error;
}
return(pri);
#else
return(0);
#endif
}
/**********************************************************************
Gets the last operating system error code for the calling thread. */
ulint
os_thread_get_last_error(void)
/*==========================*/
{
#ifdef __WIN__
return(GetLastError());
#else
return(0);
#endif
}