84#if !defined(__APPLE__) && !defined(__FreeBSD__) && !defined(__OpenBSD__) && !defined(__DragonFly__)
88#include <sys/malloc.h>
147#if !defined(_WIN32) && !defined(__APPLE__)
148#include <fontconfig/fontconfig.h>
151#include <glib/gstdio.h>
152#include <pango/pangocairo.h>
157#include <sys/param.h>
158#include <sys/types.h>
163#if defined(__x86_64__) || defined(__i386__)
164#include <xmmintrin.h>
167#ifdef HAVE_GRAPHICSMAGICK
168#include <magick/api.h>
169#elif defined HAVE_IMAGEMAGICK
170#include <MagickWand/MagickWand.h>
175#if defined(__SUNOS__)
176#include <sys/varargs.h>
185#if !defined(_WIN32) && !defined(__APPLE__)
198 gsize n_fields, gpointer user_data)
200 const gchar *message = NULL;
202 for(gsize
k = 0;
k < n_fields;
k++)
204 if(g_strcmp0(fields[
k].
key,
"MESSAGE"))
continue;
206 message = fields[
k].value;
216 if(!g_strcmp0(message,
"Unable to load dot from the cursor theme"))
217 return G_LOG_WRITER_HANDLED;
219 if(g_str_has_prefix(message,
"Theme parsing error:")
220 && g_str_has_suffix(message,
"The :insensitive pseudo-class is deprecated. Use :disabled instead."))
221 return G_LOG_WRITER_HANDLED;
223 if(g_str_has_prefix(message,
"Theme parsing error:")
224 && g_str_has_suffix(message,
"The :inconsistent pseudo-class is deprecated. Use :indeterminate instead."))
225 return G_LOG_WRITER_HANDLED;
228 return g_log_writer_default(log_level, fields, n_fields, user_data);
234 char *logfile = g_build_filename(g_get_user_cache_dir(),
"ansel",
"ansel-log.txt", NULL);
237 printf(
"usage: %s [options] [IMG_1234.{RAW,..}|image_folder/]\n", argv0);
239 printf(
"options:\n");
241 printf(
" --cachedir <user cache directory>\n");
242 printf(
" --conf <key>=<value>\n");
243 printf(
" --configdir <user config directory>\n");
244 printf(
" -d {all,cache,camctl,camsupport,colorprofile,control,demosaic,dev,gtk,history,imageio,import,\n");
245 printf(
" input,ioporder,lighttable,lua,masks,memory,nan,nocache_reuse,opencl,params,\n");
246 printf(
" perf,pipe,pipecache,print,pwstorage,signal,sql,shortcuts,tiling,undo,verbose}\n");
247 printf(
" --d-signal <signal> \n");
248 printf(
" --d-signal-act <all,raise,connect,disconnect");
250#ifdef DT_HAVE_SIGNAL_TRACE
251 printf(
",print-trace");
254 printf(
" --datadir <data directory>\n");
256 printf(
" --disable-opencl\n");
258 printf(
" -h, --help");
263 printf(
" --library <library file>\n");
264 printf(
" --localedir <locale directory>\n");
265 printf(
" --moduledir <module directory>\n");
266 printf(
" --noiseprofiles <noiseprofiles json file>\n");
267 printf(
" -t <num openmp threads>\n");
268 printf(
" --tmpdir <tmp directory>\n");
269 printf(
" --version\n");
272 printf(
" note: debug log and output will be written to this file:\n");
273 printf(
" %s\n", logfile);
285 char ver[100] = { 0 };
289 for(
char *
p = ver; *
p;
p++)
294 if(*
p >=
'0' && *
p <=
'9')
303 if(*
p ==
'.' || *
p ==
'+') count++;
311 return g_strdup(start);
318 static gchar *
id = NULL;
319 static gsize
init = 0;
320 if(g_once_init_enter(&
init))
322 id = g_uuid_string_random();
323 g_once_init_leave(&
init, 1);
333 static gchar *
id = NULL;
334 static gsize
init = 0;
335 if(g_once_init_enter(&
init))
338 if(!stored || !*stored)
341 stored = g_uuid_string_random();
345 g_once_init_leave(&
init, 1);
353 char *ext = g_strrstr(filename,
".");
357 for(
const char **
i = dt_supported_extensions; !
IS_NULL_PTR(*
i);
i++)
358 if(!g_ascii_strncasecmp(ext, *
i, strlen(*
i)))
369 if(
IS_NULL_PTR(input) || input[0] ==
'\0')
return 0;
379 if(g_file_test(filename, G_FILE_TEST_IS_DIR))
392 if(single_image) *single_image =
FALSE;
397 gchar *directory = g_path_get_dirname((
const gchar *)filename);
428 if(single_image) *single_image =
TRUE;
437#if defined(__linux__)
438 FILE *
f = g_fopen(
"/proc/meminfo",
"rb");
443 int first = 1, found = 0;
445 while(!found &&
getline(&line, &len,
f) != -1)
447 char *colon = strchr(line,
':');
449 found = !strncmp(line,
"MemTotal:", 9);
450 if(found || first) mem = atol(colon + 1);
459#elif defined(__APPLE__) || defined(__DragonFly__) || defined(__FreeBSD__) || defined(__NetBSD__) \
460 || defined(__OpenBSD__)
461#if defined(__APPLE__)
462 int mib[2] = { CTL_HW, HW_MEMSIZE };
463#elif defined(HW_PHYSMEM64)
464 int mib[2] = { CTL_HW, HW_PHYSMEM64 };
466 int mib[2] = { CTL_HW, HW_PHYSMEM };
470 sysctl(mib, 2, (
void *)&physical_memory, &length, (
void *)NULL, 0);
471 return physical_memory / 1024;
473 MEMORYSTATUSEX memInfo;
474 memInfo.dwLength =
sizeof(MEMORYSTATUSEX);
475 GlobalMemoryStatusEx(&memInfo);
476 return memInfo.ullTotalPhys / (
uint64_t)1024;
479 fprintf(stderr,
"Unknown memory size. Assuming 2GB\n");
489int dt_init(
int argc,
char *argv[],
const gboolean init_gui,
const gboolean load_data)
494 if(getuid() == 0 || geteuid() == 0)
496 "WARNING: either your user id or the effective user id are 0. are you running darktable as root?\n");
503#ifdef M_MMAP_THRESHOLD
504 mallopt(M_MMAP_THRESHOLD, 128 * 1024);
520 pthread_mutexattr_t recursive_locking;
521 pthread_mutexattr_init(&recursive_locking);
522 pthread_mutexattr_settype(&recursive_locking, PTHREAD_MUTEX_RECURSIVE);
537 char *dbfilename_from_command = NULL;
538 char *noiseprofiles_from_command = NULL;
539 char *datadir_from_command = NULL;
540 char *moduledir_from_command = NULL;
541 char *localedir_from_command = NULL;
542 char *tmpdir_from_command = NULL;
543 char *configdir_from_command = NULL;
544 char *cachedir_from_command = NULL;
545 char *kerneldir_from_command = NULL;
548 gboolean exclude_opencl =
FALSE;
549 gboolean print_statistics = (strstr(argv[0],
"ansel-cltest") == NULL);
558 gboolean cpu_threads_from_cli =
FALSE;
560 GSList *config_override = NULL;
561 for(
int k = 1;
k < argc;
k++)
564 if(!strcmp(argv[
k],
"/?"))
566 return usage(argv[0]);
569 if(argv[
k][0] ==
'-')
571 if(!strcmp(argv[
k],
"--help") || !strcmp(argv[
k],
"-h"))
573 return usage(argv[0]);
575 else if(!strcmp(argv[
k],
"--version"))
577 printf(
"this is %s\ncopyright (c) 2009-2022 Johannes Hanika, (c) 2022-%s Aurélien Pierre\n" PACKAGE_BUGREPORT "\n\ncompile options:\n"
578 " bit depth is %" G_GSIZE_FORMAT
" bit\n"
585 " OpenMP support enabled\n"
587 " OpenMP support disabled\n"
591 " OpenCL support enabled\n"
593 " OpenCL support disabled\n"
597 " Colord support enabled\n"
599 " Colord support disabled\n"
602#ifdef HAVE_GRAPHICSMAGICK
603 " GraphicsMagick support enabled\n"
605 " GraphicsMagick support disabled\n"
608#ifdef HAVE_IMAGEMAGICK
609 " ImageMagick support enabled\n"
611 " ImageMagick support disabled\n"
615 " OpenEXR support enabled\n"
617 " OpenEXR support disabled\n"
622 CHAR_BIT *
sizeof(
void *)
626 else if(!strcmp(argv[
k],
"--library") && argc >
k + 1)
628 dbfilename_from_command = argv[++
k];
632 else if(!strcmp(argv[
k],
"--datadir") && argc >
k + 1)
634 datadir_from_command = argv[++
k];
638 else if(!strcmp(argv[
k],
"--moduledir") && argc >
k + 1)
640 moduledir_from_command = argv[++
k];
644 else if(!strcmp(argv[
k],
"--tmpdir") && argc >
k + 1)
646 tmpdir_from_command = argv[++
k];
650 else if(!strcmp(argv[
k],
"--configdir") && argc >
k + 1)
652 configdir_from_command = argv[++
k];
656 else if(!strcmp(argv[
k],
"--cachedir") && argc >
k + 1)
658 cachedir_from_command = argv[++
k];
662 else if(!strcmp(argv[
k],
"--localedir") && argc >
k + 1)
664 localedir_from_command = argv[++
k];
668 else if(!strcmp(argv[
k],
"--kerneldir") && argc >
k + 1)
670 kerneldir_from_command = argv[++
k];
674 else if(argv[
k][1] ==
'd' && argc >
k + 1)
676 if(!strcmp(argv[
k + 1],
"all"))
678 else if(!strcmp(argv[
k + 1],
"cache"))
680 else if(!strcmp(argv[
k + 1],
"control"))
682 else if(!strcmp(argv[
k + 1],
"dev"))
684 else if(!strcmp(argv[
k + 1],
"gtk"))
686 else if(!strcmp(argv[
k + 1],
"input"))
688 else if(!strcmp(argv[
k + 1],
"pipecache"))
690 else if(!strcmp(argv[
k + 1],
"perf"))
692 else if(!strcmp(argv[
k + 1],
"pwstorage"))
694 else if(!strcmp(argv[
k + 1],
"opencl"))
696 else if(!strcmp(argv[
k + 1],
"sql"))
698 else if(!strcmp(argv[
k + 1],
"memory"))
700 else if(!strcmp(argv[
k + 1],
"lighttable"))
702 else if(!strcmp(argv[
k + 1],
"nan"))
704 else if(!strcmp(argv[
k + 1],
"masks"))
706 else if(!strcmp(argv[
k + 1],
"lua"))
708 else if(!strcmp(argv[
k + 1],
"print"))
710 else if(!strcmp(argv[
k + 1],
"camsupport"))
712 else if(!strcmp(argv[
k + 1],
"colorprofile"))
714 else if(!strcmp(argv[
k + 1],
"nocache_reuse"))
716 else if(!strcmp(argv[
k + 1],
"ioporder"))
718 else if(!strcmp(argv[
k + 1],
"imageio"))
720 else if(!strcmp(argv[
k + 1],
"undo"))
722 else if(!strcmp(argv[
k + 1],
"signal"))
724 else if(!strcmp(argv[
k + 1],
"params"))
726 else if(!strcmp(argv[
k + 1],
"demosaic"))
728 else if(!strcmp(argv[
k + 1],
"shortcuts"))
730 else if(!strcmp(argv[
k + 1],
"tiling"))
732 else if(!strcmp(argv[
k + 1],
"verbose"))
734 else if(!strcmp(argv[
k + 1],
"pipe"))
736 else if(!strcmp(argv[
k + 1],
"history"))
738 else if(!strcmp(argv[
k + 1],
"import"))
740 else if(!strcmp(argv[
k + 1],
"supervisor"))
743 return usage(argv[0]);
748 else if(!strcmp(argv[
k],
"--d-signal-act") && argc >
k + 1)
750 if(!strcmp(argv[
k + 1],
"all"))
752 else if(!strcmp(argv[
k + 1],
"raise"))
754 else if(!strcmp(argv[
k + 1],
"connect"))
756 else if(!strcmp(argv[
k + 1],
"disconnect"))
758 else if(!strcmp(argv[
k + 1],
"print-trace"))
760#ifdef DT_HAVE_SIGNAL_TRACE
763 fprintf(stderr,
"[signal] print-trace not available, skipping\n");
767 return usage(argv[0]);
772 else if(!strcmp(argv[
k],
"--d-signal") && argc >
k + 1)
774 gchar *str = g_ascii_strup(argv[
k+1], -1);
776 #define CHKSIGDBG(sig) else if(!g_strcmp0(str, #sig)) do {darktable.unmuted_signal_dbg[sig] = TRUE;} while (0)
777 if(!g_strcmp0(str,
"ALL"))
826 fprintf(stderr,
"unknown signal name: '%s'. use 'ALL' to enable debug for all or use full signal name\n", str);
827 return usage(argv[0]);
835 else if(argv[
k][1] ==
't' && argc >
k + 1)
842 cpu_threads_from_cli =
TRUE;
844 else if(!strcmp(argv[
k],
"--conf") && argc >
k + 1)
846 gchar *keyval = g_strdup(argv[++
k]), *c = keyval;
849 gchar *end = keyval + strlen(keyval);
850 while(*c !=
'=' && c < end) c++;
851 if(*c ==
'=' && *(c + 1) !=
'\0')
855 entry->
key = g_strdup(keyval);
856 entry->
value = g_strdup(c);
857 config_override = g_slist_append(config_override, entry);
861 else if(!strcmp(argv[
k],
"--noiseprofiles") && argc >
k + 1)
863 noiseprofiles_from_command = argv[++
k];
867 else if(!strcmp(argv[
k],
"--disable-opencl"))
870 exclude_opencl =
TRUE;
874 else if(!strcmp(argv[
k],
"--debug"))
878 else if(!strcmp(argv[
k],
"--"))
885 else if(!strncmp(argv[
k],
"-psn_", 5))
892 return usage(argv[0]);
897 for(
int i = 1;
i < argc;
i++)
900 for(
k =
i;
k < argc;
k++)
906 for(
int j =
i +
k; j < argc; j++)
916 dt_loc_init(datadir_from_command, moduledir_from_command, localedir_from_command, configdir_from_command, cachedir_from_command, tmpdir_from_command, kerneldir_from_command);
927 fprintf(stderr,
"[memory] at startup\n");
937 const gchar *xdg_data_dirs = g_getenv(
"XDG_DATA_DIRS");
938 gchar *new_xdg_data_dirs = NULL;
939 gboolean set_env =
TRUE;
940 if(!
IS_NULL_PTR(xdg_data_dirs) && *xdg_data_dirs !=
'\0')
943 gboolean found =
FALSE;
944 gchar **tokens = g_strsplit(xdg_data_dirs, G_SEARCHPATH_SEPARATOR_S, 0);
946 for(
char **iter = tokens; !
IS_NULL_PTR(*iter); iter++)
947 if(!strcmp(sharedir, *iter))
956 new_xdg_data_dirs = g_strjoin(G_SEARCHPATH_SEPARATOR_S, sharedir, xdg_data_dirs, NULL);
963 if(!g_strcmp0(sharedir,
"/usr/local/share")
964 || !g_strcmp0(sharedir,
"/usr/local/share/")
965 || !g_strcmp0(sharedir,
"/usr/share") || !g_strcmp0(sharedir,
"/usr/share/"))
966 new_xdg_data_dirs = g_strdup(
"/usr/local/share/" G_SEARCHPATH_SEPARATOR_S
"/usr/share/");
968 new_xdg_data_dirs = g_strdup_printf(
"%s" G_SEARCHPATH_SEPARATOR_S
"/usr/local/share/" G_SEARCHPATH_SEPARATOR_S
969 "/usr/share/", sharedir);
975 if(set_env) g_setenv(
"XDG_DATA_DIRS", new_xdg_data_dirs, 1);
980 setlocale(LC_ALL,
"");
1016 if(!cpu_threads_from_cli)
1030 gtk_init(&argc, &argv);
1042 gboolean recheck_needed =
TRUE;
1043 while (recheck_needed)
1048 printf(
"ERROR : cannot open database\n");
1058 gboolean image_loaded_elsewhere =
FALSE;
1059#ifndef MAC_INTEGRATION
1061 fprintf(stderr,
"trying to open the images in the running instance\n");
1065 GDBusConnection *connection = NULL;
1066 for(
int i = 1;
i < argc;
i++)
1069 if(argv[
i] == NULL || *argv[
i] ==
'\0')
continue;
1072 if(
IS_NULL_PTR(connection)) connection = g_bus_get_sync(G_BUS_TYPE_SESSION, NULL, NULL);
1074 image_loaded_elsewhere = g_dbus_connection_call_sync(connection,
"org.darktable.service",
"/darktable",
1075 "org.darktable.service.Remote",
"Open",
1076 g_variant_new(
"(s)", filename), NULL,
1077 G_DBUS_CALL_FLAGS_NONE, -1, NULL, NULL) != NULL;
1080 if(connection) g_object_unref(connection);
1087 fprintf(stderr,
"ERROR: can't acquire database lock, aborting.\n");
1097 recheck_needed =
FALSE;
1118 GList *changed_xmp_files = NULL;
1130 if(dbfilename_from_command && !strcmp(dbfilename_from_command,
":memory:"))
1160#ifdef HAVE_GRAPHICSMAGICK
1167#elif defined HAVE_IMAGEMAGICK
1170 MagickWandGenesis();
1187 fprintf(stderr,
"ERROR: can't init gui, aborting.\n");
1207 fprintf(stderr,
"ERROR: can't init develop system, aborting.\n");
1215 fprintf(stderr,
"ERROR: can't init pixelpipe cache, aborting.\n");
1254 fprintf(stderr,
"ERROR: iop order looks bad, aborting.\n");
1292 fprintf(stderr,
"[memory] after successful startup\n");
1302#ifndef MAC_INTEGRATION
1320 if(init_gui && changed_xmp_files)
1360 if(max_iters <= 0)
return;
1361 GMainContext *ctx = g_main_context_default();
1362 for(
int i = 0;
i < max_iters && g_main_context_pending(ctx);
i++)
1363 g_main_context_iteration(ctx,
FALSE);
1389 gchar **snaps_to_remove = NULL;
1390 if(perform_snapshot)
1448 if(GTK_IS_WIDGET(main_window))
1449 gtk_widget_destroy(main_window);
1502#ifdef HAVE_GRAPHICSMAGICK
1504#elif defined HAVE_IMAGEMAGICK
1505 MagickWandTerminus();
1510 if(perform_maintenance)
1517 if(perform_snapshot)
1522 while(snaps_to_remove[
i])
1525 g_chmod(snaps_to_remove[
i], S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
1528 const int retunlink = g_remove(snaps_to_remove[
i++]);
1535 g_strfreev(snaps_to_remove);
1580 g_thread_pool_stop_unused_threads();
1581#if !defined(_WIN32) && !defined(__APPLE__)
1582 PangoFontMap *fontmap = pango_cairo_font_map_get_default();
1583 gboolean use_fontconfig_backend =
FALSE;
1585 if(fontmap && PANGO_IS_CAIRO_FONT_MAP(fontmap))
1587 const cairo_font_type_t font_backend
1588 = pango_cairo_font_map_get_font_type(PANGO_CAIRO_FONT_MAP(fontmap));
1589 use_fontconfig_backend = (font_backend == CAIRO_FONT_TYPE_FT);
1594 if(use_fontconfig_backend) FcFini();
1596 pango_cairo_font_map_set_default(NULL);
1646 snprintf(buf,
sizeof(buf),
"%s took %.3f secs (%.3f CPU)", prefix, end.
clock - start->
clock,
1660 const int n = snprintf(buf,
sizeof(buf),
"%s took %.3f secs (%.3f CPU) ", prefix, end.
clock - start->
clock,
1662 if(
n <
sizeof(buf) - 1)
1665 va_start(ap, suffix);
1666 vsnprintf(buf +
n,
sizeof(buf) -
n, suffix, ap);
1678 MEMORYSTATUSEX status;
1679 status.dwLength =
sizeof(status);
1680 if(GlobalMemoryStatusEx(&status))
1681 return (
size_t)status.ullAvailPhys;
1686#elif defined(__APPLE__)
1687#include <mach/mach.h>
1691 mach_port_t host = mach_host_self();
1692 vm_statistics64_data_t vmstat;
1693 mach_msg_type_number_t count = HOST_VM_INFO64_COUNT;
1694 if(host_statistics64(host, HOST_VM_INFO64, (host_info64_t)&vmstat, &count) != KERN_SUCCESS)
return 0;
1697 host_page_size(host, &page_size);
1700 return (vmstat.free_count + vmstat.inactive_count) * page_size;
1703#elif defined(__linux__)
1708 FILE *
f = g_fopen(
"/proc/meminfo",
"r");
1712 size_t available_kb = 0;
1714 while(fgets(line,
sizeof(line),
f))
1716 if(sscanf(line,
"MemAvailable: %" G_GSIZE_FORMAT
" kB", &available_kb) == 1)
1719 return available_kb * 1024;
1755 const size_t mem = resources->
total_memory / (1024 * 1024);
1756 const size_t bits = CHAR_BIT *
sizeof(
void *);
1757 const gboolean sufficient = (mem >= 4096 && threads >= 2);
1759 dt_print(
DT_DEBUG_MEMORY,
"[MEMORY CONFIGURATION] found a %s %" G_GSIZE_FORMAT
"-bit system with %" G_GSIZE_FORMAT
" cores\n",
1760 (sufficient) ?
"sufficient" :
"low performance", bits, threads);
1777 const size_t min_pipecache_memory = 6 * 6000 * 4000 * 4 *
sizeof(float);
1783 (int64_t)min_pipecache_memory);
1788 "MEMORY WARNING: your pixelpipe cache allocated RAM is too small for your typical raw size.\n"
1789 "MEMORY WARNING: reduce your OS/apps headroom, or your thumbnail cache size.\n"
1790 "MEMORY WARNING: you may also simply need more RAM or need to reset the config key host_memory.\n"
1791 "MEMORY WARNING: we shrank the thumbnails cache to the bare minimum to leave enough space for pixelpipe cache.\n");
1795 (int64_t)128 * 1024 * 1024);
1814 dt_control_log(_(
"CRITICAL WARNING: Ansel will not be able to use the RAM you allocated it.\n"
1815 "Review your memory settings or add more RAM to your system."));
1820 for(GList *capabilities =
darktable.
capabilities; capabilities; capabilities = g_list_next(capabilities))
1822 if(!strcmp(capabilities->data, capability))
1861 fprintf(stdout,
"[memory] Currently-free and reclaimable memory detected: %lu MiB\n",
get_usable_memory_bytes() / (1024 * 1024));
1863#if defined(__linux__)
1872 char pidstatus[128];
1873 snprintf(pidstatus,
sizeof(pidstatus),
"/proc/%u/status", (uint32_t)getpid());
1875 f = g_fopen(pidstatus,
"r");
1879 while(
getline(&line, &len,
f) != -1)
1881 if(!strncmp(line,
"VmPeak:", 7))
1882 g_strlcpy(vmpeak, line + 8,
sizeof(vmpeak));
1883 else if(!strncmp(line,
"VmSize:", 7))
1884 g_strlcpy(vmsize, line + 8,
sizeof(vmsize));
1885 else if(!strncmp(line,
"VmRSS:", 6))
1886 g_strlcpy(vmrss, line + 8,
sizeof(vmrss));
1887 else if(!strncmp(line,
"VmHWM:", 6))
1888 g_strlcpy(vmhwm, line + 8,
sizeof(vmhwm));
1893 fprintf(stderr,
"[memory] max address space (vmpeak): %15s"
1894 "[memory] cur address space (vmsize): %15s"
1895 "[memory] max used memory (vmhwm ): %15s"
1896 "[memory] cur used memory (vmrss ): %15s",
1897 vmpeak, vmsize, vmhwm, vmrss);
1899#elif defined(__APPLE__)
1900 struct task_basic_info t_info;
1901 mach_msg_type_number_t t_info_count = TASK_BASIC_INFO_COUNT;
1903 if(KERN_SUCCESS != task_info(mach_task_self(), TASK_BASIC_INFO, (task_info_t)&t_info, &t_info_count))
1905 fprintf(stderr,
"[memory] task memory info unknown.\n");
1910 fprintf(stderr,
"[memory] max address space (vmpeak): %15s\n"
1911 "[memory] cur address space (vmsize): %12llu kB\n"
1912 "[memory] max used memory (vmhwm ): %15s\n"
1913 "[memory] cur used memory (vmrss ): %12llu kB\n",
1914 "unknown", (
uint64_t)t_info.virtual_size / 1024,
"unknown", (
uint64_t)t_info.resident_size / 1024);
1915#elif defined (_WIN32)
1917 MEMORYSTATUSEX memInfo;
1918 memInfo.dwLength =
sizeof(MEMORYSTATUSEX);
1919 GlobalMemoryStatusEx(&memInfo);
1923 PROCESS_MEMORY_COUNTERS_EX pmc;
1924 GetProcessMemoryInfo(GetCurrentProcess(), (PROCESS_MEMORY_COUNTERS *)&pmc,
sizeof(pmc));
1925 size_t virtualMemUsedByMe = pmc.PagefileUsage;
1926 size_t virtualMemUsedByMeMax = pmc.PeakPagefileUsage;
1929 size_t physMemUsedByMeMax = pmc.PeakWorkingSetSize;
1932 size_t physMemUsedByMe = pmc.WorkingSetSize;
1935 fprintf(stderr,
"[memory] max address space (vmpeak): %12llu kB\n"
1936 "[memory] cur address space (vmsize): %12llu kB\n"
1937 "[memory] max used memory (vmhwm ): %12llu kB\n"
1938 "[memory] cur used memory (vmrss ): %12llu Kb\n",
1939 virtualMemUsedByMeMax / 1024, virtualMemUsedByMe / 1024, physMemUsedByMeMax / 1024,
1940 physMemUsedByMe / 1024);
1943 fprintf(stderr,
"dt_print_mem_usage() currently unsupported on this platform\n");
1949 g_strlcpy(destination, path,
sizeof(
char) *
PATH_MAX);
1950 g_strlcat(destination, G_DIR_SEPARATOR_S,
sizeof(
char) *
PATH_MAX);
1951 g_strlcat(destination, file,
sizeof(
char) *
PATH_MAX);
void dt_accels_connect_accels(dt_accels_t *accels)
Actually enable accelerators after having loaded user config.
void dt_accels_cleanup(dt_accels_t *accels)
void dt_accels_load_user_config(dt_accels_t *accels)
Loads keyboardrc.lang from config dir. This needs to run after we inited the accel map from widgets c...
static void error(char *msg)
void init(dt_imageio_module_format_t *self)
void dt_bauhaus_cleanup(dt_bauhaus_t *bauhaus)
dt_bauhaus_t * dt_bauhaus_init()
static const dt_aligned_pixel_simd_t const dt_adaptation_t const float p
void dt_culling_mode_to_selection()
dt_collection_t * dt_collection_new()
void dt_collection_free(const dt_collection_t *collection)
void dt_colorlabels_cleanup(void)
void dt_colorspaces_cleanup(dt_colorspaces_t *self)
dt_colorspaces_t * dt_colorspaces_init()
const dt_aligned_pixel_t f
typedef void((*dt_cache_allocate_t)(void *userdata, dt_cache_entry_t *entry))
void dt_history_cleanup(void)
int32_t dt_image_import(const int32_t film_id, const char *filename, gboolean raise_signals)
void dt_image_cleanup(void)
#define PACKAGE_BUGREPORT
#define DT_BUILD_CPU_MODE
#define DT_BUILD_CXX_COMPILER
#define DT_BUILD_C_COMPILER
const char darktable_package_string[]
#define DT_BUILD_CXX_FLAGS
const char darktable_last_commit_year[]
void dt_conf_cleanup(dt_conf_t *cf)
int dt_conf_get_bool(const char *name)
void dt_conf_init(dt_conf_t *cf, const char *filename, GSList *override_entries)
gchar * dt_conf_get_string(const char *name)
void dt_conf_set_int(const char *name, int val)
int dt_conf_get_int(const char *name)
int64_t dt_conf_get_int64(const char *name)
void dt_conf_set_string(const char *name, const char *val)
void dt_ctl_switch_mode_to(const char *mode)
void dt_control_init(dt_control_t *s)
void dt_control_set_mouse_over_id(int32_t value)
void dt_control_log(const char *msg,...)
void dt_control_shutdown(dt_control_t *s)
void dt_control_cleanup(dt_control_t *s)
void dt_control_crawler_show_image_list(GList *images)
GList * dt_control_crawler_run(void)
void dt_printers_abort_discovery(void)
void dt_vprint(dt_debug_thread_t thread, const char *msg,...)
void dt_show_times(const dt_times_t *start, const char *prefix)
GType pango_fc_font_map_get_type(void)
int dt_load_from_string(const gchar *input, gboolean open_image_in_dr, gboolean *single_image)
static GLogWriterOutput _gtk_log_writer_filter(GLogLevelFlags log_level, const GLogField *fields, gsize n_fields, gpointer user_data)
static void _dt_drain_main_context(const int max_iters)
const char * dt_install_id(void)
void dt_concat_path_file(char destination[PATH_MAX], const char path[PATH_MAX], const char *const file)
void dt_print_mem_usage()
size_t get_usable_memory_bytes()
struct _PangoFcFontMap PangoFcFontMap
void pango_fc_font_map_shutdown(PangoFcFontMap *fcfontmap)
void * dt_alloc_align(size_t size)
void dt_capabilities_remove(char *capability)
int dt_init(int argc, char *argv[], const gboolean init_gui, const gboolean load_data)
size_t dt_get_mipmap_mem()
const char * dt_session_id(void)
static size_t _get_total_memory()
char * dt_version_major_minor()
void dt_print_nts(dt_debug_thread_t thread, const char *msg,...)
void dt_configure_runtime_performance(dt_sys_resources_t *resources, gboolean init_gui)
void dt_capabilities_add(char *capability)
gboolean dt_supported_image(const gchar *filename)
check if file is a supported image
void dt_capabilities_cleanup()
void dt_show_times_f(const dt_times_t *start, const char *prefix, const char *suffix,...)
size_t dt_get_available_mem()
int dt_capabilities_check(char *capability)
static int usage(const char *argv0)
void dt_print(dt_debug_thread_t thread, const char *msg,...)
@ DT_DEBUG_CAMERA_SUPPORT
#define dt_gui_freeze_begin()
#define dt_gui_freeze_end()
#define omp_get_max_threads()
static void * dt_alloc_align_internal(size_t size)
static void dt_free_gpointer(gpointer ptr)
static void dt_get_times(dt_times_t *t)
#define DT_DEBUG_SUPERVISOR
static double dt_get_wtime(void)
#define IS_NULL_PTR(p)
C is way too permissive with !=, == and if(var) checks, which can mean too many things depending on w...
void dt_database_cleanup_busy_statements(const struct dt_database_t *db)
void dt_database_optimize(const struct dt_database_t *db)
gboolean dt_database_snapshot(const struct dt_database_t *db)
void dt_database_perform_maintenance(const struct dt_database_t *db)
void dt_database_destroy(const dt_database_t *db)
gboolean dt_database_show_error(const dt_database_t *db)
char ** dt_database_snaps_to_remove(const struct dt_database_t *db)
gboolean dt_database_maybe_maintenance(const struct dt_database_t *db, const gboolean has_gui, const gboolean closing_time)
gboolean dt_database_get_lock_acquired(const dt_database_t *db)
dt_database_t * dt_database_init(const char *alternative, const gboolean load_data, const gboolean has_gui)
gboolean dt_database_maybe_snapshot(const struct dt_database_t *db)
void dt_dev_history_cleanup(void)
Cleanup cached statements or state used by history I/O.
void dt_dev_pixelpipe_cache_wait_dump_pending(const char *reason)
Dump pending GUI cache wait requests for lifecycle debugging.
static int dt_pthread_mutex_unlock(dt_pthread_mutex_t *mutex) RELEASE(mutex) NO_THREAD_SAFETY_ANALYSIS
static int dt_pthread_mutex_init(dt_pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr)
static int dt_pthread_rwlock_destroy(dt_pthread_rwlock_t *lock)
static int dt_pthread_mutex_destroy(dt_pthread_mutex_t *mutex)
static int dt_pthread_rwlock_init(dt_pthread_rwlock_t *lock, const pthread_rwlockattr_t *attr)
static int dt_pthread_mutex_lock(dt_pthread_mutex_t *mutex) ACQUIRE(mutex) NO_THREAD_SAFETY_ANALYSIS
int supported(struct dt_imageio_module_storage_t *storage, struct dt_imageio_module_format_t *format)
void dt_exif_set_exiv2_taglist()
void dt_loc_get_sharedir(char *sharedir, size_t bufsize)
void dt_loc_get_localedir(char *localedir, size_t bufsize)
void dt_loc_init(const char *datadir, const char *moduledir, const char *localedir, const char *configdir, const char *cachedir, const char *tmpdir, const char *kerneldir)
void dt_loc_get_user_config_dir(char *configdir, size_t bufsize)
int dt_film_new(dt_film_t *film, const char *directory)
int dt_film_open(const int32_t id)
void dt_film_set_folder_status()
int dt_film_import(const char *dirname)
dt_job_t * dt_pathlist_import_create(int argc, char *argv[])
void dt_folder_survey_cleanup()
Release folder survey state after control workers have stopped.
gboolean dt_folder_survey_session_was_active()
TRUE when the previous application session quit while monitoring.
void dt_folder_survey_stop()
Stop new scans before control workers begin shutting down.
void dt_folder_survey_init()
Initialize the folder survey state from the persisted configuration.
gboolean dt_folder_survey_propose_resume()
Propose to resume an interrupted studio session at application start.
ssize_t getline(char **lineptr, size_t *n, FILE *stream)
int dt_gui_gtk_init(dt_gui_gtk_t *gui)
GtkWidget * dt_ui_main_window(dt_ui_t *ui)
get the main window widget
void dt_gui_presets_init()
void dt_gui_presets_cleanup()
void dt_gui_throttle_init(void)
void dt_gui_throttle_cleanup(void)
void dt_guides_cleanup(GList *guides)
void dt_image_cache_cleanup(dt_image_cache_t *cache)
void dt_image_cache_init(dt_image_cache_t *cache)
void dt_image_cache_connect_info_changed_first(const struct dt_control_signal_t *ctlsig)
void dt_imageio_cleanup(dt_imageio_t *iio)
void dt_imageio_init(dt_imageio_t *iio)
void dt_iop_set_darktable_iop_table()
void dt_iop_load_modules_so(void)
void dt_iop_unload_modules_so()
GList * dt_ioppr_get_iop_order_list(int32_t imgid, gboolean sorted)
Load the order list for an image from the DB.
GList * dt_ioppr_get_iop_order_rules()
Return the list of ordering rules (prev/next constraints).
int dt_ioppr_check_so_iop_order(GList *iop_list, GList *iop_order_list)
Check whether any module .so is missing an iop_order entry.
int dt_control_add_job(dt_control_t *control, dt_job_queue_t queue_id, _dt_job_t *job)
dt_l10n_t * dt_l10n_init(gboolean init_list)
void dt_lib_init(dt_lib_t *lib)
void dt_lib_cleanup(dt_lib_t *lib)
float *const restrict const size_t k
void dt_mipmap_cache_init(dt_mipmap_cache_t *cache)
void dt_mipmap_cache_cleanup(dt_mipmap_cache_t *cache)
#define dt_mipmap_cache_get(A, B, C, D, E, F)
#define dt_mipmap_cache_release(A, B)
JsonParser * dt_noiseprofile_init(const char *alternative)
void dt_opencl_init(dt_opencl_t *cl, const gboolean exclude_opencl, const gboolean print_statistics)
void dt_opencl_cleanup(dt_opencl_t *cl)
gboolean dt_opencl_finish(const int devid)
void dt_dev_pixelpipe_cache_cleanup(dt_dev_pixelpipe_cache_t *cache)
dt_dev_pixelpipe_cache_t * dt_dev_pixelpipe_cache_init(size_t max_memory)
static void dt_points_cleanup(dt_points_t *p)
static void dt_points_init(dt_points_t *p, const unsigned int num_threads)
void dt_privacy_ask_consent(const gboolean have_gui)
void dt_control_progress_init(struct dt_control_t *control)
const dt_pwstorage_t * dt_pwstorage_new()
void dt_pwstorage_destroy(const dt_pwstorage_t *pwstorage)
void dt_selection_free(dt_selection_t *selection)
dt_selection_t * dt_selection_new()
void dt_sentry_shutdown(void)
void dt_sentry_init(const gboolean have_gui)
void dt_control_signal_cleanup(dt_control_signal_t *ctlsig)
dt_control_signal_t * dt_control_signal_init()
@ DT_DEBUG_SIGNAL_ACT_DISCONNECT
@ DT_DEBUG_SIGNAL_ACT_CONNECT
@ DT_DEBUG_SIGNAL_ACT_RAISE
@ DT_DEBUG_SIGNAL_ACT_PRINT_TRACE
@ DT_SIGNAL_DEVELOP_INITIALIZE
This signal is raised when darktable.develop is initialized.
@ DT_SIGNAL_METADATA_CHANGED
This signal is raised when metadata status (shown/hidden) or value has changed.
@ DT_SIGNAL_VIEWMANAGER_THUMBTABLE_ACTIVATE
@ DT_SIGNAL_ACTIVE_IMAGES_CHANGE
This signal is raised when image shown in the main view change no param, no returned value.
@ DT_SIGNAL_CONTROL_REDRAW_ALL
This signal is raised when dt_control_queue_redraw() is called. no param, no returned value.
@ DT_SIGNAL_FOLDER_SURVEY_CHANGED
Raised when the folder survey starts or stops monitoring. no param, no returned value.
@ DT_SIGNAL_DEVELOP_HISTORY_CHANGE
This signal is raised when develop history is changed no param, no returned value.
@ DT_SIGNAL_DEVELOP_IMAGE_CHANGED
This signal is raised when image is changed in darkroom.
@ DT_SIGNAL_CONTROL_PROFILE_USER_CHANGED
This signal is raised when a profile is changed by the user 1 uint32_t : the profile type that has ch...
@ DT_SIGNAL_IMAGE_EXPORT_TMPFILE
This signal is raised after an image has been exported to a file, but before it is sent to facebook/p...
@ DT_SIGNAL_IMAGES_ORDER_CHANGE
This signal is raised to request image order change.
@ DT_SIGNAL_DEVELOP_PREVIEW_PIPE_FINISHED
This signal is raised when develop preview pipe process is finished no param, no returned value.
@ DT_SIGNAL_STYLE_CHANGED
This signal is raised when a style is added/deleted/changed
@ DT_SIGNAL_DARKROOM_UI_CHANGED
Signal that the darkroom GUI color changed.
@ DT_SIGNAL_DEVELOP_UI_PIPE_FINISHED
This signal is raised when pipe is finished and the gui is attached no param, no returned value.
@ DT_SIGNAL_FILMROLLS_CHANGED
This signal is raised when a filmroll is deleted/changed but not imported.
@ DT_SIGNAL_MOUSE_OVER_IMAGE_CHANGE
This signal is raised when mouse hovers over image thumbs both on lighttable and in the filmstrip....
@ DT_SIGNAL_CONTROL_TOAST_REDRAW
This signal is raised when dt_control_toast_redraw() is called. no param, no returned value.
@ DT_SIGNAL_DEVELOP_MODULE_MOVED
This signal is raised when order of modules in pipeline is changed.
@ DT_SIGNAL_IMAGE_INFO_CHANGED
This signal is raised when any of image info has changed
@ DT_SIGNAL_PREFERENCES_CHANGE
This signal is raised after preferences have been changed no parameters no return.
@ DT_SIGNAL_CONTROL_REDRAW_CENTER
This signal is raised when dt_control_queue_redraw_center() is called. no param, no returned value.
@ DT_SIGNAL_DEVELOP_MODULEGROUPS_SET
This signal is raised to request a modulegroups update. 1 : dt_iop_module_t *module,...
@ DT_SIGNAL_FILMROLLS_REMOVED
This signal is raised only when a filmroll is removed.
@ DT_SIGNAL_TAG_CHANGED
This signal is raised when a tag is added/deleted/changed
@ DT_SIGNAL_IMAGEIO_STORAGE_CHANGE
This signal is raised when a new storage module is loaded noparameters no return.
@ DT_SIGNAL_VIEWMANAGER_FILMSTRIP_ACTIVATE
This signal is raised when a thumb is single-clicked in the filmstrip. Views that want filmstrip clic...
@ DT_SIGNAL_DEVELOP_MODULE_REMOVE
This signal is raised when a module is removed from the history stack 1 module no returned value.
@ DT_SIGNAL_IMAGE_LOADED
This signal is raised when an asynchronous darkroom image load finishes. 1 : uint32_t the load reques...
@ DT_SIGNAL_SELECTION_CHANGED
This signal is raised when the selection is changed no param, no returned value.
@ DT_SIGNAL_CONTROL_PICKERDATA_READY
This signal is raised when new color picker data are available in darkroom. no param,...
@ DT_SIGNAL_CONTROL_PROFILE_CHANGED
This signal is raised when the screen profile has changed no param, no returned value.
@ DT_SIGNAL_VIEWMANAGER_FILMSTRIP_DRAG_BEGIN
This signal is raised when a drag starts from the filmstrip. Views that need filmstrip drags to commi...
@ DT_SIGNAL_IMAGE_IMPORT
This signal is raised when a new image is imported (not cloned) 1 uint32_t : the new image id no retu...
@ DT_SIGNAL_COLLECTION_CHANGED
This signal is raised when collection changed. To avoid leaking the list, dt_collection_t is connecte...
@ DT_SIGNAL_CONTROL_LOG_REDRAW
This signal is raised when dt_control_log_redraw() is called. no param, no returned value.
@ DT_SIGNAL_CONTROL_NAVIGATION_REDRAW
This signal is raised when dt_control_navigation_redraw() is called. no param, no returned value.
@ DT_SIGNAL_METADATA_UPDATE
@ DT_SIGNAL_DEVELOP_HISTORY_WILL_CHANGE
This signal is raised when develop history is about to be changed 1 : GList * the current history 2 :...
@ DT_SIGNAL_VIEWMANAGER_VIEW_CHANGED
This signal is raised by viewmanager when a view has changed. 1 : dt_view_t * the old view 2 : dt_vie...
void dt_gui_splash_close(void)
struct _GtkWidget GtkWidget
void dt_styles_cleanup(void)
unsigned __int64 uint64_t
dt_pthread_mutex_t readFile_mutex
int32_t unmuted_signal_dbg_acts
struct dt_imageio_t * imageio
struct dt_dev_pixelpipe_cache_t * pixelpipe_cache
int32_t num_openmp_threads
struct dt_gui_gtk_t * gui
dt_pthread_rwlock_t database_threadsafe
struct dt_colorspaces_t * color_profiles
struct dt_collection_t * collection
struct dt_mipmap_cache_t * mipmap_cache
struct dt_selection_t * selection
dt_pthread_mutex_t exiv2_threadsafe
struct dt_sys_resources_t dtresources
dt_pthread_mutex_t plugin_threadsafe
dt_pthread_mutex_t capabilities_threadsafe
const struct dt_database_t * db
struct dt_control_signal_t * signals
struct dt_bauhaus_t * bauhaus
struct dt_opencl_t * opencl
struct dt_image_cache_t * image_cache
struct dt_develop_t * develop
struct dt_points_t * points
dt_pthread_mutex_t pipeline_threadsafe
struct dt_view_manager_t * view_manager
JsonParser * noiseprofile_parser
gboolean unmuted_signal_dbg[DT_SIGNAL_COUNT]
const struct dt_pwstorage_t * pwstorage
struct dt_control_t * control
dt_pthread_mutex_t run_mutex
dt_pthread_mutex_t log_mutex
GDBusConnection * dbus_connection
cairo_surface_t * surface
void dt_supervisor_init(void)
void dt_supervisor_cleanup(void)
void dt_set_signal_handlers()
void dt_telemetry_shutdown(void)
void dt_telemetry_init(const gboolean have_gui)
void dt_undo_cleanup(dt_undo_t *self)
dt_undo_t * dt_undo_init(void)
gchar * dt_util_normalize_path(const gchar *_input)
void dt_view_manager_cleanup(dt_view_manager_t *vm)
void dt_view_manager_init(dt_view_manager_t *vm)
void dt_view_manager_gui_init(dt_view_manager_t *vm)
void dt_ui_cleanup_titlebar(dt_ui_t *ui)
void dt_ui_cleanup_main_table(dt_ui_t *ui)
void dt_ui_init_global_menu(dt_ui_t *ui)