1 /*****************************************************************************
2 
3 Copyright (c) 1995, 2009, Innobase Oy. All Rights Reserved.
4 
5 This program is free software; you can redistribute it and/or modify it under
6 the terms of the GNU General Public License as published by the Free Software
7 Foundation; version 2 of the License.
8 
9 This program is distributed in the hope that it will be useful, but WITHOUT
10 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11 FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
12 
13 You should have received a copy of the GNU General Public License along with
14 this program; if not, write to the Free Software Foundation, Inc.,
15 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
16 
17 *****************************************************************************/
18 
19 /**************************************************//**
20 @file include/os0thread.h
21 The interface to the operating system
22 process and thread control primitives
23 
24 Created 9/8/1995 Heikki Tuuri
25 *******************************************************/
26 
27 #ifndef os0thread_h
28 #define os0thread_h
29 
30 #include "univ.i"
31 
32 /* Maximum number of threads which can be created in the program;
33 this is also the size of the wait slot array for MySQL threads which
34 can wait inside InnoDB */
35 
36 #define	OS_THREAD_MAX_N		srv_max_n_threads
37 
38 
39 /* Possible fixed priorities for threads */
40 #define OS_THREAD_PRIORITY_NONE		100
41 #define OS_THREAD_PRIORITY_BACKGROUND	1
42 #define OS_THREAD_PRIORITY_NORMAL	2
43 #define OS_THREAD_PRIORITY_ABOVE_NORMAL	3
44 
45 #ifdef __WIN__
46 typedef void*			os_thread_t;
47 typedef unsigned long		os_thread_id_t;	/*!< In Windows the thread id
48 						is an unsigned long int */
49 #else
50 typedef pthread_t		os_thread_t;
51 typedef os_thread_t		os_thread_id_t;	/*!< In Unix we use the thread
52 						handle itself as the id of
53 						the thread */
54 #endif
55 
56 /* Define a function pointer type to use in a typecast */
57 typedef void* (*os_posix_f_t) (void*);
58 
59 #ifdef HAVE_PSI_INTERFACE
60 /* Define for performance schema registration key */
61 typedef unsigned int    mysql_pfs_key_t;
62 #endif
63 
64 /***************************************************************//**
65 Compares two thread ids for equality.
66 @return	TRUE if equal */
67 UNIV_INTERN
68 ibool
69 os_thread_eq(
70 /*=========*/
71 	os_thread_id_t	a,	/*!< in: OS thread or thread id */
72 	os_thread_id_t	b);	/*!< in: OS thread or thread id */
73 /****************************************************************//**
74 Converts an OS thread id to a ulint. It is NOT guaranteed that the ulint is
75 unique for the thread though!
76 @return	thread identifier as a number */
77 UNIV_INTERN
78 ulint
79 os_thread_pf(
80 /*=========*/
81 	os_thread_id_t	a);	/*!< in: OS thread identifier */
82 /****************************************************************//**
83 Creates a new thread of execution. The execution starts from
84 the function given. The start function takes a void* parameter
85 and returns a ulint.
86 NOTE: We count the number of threads in os_thread_exit(). A created
87 thread should always use that to exit and not use return() to exit.
88 @return	handle to the thread */
89 UNIV_INTERN
90 os_thread_t
91 os_thread_create(
92 /*=============*/
93 #ifndef __WIN__
94 	os_posix_f_t		start_f,
95 #else
96 	ulint (*start_f)(void*),		/*!< in: pointer to function
97 						from which to start */
98 #endif
99 	void*			arg,		/*!< in: argument to start
100 						function */
101 	os_thread_id_t*		thread_id);	/*!< out: id of the created
102 						thread, or NULL */
103 
104 /*****************************************************************//**
105 Exits the current thread. */
106 UNIV_INTERN
107 void
108 os_thread_exit(
109 /*===========*/
110 	void*	exit_value)	/*!< in: exit value; in Windows this void*
111 				is cast as a DWORD */
112 	UNIV_COLD __attribute__((noreturn));
113 /*****************************************************************//**
114 Returns the thread identifier of current thread.
115 @return	current thread identifier */
116 UNIV_INTERN
117 os_thread_id_t
118 os_thread_get_curr_id(void);
119 /*========================*/
120 /*****************************************************************//**
121 Advises the os to give up remainder of the thread's time slice. */
122 UNIV_INTERN
123 void
124 os_thread_yield(void);
125 /*=================*/
126 /*****************************************************************//**
127 The thread sleeps at least the time given in microseconds. */
128 UNIV_INTERN
129 void
130 os_thread_sleep(
131 /*============*/
132 	ulint	tm);	/*!< in: time in microseconds */
133 
134 #ifndef UNIV_NONINL
135 #include "os0thread.ic"
136 #endif
137 
138 #endif
139