From 1a7dfd86cb51ea6bf0f00e1ef740a4c8c1879df4 Mon Sep 17 00:00:00 2001 From: henrypp Date: Mon, 15 Mar 2021 19:13:43 +0600 Subject: [PATCH] add lock profile r/w --- src/global.h | 1 + src/profile.c | 93 +++++++++++++++++---------------------------------- src/profile.h | 70 +++++++++++++++++++++++++++++++------- 3 files changed, 89 insertions(+), 75 deletions(-) diff --git a/src/global.h b/src/global.h index c89cc7ee..ccd29da3 100644 --- a/src/global.h +++ b/src/global.h @@ -57,6 +57,7 @@ DECLSPEC_SELECTANY R_SPINLOCK lock_apply; DECLSPEC_SELECTANY R_SPINLOCK lock_checkbox; DECLSPEC_SELECTANY R_SPINLOCK lock_logbusy; DECLSPEC_SELECTANY R_SPINLOCK lock_logthread; +DECLSPEC_SELECTANY R_SPINLOCK lock_profile; DECLSPEC_SELECTANY R_SPINLOCK lock_transaction; // dropped events callback subscription (win7+) diff --git a/src/profile.c b/src/profile.c index 8fbfc8b1..cadbc7d3 100644 --- a/src/profile.c +++ b/src/profile.c @@ -548,45 +548,6 @@ VOID _app_getcount (_Inout_ PITEM_STATUS status) } } -INT _app_getappgroup (_In_ PITEM_APP ptr_app) -{ - // apps with special rule - if (_app_isapphaverule (ptr_app->app_hash, FALSE)) - return 1; - - if (!ptr_app->is_enabled) - return 2; - - return 0; -} - -INT _app_getnetworkgroup (_In_ PITEM_NETWORK ptr_network) -{ - if (ptr_network->type == DataAppService) - return 1; - - if (ptr_network->type == DataAppUWP) - return 2; - - return 0; -} - -INT _app_getrulegroup (_In_ PITEM_RULE ptr_rule) -{ - if (!ptr_rule->is_enabled) - return 2; - - return 0; -} - -INT _app_getruleicon (_In_ PITEM_RULE ptr_rule) -{ - if (ptr_rule->is_block) - return 1; - - return 0; -} - COLORREF _app_getrulecolor (_In_ INT listview_id, _In_ SIZE_T rule_idx) { PITEM_RULE ptr_rule = _app_getrulebyid (rule_idx); @@ -1368,14 +1329,6 @@ BOOLEAN _app_isapphaverule (_In_ SIZE_T app_hash, _In_ BOOLEAN is_countdisabled) return FALSE; } -BOOLEAN _app_isappused (_In_ PITEM_APP ptr_app) -{ - if (ptr_app->is_enabled || ptr_app->is_silent || _app_isapphaverule (ptr_app->app_hash, TRUE)) - return TRUE; - - return FALSE; -} - BOOLEAN _app_isappexists (_In_ PITEM_APP ptr_app) { if (ptr_app->is_undeletable) @@ -1403,17 +1356,12 @@ VOID _app_openappdirectory (_In_ PITEM_APP ptr_app) if (path) { if (!_r_obj_isstringempty (path)) - _r_path_explore (path->buffer); + _r_shell_openfile (path->buffer); _r_obj_dereference (path); } } -BOOLEAN _app_profile_load_check_node (_In_ mxml_node_t* root_node, _In_ ENUM_TYPE_XML type) -{ - return (_r_str_tointeger_a (mxmlElementGetAttr (root_node, "type")) == type); -} - BOOLEAN _app_profile_load_check (_In_ LPCWSTR path, _In_ ENUM_TYPE_XML type) { HANDLE hfile = CreateFile (path, FILE_GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); @@ -1890,6 +1838,8 @@ VOID _app_profile_load (_In_opt_ HWND hwnd, _In_opt_ LPCWSTR path_custom) mxml_node_t *xml_node = NULL; mxml_node_t *root_node = NULL; + _r_spinlock_acquireshared (&lock_profile); + hfile = CreateFile (path_custom ? path_custom : config.profile_path, FILE_GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (_r_fs_isvalidhandle (hfile)) @@ -1910,6 +1860,8 @@ VOID _app_profile_load (_In_opt_ HWND hwnd, _In_opt_ LPCWSTR path_custom) } } + _r_spinlock_releaseshared (&lock_profile); + if (!xml_node) { _r_log (Error, UID, L"mxmlLoadFd", GetLastError (), path_custom ? path_custom : config.profile_path); @@ -2077,14 +2029,6 @@ VOID _app_profile_save () LONG64 current_time = 0; BOOLEAN is_backuprequired = FALSE; - hfile = CreateFile (config.profile_path, FILE_GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_DELETE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); - - if (!_r_fs_isvalidhandle (hfile)) - { - _r_log (Error, UID, L"CreateFile", GetLastError (), config.profile_path); - return; - } - mxmlSetWrapMargin (0x2000); current_time = _r_unixtime_now (); @@ -2239,10 +2183,33 @@ VOID _app_profile_save () mxmlElementSetAttrf (item_node, "is_enabled", "%" PRIu8, ptr_config->is_enabled); } - mxmlSaveFd (xml_node, hfile, &_app_profile_save_callback); + _r_spinlock_acquireexclusive (&lock_profile); + + hfile = CreateFile (config.profile_path, FILE_GENERIC_READ | FILE_GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_DELETE, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); + + if (!_r_fs_isvalidhandle (hfile)) + { + _r_log (Error, UID, L"CreateFile", GetLastError (), config.profile_path); + } + else + { + if (GetLastError () == ERROR_ALREADY_EXISTS) + { + _r_fs_setpos (hfile, 2, FILE_BEGIN); + + SetEndOfFile (hfile); + + FlushFileBuffers (hfile); + } + + mxmlSaveFd (xml_node, hfile, &_app_profile_save_callback); + + CloseHandle (hfile); + } + mxmlDelete (xml_node); - CloseHandle (hfile); + _r_spinlock_releaseexclusive (&lock_profile); // make backup if (is_backuprequired) diff --git a/src/profile.h b/src/profile.h index e5b188a1..e4aa1558 100644 --- a/src/profile.h +++ b/src/profile.h @@ -46,12 +46,61 @@ COLORREF _app_getappcolor (_In_ INT listview_id, _In_ SIZE_T app_hash, _In_ BOOL VOID _app_freeapplication (_In_ SIZE_T app_hash); +BOOLEAN _app_isappfromsystem (_In_ LPCWSTR path, _In_ SIZE_T app_hash); +BOOLEAN _app_isapphaveconnection (_In_ SIZE_T app_hash); +BOOLEAN _app_isapphavedrive (_In_ INT letter); +BOOLEAN _app_isapphaverule (_In_ SIZE_T app_hash, _In_ BOOLEAN is_countdisabled); +BOOLEAN _app_isappexists (_In_ PITEM_APP ptr_app); + +FORCEINLINE BOOLEAN _app_isappused (_In_ PITEM_APP ptr_app) +{ + if (ptr_app->is_enabled || ptr_app->is_silent || _app_isapphaverule (ptr_app->app_hash, TRUE)) + return TRUE; + + return FALSE; +} + VOID _app_getcount (_Inout_ PITEM_STATUS status); -INT _app_getappgroup (_In_ PITEM_APP ptr_app); -INT _app_getnetworkgroup (_In_ PITEM_NETWORK ptr_network); -INT _app_getrulegroup (_In_ PITEM_RULE ptr_rule); -INT _app_getruleicon (_In_ PITEM_RULE ptr_rule); +FORCEINLINE INT _app_getappgroup (_In_ PITEM_APP ptr_app) +{ + // apps with special rule + if (_app_isapphaverule (ptr_app->app_hash, FALSE)) + return 1; + + if (!ptr_app->is_enabled) + return 2; + + return 0; +} + +FORCEINLINE INT _app_getrulegroup (_In_ PITEM_RULE ptr_rule) +{ + if (!ptr_rule->is_enabled) + return 2; + + return 0; +} + +FORCEINLINE INT _app_getnetworkgroup (_In_ PITEM_NETWORK ptr_network) +{ + if (ptr_network->type == DataAppService) + return 1; + + if (ptr_network->type == DataAppUWP) + return 2; + + return 0; +} + +FORCEINLINE INT _app_getruleicon (_In_ PITEM_RULE ptr_rule) +{ + if (ptr_rule->is_block) + return 1; + + return 0; +} + COLORREF _app_getrulecolor (_In_ INT listview_id, _In_ SIZE_T rule_idx); _Ret_maybenull_ @@ -75,18 +124,15 @@ PR_STRING _app_rulesexpandapps (_In_ PITEM_RULE ptr_rule, _In_ BOOLEAN is_fordis _Ret_maybenull_ PR_STRING _app_rulesexpandrules (_In_ PR_STRING rule, _In_ LPCWSTR delimeter); -BOOLEAN _app_isappfromsystem (_In_ LPCWSTR path, _In_ SIZE_T app_hash); -BOOLEAN _app_isapphaveconnection (_In_ SIZE_T app_hash); -BOOLEAN _app_isapphavedrive (_In_ INT letter); -BOOLEAN _app_isapphaverule (_In_ SIZE_T app_hash, _In_ BOOLEAN is_countdisabled); -BOOLEAN _app_isappused (_In_ PITEM_APP ptr_app); -BOOLEAN _app_isappexists (_In_ PITEM_APP ptr_app); - VOID _app_openappdirectory (_In_ PITEM_APP ptr_app); -//BOOLEAN _app_profile_load_check_node (_In_ mxml_node_t* root_node, _In_ ENUM_TYPE_XML type); BOOLEAN _app_profile_load_check (_In_ LPCWSTR path, _In_ ENUM_TYPE_XML type); +FORCEINLINE BOOLEAN _app_profile_load_check_node (_In_ mxml_node_t* root_node, _In_ ENUM_TYPE_XML type) +{ + return (_r_str_tointeger_a (mxmlElementGetAttr (root_node, "type")) == type); +} + VOID _app_profile_load_fallback (); //VOID _app_profile_load_helper (_In_ mxml_node_t* root_node, _In_ ENUM_TYPE_DATA type, _In_ UINT version); VOID _app_profile_load_internal (_In_ LPCWSTR path, _In_ LPCWSTR resource_name, _Inout_opt_ PLONG64 ptimestamp);