aboutsummaryrefslogtreecommitdiff
path: root/APEX_1.4/common/include/WriteCheck.h
blob: 0d05a84e983fc9536db16c87ee3ce6c54a8b0f08 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
/*
 * Copyright (c) 2008-2017, NVIDIA CORPORATION.  All rights reserved.
 *
 * NVIDIA CORPORATION and its licensors retain all intellectual property
 * and proprietary rights in and to this software, related documentation
 * and any modifications thereto.  Any use, reproduction, disclosure or
 * distribution of this software and related documentation without an express
 * license agreement from NVIDIA CORPORATION is strictly prohibited.
 */

// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved.
// Copyright (c) 2001-2004 NovodeX AG. All rights reserved.  


#ifndef WRITE_CHECK_H
#define WRITE_CHECK_H

#include "PxSimpleTypes.h"
#include "ApexUsingNamespace.h"

namespace nvidia
{
namespace apex
{

class ApexRWLockable;

// RAII wrapper around the Scene::startWrite() method, note that this
// object does not acquire any scene locks, it is an error checking only mechanism
class WriteCheck
{
public: 
	WriteCheck(ApexRWLockable* scene, const char* functionName, bool allowReentry=true);
	~WriteCheck();

private:
	ApexRWLockable* mLockable;
	const char* mName;
	bool mAllowReentry;
	uint32_t mErrorCount;
};

#if PX_DEBUG || PX_CHECKED
	// Creates a scoped write check object that detects whether appropriate scene locks
	// have been acquired and checks if reads/writes overlap, this macro should typically
	// be placed at the beginning of any non-const API methods that are not multi-thread safe. 
	// By default re-entrant  write calls by the same thread are allowed, the error conditions 
	// checked can be summarized as:
	
	// 1. Other threads were already reading, or began reading during the object lifetime
	// 2. Other threads were already writing, or began writing during the object lifetime
	#define WRITE_ZONE() WriteCheck __writeCheck(static_cast<ApexRWLockable*>(this), __FUNCTION__);

	// Creates a scoped write check object that disallows re-entrant writes, this is used by
	// the Scene::simulate method to detect when callbacks make write calls to the API
	#define WRITE_ZONE_NOREENTRY() WriteCheck __writeCheck(static_cast<ApexRWLockable*>(this), __FUNCTION__, false);
#else
	#define WRITE_ZONE()
	#define WRITE_ZONE_NOREENTRY()
#endif

}
}

#endif // WRITE_CHECK_H