Check-in [0f3a56d86f]

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Overview
Comment:Refactor the library lookup and such so that it is cleaner.
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA1:0f3a56d86f68e67bc8ca9edf37f33f0f7bb783d6
User & Date: stephanie.gawroriski 2019-07-11 15:16:09
Context
2019-07-11
22:46
Add Throwable.addSuppressed in the supervisor (for try-with-resources); Have loadClassInfo return an object instead of a pointer (so other things may be accessed); More base work on class initialization check-in: d869664507 user: stephanie.gawroriski tags: trunk
15:16
Refactor the library lookup and such so that it is cleaner. check-in: 0f3a56d86f user: stephanie.gawroriski tags: trunk
2019-07-06
13:28
Remove hiring message. check-in: b5079dbeeb user: stephanie.gawroriski tags: trunk
Changes
Hide Diffs Unified Diffs Ignore Whitespace Patch

Changes to runt/klib/supervisor/cc/squirreljme/jvm/BootLibrary.java.

115
116
117
118
119
120
121
122


123





















				bp + Assembly.memReadJavaInt(sp, TOC_NAME_OFFSET))))
				return i;
		}
		
		// Not found
		return -1;
	}
}































|
>
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
				bp + Assembly.memReadJavaInt(sp, TOC_NAME_OFFSET))))
				return i;
		}
		
		// Not found
		return -1;
	}
	
	/**
	 * Returns the data pointer of the given index.
	 *
	 * @param __dx The index to get the data for.
	 * @return The pointer to the index data or {@code 0} if it is not valid.
	 * @since 2019/07/11
	 */
	public final int resourceData(int __dx)
	{
		// Get base address of the library
		int bp = this.address;
		
		// If the resource is out of range, then ignore because some invalid
		// memory will be used which would be bad
		if (__dx < 0 || __dx >= Assembly.memReadJavaInt(bp, NUMRC_OFFSET))
			return 0;
		
		// Read from the table of contents, the offset to the data.
		return bp + Assembly.memReadJavaInt(
			bp + Assembly.memReadJavaInt(bp, TOC_OFFSET_OFFSET),
			(TOC_ENTRY_SIZE * __dx) + TOC_DATA_OFFSET);
	}
}

Changes to runt/klib/supervisor/cc/squirreljme/jvm/ClientClassInfo.java.

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













































/**
 * This contains the client class information.
 *
 * @since 2019/06/24
 */
public final class ClientClassInfo

{
	/** The pointer to the class information. */
	public final int classinfopointer;
	
	/** The pointer to the mini-class information. */
	public final int miniclassaddress;
	






	/**
	 * Initializes the client class information.
	 *
	 * @param __cip
	 * @param __minip
	 * @since 2019/06/24
	 */
	public ClientClassInfo(int __cip, int __minip)
	{
		this.classinfopointer = __cip;
		this.miniclassaddress = __minip;
	}
}






















































>







>
>
>
>
>
>



|
|







|
>
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91

/**
 * This contains the client class information.
 *
 * @since 2019/06/24
 */
public final class ClientClassInfo
	implements AutoCloseable
{
	/** The pointer to the class information. */
	public final int classinfopointer;
	
	/** The pointer to the mini-class information. */
	public final int miniclassaddress;
	
	/** The mini accessor instance which exists. */
	private volatile MiniClassAccessor _miniaccessor;
	
	/** The number of times the accessor is open. */
	private volatile int _opencount;
	
	/**
	 * Initializes the client class information.
	 *
	 * @param __cip The class info pointer.
	 * @param __minip The mini class address.
	 * @since 2019/06/24
	 */
	public ClientClassInfo(int __cip, int __minip)
	{
		this.classinfopointer = __cip;
		this.miniclassaddress = __minip;
	}
	
	/**
	 * Returns the mini-class accessor.
	 *
	 * @return The mini-class accessor.
	 * @since 2019/07/11
	 */
	public final MiniClassAccessor accessor()
	{
		// Detail details
		int opencount = this._opencount;
		MiniClassAccessor rv = this._miniaccessor;
		
		// If this is just being opened, then create an accessor for it
		if (opencount == 0)
			this._miniaccessor = (rv =
				new MiniClassAccessor(this.miniclassaddress));
		
		// Count up
		this._opencount = opencount + 1;
		
		// Use it
		return rv;
	}
	
	/**
	 * {@inheritDoc}
	 * @since 2019/07/11
	 */
	@Override
	public final void close()
	{
		// Get current count
		int opencount = this._opencount;
		
		// Reduce the count
		if (opencount > 0)
			opencount--;
		
		// Store new count
		this._opencount = 0;
		
		// If there are no counts then clear the object so it gets GCed
		if (opencount == 0)
			this._miniaccessor = null;
	}
}

