Compare commits

...

12 Commits

Author SHA1 Message Date
Alexander Bondarenko 701b4186b6 Merge remote-tracking branch 'origin/master' into ios-profiling 2024-03-30 15:47:29 +03:00
Evgeny Poberezkin 257e03f10a Merge branch 'master' into ios-profiling 2024-03-29 19:44:17 +00:00
Alexander Bondarenko 7b644c0dcf Merge remote-tracking branch 'origin/master' into ios-profiling 2024-03-28 20:10:35 +02:00
Alexander Bondarenko c3d9d9a7c3 Merge remote-tracking branch 'origin/master' into ios-profiling 2024-03-27 17:40:14 +02:00
Alexander Bondarenko 261767035e Merge remote-tracking branch 'origin/master' into ios-profiling 2024-03-20 11:22:48 +02:00
spaced4ndy c9b00b3054 Merge branch 'master' into ios-profiling 2024-03-13 11:50:17 +04:00
spaced4ndy 1697190189 remove print 2024-03-12 20:52:05 +04:00
spaced4ndy 24609a98c6 fix paths 2024-03-12 20:49:42 +04:00
Alexander Bondarenko 60752feb9c fix addr 2024-03-12 17:09:54 +02:00
Alexander Bondarenko ff5ef638cd add missing include 2024-03-12 17:09:54 +02:00
spaced4ndy df619d540b ios: save debug profile, event log buttons (#3899) 2024-03-12 19:06:25 +04:00
Alexander Bondarenko 53d8a85b8c add RTS tuning to haskell_init 2024-03-12 16:58:44 +02:00
5 changed files with 72 additions and 12 deletions
+5 -1
View File
@@ -22,7 +22,11 @@ struct SimpleXApp: App {
init() { init() {
DispatchQueue.global(qos: .background).sync { 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) // hs_init(0, nil)
} }
UserDefaults.standard.register(defaults: appDefaults) UserDefaults.standard.register(defaults: appDefaults)
@@ -45,6 +45,11 @@ struct DeveloperView: View {
} }
if developerTools { if developerTools {
Section {
exportDebugProfileButton()
exportEventLogButton()
}
Section { Section {
settingsRow("key") { settingsRow("key") {
Toggle("Post-quantum E2EE", isOn: $pqExperimentalEnabled) 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) { private func setPQExperimentalEnabled(_ enable: Bool) {
do { do {
try apiSetPQEncryption(enable) try apiSetPQEncryption(enable)
+16
View File
@@ -52,6 +52,10 @@ func getAppDirectory() -> URL {
let DB_FILE_PREFIX = "simplex_v1" let DB_FILE_PREFIX = "simplex_v1"
let DEBUG_PROFILE_PREFIX = "simplex_debug"
let DEBUG_PROFILE_EXTENSION = ".hp"
func getLegacyDatabasePath() -> URL { func getLegacyDatabasePath() -> URL {
getDocumentsDirectory().appendingPathComponent("mobile_v1", isDirectory: false) getDocumentsDirectory().appendingPathComponent("mobile_v1", isDirectory: false)
} }
@@ -62,6 +66,18 @@ public func getAppDatabasePath() -> URL {
: getLegacyDatabasePath() : 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? { func fileModificationDate(_ path: String) -> Date? {
do { do {
let attr = try FileManager.default.attributesOfItem(atPath: path) let attr = try FileManager.default.attributesOfItem(atPath: path)
+27 -10
View File
@@ -7,19 +7,36 @@
// //
#include "hs_init.h" #include "hs_init.h"
#include <string.h>
extern void hs_init_with_rtsopts(int * argc, char **argv[]); extern void hs_init_with_rtsopts(int * argc, char **argv[]);
void haskell_init(void) { void haskell_init(const char *eventlog, const char *heap_profile) {
int argc = 5; // setup static arena for bump allocation and passing to RTS
char *argv[] = { char *argv[32] = {0,};
"simplex", int argc = 0; // number of arguments used so far, always stands at the first NULL in argv
"+RTS", // requires `hs_init_with_rtsopts` // common args
"-A64m", // chunk size for new allocations argv[argc++] = "simplex"; // fake program name
"-H64m", // initial heap size argv[argc++] = "+RTS"; // start adding RTS options
"-xn", // non-moving GC argv[argc++] = "-T"; // make GC counters available from inside the program
0 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; char **pargv = argv;
hs_init_with_rtsopts(&argc, &pargv); hs_init_with_rtsopts(&argc, &pargv);
} }
+1 -1
View File
@@ -9,7 +9,7 @@
#ifndef hs_init_h #ifndef hs_init_h
#define 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); void haskell_init_nse(void);