TRACE_WRAPPER PP_Resource trace_ppb_message_loop_get_for_main_thread(void) { trace_info("[PPB] {full} %s\n", __func__+6); return ppb_message_loop_get_for_main_thread(); }
void ppb_core_call_on_main_thread2(int32_t delay_in_milliseconds, struct PP_CompletionCallback callback, int32_t result, const char *origin) { PP_Resource main_message_loop = ppb_message_loop_get_for_main_thread(); if (main_message_loop == 0) trace_error("%s, no main loop\n", __func__); const int depth = 1; ppb_message_loop_post_work_with_result(main_message_loop, callback, delay_in_milliseconds, result, depth, origin); }
PP_Bool ppb_core_is_main_thread(void) { return ppb_message_loop_get_current() == ppb_message_loop_get_for_main_thread(); }
static uintptr_t load_ppp_module() { if (module_dl_handler) { // already loaded return 0; } // allocate auxiliary instance if (!aux_instance) { aux_instance = calloc(1, sizeof(*aux_instance)); if (!aux_instance) return 1; aux_instance->id = tables_generate_new_pp_instance_id(); tables_add_pp_instance(aux_instance->id, aux_instance); } // allocate message loop for browser thread if (ppb_message_loop_get_current() == 0) { PP_Resource message_loop = ppb_message_loop_create(aux_instance->id); ppb_message_loop_attach_to_current_thread(message_loop); ppb_message_loop_proclaim_this_thread_browser(); } // allocate message loop for plugin thread (main thread) if (ppb_message_loop_get_for_main_thread() == 0) { pthread_barrier_init(&aux_instance->main_thread_barrier, NULL, 2); pthread_create(&aux_instance->main_thread, NULL, fresh_wrapper_main_thread, aux_instance); pthread_detach(aux_instance->main_thread); pthread_barrier_wait(&aux_instance->main_thread_barrier); pthread_barrier_destroy(&aux_instance->main_thread_barrier); } fpp_config_initialize(); if (tried_files) { g_list_free_full(tried_files, g_free); tried_files = NULL; } if (fpp_config_get_plugin_path()) { const char *ptr = fpp_config_get_plugin_path(); const char *last = strchr(ptr, ':'); uintptr_t ret; // parse ':'-separated list while (last != NULL) { // try entries one by one char *entry = strndup(ptr, last - ptr); ret = do_load_ppp_module(entry); free(entry); if (ret == 0) return 0; ptr = last + 1; last = strchr(ptr, ':'); } // and the last entry ret = do_load_ppp_module(ptr); if (ret == 0) return 0; goto failure; } // try all paths const char **path_list = fpp_config_get_plugin_path_list(); while (*path_list) { gchar *fname = g_strdup_printf("%s/%s", *path_list, fpp_config_get_plugin_file_name()); uintptr_t ret = do_load_ppp_module(fname); g_free(fname); if (ret == 0) return 0; path_list ++; } failure: config.quirks.plugin_missing = 1; use_fallback_version_strings(); trace_error("%s, can't find %s\n", __func__, fpp_config_get_plugin_file_name()); return 1; }