summaryrefslogtreecommitdiff
path: root/test/tcl/mut002.tcl
blob: 35646a70e33c248a2c62345c6ac80540d4cd3f6b (plain)
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
# See the file LICENSE for redistribution information.
#
# Copyright (c) 2009, 2015 Oracle and/or its affiliates.  All rights reserved.
#
# $Id$
#
# TEST	mut002
# TEST	Two-process mutex test.
# TEST
# TEST	Allocate and lock a self-blocking mutex.  Start another process. 
# TEST	Try to lock the mutex again -- it will block.  
# TEST	Unlock the mutex from the other process, and the blocked 
# TEST 	lock should be obtained.  Clean up.
# TEST	Do another test with a "-process-only" mutex.  The second 
# TEST	process should not be able to unlock the mutex.

proc mut002 { } {
	source ./include.tcl

	puts "Mut002: Two process mutex test."

	# Open an env.
	set env [berkdb_env -create -home $testdir]
	
	puts "\tMut002.a: Allocate and lock a mutex."
	set mutex [$env mutex -self_block]
	error_check_good obtained_lock [$env mutex_lock $mutex] 0

	# Start a second process.
	puts "\tMut002.b: Start another process."
	set p2 [exec $tclsh_path $test_path/wrap.tcl mut002script.tcl\
	    $testdir/mut002.log $testdir $mutex &]

	# Try to lock the mutex again.  This will hang until the second
	# process unlocks it. 
	$env mutex_lock $mutex

	watch_procs $p2 1 20

	# Clean up, and check the log file from process 2. 
	error_check_good mutex_unlock [$env mutex_unlock $mutex] 0
	error_check_good env_close [$env close] 0 

	# We expect the log file to be empty.  If there are any 
	# messages, report them as failures.
	set fd [open $testdir/mut002.log r]
	while { [gets $fd line] >= 0 } {
		puts "FAIL: unexpected output in log file mut002: $line"
	}
	close $fd
}