]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.db.common/src/org/simantics/db/common/processor/MergingDelayedWriteProcessor.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.db.common / src / org / simantics / db / common / processor / MergingDelayedWriteProcessor.java
1 /*******************************************************************************\r
2  * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
3  * in Industry THTH ry.\r
4  * All rights reserved. This program and the accompanying materials\r
5  * are made available under the terms of the Eclipse Public License v1.0\r
6  * which accompanies this distribution, and is available at\r
7  * http://www.eclipse.org/legal/epl-v10.html\r
8  *\r
9  * Contributors:\r
10  *     VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.db.common.processor;\r
13 \r
14 import java.util.concurrent.ConcurrentLinkedQueue;\r
15 \r
16 import org.simantics.db.AsyncRequestProcessor;\r
17 import org.simantics.db.WriteGraph;\r
18 import org.simantics.db.common.request.DelayedWriteRequest;\r
19 import org.simantics.db.common.utils.Logger;\r
20 import org.simantics.db.exception.DatabaseException;\r
21 import org.simantics.db.request.DelayedWrite;\r
22 \r
23 final public class MergingDelayedWriteProcessor extends ProcessorBase {\r
24 \r
25     final long transactionKeepalivePeriod;\r
26     final ConcurrentLinkedQueue<DelayedWrite> queue = new ConcurrentLinkedQueue<DelayedWrite>(); \r
27     final private AsyncRequestProcessor processor;\r
28 \r
29     boolean hasAlreadyRequest = false;\r
30 \r
31     public MergingDelayedWriteProcessor(AsyncRequestProcessor processor, long transactionKeepalivePeriod) {\r
32         this.processor = processor;\r
33         this.transactionKeepalivePeriod = transactionKeepalivePeriod;\r
34     }\r
35 \r
36     class MergedWrite extends DelayedWriteRequest {\r
37 \r
38         @Override\r
39         public void perform(WriteGraph graph) throws DatabaseException {\r
40 \r
41 //            System.out.println("MergedWrite begins");\r
42 \r
43             while (true) {\r
44                 \r
45                 DelayedWrite next = queue.poll();\r
46                 if(next == null) {\r
47                     synchronized (MergingDelayedWriteProcessor.this) {\r
48                         if (transactionKeepalivePeriod > 0) {\r
49                             try {\r
50                                 MergingDelayedWriteProcessor.this.wait(transactionKeepalivePeriod);\r
51                             } catch (InterruptedException e) {\r
52                                         Logger.defaultLogError(e);\r
53                             }\r
54                             next = queue.poll();\r
55                         }\r
56                         if(next == null) {\r
57                             hasAlreadyRequest = false;\r
58 //                            System.out.println("MergedWrite ends");\r
59                             return;\r
60                         }\r
61                     }\r
62                 }\r
63 \r
64 //                System.out.println("MergedWrite executes " + next);\r
65                 try {\r
66                     next.perform(graph);\r
67                 } catch(Throwable t) {\r
68                         Logger.defaultLogError(t);\r
69                 }\r
70 \r
71             }\r
72 \r
73         }\r
74 \r
75     }\r
76 \r
77     @Override\r
78     public void asyncRequest(DelayedWrite request) {\r
79         \r
80         queue.add(request);\r
81 \r
82         synchronized (this) {\r
83         \r
84           if (!hasAlreadyRequest) {\r
85               processor.asyncRequest(new MergedWrite());\r
86               hasAlreadyRequest = true;\r
87           } else {\r
88               notify();\r
89           }\r
90           \r
91         }\r
92 \r
93     }\r
94 \r
95     @Override\r
96     public String toString() {\r
97         return "MergingDelayedWriteProcessor@" + System.identityHashCode(this) + " (based on " + processor + ")";\r
98     }\r
99 \r
100 }\r