28#include <json-glib/json-glib.h>
110#define DT_SV_LOG_MAX 20000
152 uint64_t h = 14695981039346656037ULL;
153 for(
const char *
p = s;
p && *
p;
p++) { h ^= (
unsigned char)*
p; h *= 1099511628211ULL; }
154 h ^= (
uint64_t)(uint32_t)a; h *= 1099511628211ULL;
155 h ^= (
uint64_t)(uint32_t)b; h *= 1099511628211ULL;
163 return _fnv1a(op_name ? op_name :
"?", pipe_type, multi_priority);
168 return _fnv1a(
"thumbnail", imgid, mip);
178 return _fnv1a(
"mipmap", imgid, mip);
188 return _fnv1a(
"image", imgid, 0);
198 return _fnv1a(
"form", formid, 0);
206 return _fnv1a(
"cache-wait", (
int)(request_id & 0xffffffffu), (
int)(request_id >> 32));
231 JsonArray *a = json_array_new();
232 for(GList *
p = form->
points;
p;
p = g_list_next(
p))
236 JsonObject *o = json_object_new();
237 json_object_set_int_member(o,
"id",
g->formid);
239 g_snprintf(buf,
sizeof(buf),
"0x%016" G_GINT64_MODIFIER
"x",
_form_key(
g->formid));
240 json_object_set_string_member(o,
"hash", buf);
241 json_array_add_object_element(a, o);
249 if(!forms)
return NULL;
250 JsonArray *
out = json_array_new();
251 for(GList *
f = forms;
f;
f = g_list_next(
f))
255 JsonObject *o = json_object_new();
256 json_object_set_int_member(o,
"id", form->
formid);
258 g_snprintf(buf,
sizeof(buf),
"0x%016" G_GINT64_MODIFIER
"x",
_form_key(form->
formid));
259 json_object_set_string_member(o,
"hash", buf);
260 if(form->
name[0]) json_object_set_string_member(o,
"name", form->
name);
263 if(members) json_object_set_array_member(o,
"members", members);
264 json_array_add_object_element(
out, o);
272 if(devid < 0) g_strlcpy(
out,
"cpu", out_size);
273 else g_snprintf(
out, out_size,
"opencl-%d", devid);
278 static __thread
char tag[24];
279 g_snprintf(tag,
sizeof(tag),
"thread-%p", (
void *)g_thread_self());
285 if(
_sv.inited)
return;
286 _sv.entries = g_hash_table_new_full(g_int64_hash, g_int64_equal, g_free, g_free);
287 _sv.log = g_queue_new();
294 if(!
_sv.inited)
return;
296 g_hash_table_destroy(
_sv.entries);
312 if(!
_sv.inited)
return;
315 _sv.log = g_queue_new();
324 if(e) {
if(created) *created =
FALSE;
return e; }
339 g_hash_table_insert(
_sv.entries,
key, e);
340 if(created) *created =
TRUE;
353 const gboolean resurrected = !created && !e->
alive;
362 if(!e)
return "unknown";
387 else g_strlcpy(
out,
"?", out_size);
393 g_snprintf(buf,
sizeof(buf),
"0x%016" G_GINT64_MODIFIER
"x", hash);
394 json_object_set_string_member(o,
name, buf);
406 JsonObject *o = json_object_new();
411 if(strcmp(module,
"?") != 0) json_object_set_string_member(o,
"module", module);
415 json_object_set_int_member(o,
"history_index", e->
history_index);
416 json_object_set_boolean_member(o,
"enabled", e->
enabled);
419 json_object_set_boolean_member(o,
"alive", e->
alive);
426 return (
uint64_t)g_ascii_strtoull(s, NULL, 0);
433 if(json_object_has_member(root,
"ts")) e->
ts = json_object_get_double_member(root,
"ts");
434 if(json_object_has_member(root,
"thread"))
435 g_strlcpy(e->
thread, json_object_get_string_member(root,
"thread"),
sizeof(e->
thread));
436 if(json_object_has_member(root,
"op"))
437 g_strlcpy(e->
op, json_object_get_string_member(root,
"op"),
sizeof(e->
op));
438 if(json_object_has_member(root,
"domain"))
439 g_strlcpy(e->
domain, json_object_get_string_member(root,
"domain"),
sizeof(e->
domain));
440 if(json_object_has_member(root,
"hash"))
442 e->
json = g_strdup(json_str);
449 if(!g_strcmp0(
d,
"cacheline") && json_object_has_member(root,
"name"))
451 if((!g_strcmp0(
d,
"cacheline") || !g_strcmp0(
d,
"node") || !g_strcmp0(
d,
"history"))
452 && json_object_has_member(root,
"module"))
453 g_strlcpy(e->
mnemonic, json_object_get_string_member(root,
"module"),
sizeof(e->
mnemonic));
454 else if(!g_strcmp0(
d,
"widget") && json_object_has_member(root,
"widget"))
455 g_strlcpy(e->
mnemonic, json_object_get_string_member(root,
"widget"),
sizeof(e->
mnemonic));
456 else if(!g_strcmp0(
d,
"backbuf") && json_object_has_member(root,
"pipe"))
457 g_strlcpy(e->
mnemonic, json_object_get_string_member(root,
"pipe"),
sizeof(e->
mnemonic));
458 else if(!g_strcmp0(
d,
"form"))
460 const char *nm = json_object_has_member(root,
"name") ? json_object_get_string_member(root,
"name") : NULL;
461 const char *ty = json_object_has_member(root,
"type") ? json_object_get_string_member(root,
"type") :
"";
462 const int id = json_object_has_member(root,
"id") ? (int)json_object_get_int_member(root,
"id") : 0;
466 else if(!g_strcmp0(
d,
"cache-wait"))
468 const char *owner = json_object_has_member(root,
"owner") ? json_object_get_string_member(root,
"owner") : NULL;
469 const char *target = json_object_has_member(root,
"target") ? json_object_get_string_member(root,
"target") : NULL;
470 if(owner && target) g_snprintf(e->
mnemonic,
sizeof(e->
mnemonic),
"%s→%s", owner, target);
474 else if((!g_strcmp0(
d,
"image") || !g_strcmp0(
d,
"mipmap")) && json_object_has_member(root,
"filename"))
475 g_strlcpy(e->
mnemonic, json_object_get_string_member(root,
"filename"),
sizeof(e->
mnemonic));
476 else if((!g_strcmp0(
d,
"mipmap") || !g_strcmp0(
d,
"image") || !g_strcmp0(
d,
"thumbnail"))
477 && json_object_has_member(root,
"imgid"))
478 g_snprintf(e->
mnemonic,
sizeof(e->
mnemonic),
"#%d", (
int)json_object_get_int_member(root,
"imgid"));
481 static const char *obj_edges[]
482 = {
"params",
"input",
"node",
"consumes",
"mipmap",
"image",
"predecessor",
"awaits", NULL };
483 for(
int i = 0; obj_edges[
i];
i++)
485 if(!json_object_has_member(root, obj_edges[
i]))
continue;
486 JsonObject *o = json_object_get_object_member(root, obj_edges[
i]);
487 if(o && json_object_has_member(o,
"hash"))
490 g_strlcpy(lk.
label, obj_edges[
i],
sizeof(lk.
label));
492 g_array_append_val(e->
links, lk);
496 static const char *str_edges[] = {
"rekeyed_from",
"rekeyed_to",
"awaits_hash", NULL };
497 for(
int i = 0; str_edges[
i];
i++)
499 if(!json_object_has_member(root, str_edges[
i]))
continue;
501 g_strlcpy(lk.
label, str_edges[
i],
sizeof(lk.
label));
503 g_array_append_val(e->
links, lk);
508 static const char *arr_edges[] = {
"members",
"forms", NULL };
509 for(
int i = 0; arr_edges[
i];
i++)
511 if(!json_object_has_member(root, arr_edges[
i]))
continue;
512 const char *label = !g_strcmp0(arr_edges[
i],
"forms") ?
"form" :
"member";
513 JsonArray *arr = json_object_get_array_member(root, arr_edges[
i]);
514 const guint
n = arr ? json_array_get_length(arr) : 0;
515 for(guint j = 0; j <
n; j++)
517 JsonNode *node = json_array_get_element(arr, j);
518 if(!JSON_NODE_HOLDS_OBJECT(node))
continue;
519 JsonObject *o = json_node_get_object(node);
520 if(json_object_has_member(o,
"hash"))
525 g_array_append_val(e->
links, lk);
528 if(json_object_has_member(o,
"members"))
530 JsonArray *
m = json_object_get_array_member(o,
"members");
531 const guint mn =
m ? json_array_get_length(
m) : 0;
532 for(guint
k = 0;
k < mn;
k++)
534 JsonNode *mnode = json_array_get_element(
m,
k);
535 if(!JSON_NODE_HOLDS_OBJECT(mnode))
continue;
536 JsonObject *mo = json_node_get_object(mnode);
537 if(!json_object_has_member(mo,
"hash"))
continue;
539 g_strlcpy(lk.
label,
"member",
sizeof(lk.
label));
541 g_array_append_val(e->
links, lk);
555 g_queue_push_tail(
_sv.log, e);
568 JsonNode *node = json_node_new(JSON_NODE_OBJECT);
569 json_node_take_object(node, root);
570 JsonGenerator *gen = json_generator_new();
571 json_generator_set_root(gen, node);
572 json_generator_set_pretty(gen,
FALSE);
575 gchar *str = json_generator_to_data(gen, &len);
579 fprintf(stderr,
"%s\n", str);
587 json_node_free(node);
598 const char *
name = prefix ? prefix :
"";
609 gchar *pre = prefix ? g_strdup_printf(
"%s.%s", prefix, nm) : g_strdup(nm);
618 if(g_utf8_validate(s, -1, NULL))
620 gchar *
t = g_strdup_printf(
"%s = \"%s\"",
name, s);
621 json_array_add_string_element(
out,
t);
627 for(
int i = 0, off = 0;
i < (int)field->
Array.
count &&
i < 8;
630 gchar *pre = g_strdup_printf(
"%s[%d]",
name,
i);
638 gchar *
t = g_strdup_printf(
"%s = %.4f",
name, *(
float *)
p);
639 json_array_add_string_element(
out,
t);
645 gchar *
t = g_strdup_printf(
"%s = %.4f",
name, *(
double *)
p);
646 json_array_add_string_element(
out,
t);
654 gchar *
t = g_strdup_printf(
"%s = %d",
name, val);
655 json_array_add_string_element(
out,
t);
663 : *(
unsigned int *)
p;
664 gchar *
t = g_strdup_printf(
"%s = %u",
name, val);
665 json_array_add_string_element(
out,
t);
671 gchar *
t = g_strdup_printf(
"%s = %d",
name, (
int)*(int8_t *)
p);
672 json_array_add_string_element(
out,
t);
678 gchar *
t = g_strdup_printf(
"%s = %u",
name, (
unsigned)*(uint8_t *)
p);
679 json_array_add_string_element(
out,
t);
685 gchar *
t = g_strdup_printf(
"%s = %s",
name, *(gboolean *)
p ?
"on" :
"off");
686 json_array_add_string_element(
out,
t);
692 const int val = *(
int *)
p;
693 const char *str =
"?";
697 str = (
i->description && *
i->description) ?
i->description :
i->name;
700 gchar *
t = g_strdup_printf(
"%s = %s",
name, str);
701 json_array_add_string_element(
out,
t);
713 if(!module || !params || !module->
have_introspection || !module->get_introspection)
return NULL;
715 if(!intro || !intro->
field)
return NULL;
716 JsonArray *
out = json_array_new();
718 if(json_array_get_length(
out) == 0)
720 json_array_unref(
out);
727static void _arr_addf(JsonArray *
out,
const char *fmt, ...) G_GNUC_PRINTF(2, 3);
732 gchar *s = g_strdup_vprintf(fmt, ap);
734 json_array_add_string_element(
out, s);
741 if(
i->value ==
value)
return i->name;
759 JsonArray *
out = json_array_new();
787 const int pipe_type,
const int32_t imgid,
const gboolean alive,
788 const gboolean resurrected)
790 JsonObject *o = json_object_new();
792 json_object_set_string_member(o,
"thread",
_thread_tag());
793 json_object_set_string_member(o,
"op",
_op_str(op));
794 json_object_set_string_member(o,
"domain", domain);
797 if(imgid > 0) json_object_set_int_member(o,
"imgid", imgid);
799 json_object_set_boolean_member(o,
"alive", alive);
800 if(resurrected) json_object_set_boolean_member(o,
"resurrected",
TRUE);
805 const int multi_priority,
const char *multi_name,
const int iop_order,
806 const int history_index,
const int32_t imgid,
const gboolean enabled,
833 JsonObject *root =
_envelope(op,
"history", param_hash, -1, imgid, e->
alive, resurrected);
834 char module_label[128];
836 json_object_set_string_member(root,
"module", module_label);
837 json_object_set_int_member(root,
"iop_order", iop_order);
838 json_object_set_int_member(root,
"history_index", history_index);
839 json_object_set_boolean_member(root,
"enabled", enabled);
840 if(parameters) json_object_set_array_member(root,
"parameters", parameters);
841 if(blendop) json_object_set_array_member(root,
"blendop", blendop);
842 if(forms_json) json_object_set_array_member(root,
"forms", forms_json);
849 json_object_set_string_member(root,
"filename", image_e->
img_filename);
857 const uint64_t predecessor_hash,
const char *op_name,
const int multi_priority,
858 const int iop_order,
const int pipe_type,
const int32_t imgid)
877 JsonObject *root =
_envelope(op,
"node", node_hash, pipe_type, imgid, e->
alive, resurrected);
880 json_object_set_string_member(root,
"module", module);
881 json_object_set_int_member(root,
"iop_order", iop_order);
883 if(params) json_object_set_object_member(root,
"params", params);
885 if(pred) json_object_set_object_member(root,
"predecessor", pred);
893 const char *op_name,
const int multi_priority,
const int iop_order,
894 const int pipe_type,
const int32_t imgid,
const int roi_w,
895 const int roi_h,
const int devid,
const size_t size,
927 json_object_set_string_member(root,
"module", module);
928 json_object_set_int_member(root,
"iop_order", iop_order);
929 json_object_set_int_member(root,
"size", (gint64)
size);
930 if(e->
cl_name[0]) json_object_set_string_member(root,
"name", e->
cl_name);
934 json_object_set_string_member(root,
"device", dev);
936 JsonArray *roi = json_array_new();
937 json_array_add_int_element(roi, roi_w);
938 json_array_add_int_element(roi, roi_h);
939 json_object_set_array_member(root,
"roi", roi);
942 if(params) json_object_set_object_member(root,
"params", params);
944 if(in) json_object_set_object_member(root,
"input", in);
946 if(node) json_object_set_object_member(root,
"node", node);
965 json_object_set_int_member(root,
"size", (gint64)e->
size);
968 if(strcmp(module,
"?") != 0) json_object_set_string_member(root,
"module", module);
969 if(e->
cl_name[0]) json_object_set_string_member(root,
"name", e->
cl_name);
972 if(params) json_object_set_object_member(root,
"params", params);
974 if(node) json_object_set_object_member(root,
"node", node);
976 if(in) json_object_set_object_member(root,
"input", in);
998 json_object_set_int_member(root,
"size", (gint64)e->
size);
999 if(e->
cl_name[0]) json_object_set_string_member(root,
"name", e->
cl_name);
1000 json_object_set_int_member(root,
"owner_pipe", e->
owner_pipe_id);
1003 if(strcmp(module,
"?") != 0) json_object_set_string_member(root,
"module", module);
1005 if(params) json_object_set_object_member(root,
"params", params);
1007 if(node) json_object_set_object_member(root,
"node", node);
1014 const char *owner_tag,
const char *op_name,
const int multi_priority,
1015 const int pipe_type,
const int32_t imgid,
const gboolean request_emitted,
1030 if(imgid > 0) e->
imgid = imgid;
1040 json_object_set_int_member(root,
"request_id", (gint64)request_id);
1044 if(strcmp(module,
"?") != 0) json_object_set_string_member(root,
"target", module);
1045 json_object_set_boolean_member(root,
"request_emitted", request_emitted);
1046 if(note) json_object_set_string_member(root,
"note", note);
1054 if(awaits) json_object_set_object_member(root,
"awaits", awaits);
1063 const char *link_field,
const uint64_t link_hash,
const gboolean alive)
1068 if(strcmp(module,
"?") != 0) json_object_set_string_member(o,
"module", module);
1073 if(node) json_object_set_object_member(o,
"node", node);
1075 if(params) json_object_set_object_member(o,
"params", params);
1133 const int w,
const int h,
const int bpp,
const int pipe_type,
1147 if(devid >= 0) e->
devid = devid;
1150 JsonObject *root =
_envelope(op,
"backbuf", hash, pipe_type, e->
imgid, e->
alive, resurrected);
1153 json_object_set_string_member(root,
"device", dev);
1156 JsonArray *
size = json_array_new();
1157 json_array_add_int_element(
size, w);
1158 json_array_add_int_element(
size, h);
1159 json_array_add_int_element(
size,
bpp);
1160 json_object_set_array_member(root,
"size",
size);
1165 if(strcmp(module,
"?") != 0) json_object_set_string_member(root,
"module", module);
1167 if(params) json_object_set_object_member(root,
"params", params);
1174 const int pipe_type,
const int32_t imgid)
1183 JsonObject *root =
_envelope(op,
"widget", consumed_hash, pipe_type, imgid,
1185 if(widget_tag) json_object_set_string_member(root,
"widget", widget_tag);
1187 if(consumed) json_object_set_object_member(root,
"consumes", consumed);
1189 if(params) json_object_set_object_member(root,
"params", params);
1196 const int height,
const int mip,
const gboolean success)
1212 JsonObject *root =
_envelope(op,
"thumbnail",
key, -1, imgid, e->
alive, resurrected);
1213 json_object_set_int_member(root,
"mip", mip);
1214 json_object_set_boolean_member(root,
"success", success);
1215 JsonArray *
size = json_array_new();
1216 json_array_add_int_element(
size,
width);
1218 json_object_set_array_member(root,
"size",
size);
1223 JsonObject *mm = json_object_new();
1225 json_object_set_int_member(mm,
"mip", mip);
1229 json_object_set_boolean_member(mm,
"alive", me->
alive);
1232 json_object_set_object_member(root,
"mipmap", mm);
1241 JsonObject *o = json_object_new();
1242 json_object_set_int_member(o,
"id", img->
id);
1243 json_object_set_string_member(o,
"filename", img->
filename);
1244 json_object_set_string_member(o,
"folder", img->
folder);
1245 json_object_set_int_member(o,
"film_id", img->
film_id);
1246 json_object_set_int_member(o,
"group_id", img->
group_id);
1247 json_object_set_int_member(o,
"version", img->
version);
1249 JsonArray *dim = json_array_new();
1250 json_array_add_int_element(dim, img->
width);
1251 json_array_add_int_element(dim, img->
height);
1252 json_object_set_array_member(o,
"dimensions", dim);
1253 JsonArray *pdim = json_array_new();
1254 json_array_add_int_element(pdim, img->
p_width);
1255 json_array_add_int_element(pdim, img->
p_height);
1256 json_object_set_array_member(o,
"processed", pdim);
1260 json_object_set_string_member(o,
"flags",
flags);
1261 json_object_set_int_member(o,
"rating", img->
flags & 0x7);
1262 json_object_set_int_member(o,
"orientation", (
int)img->
orientation);
1263 json_object_set_int_member(o,
"loader", (
int)img->
loader);
1266 json_object_set_string_member(o,
"lens", img->
exif_lens);
1267 json_object_set_string_member(o,
"datetime", img->
datetime);
1268 json_object_set_double_member(o,
"iso", img->
exif_iso);
1269 json_object_set_double_member(o,
"aperture", img->
exif_aperture);
1270 json_object_set_double_member(o,
"exposure", img->
exif_exposure);
1290 JsonObject *root =
_envelope(op,
"mipmap",
key, -1, imgid, e->
alive, resurrected);
1291 json_object_set_int_member(root,
"mip", mip);
1296 json_object_set_string_member(root,
"filename", image_e->
img_filename);
1300 im = json_object_new();
1303 json_object_set_object_member(root,
"image", im);
1327 JsonObject *root =
_envelope(eff_op,
"image",
key, -1, imgid, e->
alive, resurrected);
1355 JsonObject *root =
_envelope(eff_op,
"form",
key, -1, -1, e->
alive, resurrected);
1356 json_object_set_int_member(root,
"id", form->
formid);
1359 json_object_set_int_member(root,
"version", form->
version);
1360 if(members) json_object_set_array_member(root,
"members", members);
1374 g_string_append_printf(s,
"%s 0x%016" G_GINT64_MODIFIER
"x", prefix, hash);
1375 if(strcmp(module,
"?") != 0) g_string_append_printf(s,
" (%s)", module);
1376 if(!e->
alive) g_string_append(s,
" [deleted]");
1391 GString *s = g_string_new(NULL);
1407 g_string_append_printf(s,
"image #%d", e->
imgid);
1412 g_string_append_printf(s,
"mipmap image #%d mip %d", e->
imgid, e->
mip);
1417 g_string_append_printf(s,
"thumbnail for image #%d (%dx%d, mip %d) %s", e->
imgid, e->
roi_w,
1422 g_string_append_printf(s,
"backbuffer 0x%016" G_GINT64_MODIFIER
"x", hash);
1423 if(strcmp(module,
"?") != 0) g_string_append_printf(s,
" (%s)", module);
1424 g_string_append_printf(s,
" published by %s pipe (%dx%dx%d, %s)", pipe ? pipe :
"?", e->
bb_w,
1430 g_string_append_printf(s,
"cacheline 0x%016" G_GINT64_MODIFIER
"x", hash);
1431 if(strcmp(module,
"?") != 0) g_string_append_printf(s,
" (%s", module);
1432 g_string_append_printf(s,
", %s, %dx%d, %s)", pipe ? pipe :
"?", e->
roi_w, e->
roi_h, dev);
1438 g_string_append_printf(s,
"node 0x%016" G_GINT64_MODIFIER
"x (%s, %s pipe, iop_order %d)", hash,
1439 module, pipe ? pipe :
"?", e->
iop_order);
1443 g_string_append_printf(s,
"history state #%d: %s (%s)", e->
history_index, module,
1444 e->
enabled ?
"enabled" :
"disabled");
1448 g_string_append_printf(s,
"0x%016" G_GINT64_MODIFIER
"x", hash);
1451 if(!e->
alive) g_string_append(s,
" [DELETED]");
1454 return g_string_free(s,
FALSE);
1461 c->json = g_strdup(src->
json);
1464 g_array_append_vals(c->links, src->
links->data, src->
links->len);
1471 if(!
_sv.inited)
return out;
1474 for(GList *l =
_sv.log ?
_sv.log->head : NULL; l; l = l->next)
1483 if(out_last_seq) *out_last_seq = after_seq;
1484 if(!
_sv.inited)
return out;
1488 for(GList *l =
_sv.log ?
_sv.log->tail : NULL; l; l = l->prev)
1491 if(ev->
seq <= after_seq)
break;
1497 for(guint
i = 0, j =
out->len ?
out->len - 1 : 0;
i < j;
i++, j--)
1499 gpointer
t =
out->pdata[
i];
1500 out->pdata[
i] =
out->pdata[j];
1503 if(out_last_seq &&
out->len)
1510 if(!
_sv.inited)
return 0;
1512 const guint
n =
_sv.log ? g_queue_get_length(
_sv.log) : 0;
1519 if(events) g_ptr_array_free(events,
TRUE);
const dt_develop_name_value_t dt_develop_invert_mask_names[]
const dt_develop_name_value_t dt_develop_mask_mode_names[]
const dt_develop_name_value_t dt_develop_blend_colorspace_names[]
const dt_develop_name_value_t dt_develop_blend_mode_flag_names[]
@ DEVELOP_BLEND_MODE_MASK
const dt_develop_name_value_t dt_develop_combine_masks_names[]
const dt_develop_name_value_t dt_develop_blend_mode_names[]
const dt_develop_name_value_t dt_develop_feathering_guide_names[]
static const dt_aligned_pixel_simd_t const dt_adaptation_t const float p
const dt_aligned_pixel_t f
const dt_colormatrix_t dt_aligned_pixel_t out
#define DT_DEBUG_SUPERVISOR
static const dt_aligned_pixel_simd_t value
static double dt_get_wtime(void)
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_mutex_destroy(dt_pthread_mutex_t *mutex)
static int dt_pthread_mutex_lock(dt_pthread_mutex_t *mutex) ACQUIRE(mutex) NO_THREAD_SAFETY_ANALYSIS
@ DT_INTROSPECTION_TYPE_BOOL
@ DT_INTROSPECTION_TYPE_DOUBLE
@ DT_INTROSPECTION_TYPE_ENUM
@ DT_INTROSPECTION_TYPE_ARRAY
@ DT_INTROSPECTION_TYPE_CHAR
@ DT_INTROSPECTION_TYPE_UINT8
@ DT_INTROSPECTION_TYPE_FLOAT
@ DT_INTROSPECTION_TYPE_SHORT
@ DT_INTROSPECTION_TYPE_UNION
@ DT_INTROSPECTION_TYPE_UINT
@ DT_INTROSPECTION_TYPE_USHORT
@ DT_INTROSPECTION_TYPE_INT8
@ DT_INTROSPECTION_TYPE_STRUCT
@ DT_INTROSPECTION_TYPE_INT
float *const restrict const size_t k
dt_mipmap_buffer_dsc_flags flags
Pixelpipe cache for storing intermediate results in the pixelpipe.
#define DT_PIXELPIPE_CACHE_HASH_INVALID
char * dt_pixelpipe_get_pipe_name(dt_dev_pixelpipe_type_t pipe_type)
unsigned __int64 uint64_t
uint32_t feathering_guide
gboolean raster_mask_invert
char camera_makermodel[128]
dt_image_orientation_t orientation
char filename[DT_MAX_FILENAME_LEN]
dt_introspection_field_t * field
union dt_introspection_field_t * field
dt_introspection_type_t type
dt_introspection_type_enum_tuple_t * values
union dt_introspection_field_t ** fields
gboolean have_introspection
static JsonArray * _forms_json(GList *forms)
uint64_t dt_supervisor_form_key(const int formid)
void dt_supervisor_events_free(GPtrArray *events)
static int _entry_pipe_type(const dt_sv_entry_t *e)
gchar * dt_supervisor_describe(const uint64_t hash)
void dt_supervisor_cache_wait(const dt_sv_op_t op, const uint64_t request_id, const uint64_t awaited_hash, const char *owner_tag, const char *op_name, const int multi_priority, const int pipe_type, const int32_t imgid, const gboolean request_emitted, const char *note)
static uint64_t _form_key(const int formid)
void dt_supervisor_set_recording(const gboolean on)
gint dt_supervisor_recording
static void _introspect_dump(dt_introspection_field_t *field, const char *prefix, gpointer params, JsonArray *out)
static uint64_t _fnv1a(const char *s, const int a, const int b)
void dt_supervisor_events_clear(void)
static uint64_t _image_key(const int32_t imgid)
static void _emit_line(JsonObject *root)
static uint64_t _cache_wait_key(const uint64_t request_id)
static uint64_t _mipmap_key(const int32_t imgid, const int mip)
static uint64_t _parse_hash(const char *s)
static gboolean _touch_alive_locked(dt_sv_entry_t *e, const gboolean created, const dt_sv_op_t op)
void dt_supervisor_mipmap(const dt_sv_op_t op, const int32_t imgid, const int mip)
static void _describe_edge(GString *s, const char *prefix, const uint64_t hash)
void dt_supervisor_cacheline_delete(const uint64_t hash, const size_t size, const int owner_pipe_id, const char *name)
void dt_supervisor_init(void)
GPtrArray * dt_supervisor_events_snapshot(void)
void dt_supervisor_rekey(const uint64_t old_hash, const uint64_t new_hash)
static void _arr_addf(JsonArray *out, const char *fmt,...) G_GNUC_PRINTF(2
void dt_supervisor_cacheline_read(const uint64_t hash, const size_t size)
static dt_sv_entry_t * _entry_get_locked(const uint64_t hash, gboolean *created)
static void _module_label(const dt_sv_entry_t *e, char *out, const size_t out_size)
void dt_supervisor_thumbnail(const dt_sv_op_t op, const int32_t imgid, const int width, const int height, const int mip, const gboolean success)
GPtrArray * dt_supervisor_events_snapshot_since(const uint64_t after_seq, uint64_t *out_last_seq)
static JsonArray * _params_json(const dt_iop_module_t *module, const void *params)
uint64_t dt_supervisor_node_key(const int pipe_type, const char *op_name, const int multi_priority)
static const char * _op_str(const dt_sv_op_t op)
uint64_t dt_supervisor_image_key(const int32_t imgid)
void dt_supervisor_cleanup(void)
void dt_supervisor_image(const dt_sv_op_t op, const int32_t imgid, const dt_image_t *img)
static dt_sv_logged_event_t * _extract_event(JsonObject *root, const gchar *json_str)
static void _logged_event_free(gpointer p)
void dt_supervisor_form(const dt_sv_op_t op, const dt_masks_form_t *form)
static JsonObject * _resolve_locked(const uint64_t hash)
static const char * _form_type_name(const int type)
static JsonArray * _blendop_json(const dt_develop_blend_params_t *bp)
void dt_supervisor_widget(const dt_sv_op_t op, const char *widget_tag, const uint64_t consumed_hash, const int pipe_type, const int32_t imgid)
static const char * _primary_domain(const dt_sv_entry_t *e)
static void _device_string(const int devid, char *out, const size_t out_size)
uint64_t dt_supervisor_thumbnail_key(const int32_t imgid, const int mip)
static dt_sv_logged_event_t * _event_copy(const dt_sv_logged_event_t *src)
static void _set_hash_member(JsonObject *o, const char *name, const uint64_t hash)
guint dt_supervisor_events_count(void)
uint64_t dt_supervisor_mipmap_key(const int32_t imgid, const int mip)
void dt_supervisor_cacheline_create(const uint64_t hash, const uint64_t node_hash, const uint64_t param_hash, const uint64_t input_hash, const char *op_name, const int multi_priority, const int iop_order, const int pipe_type, const int32_t imgid, const int roi_w, const int roi_h, const int devid, const size_t size, const char *name)
void dt_supervisor_node(const dt_sv_op_t op, const uint64_t node_hash, const uint64_t param_hash, const uint64_t predecessor_hash, const char *op_name, const int multi_priority, const int iop_order, const int pipe_type, const int32_t imgid)
static JsonObject * _envelope(const dt_sv_op_t op, const char *domain, const uint64_t hash, const int pipe_type, const int32_t imgid, const gboolean alive, const gboolean resurrected)
static JsonObject * _rekey_record(const dt_sv_op_t op, const dt_sv_entry_t *e, const uint64_t hash, const char *link_field, const uint64_t link_hash, const gboolean alive)
static const char * _thread_tag(void)
static const char * _name_for_value(const dt_develop_name_value_t *list, const int value)
static uint64_t _thumb_key(const int32_t imgid, const int mip)
static gboolean _hash_is_set(const uint64_t h)
void dt_supervisor_backbuf(const dt_sv_op_t op, const uint64_t hash, const uint64_t history_hash, const int w, const int h, const int bpp, const int pipe_type, const int devid)
static void _log_push(dt_sv_logged_event_t *e)
static JsonObject * _image_properties_json(const dt_image_t *img)
static JsonArray * _form_members_json(const dt_masks_form_t *form)
static void _arr_add_enum(JsonArray *out, const char *label, const dt_develop_name_value_t *names, const int value)
void dt_supervisor_history(const dt_sv_op_t op, const uint64_t param_hash, const char *op_name, const int multi_priority, const char *multi_name, const int iop_order, const int history_index, const int32_t imgid, const gboolean enabled, const dt_iop_module_t *module, const void *params, const dt_develop_blend_params_t *blend_params, GList *forms)
static gboolean dt_supervisor_active(void)
dt_introspection_type_header_t header
dt_introspection_type_array_t Array
dt_introspection_type_enum_t Enum
dt_introspection_type_struct_t Struct