Ver código fonte

Added thread lock to TimerService.

Markus Mühlbrandt 9 anos atrás
pai
commit
edcc50e9f6

+ 10 - 0
plugins/org.yakindu.sct.generator.java/src/org/yakindu/sct/generator/java/TimerService.xtend

@@ -34,6 +34,8 @@ class TimerService {
 		import java.util.List;
 		import java.util.Timer;
 		import java.util.TimerTask;
+		import java.util.concurrent.locks.Lock;
+		import java.util.concurrent.locks.ReentrantLock;
 		
 		/**
 		 * Default timer service implementation.
@@ -45,6 +47,8 @@ class TimerService {
 			
 			private final List<TimeEventTask> timerTaskList = new ArrayList<TimeEventTask>();
 			
+			private final Lock lock = new ReentrantLock();
+			
 			/**
 			 * Timer task that reflects a time event. It's internally used by
 			 * {@link TimerService}.
@@ -90,6 +94,7 @@ class TimerService {
 			
 				// Create a new TimerTask for given event and store it.
 				TimeEventTask timerTask = new TimeEventTask(callback, eventID);
+				lock.lock();
 				timerTaskList.add(timerTask);
 			
 				// start scheduling the timer
@@ -98,15 +103,18 @@ class TimerService {
 				} else {
 					timer.schedule(timerTask, time);
 				}
+				lock.unlock();
 			}
 			
 			public void unsetTimer(ITimerCallback callback, int eventID) {
+				lock.lock();
 				int index = timerTaskList.indexOf(new TimeEventTask(callback, eventID));
 				if (index != -1) {
 					timerTaskList.get(index).cancel();
 					timer.purge();
 					timerTaskList.remove(index);
 				}
+				lock.unlock();
 			}
 			
 			/**
@@ -114,8 +122,10 @@ class TimerService {
 			 * memory resources.
 			 */
 			public void cancel() {
+				lock.lock();
 				timer.cancel();
 				timer.purge();
+				lock.unlock();
 			}
 		}