File: callback.c

package info (click to toggle)
emscripten 3.1.69%2Bdfsg-3
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 121,860 kB
  • sloc: ansic: 636,110; cpp: 425,974; javascript: 78,401; python: 58,404; sh: 49,154; pascal: 5,237; makefile: 3,366; asm: 2,415; lisp: 1,869
file content (42 lines) | stat: -rw-r--r-- 1,353 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
/*
 * Copyright 2023 The Emscripten Authors.  All rights reserved.
 * Emscripten is available under two separate licenses, the MIT license and the
 * University of Illinois/NCSA Open Source License.  Both these licenses can be
 * found in the LICENSE file.
 */
#include <assert.h>
#include <emscripten/html5.h>

#include "emscripten_internal.h"

typedef bool (*event_callback)(int event_type, void *event_data __attribute__((nonnull)), void *user_data);

typedef struct callback_args_t {
  event_callback callback;
  int event_type;
  void *event_data;
  void *user_data;
} callback_args_t;

static void do_callback(void* arg) {
  callback_args_t* args = (callback_args_t*)arg;
  args->callback(args->event_type, args->event_data, args->user_data);
}

void _emscripten_run_callback_on_thread(pthread_t t,
                                        event_callback f,
                                        int event_type,
                                        void* event_data,
                                        void* user_data) {
  em_proxying_queue* q = emscripten_proxy_get_system_queue();
  callback_args_t arg = {
    .callback = f,
    .event_type = event_type,
    .event_data = event_data,
    .user_data = user_data,
  };

  if (!emscripten_proxy_sync(q, t, do_callback, &arg)) {
    assert(false && "emscripten_proxy_sync failed");
  }
}