Initial import
[jpf-core.git] / src / tests / gov / nasa / jpf / test / mc / basic / UnlockNonSharedTest.java
1 /*
2  * Copyright (C) 2014, United States Government, as represented by the
3  * Administrator of the National Aeronautics and Space Administration.
4  * All rights reserved.
5  *
6  * The Java Pathfinder core (jpf-core) platform is licensed under the
7  * Apache License, Version 2.0 (the "License"); you may not use this file except
8  * in compliance with the License. You may obtain a copy of the License at
9  * 
10  *        http://www.apache.org/licenses/LICENSE-2.0. 
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and 
16  * limitations under the License.
17  */
18
19 package gov.nasa.jpf.test.mc.basic;
20
21 import gov.nasa.jpf.util.test.TestJPF;
22 import gov.nasa.jpf.vm.Verify;
23
24 import org.junit.Test;
25
26 /**
27  * Ensures that a recursive lock/unlock doesn't leave the lock in an acquired state.
28  */
29 public class UnlockNonSharedTest extends TestJPF
30 {
31    @Test
32    public void test() throws InterruptedException
33    {
34       Runnable task, nop;
35       Thread thread;
36       
37       if (verifyNoPropertyViolation())
38       {
39          Verify.setProperties("vm.por.skip_local_sync=true");
40
41          nop = new Runnable()
42          {
43             @Override
44                         public void run()
45             {
46                // nothing to do
47             }
48          };
49          
50          task = new Runnable()
51          {
52             private final Object m_lock = new Object();
53             private       int    m_count;
54             
55             @Override
56                         public void run()
57             {
58                synchronized (m_lock)
59                {
60                   m_count++;
61                }
62             }
63          };
64          
65          task.run();                    // Acquire m_lock in a single-threaded state so that MONITOREXIT.isShared() will return false.  (The bug would cause ei.unlock() to not be called).
66          
67          thread = new Thread(task);     // Create a thread to acquire m_lock.
68          
69          thread.setDaemon(false);
70          thread.start();                // To reproduce the bug, this thread shouldn't start executing until after the main thread exits.  This thread should then execute to the point just before acquiring m_lock.
71          
72          thread = new Thread(nop);      // Create another thread.  This thread must not be able to reach m_lock.
73    
74          thread.setDaemon(false);
75          thread.start();                // This thread should start and exit before the above thread acquires m_lock.  Due to the bug, the above thread won't be able to acquire the lock and hence a "deadlock" will ensue.
76       }
77    }
78 }