1 /*
2  * Copyright (c) 2017-2019 sel-project
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a copy
5  * of this software and associated documentation files (the "Software"), to deal
6  * in the Software without restriction, including without limitation the rights
7  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8  * copies of the Software, and to permit persons to whom the Software is
9  * furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice shall be included in all
12  * copies or substantial portions of the Software.
13  *
14  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20  * SOFTWARE.
21  *
22  */
23 /**
24  * Copyright: Copyright (c) 2017-2019 sel-project
25  * License: MIT
26  * Authors: Kripth
27  * Source: $(HTTP github.com/sel-project/selery/source/selery/util/thread.d, selery/util/thread.d)
28  */
29 module selery.util.thread;
30 
31 import core.thread;
32 
33 import std.ascii : newline;
34 import std.conv : to;
35 import std.datetime : dur;
36 import std.file : exists, write, mkdirRecurse;
37 
38 import selery.crash : logCrash;
39 import selery.lang : LanguageManager;
40 import selery.util.util : seconds;
41 
42 /**
43  * Safe thread that handles errors and exceptions
44  * and writes a crash file before stopping the server.
45  */
46 class SafeThread : Thread {
47 
48 	public this(T)(const LanguageManager lang, T fn) if(is(T == function) || is(T == delegate)) {
49 		super({
50 			try {
51 				fn();
52 			} catch(Throwable t) {
53 				logCrash("hub", lang, t);
54 			}
55 		});
56 	}
57 
58 	public this(T)(string name, const LanguageManager lang, T fn) if(is(T == function) || is(T == delegate)) {
59 		this(lang, fn);
60 		this.name = name;
61 	}
62 
63 }