From eadeb9f2a13577d6cd532b2a1bd306710136322a Mon Sep 17 00:00:00 2001 From: Jan200101 Date: Sun, 11 Sep 2022 23:14:54 +0200 Subject: move over to official cmake packages, fix data race in qt frontend --- cmake/FindJsonC.cmake | 63 ------------------------------------------- src/CMakeLists.txt | 7 +++-- src/mirror/main.c | 5 ---- src/net.c | 2 +- src/net.h | 2 +- src/qt/mainwindow.cpp | 2 ++ src/qt/workers.cpp | 75 +++++++++++++++++++-------------------------------- src/qt/workers.hpp | 1 + src/toast.c | 6 ++--- 9 files changed, 38 insertions(+), 125 deletions(-) delete mode 100644 cmake/FindJsonC.cmake diff --git a/cmake/FindJsonC.cmake b/cmake/FindJsonC.cmake deleted file mode 100644 index 1d4386b..0000000 --- a/cmake/FindJsonC.cmake +++ /dev/null @@ -1,63 +0,0 @@ -# -# JSONC_INCLUDE_DIRS -# JSONC_LIBRARIES -# JSONC_CFLAGS - -find_package(PkgConfig QUIET) -if (PKG_CONFIG_FOUND) - pkg_check_modules(_JSONC json-c) - - if (BUILD_STATIC AND NOT _JSONC_FOUND) - message(FATAL_ERROR "Cannot find static build information") - endif() -endif() - -if (_JSONC_FOUND) # we can rely on pkg-config - if (NOT BUILD_STATIC) - set(JSONC_LIBRARIES ${_JSONC_LIBRARIES}) - set(JSONC_INCLUDE_DIRS ${_JSONC_INCLUDE_DIRS}) - set(JSONC_CFLAGS ${_JSONC_CFLAGS_OTHER}) - else() - set(JSONC_LIBRARIES ${_JSONC_STATIC_LIBRARIES}) - set(JSONC_INCLUDE_DIRS ${_JSONC_STATIC_INCLUDE_DIRS}) - set(JSONC_CFLAGS ${_JSONC_STATIC_CFLAGS_OTHER}) - endif() -else() - if(CMAKE_SIZEOF_VOID_P EQUAL 8) - set(_lib_suffix 64) - else() - set(_lib_suffix 32) - endif() - - find_path(JSONC_INC - NAMES json.h - HINTS - ENV jsoncPath${_lib_suffix} - ENV jsoncPath - ${_JSONC_INCLUDE_DIRS} - PATHS - /usr/include/json-c /usr/local/include/json-c) - - find_library(JSONC_LIB - NAMES ${_JSONC_LIBRARIES} jsonc json-c - HINTS - ENV jsoncPath${_lib_suffix} - ENV jsoncPath - ${_JSONC_LIBRARY_DIRS} - ${_JSONC_STATIC_LIBRARY_DIRS} - PATHS - /usr/lib{_lib_suffix} /usr/local/lib{_lib_suffix} - /usr/lib /usr/local/lib) - - include(FindPackageHandleStandardArgs) - find_package_handle_standard_args(JsonC DEFAULT_MSG JSONC_LIB JSONC_INC) - mark_as_advanced(JSONC_INC JSONC_LIB) - - if(JSONC_FOUND) - set(JSONC_INCLUDE_DIRS ${JSONC_INC}) - set(JSONC_LIBRARIES ${JSONC_LIB}) - if (BUILD_STATIC) - set(JSONC_LIBRARIES ${JSONC_LIBRARIES} ${_JSONC_STATIC_LIBRARIES}) - endif() - endif() -endif() \ No newline at end of file diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index d993dba..0fdcce5 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,6 +1,6 @@ +find_package(json-c REQUIRED) find_package(Libcurl REQUIRED) -find_package(JsonC REQUIRED) add_subdirectory(hash) add_subdirectory(vdf) add_subdirectory(threading) @@ -14,7 +14,6 @@ set(CFLAGS -Wmissing-declarations -Wmissing-include-dirs -Wno-unused-parameter -Wuninitialized ${LIBCURL_CFLAGS} - ${JSONC_CFLAGS} ) list(APPEND @@ -33,12 +32,12 @@ add_library(tvn STATIC ${CORE_SOURCES}) target_compile_options(tvn PUBLIC ${CFLAGS}) target_include_directories(tvn PUBLIC ${LIBCURL_INCLUDE_DIRS}) -target_include_directories(tvn PUBLIC ${JSONC_INCLUDE_DIRS}) target_include_directories(tvn PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) target_link_libraries(tvn LINK_PUBLIC ${LIBCURL_LIBRARIES}) -target_link_libraries(tvn LINK_PUBLIC ${JSONC_LIBRARIES}) +target_link_libraries(tvn LINK_PUBLIC json-c::json-c) target_link_libraries(tvn LINK_PUBLIC md5) target_link_libraries(tvn LINK_PUBLIC vdf) + if (WIN32) target_link_libraries(tvn LINK_PUBLIC shlwapi) endif() diff --git a/src/mirror/main.c b/src/mirror/main.c index 51ce98a..89a085d 100644 --- a/src/mirror/main.c +++ b/src/mirror/main.c @@ -152,14 +152,9 @@ int main(int argc, char** argv) free(thread_info); } - char* buf = malloc(rev_len+1); - sprintf(buf, "%i", latest_rev); sprintf(revisions_dir_end, "%slatest", OS_PATH_SEP); - setLocalRevision(output_dir, latest_rev); symlink(".." OS_PATH_SEP TOAST_LOCAL_REVISION_PATH, revisions_dir); - - free(buf); free(revisions_dir); cleanup: diff --git a/src/net.c b/src/net.c index 03b3990..ef661e2 100644 --- a/src/net.c +++ b/src/net.c @@ -4,7 +4,7 @@ #include #include #include -#include +#include #include "net.h" #include "fs.h" diff --git a/src/net.h b/src/net.h index 098a8d7..5ad71f8 100644 --- a/src/net.h +++ b/src/net.h @@ -6,7 +6,7 @@ extern "C" { #endif #include -#include +#include struct MemoryStruct { uint8_t* memory; diff --git a/src/qt/mainwindow.cpp b/src/qt/mainwindow.cpp index 12ddf3e..49cc09f 100644 --- a/src/qt/mainwindow.cpp +++ b/src/qt/mainwindow.cpp @@ -91,9 +91,11 @@ void MainWindow::workerResult(const enum Worker::Results_t& result) break; case Worker::RESULT_UPDATE_TEXT: + pthread_mutex_lock(&worker->textMutex); ui->progressBar->setValue(worker->progress); ui->infoLabel->setText(worker->infoText); worker->infoText.clear(); + pthread_mutex_unlock(&worker->textMutex); break; case Worker::RESULT_IS_INSTALLED: diff --git a/src/qt/workers.cpp b/src/qt/workers.cpp index 1642813..b0e18e8 100644 --- a/src/qt/workers.cpp +++ b/src/qt/workers.cpp @@ -47,15 +47,11 @@ static void* thread_download(void* pinfo) QString* threadString = &info->infoText; if (!threadString->isEmpty() && *do_work) { - pthread_mutex_lock(&worker->textMutex); - // allow the main thread to clear the string before we continue - while (!worker->infoText.isEmpty() && *do_work) {}; + int progress = (int)(((info->index * 100) + 1) / rev->file_count); + if (progress > worker->progress) + worker->progress = progress; - worker->progress = (int)(((info->index * 100) + 1) / rev->file_count); - - worker->infoText = *threadString; - emit worker->resultReady(Worker::RESULT_UPDATE_TEXT); - pthread_mutex_unlock(&worker->textMutex); + worker->setInfoText(*threadString); } } return NULL; @@ -104,6 +100,14 @@ QString Worker::getArguments() return settings.value("launchArguments", QString()).toString(); } +void Worker::setInfoText(QString infoTextArg) +{ + pthread_mutex_lock(&this->textMutex); + this->infoText = infoTextArg; + emit this->resultReady(Worker::RESULT_UPDATE_TEXT); + pthread_mutex_unlock(&this->textMutex); +} + void Worker::setArguments(QString argumentstr) { settings.setValue("launchArguments", argumentstr); @@ -141,7 +145,7 @@ int Worker::update_setup(int local_rev, int remote_rev) if (rev) { - for (size_t i = 0; i < rev->file_count; ++i) + for (size_t i = 0; i < rev->file_count && do_work; ++i) { struct file_info* file = &rev->files[i]; @@ -160,7 +164,7 @@ int Worker::update_setup(int local_rev, int remote_rev) struct pool_t* pool = pool_init(); pool->condition = &do_work; - for (size_t i = 0; i < rev->file_count; ++i) + for (size_t i = 0; i < rev->file_count && do_work; ++i) { struct thread_object_info* info = &thread_info[i]; @@ -178,24 +182,7 @@ int Worker::update_setup(int local_rev, int remote_rev) delete[] thread_info; progress = 0; - infoText = QString("Processing"); - emit resultReady(RESULT_UPDATE_TEXT); - - for (size_t i = 0; i < rev->file_count && do_work; ++i) - { - struct file_info* file = &rev->files[i]; - if (file->type != TYPE_MKDIR) - continue; - - progress = (int)(((i * 100) + 1) / rev->file_count); - emit resultReady(RESULT_UPDATE_TEXT); - - size_t len = strlen(of_dir) + strlen(OS_PATH_SEP) + strlen(file->path) + 1; - char* buf = (char*)malloc(len); - snprintf(buf, len, "%s%s%s", of_dir, OS_PATH_SEP, file->path); - makeDir(buf); - free(buf); - } + this->setInfoText("Processing"); for (size_t i = 0; i < rev->file_count && do_work; ++i) { @@ -203,13 +190,14 @@ int Worker::update_setup(int local_rev, int remote_rev) if (file->type != TYPE_DELETE) continue; size_t len = strlen(of_dir) + strlen(OS_PATH_SEP) + strlen(file->path) + 1; - char* buf = (char*)malloc(len); + char* buf = new char[len]; snprintf(buf, len, "%s%s%s", of_dir, OS_PATH_SEP, file->path); - if (isFile(buf) && remove(buf)) + if (isFile(buf)) { - printf("\nFailed to delete %s\n", file->path); + remove(buf); } - free(buf); + delete[] buf; + } for (size_t i = 0; i < rev->file_count && do_work; ++i) @@ -218,24 +206,18 @@ int Worker::update_setup(int local_rev, int remote_rev) if (file->type != TYPE_MKDIR) continue; size_t len = strlen(of_dir) + strlen(OS_PATH_SEP) + strlen(file->path) + 1; - char* buf = (char*)malloc(len); - if (!isDir(buf) && makeDir(buf)) - { - printf("\nFailed to create %s\n", file->path); - } - free(buf); + char* buf = new char[len]; + snprintf(buf, len, "%s%s%s", of_dir, OS_PATH_SEP, file->path); + makeDir(buf); + delete[] buf; } - for (size_t i = 0; i < rev->file_count; ++i) + for (size_t i = 0; i < rev->file_count && do_work; ++i) { struct file_info* file = &rev->files[i]; if (file->type != TYPE_WRITE) continue; - fprintf(stderr, "\rInstalling %zu/%zu (%s)", i+1, rev->file_count, file->object); - if (applyObject(of_dir, file)) - { - printf("\nFailed to write %s\n", file->path); - } + applyObject(of_dir, file); } if (do_work) @@ -245,13 +227,10 @@ int Worker::update_setup(int local_rev, int remote_rev) setLocalRevision(of_dir, remote_rev); } - progress = 0; - infoText = QString(""); - emit resultReady(RESULT_UPDATE_TEXT); - freeRevision(rev); } + this->setInfoText(""); update_in_progress = false; return retval; diff --git a/src/qt/workers.hpp b/src/qt/workers.hpp index 19d83f5..dbc2c7e 100644 --- a/src/qt/workers.hpp +++ b/src/qt/workers.hpp @@ -39,6 +39,7 @@ public: void setRemote(QString); QString getArguments(); void setArguments(QString); + void setInfoText(QString); int getRevision(); int getRemoteRevision(); diff --git a/src/toast.c b/src/toast.c index 0d3ac3a..9d184e5 100644 --- a/src/toast.c +++ b/src/toast.c @@ -3,7 +3,7 @@ #include #include #include -#include +#include #include #if defined(_WIN32) @@ -17,8 +17,8 @@ #include "net.h" #include "toast.h" -#ifdef TOAST_DEFAULT_REMOTE -#define TOAST_DEFAULT_REMOTE "http://toast.openfortress.fun/toast" +#ifndef TOAST_DEFAULT_REMOTE +#define TOAST_DEFAULT_REMOTE "https://toast.openfortress.fun/toast" #endif const char* TYPE_STRINGS[] = { -- cgit v1.2.3