Deleted runt/klib/supervisor/cc/squirreljme/jvm/ClientClassInfoLayout.java.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// -*- Mode: Java; indent-tabs-mode: t; tab-width: 4 -*-
// ---------------------------------------------------------------------------
// Multi-Phasic Applications: SquirrelJME
//     Copyright (C) Stephanie Gawroriski <xer@multiphasicapps.net>
// ---------------------------------------------------------------------------
// SquirrelJME is under the GNU General Public License v3+, or later.
// See license.mkd for licensing and copyright information.
// ---------------------------------------------------------------------------

package cc.squirreljme.jvm;

/**
 * This class contains the layout for the client's {@link ClassInfo} object
 * such as where all the fields are positioned.
 *
 * @since 2019/06/29
 */
public final class ClientClassInfoLayout
{
}

<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<










































Changes to runt/klib/supervisor/cc/squirreljme/jvm/ClientTask.java.

39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
..
82
83
84
85
86
87
88
89
90
91
92
93
94
95

96
97
98
99
100
101
102
103
104
105
106
107
108
109


110

111
112
113
114

115
116
117
118
119
120
121
122
123
...
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172

173
174
175
176
177
178
179
180
181
182
183
184

185
186
187

































188

189
190
191
192

193
194
195
196
197
198
199
200
201
202



203



























































	/** The classpath. */
	public final BootLibrary[] classpath;
	
	/** Classes which have been loaded. */
	public final HashMap<String, ClientClassInfo> classinfos =
		new HashMap<>();
	
	/** The layout for client class information. */
	private volatile ClientClassInfoLayout _classinfolayout;
	
	/**
	 * Initializes the client task.
	 *
	 * @param __pid The PID.
	 * @param __lid The LID.
	 * @param __cp The classpath used.
................................................................................
		// Just perform the allocation with our PID as part of the tag and
		// whatever was passed, masked correctly
		return Allocator.allocate(
			this.tagbits | (__tag & Allocator.CHUNK_BITS_VALUE_MASK), __sz);
	}
	
	/**
	 * Returns the layout which describes how the class info structure is
	 * laid out in memory.
	 *
	 * @return The class info layout.
	 * @since 2019/06/29
	 */
	public final ClientClassInfoLayout classInfoLayout()

	{
		// Has already been read?
		ClientClassInfoLayout rv = this._classinfolayout;
		if (rv != null)
			return rv;
		
		// Debug
		todo.DEBUG.note("Determining ClassInfo layout...");
		
		// Find index for object and 
		BootLibrary[] classpath = this.classpath;
		int jodx = ClientTask.__findClassIndex(classpath, "java/lang/Object"),
			cidx = ClientTask.__findClassIndex(classpath,
				"cc/squirreljme/jvm/ClassInfo");


		

		// This is not good
		if (jodx < 0 || cidx < 0)
			return null;
		

		Assembly.breakpoint();
		throw new todo.TODO();
	}
	
	/**
	 * Loads the in-memory class information for the given class.
	 *
	 * @param __cl The class to load.
	 * @return The loaded class information or {@code 0} if it is not found.
................................................................................
		ClientClassInfo rv = classinfos.get(__cl);
		if (classinfos.containsKey(__cl))
			return (rv != null ? rv.classinfopointer : 0);
		
		// Debug
		todo.DEBUG.note("Finding class %s...", __cl);
		
		// Attempt to locate the class
		BootLibrary[] classpath = this.classpath;
		int dx = ClientTask.__findClassIndex(classpath, __cl);
		
		// If it was not found, remember this and then stop
		if (dx < 0)
		{
			// Cache for later
			classinfos.put(__cl, null);
			
			// Not found
			return 0;
		}
		
		// Get the layout for the class information (where fields go)
		ClientClassInfoLayout ccil = this.classInfoLayout();
		
		// Debug
		todo.DEBUG.note("Initializing class info %s...", __cl);
		
		Assembly.breakpoint();
		throw new todo.TODO();
	}
	
	/**
	 * Locates the given class within the classpath.
	 *
	 * @param __cp The classpath.
	 * @param __cl The class to locate.
	 * @return A negative value if not found, otherwise the classpath index
	 * shifted up by {@link #_INDEX_SHIFT} and then the resource index.

	 * @throws NullPointerException On null arguments.
	 * @since 2019/06/29
	 */
	public static final int __findClassIndex(BootLibrary[] __cp, String __cl)
		throws NullPointerException
	{
		if (__cp == null || __cl == null)
			throw new NullPointerException("NARG");
		
		// The resource the class will be in
		String filename = __cl + ".class";
		

		// Debug
		todo.DEBUG.note("Scanning for %s...", filename);
		

































		// Scan the classpath

		for (int i = 0, n = __cp.length; i < n; i++)
		{
			// Locate resource
			int rv = __cp[i].indexOf(filename);

			
			// Was found?
			if (rv >= 0)
				return (i << _INDEX_SHIFT) | rv;
		}
		
		// Not found
		return -1;
	}
}






































































