mirror of
https://github.com/simon987/sist2.git
synced 2025-04-19 18:26:43 +00:00
add signal handler w/ debug info
This commit is contained in:
parent
523c123e2e
commit
22dd58e140
6
scripts/reset.sh
Executable file
6
scripts/reset.sh
Executable file
@ -0,0 +1,6 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
make clean
|
||||||
|
rm -rf CMakeFiles/ CMakeCache.txt Makefile \
|
||||||
|
third-party/libscan/CMakeFiles third-party/libscan/CMakeCache.txt third-party/libscan/third-party/ext_ffmpeg \
|
||||||
|
third-party/libscan/third-party/ext_libmobi third-party/libscan/Makefile
|
@ -4,6 +4,7 @@
|
|||||||
store_t *store_create(char *path, size_t chunk_size) {
|
store_t *store_create(char *path, size_t chunk_size) {
|
||||||
|
|
||||||
store_t *store = malloc(sizeof(struct store_t));
|
store_t *store = malloc(sizeof(struct store_t));
|
||||||
|
#if (SIST_FAKE_STORE != 1)
|
||||||
store->chunk_size = chunk_size;
|
store->chunk_size = chunk_size;
|
||||||
pthread_rwlock_init(&store->lock, NULL);
|
pthread_rwlock_init(&store->lock, NULL);
|
||||||
|
|
||||||
@ -28,15 +29,18 @@ store_t *store_create(char *path, size_t chunk_size) {
|
|||||||
mdb_txn_begin(store->env, NULL, 0, &txn);
|
mdb_txn_begin(store->env, NULL, 0, &txn);
|
||||||
mdb_dbi_open(txn, NULL, 0, &store->dbi);
|
mdb_dbi_open(txn, NULL, 0, &store->dbi);
|
||||||
mdb_txn_commit(txn);
|
mdb_txn_commit(txn);
|
||||||
|
#endif
|
||||||
|
|
||||||
return store;
|
return store;
|
||||||
}
|
}
|
||||||
|
|
||||||
void store_destroy(store_t *store) {
|
void store_destroy(store_t *store) {
|
||||||
|
|
||||||
|
#if (SIST_FAKE_STORE != 1)
|
||||||
pthread_rwlock_destroy(&store->lock);
|
pthread_rwlock_destroy(&store->lock);
|
||||||
mdb_close(store->env, store->dbi);
|
mdb_close(store->env, store->dbi);
|
||||||
mdb_env_close(store->env);
|
mdb_env_close(store->env);
|
||||||
|
#endif
|
||||||
free(store);
|
free(store);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -56,6 +60,8 @@ void store_write(store_t *store, char *key, size_t key_len, char *buf, size_t bu
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if (SIST_FAKE_STORE != 1)
|
||||||
|
|
||||||
MDB_val mdb_key;
|
MDB_val mdb_key;
|
||||||
mdb_key.mv_data = key;
|
mdb_key.mv_data = key;
|
||||||
mdb_key.mv_size = key_len;
|
mdb_key.mv_size = key_len;
|
||||||
@ -92,10 +98,13 @@ void store_write(store_t *store, char *key, size_t key_len, char *buf, size_t bu
|
|||||||
if (put_ret != 0) {
|
if (put_ret != 0) {
|
||||||
LOG_ERROR("store.c", mdb_strerror(put_ret))
|
LOG_ERROR("store.c", mdb_strerror(put_ret))
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
char *store_read(store_t *store, char *key, size_t key_len, size_t *ret_vallen) {
|
char *store_read(store_t *store, char *key, size_t key_len, size_t *ret_vallen) {
|
||||||
char *buf = NULL;
|
char *buf = NULL;
|
||||||
|
|
||||||
|
#if (SIST_FAKE_STORE != 1)
|
||||||
MDB_val mdb_key;
|
MDB_val mdb_key;
|
||||||
mdb_key.mv_data = key;
|
mdb_key.mv_data = key;
|
||||||
mdb_key.mv_size = key_len;
|
mdb_key.mv_size = key_len;
|
||||||
@ -116,6 +125,7 @@ char *store_read(store_t *store, char *key, size_t key_len, size_t *ret_vallen)
|
|||||||
}
|
}
|
||||||
|
|
||||||
mdb_txn_abort(txn);
|
mdb_txn_abort(txn);
|
||||||
|
#endif
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
68
src/main.c
68
src/main.c
@ -30,6 +30,69 @@ static const char *const usage[] = {
|
|||||||
NULL,
|
NULL,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#include<signal.h>
|
||||||
|
#include<unistd.h>
|
||||||
|
|
||||||
|
static __sighandler_t sigsegv_handler = NULL;
|
||||||
|
static __sighandler_t sigabrt_handler = NULL;
|
||||||
|
|
||||||
|
void sig_handler(int signum) {
|
||||||
|
|
||||||
|
LogCtx.verbose = 1;
|
||||||
|
LogCtx.very_verbose = 1;
|
||||||
|
|
||||||
|
LOG_ERROR("*SIGNAL HANDLER*", "=============================================\n\n");
|
||||||
|
LOG_ERRORF("*SIGNAL HANDLER*", "Uh oh! Caught fatal signal: %s", strsignal(signum));
|
||||||
|
|
||||||
|
GHashTableIter iter;
|
||||||
|
g_hash_table_iter_init(&iter, ScanCtx.dbg_current_files);
|
||||||
|
|
||||||
|
void *key;
|
||||||
|
void *value;
|
||||||
|
while (g_hash_table_iter_next(&iter, &key, &value)) {
|
||||||
|
parse_job_t *job = value;
|
||||||
|
|
||||||
|
if (isatty(STDERR_FILENO)) {
|
||||||
|
LOG_DEBUGF(
|
||||||
|
"*SIGNAL HANDLER*",
|
||||||
|
"Thread \033[%dm[%04llX]\033[0m was working on job '%s'",
|
||||||
|
31 + ((unsigned int) key) % 7, key, job->filepath
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
LOG_DEBUGF(
|
||||||
|
"*SIGNAL HANDLER*",
|
||||||
|
"THREAD [%04llX] was working on job %s",
|
||||||
|
key, job->filepath
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tpool_dump_debug_info(ScanCtx.pool);
|
||||||
|
|
||||||
|
LOG_INFO(
|
||||||
|
"*SIGNAL HANDLER*",
|
||||||
|
"Please consider creating a bug report at https://github.com/simon987/sist2/issues !"
|
||||||
|
)
|
||||||
|
LOG_INFO(
|
||||||
|
"*SIGNAL HANDLER*",
|
||||||
|
"sist2 is an open source project and relies on the collaboration of its users to diagnose and fix bugs"
|
||||||
|
)
|
||||||
|
|
||||||
|
#ifndef SIST_DEBUG
|
||||||
|
LOG_WARNING(
|
||||||
|
"*SIGNAL HANDLER*",
|
||||||
|
"You are running sist2 in release mode! Please consider downloading the debug binary from the Github "
|
||||||
|
"releases page to provide additionnal information when submitting a bug report."
|
||||||
|
)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (signum == SIGSEGV && sigsegv_handler != NULL) {
|
||||||
|
sigsegv_handler(signum);
|
||||||
|
} else if (signum == SIGABRT && sigabrt_handler != NULL) {
|
||||||
|
sigabrt_handler(signum);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void init_dir(const char *dirpath) {
|
void init_dir(const char *dirpath) {
|
||||||
char path[PATH_MAX];
|
char path[PATH_MAX];
|
||||||
snprintf(path, PATH_MAX, "%sdescriptor.json", dirpath);
|
snprintf(path, PATH_MAX, "%sdescriptor.json", dirpath);
|
||||||
@ -105,6 +168,8 @@ void initialize_scan_context(scan_args_t *args) {
|
|||||||
ScanCtx.arc_ctx.passphrase[0] = 0;
|
ScanCtx.arc_ctx.passphrase[0] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ScanCtx.dbg_current_files = g_hash_table_new(g_int64_hash, g_int64_equal);
|
||||||
|
|
||||||
// Comic
|
// Comic
|
||||||
ScanCtx.comic_ctx.log = _log;
|
ScanCtx.comic_ctx.log = _log;
|
||||||
ScanCtx.comic_ctx.logf = _logf;
|
ScanCtx.comic_ctx.logf = _logf;
|
||||||
@ -405,6 +470,9 @@ void sist2_web(web_args_t *args) {
|
|||||||
|
|
||||||
|
|
||||||
int main(int argc, const char *argv[]) {
|
int main(int argc, const char *argv[]) {
|
||||||
|
sigsegv_handler = signal(SIGSEGV, sig_handler);
|
||||||
|
sigabrt_handler = signal(SIGABRT, sig_handler);
|
||||||
|
|
||||||
setlocale(LC_ALL, "");
|
setlocale(LC_ALL, "");
|
||||||
|
|
||||||
scan_args_t *scan_args = scan_args_create();
|
scan_args_t *scan_args = scan_args_create();
|
||||||
|
@ -41,11 +41,18 @@ void fs_reset(struct vfile *f) {
|
|||||||
|
|
||||||
#define IS_GIT_OBJ (strlen(doc.filepath + doc.base) == 38 && (strstr(doc.filepath, "objects") != NULL))
|
#define IS_GIT_OBJ (strlen(doc.filepath + doc.base) == 38 && (strstr(doc.filepath, "objects") != NULL))
|
||||||
|
|
||||||
|
void set_dbg_current_file(parse_job_t *job) {
|
||||||
|
unsigned long long pid = (unsigned long long) pthread_self();
|
||||||
|
g_hash_table_replace(ScanCtx.dbg_current_files, GINT_TO_POINTER(pid), job);
|
||||||
|
}
|
||||||
|
|
||||||
void parse(void *arg) {
|
void parse(void *arg) {
|
||||||
|
|
||||||
parse_job_t *job = arg;
|
parse_job_t *job = arg;
|
||||||
document_t doc;
|
document_t doc;
|
||||||
|
|
||||||
|
set_dbg_current_file(job);
|
||||||
|
|
||||||
doc.filepath = job->filepath;
|
doc.filepath = job->filepath;
|
||||||
doc.ext = (short) job->ext;
|
doc.ext = (short) job->ext;
|
||||||
doc.base = (short) job->base;
|
doc.base = (short) job->base;
|
||||||
|
10
src/tpool.c
10
src/tpool.c
@ -52,6 +52,13 @@ static tpool_work_t *tpool_work_create(thread_func_t func, void *arg) {
|
|||||||
return work;
|
return work;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void tpool_dump_debug_info(tpool_t *pool) {
|
||||||
|
LOG_DEBUGF("tpool.c", "pool->thread_cnt = %d", pool->thread_cnt)
|
||||||
|
LOG_DEBUGF("tpool.c", "pool->work_cnt = %d", pool->work_cnt)
|
||||||
|
LOG_DEBUGF("tpool.c", "pool->done_cnt = %d", pool->done_cnt)
|
||||||
|
LOG_DEBUGF("tpool.c", "pool->stop = %d", pool->stop)
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Pop work object from thread pool
|
* Pop work object from thread pool
|
||||||
*/
|
*/
|
||||||
@ -83,7 +90,7 @@ int tpool_add_work(tpool_t *pool, thread_func_t func, void *arg) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
while ((pool->work_cnt - pool->done_cnt) >= MAX_QUEUE_SIZE) {
|
while ((pool->work_cnt - pool->done_cnt) >= MAX_QUEUE_SIZE) {
|
||||||
usleep(100000);
|
usleep(10000);
|
||||||
}
|
}
|
||||||
|
|
||||||
pthread_mutex_lock(&(pool->work_mutex));
|
pthread_mutex_lock(&(pool->work_mutex));
|
||||||
@ -150,6 +157,7 @@ static void *tpool_worker(void *arg) {
|
|||||||
if (pool->cleanup_func != NULL) {
|
if (pool->cleanup_func != NULL) {
|
||||||
LOG_INFO("tpool.c", "Executing cleanup function")
|
LOG_INFO("tpool.c", "Executing cleanup function")
|
||||||
pool->cleanup_func();
|
pool->cleanup_func();
|
||||||
|
LOG_DEBUG("tpool.c", "Done executing cleanup function")
|
||||||
}
|
}
|
||||||
|
|
||||||
pthread_cond_signal(&(pool->working_cond));
|
pthread_cond_signal(&(pool->working_cond));
|
||||||
|
@ -10,10 +10,12 @@ typedef void (*thread_func_t)(void *arg);
|
|||||||
|
|
||||||
tpool_t *tpool_create(size_t num, void (*cleanup_func)(), int free_arg);
|
tpool_t *tpool_create(size_t num, void (*cleanup_func)(), int free_arg);
|
||||||
void tpool_start(tpool_t *pool);
|
void tpool_start(tpool_t *pool);
|
||||||
void tpool_destroy(tpool_t *tm);
|
void tpool_destroy(tpool_t *pool);
|
||||||
|
|
||||||
int tpool_add_work(tpool_t *pool, thread_func_t func, void *arg);
|
int tpool_add_work(tpool_t *pool, thread_func_t func, void *arg);
|
||||||
void tpool_wait(tpool_t *tm);
|
void tpool_wait(tpool_t *pool);
|
||||||
|
|
||||||
|
void tpool_dump_debug_info(tpool_t *pool);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
File diff suppressed because one or more lines are too long
Loading…
x
Reference in New Issue
Block a user