File: PendingCall.cs

package info (click to toggle)
aircrack-ng 1%3A1.6%2Bgit20210130.91820bc-1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 19,056 kB
  • sloc: ansic: 67,045; cs: 5,392; sh: 3,773; python: 2,565; pascal: 1,074; asm: 570; makefile: 253; cpp: 46
file content (63 lines) | stat: -rw-r--r-- 1,081 bytes parent folder | download | duplicates (16)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
// Copyright 2007 Alp Toker <alp@atoker.com>
// This software is made available under the MIT License
// See COPYING for details

using System;
using System.Threading;

namespace NDesk.DBus
{
	class PendingCall
	{
		Connection conn;
		Message reply = null;
		object lockObj = new object ();

		public PendingCall (Connection conn)
		{
			this.conn = conn;
		}

		int waiters = 0;

		public Message Reply
		{
			get {
				if (Thread.CurrentThread == conn.mainThread) {
					/*
					while (reply == null)
						conn.Iterate ();
					*/

					while (reply == null)
						conn.HandleMessage (conn.ReadMessage ());

					conn.DispatchSignals ();
				} else {
					lock (lockObj) {
						Interlocked.Increment (ref waiters);

						while (reply == null)
							Monitor.Wait (lockObj);

						Interlocked.Decrement (ref waiters);
					}
				}

				return reply;
			} set {
				lock (lockObj) {
					reply = value;

					if (waiters > 0)
						Monitor.PulseAll (lockObj);

					if (Completed != null)
						Completed (reply);
				}
			}
		}

		public event Action<Message> Completed;
	}
}