mariadb/innobase/os/os0thread.c

240 lines
5.1 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"
2001-02-17 13:19:19 +01:00
/*********************************************************************
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)));
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) /* out: id of created
thread */
{
#ifdef __WIN__
os_thread_t thread;
thread = CreateThread(NULL, /* no security attributes */
0, /* default size stack */
(LPTHREAD_START_ROUTINE)start_f,
arg,
0, /* thread runs immediately */
thread_id);
ut_a(thread);
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));
}
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);
}
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)
/*=======================*/
{
#ifdef __WIN__
return(GetCurrentThread());
#else
return(pthread_self());
#endif
}
/*********************************************************************
Converts a thread id to a ulint. */
ulint
os_thread_conv_id_to_ulint(
/*=======================*/
/* out: converted to ulint */
os_thread_id_t id) /* in: thread id */
{
return((ulint)id);
}
/*********************************************************************
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))
sched_yield();
#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) /* in: OS handle to the thread */
{
#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
}