|
|







 







|
<

|
|

<
>

|
|




|

|
<
<
<
|
>
>

>
|
|
<

>
|
<







 







|
|
<
<
<










|









|

|
<
|
|
>

|

|


|


|
<
|
>
|
|
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>

>
|


<
>









|
>
>
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
..
82
83
84
85
86
87
88
89

90
91
92
93

94
95
96
97
98
99
100
101
102
103
104



105
106
107
108
109
110
111

112
113
114

115
116
117
118
119
120
121
...
133
134
135
136
137
138
139
140
141



142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164

165
166
167
168
169
170
171
172
173
174
175
176
177

178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220

221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
	/** The classpath. */
	public final BootLibrary[] classpath;
	
	/** Classes which have been loaded. */
	public final HashMap<String, ClientClassInfo> classinfos =
		new HashMap<>();
	
	/** The accessor for client class information. */
	private volatile MiniClassAccessor _classinfoaccessor;
	
	/**
	 * Initializes the client task.
	 *
	 * @param __pid The PID.
	 * @param __lid The LID.
	 * @param __cp The classpath used.
................................................................................
		// Just perform the allocation with our PID as part of the tag and
		// whatever was passed, masked correctly
		return Allocator.allocate(
			this.tagbits | (__tag & Allocator.CHUNK_BITS_VALUE_MASK), __sz);
	}
	
	/**
	 * Returns the mini-class accessor for the {@link ClassInfo} class.

	 *
	 * @return The ClassInfo mini-class accessor.
	 * @since 2019/07/11
	 */

	public final MiniClassAccessor classInfoAccessor()
	{
		// If it has already been used, only get it once!
		MiniClassAccessor rv = this._classinfoaccessor;
		if (rv != null)
			return rv;
		
		// Debug
		todo.DEBUG.note("Searching for ClassInfo...");
		
		// Locate class resource



		int dx = this.resourceClassFind("cc/squirreljme/jvm/ClassInfo");
		if (dx < 0)
			return null;
		
		// Cache it
		this._classinfoaccessor = (rv = new MiniClassAccessor(
			this.resourceData(dx)));

		
		// Use it
		return rv;

	}
	
	/**
	 * Loads the in-memory class information for the given class.
	 *
	 * @param __cl The class to load.
	 * @return The loaded class information or {@code 0} if it is not found.
................................................................................
		ClientClassInfo rv = classinfos.get(__cl);
		if (classinfos.containsKey(__cl))
			return (rv != null ? rv.classinfopointer : 0);
		
		// Debug
		todo.DEBUG.note("Finding class %s...", __cl);
		
		// Attempt to locate the class, if not found remember this and stop
		int dx = this.resourceClassFind(__cl);



		if (dx < 0)
		{
			// Cache for later
			classinfos.put(__cl, null);
			
			// Not found
			return 0;
		}
		
		// Get the layout for the class information (where fields go)
		MiniClassAccessor ccia = this.classInfoAccessor();
		
		// Debug
		todo.DEBUG.note("Initializing class info %s...", __cl);
		
		Assembly.breakpoint();
		throw new todo.TODO();
	}
	
	/**
	 * Searches for the given class name resource for the given class
	 *
	 * @param __name The name of the class.

	 * @return A negative value if not found, otherwise the class path index
	 * will be shifted up by {@link #_INDEX_SHIFT} and the resource index will
	 * be on the lower mask.
	 * @throws NullPointerException On null arguments.
	 * @since 2019/07/11
	 */
	public final int resourceClassFind(String __name)
		throws NullPointerException
	{
		if (__name == null)
			throw new NullPointerException("NARG");
		
		return this.resourceFind(__name + ".class");

	}
	
	/**
	 * Returns the data pointer for the given resource.
	 *
	 * @param __dx The index to get the data pointer for.
	 * @return The data pointer of the resource or {@code 0} if it is not
	 * valid.
	 * @since 2019/07/11
	 */
	public final int resourceData(int __dx)
	{
		// Make sure the index is in range
		int cpdx = __dx >>> _INDEX_SHIFT;
		BootLibrary[] classpath = this.classpath;
		if (cpdx < 0 || cpdx >= classpath.length)
			return 0;
		
		// Get resource pointer from this
		return classpath[cpdx].resourceData(__dx & _INDEX_MASK);
	}
	
	/**
	 * Searches for the given resource in this client task.
	 *
	 * @param __name The name of the resource.
	 * @return A negative value if not found, otherwise the class path index
	 * will be shifted up by {@link #_INDEX_SHIFT} and the resource index will
	 * be on the lower mask.
	 * @throws NullPointerException On null arguments.
	 * @since 2019/07/11
	 */
	public final int resourceFind(String __name)
		throws NullPointerException
	{
		if (__name == null)
			throw new NullPointerException("NARG");
		
		// Scan the classpath
		BootLibrary[] classpath = this.classpath;
		for (int i = 0, n = classpath.length; i < n; i++)
		{
			// Locate resource

			int rv = classpath[i].indexOf(__name);
			
			// Was found?
			if (rv >= 0)
				return (i << _INDEX_SHIFT) | rv;
		}
		
		// Not found
		return -1;
	}
	
	/**
	 * Searches for the given resource in this client task in the given
	 * specified classpath library.
	 *
	 * @param __name The name of the resource.
	 * @param __in The class path library to look in.
	 * @return A negative value if not found, otherwise the class path index
	 * will be shifted up by {@link #_INDEX_SHIFT} and the resource index will
	 * be on the lower mask.
	 * @throws NullPointerException On null arguments.
	 * @since 2019/07/11
	 */
	public final int resourceFindIn(String __name, int __in)
		throws NullPointerException
	{
		if (__name == null)
			throw new NullPointerException("NARG");
		
		// Out of range values are always not found
		BootLibrary[] classpath = this.classpath;
		if (__in < 0 || __in >= classpath.length)
			return -1;
		
		// Locate resource
		int rv = classpath[__in].indexOf(__name);
		
		// If it was found shift in
		if (rv >= 0)
			return (__in << _INDEX_SHIFT) | rv;
		
		// Otherwise does not exist
		return -1;
	}
	
	/**
	 * Searches for the given resource in this client task in the given
	 * specified classpath library, if it is not found in that library then
	 * all libraries on the classpath are searched.
	 *
	 * @param __name The name of the resource.
	 * @param __in The class path library to look in.
	 * @return A negative value if not found, otherwise the class path index
	 * will be shifted up by {@link #_INDEX_SHIFT} and the resource index will
	 * be on the lower mask.
	 * @throws NullPointerException On null arguments.
	 * @since 2019/07/11
	 */
	public final int resourceFindInOtherwise(String __name, int __in)
		throws NullPointerException
	{
		if (__name == null)
			throw new NullPointerException("NARG");
		
		// Search in this specific library first
		int rv = this.resourceFindIn(__name, __in);
		if (rv >= 0)
			return rv;
		
		// Then locate it in any class library
		return this.resourceFind(__name);
	}
}

