blob: 9ba465d8d7b87953df5d34569318919561fa392f [file] [log] [blame]
sewardjf98e1c02008-10-25 16:22:41 +00001
2/*--------------------------------------------------------------------*/
3/*--- LibHB: a library for implementing and checking ---*/
4/*--- the happens-before relationship in concurrent programs. ---*/
5/*--- libhb_main.c ---*/
6/*--------------------------------------------------------------------*/
7
8/*
9 This file is part of LibHB, a library for implementing and checking
10 the happens-before relationship in concurrent programs.
11
njn9f207462009-03-10 22:02:09 +000012 Copyright (C) 2008-2009 OpenWorks Ltd
sewardjf98e1c02008-10-25 16:22:41 +000013 info@open-works.co.uk
14
15 This program is free software; you can redistribute it and/or
16 modify it under the terms of the GNU General Public License as
17 published by the Free Software Foundation; either version 2 of the
18 License, or (at your option) any later version.
19
20 This program is distributed in the hope that it will be useful, but
21 WITHOUT ANY WARRANTY; without even the implied warranty of
22 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
23 General Public License for more details.
24
25 You should have received a copy of the GNU General Public License
26 along with this program; if not, write to the Free Software
27 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
28 02111-1307, USA.
29
30 The GNU General Public License is contained in the file COPYING.
31*/
32
33#ifndef __LIBHB_H
34#define __LIBHB_H
35
36/* Abstract to user: thread identifiers */
37/* typedef struct _Thr Thr; */ /* now in hg_lock_n_thread.h */
38
39/* Abstract to user: synchronisation objects */
40/* typedef struct _SO SO; */ /* now in hg_lock_n_thread.h */
41
sewardjf98e1c02008-10-25 16:22:41 +000042/* Initialise library; returns Thr* for root thread. 'shadow_alloc'
43 should never return NULL, instead it should simply not return if
44 they encounter an out-of-memory condition. */
45Thr* libhb_init (
46 void (*get_stacktrace)( Thr*, Addr*, UWord ),
sewardjd52392d2008-11-08 20:36:26 +000047 ExeContext* (*get_EC)( Thr* )
sewardjf98e1c02008-10-25 16:22:41 +000048 );
49
50/* Shut down the library, and print stats (in fact that's _all_
51 this is for.) */
52void libhb_shutdown ( Bool show_stats );
53
54/* Thread creation: returns Thr* for new thread */
55Thr* libhb_create ( Thr* parent );
56
57/* Thread async exit */
58void libhb_async_exit ( Thr* exitter );
59
60/* Synchronisation objects (abstract to caller) */
61
62/* Allocate a new one (alloc'd by library) */
63SO* libhb_so_alloc ( void );
64
65/* Dealloc one */
66void libhb_so_dealloc ( SO* so );
67
68/* Send a message via a sync object. If strong_send is true, the
69 resulting inter-thread dependency seen by a future receiver of this
70 message will be a dependency on this thread only. That is, in a
71 strong send, the VC inside the SO is replaced by the clock of the
72 sending thread. For a weak send, the sender's VC is joined into
73 that already in the SO, if any. This subtlety is needed to model
74 rwlocks: a strong send corresponds to releasing a rwlock that had
75 been w-held (or releasing a standard mutex). A weak send
76 corresponds to releasing a rwlock that has been r-held.
77
78 (rationale): Since in general many threads may hold a rwlock in
79 r-mode, a weak send facility is necessary in order that the final
80 SO reflects the join of the VCs of all the threads releasing the
81 rwlock, rather than merely holding the VC of the most recent thread
82 to release it. */
83void libhb_so_send ( Thr* thr, SO* so, Bool strong_send );
84
85/* Recv a message from a sync object. If strong_recv is True, the
86 resulting inter-thread dependency is considered adequate to induce
87 a h-b ordering on both reads and writes. If it is False, the
88 implied h-b ordering exists only for reads, not writes. This is
89 subtlety is required in order to support reader-writer locks: a
90 thread doing a write-acquire of a rwlock (or acquiring a normal
91 mutex) models this by doing a strong receive. A thread doing a
92 read-acquire of a rwlock models this by doing a !strong_recv. */
93void libhb_so_recv ( Thr* thr, SO* so, Bool strong_recv );
94
95/* Has this SO ever been sent on? */
96Bool libhb_so_everSent ( SO* so );
97
98/* Memory accesses (1/2/4/8 byte size). They report a race if one is
99 found. */
sewardj23f12002009-07-24 08:45:08 +0000100#define LIBHB_CWRITE_1(_thr,_a) zsm_sapply08_f__msmcwrite((_thr),(_a))
101#define LIBHB_CWRITE_2(_thr,_a) zsm_sapply16_f__msmcwrite((_thr),(_a))
102#define LIBHB_CWRITE_4(_thr,_a) zsm_sapply32_f__msmcwrite((_thr),(_a))
103#define LIBHB_CWRITE_8(_thr,_a) zsm_sapply64_f__msmcwrite((_thr),(_a))
104#define LIBHB_CWRITE_N(_thr,_a,_n) zsm_sapplyNN_f__msmcwrite((_thr),(_a),(_n))
sewardjf98e1c02008-10-25 16:22:41 +0000105
sewardj23f12002009-07-24 08:45:08 +0000106#define LIBHB_CREAD_1(_thr,_a) zsm_sapply08_f__msmcread((_thr),(_a))
107#define LIBHB_CREAD_2(_thr,_a) zsm_sapply16_f__msmcread((_thr),(_a))
108#define LIBHB_CREAD_4(_thr,_a) zsm_sapply32_f__msmcread((_thr),(_a))
109#define LIBHB_CREAD_8(_thr,_a) zsm_sapply64_f__msmcread((_thr),(_a))
110#define LIBHB_CREAD_N(_thr,_a,_n) zsm_sapplyNN_f__msmcread((_thr),(_a),(_n))
sewardjf98e1c02008-10-25 16:22:41 +0000111
sewardj23f12002009-07-24 08:45:08 +0000112void zsm_sapply08_f__msmcwrite ( Thr* thr, Addr a );
113void zsm_sapply16_f__msmcwrite ( Thr* thr, Addr a );
114void zsm_sapply32_f__msmcwrite ( Thr* thr, Addr a );
115void zsm_sapply64_f__msmcwrite ( Thr* thr, Addr a );
116void zsm_sapplyNN_f__msmcwrite ( Thr* thr, Addr a, SizeT len );
sewardjf98e1c02008-10-25 16:22:41 +0000117
sewardj23f12002009-07-24 08:45:08 +0000118void zsm_sapply08_f__msmcread ( Thr* thr, Addr a );
119void zsm_sapply16_f__msmcread ( Thr* thr, Addr a );
120void zsm_sapply32_f__msmcread ( Thr* thr, Addr a );
121void zsm_sapply64_f__msmcread ( Thr* thr, Addr a );
122void zsm_sapplyNN_f__msmcread ( Thr* thr, Addr a, SizeT len );
sewardjf98e1c02008-10-25 16:22:41 +0000123
sewardj23f12002009-07-24 08:45:08 +0000124void libhb_Thr_resumes ( Thr* thr );
sewardjf98e1c02008-10-25 16:22:41 +0000125
126/* Set memory address ranges to new (freshly allocated), or noaccess
127 (no longer accessible). */
sewardj23f12002009-07-24 08:45:08 +0000128void libhb_srange_new ( Thr*, Addr, SizeT );
129void libhb_srange_noaccess ( Thr*, Addr, SizeT );
sewardjf98e1c02008-10-25 16:22:41 +0000130
131/* For the convenience of callers, we offer to store one void* item in
132 a Thr, which we ignore, but the caller can get or set any time. */
133void* libhb_get_Thr_opaque ( Thr* );
134void libhb_set_Thr_opaque ( Thr*, void* );
135
136/* Low level copy of shadow state from [src,src+len) to [dst,dst+len).
137 Overlapping moves are checked for and asserted against. */
sewardj23f12002009-07-24 08:45:08 +0000138void libhb_copy_shadow_state ( Thr* thr, Addr src, Addr dst, SizeT len );
sewardjf98e1c02008-10-25 16:22:41 +0000139
140/* Call this periodically to give libhb the opportunity to
141 garbage-collect its internal data structures. */
142void libhb_maybe_GC ( void );
143
sewardjc5ea9962008-12-07 01:41:46 +0000144/* Extract info from the conflicting-access machinery. */
145Bool libhb_event_map_lookup ( /*OUT*/ExeContext** resEC,
146 /*OUT*/Thr** resThr,
147 /*OUT*/SizeT* resSzB,
148 /*OUT*/Bool* resIsW,
149 Thr* thr, Addr a, SizeT szB, Bool isW );
150
sewardjf98e1c02008-10-25 16:22:41 +0000151#endif /* __LIBHB_H */
152
153/*--------------------------------------------------------------------*/
154/*--- end libhb.h ---*/
155/*--------------------------------------------------------------------*/