mirror of
https://github.com/ioacademy-jikim/debugging
synced 2025-06-08 00:16:11 +00:00
127 lines
5.1 KiB
C
127 lines
5.1 KiB
C
|
|
/*--------------------------------------------------------------------*/
|
|
/*--- Sets of words, with unique set identifiers. ---*/
|
|
/*--- hg_wordset.h ---*/
|
|
/*--------------------------------------------------------------------*/
|
|
|
|
/*
|
|
This file is part of Helgrind, a Valgrind tool for detecting errors
|
|
in threaded programs.
|
|
|
|
Copyright (C) 2007-2015 OpenWorks LLP
|
|
info@open-works.co.uk
|
|
|
|
This program is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU General Public License as
|
|
published by the Free Software Foundation; either version 2 of the
|
|
License, or (at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful, but
|
|
WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
|
02111-1307, USA.
|
|
|
|
The GNU General Public License is contained in the file COPYING.
|
|
|
|
Neither the names of the U.S. Department of Energy nor the
|
|
University of California nor the names of its contributors may be
|
|
used to endorse or promote products derived from this software
|
|
without prior written permission.
|
|
*/
|
|
|
|
#ifndef __HG_WORDSET_H
|
|
#define __HG_WORDSET_H
|
|
|
|
//------------------------------------------------------------------//
|
|
//--- WordSet ---//
|
|
//--- Public Interface ---//
|
|
//------------------------------------------------------------------//
|
|
|
|
typedef struct _WordSetU WordSetU; /* opaque */
|
|
|
|
typedef UInt WordSet; /* opaque, small int index */
|
|
|
|
/* Allocate and initialise a WordSetU */
|
|
WordSetU* HG_(newWordSetU) ( void* (*alloc_nofail)( const HChar*, SizeT ),
|
|
const HChar* cc,
|
|
void (*dealloc)(void*),
|
|
Word cacheSize );
|
|
|
|
/* Free up the WordSetU. */
|
|
void HG_(deleteWordSetU) ( WordSetU* );
|
|
|
|
/* Get the number of elements in this WordSetU. Note that the dead
|
|
WordSet are included in the WordSetU number of elements. */
|
|
UWord HG_(cardinalityWSU) ( WordSetU* );
|
|
|
|
/* Show performance stats for this WordSetU. */
|
|
void HG_(ppWSUstats) ( WordSetU* wsu, const HChar* name );
|
|
|
|
|
|
/* Element-level operations on WordSets. Note that the WordSet
|
|
numbers given out are 0, 1, 2, 3, etc, and as it happens 0 always
|
|
represents the empty set. */
|
|
|
|
WordSet HG_(emptyWS) ( WordSetU* );
|
|
WordSet HG_(addToWS) ( WordSetU*, WordSet, UWord );
|
|
WordSet HG_(delFromWS) ( WordSetU*, WordSet, UWord );
|
|
WordSet HG_(unionWS) ( WordSetU*, WordSet, WordSet );
|
|
WordSet HG_(intersectWS) ( WordSetU*, WordSet, WordSet );
|
|
WordSet HG_(minusWS) ( WordSetU*, WordSet, WordSet );
|
|
Bool HG_(isEmptyWS) ( WordSetU*, WordSet );
|
|
Bool HG_(isSingletonWS) ( WordSetU*, WordSet, UWord );
|
|
UWord HG_(anyElementOfWS) ( WordSetU*, WordSet );
|
|
UWord HG_(cardinalityWS) ( WordSetU*, WordSet );
|
|
Bool HG_(elemWS) ( WordSetU*, WordSet, UWord );
|
|
WordSet HG_(doubletonWS) ( WordSetU*, UWord, UWord );
|
|
WordSet HG_(singletonWS) ( WordSetU*, UWord );
|
|
WordSet HG_(isSubsetOf) ( WordSetU*, WordSet, WordSet );
|
|
|
|
Bool HG_(plausibleWS) ( WordSetU*, WordSet );
|
|
|
|
|
|
Bool HG_(saneWS_SLOW) ( WordSetU*, WordSet );
|
|
|
|
void HG_(ppWS) ( WordSetU*, WordSet );
|
|
|
|
void HG_(getPayloadWS) ( /*OUT*/UWord** words, /*OUT*/UWord* nWords,
|
|
WordSetU*, WordSet );
|
|
|
|
/* HG_(dieWS) indicates WordSet is not used/not referenced anymore,
|
|
and its memory can be reclaimed.
|
|
If ever a WordSet with the same content would be needed again,
|
|
a new WordSet will be reallocated.
|
|
|
|
BUG ALERT: !!! Using HG_(dieWS) on a WSU introduces a risk of
|
|
dangling references. Dangling references can be created by keeping
|
|
a ws after having marked it dead. This ws (just an index in
|
|
reality) will be re-cycled : a newly created wv can get the same
|
|
index. This implies that the wrong wv will be used if the
|
|
"old" ws has been kept.
|
|
Re-using a "dead" ws will be detected if the index has not been
|
|
re-cycled yet.
|
|
|
|
Another possibility of bug is to ask for the payload of a ws, and
|
|
then have this ws marked dead while the payload is still being
|
|
examined. This is a real dangling reference in free or re-allocated
|
|
memory. */
|
|
void HG_(dieWS) ( WordSetU*, WordSet );
|
|
|
|
|
|
|
|
//------------------------------------------------------------------//
|
|
//--- end WordSet ---//
|
|
//--- Public Interface ---//
|
|
//------------------------------------------------------------------//
|
|
|
|
#endif /* ! __HG_WORDSET_H */
|
|
|
|
/*--------------------------------------------------------------------*/
|
|
/*--- end hg_wordset.h ---*/
|
|
/*--------------------------------------------------------------------*/
|