cli_configuration() : fl_configuration(), debug(false), #ifndef WINDOWS thread_count(0), foreground(false), pid_file() #else thread_count(0) #endif {} fl::configuration fl_configuration; bool debug; unsigned int thread_count; #ifndef WINDOWS bool foreground; fs::path pid_file; #endif };
static void task_init() { int i; if (threads) return; strm_event_loop_started = TRUE; strm_init_io_loop(); pthread_mutex_init(&pipeline_mutex, NULL); pthread_cond_init(&pipeline_cond, NULL); thread_max = thread_count(); threads = malloc(sizeof(struct strm_thread)*thread_max); for (i=0; i<thread_max; i++) { threads[i].queue = strm_queue_alloc(); pthread_create(&threads[i].th, NULL, task_loop, &threads[i]); } }
void core_target_open (const char *arg, int from_tty) { const char *p; int siggy; int scratch_chan; int flags; target_preopen (from_tty); if (!arg) { if (core_bfd) error (_("No core file specified. (Use `detach' " "to stop debugging a core file.)")); else error (_("No core file specified.")); } gdb::unique_xmalloc_ptr<char> filename (tilde_expand (arg)); if (!IS_ABSOLUTE_PATH (filename.get ())) filename.reset (concat (current_directory, "/", filename.get (), (char *) NULL)); flags = O_BINARY | O_LARGEFILE; if (write_files) flags |= O_RDWR; else flags |= O_RDONLY; scratch_chan = gdb_open_cloexec (filename.get (), flags, 0); if (scratch_chan < 0) perror_with_name (filename.get ()); gdb_bfd_ref_ptr temp_bfd (gdb_bfd_fopen (filename.get (), gnutarget, write_files ? FOPEN_RUB : FOPEN_RB, scratch_chan)); if (temp_bfd == NULL) perror_with_name (filename.get ()); if (!bfd_check_format (temp_bfd.get (), bfd_core) && !gdb_check_format (temp_bfd.get ())) { /* Do it after the err msg */ /* FIXME: should be checking for errors from bfd_close (for one thing, on error it does not free all the storage associated with the bfd). */ error (_("\"%s\" is not a core dump: %s"), filename.get (), bfd_errmsg (bfd_get_error ())); } current_program_space->cbfd = std::move (temp_bfd); core_target *target = new core_target (); /* Own the target until it is successfully pushed. */ target_ops_up target_holder (target); validate_files (); /* If we have no exec file, try to set the architecture from the core file. We don't do this unconditionally since an exec file typically contains more information that helps us determine the architecture than a core file. */ if (!exec_bfd) set_gdbarch_from_file (core_bfd); push_target (std::move (target_holder)); inferior_ptid = null_ptid; /* Need to flush the register cache (and the frame cache) from a previous debug session. If inferior_ptid ends up the same as the last debug session --- e.g., b foo; run; gcore core1; step; gcore core2; core core1; core core2 --- then there's potential for get_current_regcache to return the cached regcache of the previous session, and the frame cache being stale. */ registers_changed (); /* Build up thread list from BFD sections, and possibly set the current thread to the .reg/NN section matching the .reg section. */ bfd_map_over_sections (core_bfd, add_to_thread_list, bfd_get_section_by_name (core_bfd, ".reg")); if (inferior_ptid == null_ptid) { /* Either we found no .reg/NN section, and hence we have a non-threaded core (single-threaded, from gdb's perspective), or for some reason add_to_thread_list couldn't determine which was the "main" thread. The latter case shouldn't usually happen, but we're dealing with input here, which can always be broken in different ways. */ thread_info *thread = first_thread_of_inferior (current_inferior ()); if (thread == NULL) { inferior_appeared (current_inferior (), CORELOW_PID); inferior_ptid = ptid_t (CORELOW_PID); add_thread_silent (inferior_ptid); } else switch_to_thread (thread); } post_create_inferior (target, from_tty); /* Now go through the target stack looking for threads since there may be a thread_stratum target loaded on top of target core by now. The layer above should claim threads found in the BFD sections. */ try { target_update_thread_list (); } catch (const gdb_exception_error &except) { exception_print (gdb_stderr, except); } p = bfd_core_file_failing_command (core_bfd); if (p) printf_filtered (_("Core was generated by `%s'.\n"), p); /* Clearing any previous state of convenience variables. */ clear_exit_convenience_vars (); siggy = bfd_core_file_failing_signal (core_bfd); if (siggy > 0) { gdbarch *core_gdbarch = target->core_gdbarch (); /* If we don't have a CORE_GDBARCH to work with, assume a native core (map gdb_signal from host signals). If we do have CORE_GDBARCH to work with, but no gdb_signal_from_target implementation for that gdbarch, as a fallback measure, assume the host signal mapping. It'll be correct for native cores, but most likely incorrect for cross-cores. */ enum gdb_signal sig = (core_gdbarch != NULL && gdbarch_gdb_signal_from_target_p (core_gdbarch) ? gdbarch_gdb_signal_from_target (core_gdbarch, siggy) : gdb_signal_from_host (siggy)); printf_filtered (_("Program terminated with signal %s, %s.\n"), gdb_signal_to_name (sig), gdb_signal_to_string (sig)); /* Set the value of the internal variable $_exitsignal, which holds the signal uncaught by the inferior. */ set_internalvar_integer (lookup_internalvar ("_exitsignal"), siggy); } /* Fetch all registers from core file. */ target_fetch_registers (get_current_regcache (), -1); /* Now, set up the frame cache, and print the top of stack. */ reinit_frame_cache (); print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC, 1); /* Current thread should be NUM 1 but the user does not know that. If a program is single threaded gdb in general does not mention anything about threads. That is why the test is >= 2. */ if (thread_count () >= 2) { try { thread_command (NULL, from_tty); } catch (const gdb_exception_error &except) { exception_print (gdb_stderr, except); } } }