| From 127b82d81ff41cc4ab26695f6c42af2d7443909f Mon Sep 17 00:00:00 2001 |
| From: Shlomi Fish <shlomif@shlomifish.org> |
| Date: Wed, 15 Apr 2020 20:23:52 +0300 |
| Subject: [PATCH 8/9] Subject: [PATCH 8/9] Fix multiple global symbols |
| definitions. |
| |
| See the use of extern here: |
| |
| * https://www.geeksforgeeks.org/understanding-extern-keyword-in-c/ |
| |
| * https://en.wikipedia.org/wiki/External_variable |
| |
| * |
| https://stackoverflow.com/questions/496448/how-to-correctly-use-the-extern-keyword-in-c |
| --- |
| src/ignore.c | 2 ++ |
| src/ignore.h | 2 +- |
| src/log.c | 1 + |
| src/log.h | 2 +- |
| src/options.c | 2 ++ |
| src/options.h | 2 +- |
| src/search.c | 13 +++++++++++++ |
| src/search.h | 20 ++++++++++---------- |
| src/util.c | 2 ++ |
| src/util.h | 4 ++-- |
| 10 files changed, 35 insertions(+), 15 deletions(-) |
| |
| diff --git a/src/ignore.c b/src/ignore.c |
| index fa41889..32464d7 100644 |
| --- a/src/ignore.c |
| +++ b/src/ignore.c |
| @@ -20,6 +20,8 @@ |
| const int fnmatch_flags = FNM_PATHNAME; |
| #endif |
| |
| +ignores *root_ignores; |
| + |
| /* TODO: build a huge-ass list of files we want to ignore by default (build cache stuff, pyc files, etc) */ |
| |
| const char *evil_hardcoded_ignore_files[] = { |
| diff --git a/src/ignore.h b/src/ignore.h |
| index 20d5a6a..8db0f37 100644 |
| --- a/src/ignore.h |
| +++ b/src/ignore.h |
| @@ -29,7 +29,7 @@ struct ignores { |
| }; |
| typedef struct ignores ignores; |
| |
| -ignores *root_ignores; |
| +extern ignores *root_ignores; |
| |
| extern const char *evil_hardcoded_ignore_files[]; |
| extern const char *ignore_pattern_files[]; |
| diff --git a/src/log.c b/src/log.c |
| index 1481b6d..f6f4e9a 100644 |
| --- a/src/log.c |
| +++ b/src/log.c |
| @@ -4,6 +4,7 @@ |
| #include "log.h" |
| #include "util.h" |
| |
| +pthread_mutex_t print_mtx = PTHREAD_MUTEX_INITIALIZER; |
| static enum log_level log_threshold = LOG_LEVEL_ERR; |
| |
| void set_log_level(enum log_level threshold) { |
| diff --git a/src/log.h b/src/log.h |
| index 85847ee..318622c 100644 |
| --- a/src/log.h |
| +++ b/src/log.h |
| @@ -9,7 +9,7 @@ |
| #include <pthread.h> |
| #endif |
| |
| -pthread_mutex_t print_mtx; |
| +extern pthread_mutex_t print_mtx; |
| |
| enum log_level { |
| LOG_LEVEL_DEBUG = 10, |
| diff --git a/src/options.c b/src/options.c |
| index a469845..0ff5526 100644 |
| --- a/src/options.c |
| +++ b/src/options.c |
| @@ -21,6 +21,8 @@ const char *color_line_number = "\033[1;33m"; /* bold yellow */ |
| const char *color_match = "\033[30;43m"; /* black with yellow background */ |
| const char *color_path = "\033[1;32m"; /* bold green */ |
| |
| +cli_options opts; |
| + |
| /* TODO: try to obey out_fd? */ |
| void usage(void) { |
| printf("\n"); |
| diff --git a/src/options.h b/src/options.h |
| index 990ce6a..09cd058 100644 |
| --- a/src/options.h |
| +++ b/src/options.h |
| @@ -101,7 +101,7 @@ typedef struct { |
| } cli_options; |
| |
| /* global options. parse_options gives it sane values, everything else reads from it */ |
| -cli_options opts; |
| +extern cli_options opts; |
| |
| typedef struct option option_t; |
| |
| diff --git a/src/search.c b/src/search.c |
| index ff5e386..8539bac 100644 |
| --- a/src/search.c |
| +++ b/src/search.c |
| @@ -2,6 +2,19 @@ |
| #include "print.h" |
| #include "scandir.h" |
| |
| +size_t alpha_skip_lookup[256]; |
| +size_t *find_skip_lookup; |
| +uint8_t h_table[H_SIZE] __attribute__((aligned(64))); |
| + |
| +work_queue_t *work_queue = NULL; |
| +work_queue_t *work_queue_tail = NULL; |
| +int done_adding_files = 0; |
| +pthread_cond_t files_ready = PTHREAD_COND_INITIALIZER; |
| +pthread_mutex_t stats_mtx = PTHREAD_MUTEX_INITIALIZER; |
| +pthread_mutex_t work_queue_mtx = PTHREAD_MUTEX_INITIALIZER; |
| + |
| +symdir_t *symhash = NULL; |
| + |
| void search_buf(const char *buf, const size_t buf_len, |
| const char *dir_full_path) { |
| int binary = -1; /* 1 = yes, 0 = no, -1 = don't know */ |
| diff --git a/src/search.h b/src/search.h |
| index 1071114..a1bc5d7 100644 |
| --- a/src/search.h |
| +++ b/src/search.h |
| @@ -31,9 +31,9 @@ |
| #include "uthash.h" |
| #include "util.h" |
| |
| -size_t alpha_skip_lookup[256]; |
| -size_t *find_skip_lookup; |
| -uint8_t h_table[H_SIZE] __attribute__((aligned(64))); |
| +extern size_t alpha_skip_lookup[256]; |
| +extern size_t *find_skip_lookup; |
| +extern uint8_t h_table[H_SIZE] __attribute__((aligned(64))); |
| |
| struct work_queue_t { |
| char *path; |
| @@ -41,12 +41,12 @@ struct work_queue_t { |
| }; |
| typedef struct work_queue_t work_queue_t; |
| |
| -work_queue_t *work_queue; |
| -work_queue_t *work_queue_tail; |
| -int done_adding_files; |
| -pthread_cond_t files_ready; |
| -pthread_mutex_t stats_mtx; |
| -pthread_mutex_t work_queue_mtx; |
| +extern work_queue_t *work_queue; |
| +extern work_queue_t *work_queue_tail; |
| +extern int done_adding_files; |
| +extern pthread_cond_t files_ready; |
| +extern pthread_mutex_t stats_mtx; |
| +extern pthread_mutex_t work_queue_mtx; |
| |
| |
| /* For symlink loop detection */ |
| @@ -64,7 +64,7 @@ typedef struct { |
| UT_hash_handle hh; |
| } symdir_t; |
| |
| -symdir_t *symhash; |
| +extern symdir_t *symhash; |
| |
| void search_buf(const char *buf, const size_t buf_len, |
| const char *dir_full_path); |
| diff --git a/src/util.c b/src/util.c |
| index cb23914..0431148 100644 |
| --- a/src/util.c |
| +++ b/src/util.c |
| @@ -21,6 +21,8 @@ |
| } \ |
| return ptr; |
| |
| +FILE *out_fd = NULL; |
| +ag_stats stats; |
| void *ag_malloc(size_t size) { |
| void *ptr = malloc(size); |
| CHECK_AND_RETURN(ptr) |
| diff --git a/src/util.h b/src/util.h |
| index 0c9b9b1..338b05f 100644 |
| --- a/src/util.h |
| +++ b/src/util.h |
| @@ -12,7 +12,7 @@ |
| #include "log.h" |
| #include "options.h" |
| |
| -FILE *out_fd; |
| +extern FILE *out_fd; |
| |
| #ifndef TRUE |
| #define TRUE 1 |
| @@ -51,7 +51,7 @@ typedef struct { |
| } ag_stats; |
| |
| |
| -ag_stats stats; |
| +extern ag_stats stats; |
| |
| /* Union to translate between chars and words without violating strict aliasing */ |
| typedef union { |
| -- |
| 2.27.0 |
| |