blob: 5e6042a324ba29276c9300e1d707d9bf3eaa7561 [file] [log] [blame]
njn278b3d62005-05-30 23:20:51 +00001
2/*--------------------------------------------------------------------*/
3/*--- The scheduler. pub_core_scheduler.h ---*/
4/*--------------------------------------------------------------------*/
5
6/*
7 This file is part of Valgrind, a dynamic binary instrumentation
8 framework.
9
sewardjec062e82011-10-23 07:32:08 +000010 Copyright (C) 2000-2011 Julian Seward
njn278b3d62005-05-30 23:20:51 +000011 jseward@acm.org
12
13 This program is free software; you can redistribute it and/or
14 modify it under the terms of the GNU General Public License as
15 published by the Free Software Foundation; either version 2 of the
16 License, or (at your option) any later version.
17
18 This program is distributed in the hope that it will be useful, but
19 WITHOUT ANY WARRANTY; without even the implied warranty of
20 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21 General Public License for more details.
22
23 You should have received a copy of the GNU General Public License
24 along with this program; if not, write to the Free Software
25 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
26 02111-1307, USA.
27
28 The GNU General Public License is contained in the file COPYING.
29*/
30
31#ifndef __PUB_CORE_SCHEDULER_H
32#define __PUB_CORE_SCHEDULER_H
33
34//--------------------------------------------------------------------
35// PURPOSE: This module is the scheduler, which is the main loop
36// controlling the running of all the program's threads.
37// It's at the centre of everything.
38//--------------------------------------------------------------------
39
njn278b3d62005-05-30 23:20:51 +000040/* Allocate a new ThreadState */
41extern ThreadId VG_(alloc_ThreadState)(void);
42
43/* A thread exits. tid must currently be running. */
44extern void VG_(exit_thread)(ThreadId tid);
45
sewardjf54342a2006-10-17 01:51:24 +000046/* If 'tid' is blocked in a syscall, send it SIGVGKILL so as to get it
47 out of the syscall and onto doing the next thing, whatever that is.
48 If it isn't blocked in a syscall, has no effect on the thread. */
49extern void VG_(get_thread_out_of_syscall)(ThreadId tid);
njn278b3d62005-05-30 23:20:51 +000050
njn278b3d62005-05-30 23:20:51 +000051/* Nuke all threads except tid. */
52extern void VG_(nuke_all_threads_except) ( ThreadId me,
53 VgSchedReturnCode reason );
54
55/* Make a thread the running thread. The thread must previously been
sewardjf54342a2006-10-17 01:51:24 +000056 sleeping, and not holding the CPU lock. This will set the
njn278b3d62005-05-30 23:20:51 +000057 thread state to VgTs_Runnable, and the thread will attempt to take
sewardjf54342a2006-10-17 01:51:24 +000058 the CPU lock. By the time it returns, tid will be the running
njn278b3d62005-05-30 23:20:51 +000059 thread. */
sewardjad0a3a82006-12-17 18:58:55 +000060extern void VG_(acquire_BigLock) ( ThreadId tid, HChar* who );
njn278b3d62005-05-30 23:20:51 +000061
njnf76d27a2009-05-28 01:53:07 +000062/* Simple version, which simply acquires the lock, but does not mess
63 with the guest state in the same way as the non _LL version
64 does. */
65extern void VG_(acquire_BigLock_LL) ( HChar* who );
66
njn278b3d62005-05-30 23:20:51 +000067/* Set a thread into a sleeping state. Before the call, the thread
sewardjf54342a2006-10-17 01:51:24 +000068 must be runnable, and holding the CPU lock. When this call
njn278b3d62005-05-30 23:20:51 +000069 returns, the thread will be set to the specified sleeping state,
sewardjf54342a2006-10-17 01:51:24 +000070 and will not be holding the CPU lock. Note that another
njn278b3d62005-05-30 23:20:51 +000071 thread could be running by the time this call returns, so the
72 caller must be careful not to touch any shared state. It is also
73 the caller's responsibility to actually block until the thread is
74 ready to run again. */
njnf76d27a2009-05-28 01:53:07 +000075extern void VG_(release_BigLock) ( ThreadId tid,
76 ThreadStatus state, HChar* who );
njn278b3d62005-05-30 23:20:51 +000077
njnf76d27a2009-05-28 01:53:07 +000078/* Matching function to acquire_BigLock_LL. */
79extern void VG_(release_BigLock_LL) ( HChar* who );
80
bart9a2b80d2012-03-25 17:51:59 +000081/* Whether the specified thread owns the big lock. */
82extern Bool VG_(owns_BigLock_LL) ( ThreadId tid );
83
njnf76d27a2009-05-28 01:53:07 +000084/* Yield the CPU for a while. Drops/acquires the lock using the
85 normal (non _LL) functions. */
njn278b3d62005-05-30 23:20:51 +000086extern void VG_(vg_yield)(void);
87
88// The scheduler.
89extern VgSchedReturnCode VG_(scheduler) ( ThreadId tid );
90
sewardjde764e82007-11-09 23:13:22 +000091// Initialise, phase 1. Zero out VG_(threads), decide on the root
92// ThreadId and initialise the bigLock.
93extern ThreadId VG_(scheduler_init_phase1) ( void );
94
95// Initialise, phase 2. Is passed the extent of the root thread's
96// client stack and the root ThreadId decided on by phase 1.
97extern void VG_(scheduler_init_phase2) ( ThreadId main_tid,
98 Addr clstack_end,
99 SizeT clstack_size );
njn278b3d62005-05-30 23:20:51 +0000100
sewardj3b290482011-05-06 21:02:55 +0000101// Allows to disable the polling done to detect vgdb input
102// or to force a poll at next scheduler call.
103extern void VG_(disable_vgdb_poll) (void );
104extern void VG_(force_vgdb_poll) ( void );
105
njn04e16982005-05-31 00:23:43 +0000106/* Stats ... */
107extern void VG_(print_scheduler_stats) ( void );
108
sewardj0ec07f32006-01-12 12:32:32 +0000109/* If False, a fault is Valgrind-internal (ie, a bug) */
110extern Bool VG_(in_generated_code);
njn278b3d62005-05-30 23:20:51 +0000111
njn6676d5b2005-06-19 18:49:19 +0000112/* Sanity checks which may be done at any time. The scheduler decides when. */
113extern void VG_(sanity_check_general) ( Bool force_expensive );
114
njn278b3d62005-05-30 23:20:51 +0000115#endif // __PUB_CORE_SCHEDULER_H
116
117/*--------------------------------------------------------------------*/
118/*--- end ---*/
119/*--------------------------------------------------------------------*/