Added runt/klib/supervisor/cc/squirreljme/jvm/MiniClassAccessor.java.









































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
// -*- Mode: Java; indent-tabs-mode: t; tab-width: 4 -*-
// ---------------------------------------------------------------------------
// Multi-Phasic Applications: SquirrelJME
//     Copyright (C) Stephanie Gawroriski <xer@multiphasicapps.net>
// ---------------------------------------------------------------------------
// SquirrelJME is under the GNU General Public License v3+, or later.
// See license.mkd for licensing and copyright information.
// ---------------------------------------------------------------------------

package cc.squirreljme.jvm;

/**
 * This class is used as a utility to access the data contained within the
 * mini-class format.
 *
 * @since 2019/07/11
 */
public final class MiniClassAccessor
{
	/** The mini-class address. */
	protected final int address;
	
	/**
	 * Initializes the mini class accessor.
	 *
	 * @param __a The address of the mini-class.
	 * @since 2019/07/11
	 */
	public MiniClassAccessor(int __a)
	{
		this.address = __a;
		
		todo.DEBUG.code('m', 'd', __a);
	}
}

Added runt/klib/supervisor/java/lang/AutoCloseable.java.









































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
64
65
66
67
68
// -*- Mode: Java; indent-tabs-mode: t; tab-width: 4 -*-
// ---------------------------------------------------------------------------
// Multi-Phasic Applications: SquirrelJME
//     Copyright (C) Stephanie Gawroriski <xer@multiphasicapps.net>
//     Copyright (C) Multi-Phasic Applications <multiphasicapps.net>
// ---------------------------------------------------------------------------
// SquirrelJME is under the GNU General Public License v3+, or later.
// See license.mkd for licensing and copyright information.
// ---------------------------------------------------------------------------

