01: /*******************************************************************************
02: * Copyright (c) 2006, 2007 IBM Corporation and others.
03: * All rights reserved. This program and the accompanying materials
04: * are made available under the terms of the Eclipse Public License v1.0
05: * which accompanies this distribution, and is available at
06: * http://www.eclipse.org/legal/epl-v10.html
07: *
08: * Contributors:
09: * IBM Corporation - initial API and implementation
10: *******************************************************************************/package org.eclipse.core.tests.databinding.observable;
11:
12: import java.util.LinkedList;
13:
14: import org.eclipse.core.databinding.observable.Realm;
15: import org.eclipse.core.runtime.IProgressMonitor;
16: import org.eclipse.core.runtime.IStatus;
17: import org.eclipse.core.runtime.Status;
18: import org.eclipse.core.runtime.jobs.ILock;
19: import org.eclipse.core.runtime.jobs.Job;
20:
21: /**
22: * @since 3.2
23: *
24: */
25: public class LockRealm extends Realm {
26:
27: private LinkedList queue;
28: private ILock lock;
29: private Job job;
30: private boolean lockAcquired;
31:
32: public LockRealm() {
33: queue = new LinkedList();
34: lock = Job.getJobManager().newLock();
35: job = new Job("Lock Realm Job") {
36: protected IStatus run(IProgressMonitor monitor) {
37: for (Runnable runnable; (runnable = dequeue()) != null;) {
38: acquireLock();
39: try {
40: safeRun(runnable);
41: } finally {
42: releaseLock();
43: }
44: }
45: return Status.OK_STATUS;
46: }
47: };
48: job.setSystem(true);
49: }
50:
51: protected void syncExec(Runnable runnable) {
52: acquireLock();
53: try {
54: safeRun(runnable);
55: } finally {
56: releaseLock();
57: }
58: }
59:
60: public void asyncExec(Runnable runnable) {
61: enqueue(runnable);
62: job.schedule();
63: }
64:
65: /**
66: * @param runnable
67: */
68: private void enqueue(Runnable runnable) {
69: synchronized (queue) {
70: queue.addLast(runnable);
71: }
72: }
73:
74: private Runnable dequeue() {
75: synchronized (queue) {
76: if (queue.isEmpty()) {
77: return null;
78: }
79: return (Runnable) queue.getFirst();
80: }
81: }
82:
83: public boolean isCurrent() {
84: return lockAcquired;
85: }
86:
87: private void acquireLock() {
88: lock.acquire();
89: lockAcquired = true;
90: }
91:
92: private void releaseLock() {
93: lockAcquired = false;
94: lock.release();
95: }
96:
97: }
|