Transitions as Transactions ⋆ Shengyuan Wang, Weiyi Wu, Yao Zhang, and Yuan Dong Department of Computer Science and Technology Tsinghua University, Beijing, 100084, China {wwssyy}@tsinghua.edu.cn http://soft.cs.tsinghua.edu.cn/~wang Abstract. As newly developed transactional memory technology has received significant attention as a way to dramatically simplify shared- memory concurrent programming, user-level transactional concurrent programming models have become a very interesting topic in the pro- gramming community. However, the fact is that, in existing transactional concurrent programming models, user-level mechanisms have not been well developed. The dilemma is how to make a balance between the performance and correctness of a program. Explicit concurrency among cooperative transactions can undoubtedly decrease the rate of conflicts and improve the performance, but it is harmful to the correctness. In this paper, a transactional concurrent programming approach, based on Petri nets, is presented, which can easily specify concurrency among transac- tions and do not aggravate programmers remarkably in writing correct transactional concurrent programs. In this approach, a special Petri net system with transition markings is developed. Although such a Petri net system is not defined conventionally, it is shown that its behavior can be simulated through a conventional net, so existing analysis and verification approaches for usual Petri nets can be applied indirectly. Key words: Concurrent Programming; Transactional Memory; Petri Nets 1 Introduction Transactional memory mechanism has recently received significant attention as a way to dramatically simplify memory-sharing concurrent programming, in which mutual exclusion and synchronization can be constructed without using any locks [1]. For convenience,a concurrent programming model based on transactional memory mechanism is called a transactional concurrent programming model in this paper. In existing user-level transactional concurrent programming models, there are two major solutions. One of them is to use directly some API’s for transac- tional memory mechanism, which may be implemented by hardware, software or hybrid. For example, programmers can write transactional concurrent programs ⋆ Supported by the National Natural Science Foundation of China under grant No. 90818019 S. Wang, W. Wu, Y. Zhang and Y. Dong: Transitions as Transactions 137 in Java together with the library DSTM2 [2], or in C together with the library TL2-x86 [3]. The advantage of this solution is that one can use existing com- mon languages without changing their compilers, but programmers have to use non-structural library functions carefully. Another solution is to extend conventional programming languages with some transactional features, such as atomic statement-blocks, as in some new lan- guages Fortress [4], X10 [5], Chapel [6], etc. In this solution, it is easier for programmers to write correct transactional concurrent programs, however, an appropriate compiler must be provided. To develop a user-level transactional concurrent programming mechanisms, one dilemma is how to make a balance between the performance and correctness of a program. On the one hand, to write an efficient program in the transac- tional programming paradigm, it still needs programmers’ wisdom to build the explicit parallelism among cooperative transactions, in order to decrease the rate of conflicts. On the other hand, however, explicit parallelism is harmful to the correctness of a program, while one of the initial intents of the transactional memory mechanism is to alleviate the burden for a programmer to write con- current programs. There have been some contributions in the literature to introduce transac- tions into existing concurrent programming model. For example, a CCR-based transactional concurrent programming model was proposed by T. Harris and K. Fraser [7], and Baek et al extend the API’s of OpenMP [8] to OpenTM [9]. Unfortunately, these approaches still have the usual drawbacks of concurrent programs, that is, not easy to write and not easy to verify. As well known, Petri nets [10] are useful tools in the specification and verifi- cation of concurrent applications. With true concurrency dynamical semantics, a Petri net system has a good opportunity to become a realistic part of a con- current program for multi-core or multi-thread architecture. In this paper, we present informally a transactional concurrent programming mechanism based on a Petri net, in order to specify concurrency among transactions explicitly while not to aggravate programmers remarkably in writing correct concurrent programs. Fig.1 shows a simple example described in a typical transactional concurrent program structure, where an atomic statement-block declares a transactional region, and fork 1, fork 2, fork 3 and cake_c are shared objects among cooperative transactions. In the Petri net system shown in Fig.2, to be explained in more details, each of the transitions declares a transactional region, and fork 1, fork 2, fork 3 and cake_c are shared objects among three cooperative transactions. Since the accesses of fork 1, fork 2 , and fork 3 will never conflict, the rate of access conflicts among transactions is decreased, compared to the program in Fig.1. Extremely, we can protect all shared objects by the Petri net system, cor- responding to the so-called conservative concurrency control. However, if the number of shared objects increases dramatically, the net system may get too big in size. Fortunately, we can leave some shared objects to be protected by the 138 PNSE’11 – Petri Nets and Software Engineering int fork1 = 0, fork2 = 0, fork3 = 0; thread ph2: thread ph3: int cake_c = 12; while ( true ) { while ( true ) { atomic { atomic { read fork2 ; read fork3 ; thread ph1: read fork3 ; read fork1 ; while ( true ) { write fork2+1 to fork2 ; write fork3+1 to fork3 ; atomic { write fork3+1 to fork3 ; write fork1+1 to fork1 ; read fork1 ; if ( fork2 mod 10 == 0 ) { if ( fork1 mod 20 == 0 ) { read fork2 ; read cake_c ; read cake_c ; write fork1+1 to fork1 ; write cake_c-1 to cake_c ; write cake_c-1 to cake_c ; write fork2+1 to fork2 ; } } } } } } } } Fig. 1. A simple example of typical transactional concurrent program structure transactional memory mechanism, if the probability of access conflicts for those shared objects is not that big. For example, we have not made the accesses to cake_c protected by the net system in Fig.2. We call a shared object to be critical or non-critical according to its probabil- ity of access conflicts. So in the transactional concurrent programming approach suggested in this paper, programmers are encouraged to implement the pro- tection of critical shared objects through Petri net systems, and to leave the non-critical shared objects to be protected automatically by the transactional memory system. In the example shown in Fig.1 and Fig.2, the shared object cake_c is less frequently accessed than fork i’s, hence, it is assumed that fork i’s be critical shared objects among phi’s, and cake_c be the non-critical shared object among them. The Petri net model we use is a special colored Petri net model [11], called resource nets, which guarantee the access consistency for shared objects. The semantics for a transactional memory mechanism is inspired by the implemen- tation of DSTM2 [2]. The rest of the paper is organized as follows. In Section 2, we make some informal interpretation to the Petri net model, resource nets. Further in Section 3, the behavior simulation of a resource net system is discussed. Then in Section 4, the program model is briefly presented. Section 5 shows a sample user-level transactional concurrent programming tool, where the concept resource nets is applied. Finally, Section 6 gives some remarks and the future work. 2 The Net Model As stated above, a transactional concurrent program can access two classes of shared objects, critical or non-critical ones. We use resource variables to access critical shared objects, and global variables to access non-critical shared objects. In the following, the set of resource variables is denoted by VR , and the set of global variables is denoted by VT . A resource net system is a special colored Petri net system N = (P, T, A, W, m0 , MF ), where S. Wang, W. Wu, Y. Zhang and Y. Dong: Transitions as Transactions 139 Heap Memory ······ fork3 fork2 fork1 ······ cake_c MT cake_c : 12 ······ MR Stack fork1 : 0 fork2 : 0 ph1 fork3 : 0  : read fork1 ; 1 read fork2 ; write fork1+1 to fork1 ; write fork2+1 to fork2 fk1 fk2 fk3 ph2 ph3 : 2 read fork2 ; :3 read fork3 ; read fork3 ; read fork1 ; write fork2+1 to fork2 ; write fork3+1 to fork3 ; write fork3+1 to fork3 ; write fork1+1 to fork1 ; if ( fork2 mod 10 == 0 ) { if ( fork1 mod 20 == 0 ) { read cake_c ; read cake_c ; write cake_c-1 to cake_c ; write cake_c-1 to cake_c ; } } Fig. 2. A resource net system for Dining Philosophers – P ⊆ {ρk | k ∈ N}, and T ⊆ {(τk , Ik ) | k ∈ N} are the set of places and the set of transitions respectively. – A = (P × T) ∪ (T × P) is the set of arcs. – W : A → {S | S ⊆ VR } is the inscription function. – m0 ∈ Marking is the initial marking, where Marking = {m | m : (P ∪ T) → {S | S ⊆ VR }}. – MF ⊆ Marking is the set of final markings. A resource net system N = (P, T, A, W, m0 , MF ) has the following features: – For each transition (τk , Ik ) ∈ T, a command sequence Ik is attached. When a transition (τk , Ik ) is fired, it starts a transaction for the command sequence Ik . A command in Ik can access shared variables in VR ∪VT , and the variables local to τk . – A transition can hold a token while its transaction is executing, and the token does not return to the net system until the computation is committed or aborted. So we extend the definition of marking with transition markings. 140 PNSE’11 – Petri Nets and Software Engineering – It is possible that MF is empty, which is the usual case in conventional Petri net systems.. It is worth to noting that variables in VR should be disjoined in locations with each other, which are usually implemented by the compiler. 2.1 An Example Example 1 Fig.2 shows a transactional concurrent program with VR = { fork 1, fork 2,fork 3} and VT = { cake_c }. The resource net system N = (P, T, A, W, m0 , MF ), where – P = {f k1, f k2, f k3}. – T = {tr1, tr2, tr3}, where tr1 = (ph1, I1 ), tr2 = (ph2, I2 ), and tr3 = (ph3, I3 ), where I1 , I2 and I3 are command sequences attached to transi- tions ph1, ph2, and ph3 respectively, as is illustrated in Fig.2. – A = {(tr1,f k1), (tr1,f k2), (tr2,f k2), (tr2,f k3), (tr3,f k3), (tr3,f k1), (f k1,tr1), (f k1, tr3), (f k2, tr2), (f k2, tr1), (f k3, tr3), (f k3, tr2)}. – W is defined by: W (f k1, tr1) = W (tr1, f k1) = W (f k1, tr3) = W (tr3, f k1) = {fork1}, W (f k2, tr2) = W (tr2, f k2) = W (f k2, tr1) = W (tr1, f k2) = {fork2}, W (f k3, tr2) = W (tr2, f k3) = W (f k3, tr3) = W (tr3, f k3) = {fork3}. – m0 ∈ Marking is defined by: m0 (f k1) = {fork1}, m0 (f k2) = {fork2}, m0 (f k3) = {fork3}, and m0 (τ ) = ∅ for τ = tr1, tr2, tr3. – MF = ∅. 2.2 Well-Formed Resource Net Systems A resource net system N = (P, T, A, W, m0 , MF ) is well-formed, if – P ∩ T = ∅. – ∀ρ ∈ P.∀v1 , v2 ∈ m0 (ρ).(v1 6= v2 ), that is, at the initial marking, all tokens owned by a place are corresponding to different resource variables. – ∀ρ1 , ρ2 ∈ P.∀v1 ∀v2 .(ρ1 6= ρ2 ∧ v1 ∈ m0 (ρ1 ) ∧ v2 ∈ m0 (ρ2 ) → v1 6= v2 ), that is, at the initial marking, tokens owned by different places have disjoint resource variables. – ∀τ ∈ T.(m0 (τ ) = ∅), that is, at the initial marking, every transition contains no tokens. – ∀m ∈ MF .∀τ ∈ T.(m(τ ) = ∅), that is, at each of final markings, every transition will not contain any tokens. – ∀τ ∈ T.∀ρ1 , ρ2 ∈ •τ.∀v1 ∀v2 .(ρ1 6= ρ2 ∧ v1 ∈ W (τ, ρ1 ) ∧ v2 ∈ W (τ, ρ2 ) → v1 6= v2 ), that is, all sets of resource variables on the incoming arcs of the same transition are disjoined with each other. S. Wang, W. Wu, Y. Zhang and Y. Dong: Transitions as Transactions 141 – ∀τ ∈ T.∀ρ1 , ρ2 ∈ τ • .∀v1 ∀v2 .(ρ1 6= ρ2 ∧ v1 ∈ W (ρ1 , τ ) ∧ v2 ∈ W (ρ2 , τ ) → v1 6= v2 ), that is, all sets of memory blocks on the outgoing arcs of the same transition are disjoined with each S other. – ∀τ ∈ T.∀ρ ∈ τ • .(W (τ, ρ) ⊆ ρ′ ∈•τ (W ((ρ′ , τ ))), that is, no extra shared objects be produced within a transaction associated to each of transitions. For simplification,in this paper, we don’t consider the dynamic memory al- location for a shared object within a transaction. In the above,the pre-set and post-set of a transition τ ∈ T or a place ρ ∈ P are used, which are defined as usual: •τ = {ρ | (ρ, τ ) ∈ A}, τ • = {ρ | (τ, ρ) ∈ A}, •ρ = {τ | (τ, ρ) ∈ A}, and ρ• = {τ | (ρ, τ ) ∈ A}. Example 2 It is easy to show that the resource net system in Example 1 is well-formed. 2.3 Execution Semantics To show the execution semantics of a resource net system, we define TranState = {blocked, active, aborted, committed }, consisting of 4 transaction states of a transition. At the initial marking, every transition has the state blocked. Entering a Transition Whenever a transition τ in the resource net system is in state blocked, and the firing condition for τ is satisfied under the current marking m, that is, ∀ρ ∈ •τ.(m(ρ) ⊇ W (ρ, τ )), and in the same time, the current marking is not a final state, that is, m ∈ / MF , the system can enter the transition such that a transaction is started and the transition gets to hold tokens. When it occurs, the state of the τ will be active. Execution of a Command Sequence Whenever a transition τ in the resource net system is in state active, and the next command in its remained command sequence is c, the transition can make a progress by executing the command c. We need several separate rules respectively for several cases: (1) If c reads or writes to a global variable which has been written most recently by some other transition but τ , a read/write confliction occurs, and τ will be in the state aborted. (2) If the execution of c has no read/write confliction and c has no write operation to any global variables, the transition will keep in state active. (3) If the execution of c has no read/write confliction and c has a write operation to some global variable x, the transition will keep in state active, while the system will record τ to be the transition that most recently written to x. Ready to Commit a Transaction Whenever a transition τ in the resource net system is in state active, and there is no next command in its remained command sequence, the system can make a progress to change the state of τ from active to committed, meaning that the transaction associated to τ is ready to commit. Committing a Transaction Whenever a transition τ in the resource net system is in state committed, the system can make a progress to commit the transaction associated to τ , changing the state of τ from committed to blocked. 142 PNSE’11 – Petri Nets and Software Engineering Aborting a Transaction Whenever a transition τ in the resource net system is in state aborted, the system can make a progress to return tokens to places in the pre-set of τ , changing the state of τ from aborted to blocked. Let N = (P, T, A, W, m0 , MF ) be a well-formed resource net system, it is easy to show that for any reachable marking m from the initial marking m0 , the following two properties are satisfied – ∀x ∈ P ∪ T.∀v1 , v2 ∈ m(x).(v1 6= v2 ),that is, at the marking m, all tokens owned by a place or a transition are corresponding to different resource variables. – ∀x1 , x2 ∈ P ∪ T.∀v1 ∀v2 .(x1 6= x2 ∧ v1 ∈ m(x1 ) ∧ v2 ∈ m(x2 ) → v1 6= v2 ), that is, at the marking m, all tokens owned by different places or transitions have disjoint resource variables. Example 3 Since the resource net system N = (P, T, A, W, m0 , MF ) in Example 1 is well-formed. So the above two properties will keep in a well-formed program state during its execution. 3 Behavior Simulation of a Resource Net System In this section, it will be shown that a well-formed resource net system N can be reduced to an usual colored Petri net system desugar(N ) so that the behavior of N can be simulated by desugar(N ), which can be analyzed and verified by using existing approaches in the Petri net community. The transformation from N to desugar(N ) is called desugaring. Before and after desugaring, the change of net structure can be illustrated by Fig.3. …… m …… m enter rollback commit …… m …… m (a) (b) Fig. 3. Net structure before and after desugaring Example 4 Consider the well-formed resource net system N = (P, T, A, W, m0 , MF ) in Example 1. desugar(N ) = (P′ , T′ , A′ , W ′ , m′0 , MF′ ) can be depicted in Fig.4, where S. Wang, W. Wu, Y. Zhang and Y. Dong: Transitions as Transactions 143 ph1commit ph1 ph1enter ph1rollback fk2 fk1 fk3 ph2enter ph3enter ph2rollback ph3rollback ph2 ph3 ph2commit ph3commit Fig. 4. Example of a desugaring net system – P′ = {f k1, f k2, f k3, ρph1 , ρph2 , ρph3 }. – T′ = {ph1enter , ph2enter , ph3enter , ..., ph3commit } – A′ = {(ph1enter , ρph1 ), (ph2enter , ρph2 ), (ph3enter , ρph3 ), ..., (f k1, ph1enter ), (f k1, ph3enter ), ..., (ph1rollback , f k1), (ph3rollback , f k1), ..., (ph1commit , f k1), (ph3commit , f k1), ..., ..., (ph3commit , f k3)}. – The definition of W ′ is illustrated in Table 1 (partly). – m′0 is defined by m′0 (ρph1 ) = m′0 (ρph2 ) = m′0 (ρph3 ) = ∅, m′0 (f k1) = {{fork1}}, m′0 (f k2) = {{fork2}}, and m′0 (f k3) = {{fork3}}. – MF′ = ∅. It is not difficult to establish a behavior simulation relation between N and desugar(N ), and show that many behavior properties, including deadlock-freeness, for N can be verified indirectly by verifying those for desugar(N ). For example, it is easy to verify that the usual Petri net system desugar(N ) in Example 4 is deadlock-free, so we can conclude that the resource net system N is also deadlock-free. It is worth to noting that the execution semantics can guarantee behaviour consis- tence between N and desugar(N ). For every transition τ in N and ρτ in desugar(N ) as illustrated in Fig.3, we have – If τ is in state blocked, there no token in ρτ , and τenter is enabled. If τenter fires, τ will be in state active at the same time. – If τ is in state active, nether τcommit or τrollback will fire though there exist tokens in ρτ . – If τ is in state committed, τcommit is enabled. – If τ is in state aborted, τrollback is enabled. – τ is in state active, committed, or aborted, iff there no token in ρτ . 144 PNSE’11 – Petri Nets and Software Engineering Table 1. W ′ : A′ → {L | L ⊆ 2Label } if a = then W ′ (a) = (ph1enter , ρph1 ) {{fork1}, {fork2}} (ph2enter , ρph2 ) {{fork2}, {fork3}} (ph3enter , ρph3 ) {{fork3}, {fork1}} ... ... (f k1, ph1enter ) {{fork1}} (f k1, ph3enter ) {{fork1}} ... ... (ph1rollback , f k1) {{fork1}} (ph3rollback , f k1) {{fork1}} ... ... (ph1commit , f k1) {{fork1}} (ph3commit , f k1) {{fork1}} ... ... (ph3commit , f k3) {{fork3}} For the sake of limited space, in this paper, we have not formally defined the desugaring and the behavior simulation relation. 4 The Program Model In the transactional concurrent programming approach of this paper, a program con- sists of a set of Petri net systems, which are protected parts in the system, and a set of unprotected threads which contains an initial thread identified root and other unpro- tected threads. Resource variables can only be accessed within protected parts. At the beginning, the thread root is initialized to execute at the level which we call top level. A set of Petri net systems can spawn outside a Petri net system, initialized with new allocated resource variables or their references. When a transition in a Petri net system is fired, it becomes a (transactional) transition thread, which will eventually commit, or rollback due to conflicts to access the shared memory. An unprotected thread except for the thread root can be spawned outside a Petri net system. The program ends if all the Petri net systems achieve one of their final states, and in the same time all the unprotected threads execute to the end. 5 A sample user-level transactional concurrent programming tool A sample user-level transactional concurrent programming tool has been developing in our lab, based on available software sources, DSTM2 [2], PNK [13] and GJC [14]. In the programming model of this sample programming tool, a program consists of a set of Petri net systems, corresponding to resource net systems in this paper, and other part written in Java Language. A simple visual IDE for this programming model has been developing. S. Wang, W. Wu, Y. Zhang and Y. Dong: Transitions as Transactions 145 Fig. 5. A basic editing view Editors In the IDE, each of the elements of a program can be visually edited. Fig.5 shows a basic editing view. A editor for a Petri net system is similar to that provided in PNK source, but some modifications to add code editing area, to make the code editing to be the main input area, and to integrate with associate compilation operations. Fig. 6. A visual Petri net system A visually edited Petri net system will be automatically translated to some code to be fed to the compiler. It actually completes a class inherited from a class PetriNet for the programmer, where PetriNet is the class encapsulated for a special Petri net 146 PNSE’11 – Petri Nets and Software Engineering virtual machine. For example, for the Petri net system in Fig.6, the result class will be the one in Fig.7. package base_directory.pnml.compile; public class PNTest extends PetriNet{ public PNTest(Object objectSource) { super(objectSource); this.AddTransition("t1","code", "f1"); this.AddTransition("t2","code", "f2"); this.AddTransition("t3","code", "f3"); this.AddPlace("p1", "a,b", "marking"); this.AddPlace("p2", "", "marking"); this.AddArc("p1", "t1", "a", "inscription"); this.AddArc("t1", "p2", "a", "inscription"); this.AddArc("p1", "t2", "b", "inscription"); this.AddArc("t2", "p2", "b", "inscription"); this.AddArc("p2", "t3", "a,b", "inscription"); } } Fig. 7. Class for a Petri net system Associate Compilation The associate compilation makes the static check of a Petri net system, then associates its code with all other parts of opened codes and compiles them together with each other. At the early time of the compilation, the Petri net system is translated into its internal form as the Petri net virtual machine instructions, which then is added to its specific class. Variables corresponding to transaction memory blocks and resource memory blocks are declared with the modifiers global and resource respectively. Besides, the code for each transition of a Petri net system is defined by a specific member function with the modifier petrinet. In the associate compilation, the lexical, syntactical, and semantical analysis associate to the modifiers global, resource and petrinet has been processed carefully. The compiler has been implemented based on GJC [14], a open Java compiler released by Sun, and kept the original logic of GJC unchanged. The statical semantic check for a Petri net system is corresponding to the definition of a well-formed resource net system in Section 2.2. STM Integration The transactional memory support is based on DSTM2 [2], with each piece of transition code automatically trisected by invoking provided STM APIs. Hence the variable with modifier Global can be protected by the transactional memory system. In order to integrate DSTM2’s API, we need to make some modification to GJC. We need to change the type of every variable with modifier Global to a wrapper class with a factory. Also we need to change every reference of those variables and every left-value consisted of those variables to corresponding DSTM2’s APIs. S. Wang, W. Wu, Y. Zhang and Y. Dong: Transitions as Transactions 147 Fig.8 illustrates how to transact a global variable in our implementation. Currently we only support basic types or simple “copyable” types. @atomic interface _T { T getValue (); void setValue (T value); } Factory<_T> factory_T = Thread.makeFactory(_T.class); global T a; _T _a = factory_T.create(); a = x; _a.setValue(x); x = a; x = _a.getValue(); Fig. 8. Transactional global variables Petri Net Virtual Machine As stated above, a Petri net system is finally translated to some class inherited from a class PetriNet, which encapsulates interfaces for a special Petri net virtual machine. The Petri net virtual machine is now simply designed with the following instructions: – AddTransition (name,code) – AddPlace (name,resource) – AddArc (Source, Target, Inscription) – Start () – Join () where AddTransition, AddPlace, and AddArc are used to construct a Petri net system, and Start and Join used for scheduling the execution of a Petri net system. Fig.9 shows an example to start the Petri net system defined in Fig.6 or Fig.7. One possible execution result will be "a=1 a=1 b=3", and another possible result is "a=0 a=1 b=3", as is illustrated in Fig.10. Fig.11 and Fig.12 illustrate the integration of a simple Petri net transition simulator and DSTM routine. The left routine in Fig.11 simulate a Petri net transition to do something, and the right part is the DSTM routine to do the same task. Fig. 12 integrates the functions of two routines in Fig.11, getting a so-called PNTM routine. The Petri net virtual machine can be implemented on any architecture you like, especially, it will be helpful if the target architecture can efficiently support concurrent programming, such as a CMP system. Until now, we have just implemented the Petri net virtual machine based on JVM. The latest stable version of source code, in which the invoking of STM API’s in DSTM2 has not been packaged, can be downloaded at the URL: http://soft.cs.tsinghua.edu.cn/~wang/projects/NSFC90818019/software/pntm.rar We are making a research plan to extend the virtual machine and its implementation based on some reconfigurable simulator for multi-core architectures such that some basic performance analysis could be made. 148 PNSE’11 – Petri Nets and Software Engineering package base_directory.pnml.compile; public class Test { private resource int a =0; private resource int b =0; public static void main(String[] args) { Test t= new Test(); new PNTest(t).start(); } public petrinet void f1() { a=1; } public petrinet void f2() { System.out.print("a="+a); b=3; } public petrinet void f3() { System.out.print("a="+a); System.out.print("b="+b); a=4; b=5; } } Fig. 9. Example for starting a Petri net system Fig. 10. Two different executions on the simple virtual machine 6 Remarks and Future Work The paper presents an approach to integrate a Petri net system with a transitional memory mechanism, which has currently been applied to the implementation of a user- level transactional concurrent programming tool in our lab. There is few formalism to play such a role as we have known so far. There exist researches based on Petri nets to model atomic or transactional threads, however the net system is not a part of the program. For example, an approach to check causal atomicity is proposed by modeling programs using Petri Nets [12]. At some extent, concurrent programming models based on Petri nets, such as OPN [15], CLOWN [16], COO [17], CO-OPN/2 [18], and Elementary Object Nets [19] may be extended to support various transaction semantics with the conservative concurrency control. We observed that the integration of Petri nets with transactional memory can bring benefits to both side, which is the motivation of the paper. On the one hand, with S. Wang, W. Wu, Y. Zhang and Y. Dong: Transitions as Transactions 149 Thread.onCommit(new Runnable() { public void run () { Commit(); } }); Thread.onAbort(new Runnable() { public void run () { TestAndConsumeToken(); Abort(); DoThings(); } ProduceToken(); }); Thread.doIt(new Callable() { public Void call () throws Exception { DoThings(); } }); PN-Transition routine DSTM routine Fig. 11. Petri net transition and DSTM routines Thread.onCommit(new Runnable() { public void run () { ProduceToken(); } }); Thread.onAbort(new Runnable() { public void run () { ReturnToken(); } }); TestAndConsumeToken(); Thread.doIt(new Callable() { public Void call () throws Exception { DoThings(); } }); Fig. 12. PNTM routine transactional memory, a finer granularity of concurrency can be achieved in a Petri net system, and the scale of the net model can be controlled flexibly. On the other hand, with a Petri net system, the concurrency among cooperative transactions can be built explicitly, which can undoubtedly decrease the rate of conflicts and improve the performance, while the analysis and verification capability of a Petri net model can be inherited. The main idea in a resource net system, the net system presented in the paper, is to classify shared resources in two classes: (1) resources such that the access policy is driven by the net structure, so that mutual exclusion is guaranteed; (2) resources 150 PNSE’11 – Petri Nets and Software Engineering whose access policy is driven by a transactional memory model, with possible conflicts, resolved by a commit-rollback protocol. That is, our approach advocates the methodology that critical objects shared among concurrent transactions will be protected through a resource net system, while non- critical shared objects be left protected automatically by the transactional memory system. Thus the net system can be designed flexibly to keep a moderate size and in a finer granularity than usual net system. It is shown that the behavior of a well-formed resource net system can be simu- lated by its desugar net system, which can be analyzed and verified by using existing approaches in the Petri net community. Behavior properties for a well-formed resource net system, such as deadlock-freeness, can be verified indirectly by verifying those for its desugaring net system. For example, INA tool [20] can be directly integrated into our programming tool being developed, as has been done in PNK. A practical user-level transactional concurrent programming tool, based on DSTM2 [2], PNK [13] and GJC [14], has been developing in our lab. The version so far is not suitable to make a performance analysis because the target virtual machine on which a program with Petri net structures runs is implemented simply based on JVM. We are making a plan to extend the virtual machine and its implementation such that some basic performance analysis could be made. Certainly, the approach could be extended to other formalisms as well. Furthermore, how to decide critical or non-critical shared objects, we believe, would become an interesting area in software design methodology. References 1. Tim Harris, et al., Transactional Memory: An Overview, IEEE Micro, vol. 27, no. 3, Pages 8-29, 2007. 2. Maurice Herlihy, Victor Luchangco, Mark Moir, A Flexible Framework for Imple- menting Software Transactional Memory, In Preceedings of OOPSLA’06, Pages 253-262, 2006. 3. TL2-x86, Stanford Transactional Applications for Multi-Processing, http://stamp.stanford.edu/. 4. E. Allen et al., The Fortress Language Specification, Sun Microsystems, 2005. 5. P. Charles et al, X10: An Object-Oriented Approach to Non-Uniform Cluster Com- puting, Proc. 20th Ann. ACM SIGPLAN Conf Object-Oriented Programming, Systems, Languages, and Applications (OOPSLA05), ACM Press, pp. 519-538, 2005. 6. Chapel Specification 0.4, Cray Inc., 2005; http://chapel.cs.washington.edu/Specification.pdf. 7. Tim Harris, Keir Fraser, Language Support for Lightweight Transactions, OOP- SLA’03, October 26-30, 2003. 8. The OpenMP API specification for parallel programming. URL: http://openmp.org. 9. Baek W., Minh C. C., Trautmann M., Kozyrakis C., and Olukotun K., The OpenTM Transactional Application Programming Interface, In PACT’07: Proceed- ings of the 16th international conference on Parallel architectures and compilation techniques, Washington, DC, USA: IEEE Computer Society, pp. 376-387, 2007. 10. W. Reisig, Petri Nets, EATCS Monagraphs on Theoretical Computer Science, Springer Verlag, 1985. S. Wang, W. Wu, Y. Zhang and Y. Dong: Transitions as Transactions 151 11. K.Jensen. Coloured Petri Nets: Basic Concepts, Analysis Methods and Practical Use, Volume 1, EATCS Monographs in Computer Science, Springer verlag, 1992. 12. Azadeh Farzan, P. Madhusudan,Causal Atomicity. In Proceedings of Computer Aided Verification (CAV) 2006, Lecture Notes in Computer Science, volume 4144: 315-328, 2006. 13. Ekkart Kindler, Michael Weber, The Petri Net Kernel: An infrastructure for build- ing Petri net tools, International Journal on Software Tools for Technology Transfer (STTT), Vol 3, No.: 486-497, 2001. PNK available at : http://www2.informatik.hu- berlin.de/top/pnk/. 14. GJC available at : http://www.sun.com/software/communitysource/j2se /java2/download.xml 15. C.A. Lakos, Object-Oriented Modelling with Object Petri Nets, Concurrent Object-Oriented Programming and Petri Nets, G. Agha, F.D. Cindio, and G. Rozenberg (eds.), Lecture Notes in Computer Science 2001, Springer-Verlag, pages 1-37, 2001. 16. E.Batiston, A.Chizzoni, Fiorella De Cindo, CLOWN as a Testbed for Concurrent Object-Oriented Concepts, Concurrent Object-Oriented Programming and Petri Nets, G. Agha, F.D. Cindio, and G. Rozenberg (eds.), Lecture Notes in Computer Science 2001, Springer-Verlag, pages 131-163, 2001. 17. C.Sibertin-Blanc, CoOperative Objects: Principles, Use and Implementation, Con- current Object-Oriented Programming and Petri Nets, G. Agha, F.D. Cindio, and G. Rozenberg (eds.), Lecture Notes in Computer Science 2001, Springer-Verlag, pages 216-246, 2001. 18. O. Biberstein, D. Buchs, N. Guelfi, Object-Oriented Nets with Algebraic Speci- fications: The CO-OPN/2 Formalism, Concurrent Object-Oriented Programming and Petri Nets, G. Agha, F.D. Cindio, and G. Rozenberg (eds.), Lecture Notes in Computer Science 2001, Springer-Verlag, pages 73-130, 2001. 19. R.Valk. Petri Nets as Token Objects An Introduction to Elementary Object Nets. Proceedings of 19th International Conference on the Application and Theory of Petri Nets, LNCS 1420, Springer-Verlag, 1998. 20. INA:Integrated Net Analyzer, at http://www.informatik.hu- berlin.de/lehrstuehle/automaten/ina.