package java.lang;

/**
 * This interface is used with the classes which are initialized in the
 * {@code try-with-resources} block, after the entire block has been finished
 * the {@link #close()} method is called automatically. This makes it much
 * simpler to free resources and no longer requires a {@code finally} with a
 * local variable mess to handle closing of streams.
 *
 * {@code
 *
 * try (FileInputStream fis = new FileInputStream("foo"))
 * {
 *     // fis is VISIBLE here.
 *     // Do stuff with file.
 * }
 * catch (IOException ioe)
 * {
 *     // fis is NOT VISIBLE here.
 *     // Handle exception or rethrow as needed
 * }
 * finally
 * {
 *     // fis is NOT VISIBLE here.
 *     // Other things to do regardless of success or an exception.
 * }
 * // The variable fis is NOT VISIBLE here and when this point of code has
 * // been reached, fis.close() would have been called.
 * 
 * }
 *
 * @see Closeable
 * @since 2015/03/23
 */
public interface AutoCloseable
{
	/**
	 * This releases all (or most) of the resources associated with
	 * an implementing class. When used with a try-with-resources block, this
	 * is automatically called after the scope of block has been left (it is
	 * executed after {@code finally}).
	 *
	 * It is recommended that a resource is actually closed (or at least
	 * marked as such) before an exception is thrown.
	 *
	 * Unlike {@link java.io.Closeable#close()} (and provided the class does
	 * not extend {@link java.io.Closeable}), calling this multiple times may
	 * produce side effects rather than doing nothing on a closed resource.
	 * However, it is stronly recommended and encouraged to follow the "do
	 * nothing when closed" behavior of {@link java.io.Closeable}.
	 *
	 * @throws Exception If there was an error closing the specified object.
	 * @since 2015/03/23
	 */
	public abstract void close()
		throws Exception;
}

Added runt/klib/supervisor/java/lang/InterruptedException.java.























































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
// -*- Mode: Java; indent-tabs-mode: t; tab-width: 4 -*-
// ---------------------------------------------------------------------------
// Multi-Phasic Applications: SquirrelJME
//     Copyright (C) Stephanie Gawroriski <xer@multiphasicapps.net>
//     Copyright (C) Multi-Phasic Applications <multiphasicapps.net>
// ---------------------------------------------------------------------------
// SquirrelJME is under the GNU General Public License v3+, or later.
// See license.mkd for licensing and copyright information.
// ---------------------------------------------------------------------------

package java.lang;

/**
 * This is thrown when a thread is interrupted.
 *
 * Note that this does not clear the interrupt status of a thread.
 *
 * @since 2018/11/21
 */
public class InterruptedException
	extends Exception
{
	/**
	 * Initializes the exception with no message or cause.
	 *
	 * @since 2018/11/21
	 */
	public InterruptedException()
	{
	}
	
	/**
	 * Initializes the exception with the given message and no cause.
	 *
	 * @param __m The message.
	 * @since 2018/11/21
	 */
	public InterruptedException(String __m)
	{
		super(__m);
	}
}