mirror of
https://github.com/simplex-chat/simplex-chat.git
synced 2024-12-17 17:20:21 +01:00
Compare commits
12 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 701b4186b6 | |||
| 257e03f10a | |||
| 7b644c0dcf | |||
| c3d9d9a7c3 | |||
| 261767035e | |||
| c9b00b3054 | |||
| 1697190189 | |||
| 24609a98c6 | |||
| 60752feb9c | |||
| ff5ef638cd | |||
| df619d540b | |||
| 53d8a85b8c |
@@ -22,7 +22,11 @@ struct SimpleXApp: App {
|
||||
|
||||
init() {
|
||||
DispatchQueue.global(qos: .background).sync {
|
||||
haskell_init()
|
||||
// we have to use debug profile file name without extension here because .hp extension is added by profiler
|
||||
haskell_init(
|
||||
getAppEventLogPath().path,
|
||||
getAppDebugProfilePrefixPath().path
|
||||
)
|
||||
// hs_init(0, nil)
|
||||
}
|
||||
UserDefaults.standard.register(defaults: appDefaults)
|
||||
|
||||
@@ -45,6 +45,11 @@ struct DeveloperView: View {
|
||||
}
|
||||
|
||||
if developerTools {
|
||||
Section {
|
||||
exportDebugProfileButton()
|
||||
exportEventLogButton()
|
||||
}
|
||||
|
||||
Section {
|
||||
settingsRow("key") {
|
||||
Toggle("Post-quantum E2EE", isOn: $pqExperimentalEnabled)
|
||||
@@ -62,6 +67,24 @@ struct DeveloperView: View {
|
||||
}
|
||||
}
|
||||
|
||||
@ViewBuilder private func exportDebugProfileButton() -> some View {
|
||||
let url = getAppDebugProfilePath()
|
||||
settingsRow("square.and.arrow.up") {
|
||||
Button("Export debugging profile") {
|
||||
showShareSheet(items: [url])
|
||||
}
|
||||
}.disabled(!FileManager.default.fileExists(atPath: url.path))
|
||||
}
|
||||
|
||||
@ViewBuilder private func exportEventLogButton() -> some View {
|
||||
let url = getAppEventLogPath()
|
||||
settingsRow("square.and.arrow.up") {
|
||||
Button("Export event log") {
|
||||
showShareSheet(items: [url])
|
||||
}
|
||||
}.disabled(!FileManager.default.fileExists(atPath: url.path))
|
||||
}
|
||||
|
||||
private func setPQExperimentalEnabled(_ enable: Bool) {
|
||||
do {
|
||||
try apiSetPQEncryption(enable)
|
||||
|
||||
@@ -52,6 +52,10 @@ func getAppDirectory() -> URL {
|
||||
|
||||
let DB_FILE_PREFIX = "simplex_v1"
|
||||
|
||||
let DEBUG_PROFILE_PREFIX = "simplex_debug"
|
||||
|
||||
let DEBUG_PROFILE_EXTENSION = ".hp"
|
||||
|
||||
func getLegacyDatabasePath() -> URL {
|
||||
getDocumentsDirectory().appendingPathComponent("mobile_v1", isDirectory: false)
|
||||
}
|
||||
@@ -62,6 +66,18 @@ public func getAppDatabasePath() -> URL {
|
||||
: getLegacyDatabasePath()
|
||||
}
|
||||
|
||||
public func getAppDebugProfilePrefixPath() -> URL {
|
||||
getAppDirectory().appendingPathComponent(DEBUG_PROFILE_PREFIX, isDirectory: false)
|
||||
}
|
||||
|
||||
public func getAppDebugProfilePath() -> URL {
|
||||
getAppDirectory().appendingPathComponent(DEBUG_PROFILE_PREFIX + DEBUG_PROFILE_EXTENSION, isDirectory: false)
|
||||
}
|
||||
|
||||
public func getAppEventLogPath() -> URL {
|
||||
getAppDirectory().appendingPathComponent("simplex.eventlog", isDirectory: false)
|
||||
}
|
||||
|
||||
func fileModificationDate(_ path: String) -> Date? {
|
||||
do {
|
||||
let attr = try FileManager.default.attributesOfItem(atPath: path)
|
||||
|
||||
@@ -7,19 +7,36 @@
|
||||
//
|
||||
|
||||
#include "hs_init.h"
|
||||
#include <string.h>
|
||||
|
||||
extern void hs_init_with_rtsopts(int * argc, char **argv[]);
|
||||
|
||||
void haskell_init(void) {
|
||||
int argc = 5;
|
||||
char *argv[] = {
|
||||
"simplex",
|
||||
"+RTS", // requires `hs_init_with_rtsopts`
|
||||
"-A64m", // chunk size for new allocations
|
||||
"-H64m", // initial heap size
|
||||
"-xn", // non-moving GC
|
||||
0
|
||||
};
|
||||
void haskell_init(const char *eventlog, const char *heap_profile) {
|
||||
// setup static arena for bump allocation and passing to RTS
|
||||
char *argv[32] = {0,};
|
||||
int argc = 0; // number of arguments used so far, always stands at the first NULL in argv
|
||||
// common args
|
||||
argv[argc++] = "simplex"; // fake program name
|
||||
argv[argc++] = "+RTS"; // start adding RTS options
|
||||
argv[argc++] = "-T"; // make GC counters available from inside the program
|
||||
argv[argc++] = "-A64m"; // chunk size for new allocations (less frequent GC)
|
||||
argv[argc++] = "-H64m"; // larger heap size on start (faster boot)
|
||||
// argv[argc++] = "-M8G"; // keep memory usage under 8G, collecting more aggressively when approaching it (and crashing sooner rather than taking down the whole system)
|
||||
if (eventlog) {
|
||||
static char ol[1024] = "-ol";
|
||||
(void)strncpy(&ol[3], eventlog, sizeof(ol) - 3);
|
||||
argv[argc++] = ol;
|
||||
argv[argc++] = "-l-agu"; // collect GC and user events
|
||||
}
|
||||
if (heap_profile) {
|
||||
static char po[1024] = "-po";
|
||||
(void)strncpy(&po[3], heap_profile, sizeof(po) - 3);
|
||||
argv[argc++] = po; // adds ".hp" extension
|
||||
argv[argc++] = "-hT"; // emit heap profile by closure type
|
||||
}
|
||||
int non_moving_gc = !heap_profile; // not compatible with heap profile
|
||||
if (non_moving_gc) argv[argc++] = "-xn";
|
||||
// wrap args as expected by RTS
|
||||
char **pargv = argv;
|
||||
hs_init_with_rtsopts(&argc, &pargv);
|
||||
}
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
#ifndef hs_init_h
|
||||
#define hs_init_h
|
||||
|
||||
void haskell_init(void);
|
||||
void haskell_init(const char *eventlog, const char *heap_profile);
|
||||
|
||||
void haskell_init_nse(void);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user