diff --git a/backends/opkg/pk-backend-opkg.c b/backends/opkg/pk-backend-opkg.c index a7b5244..9e71b90 100644 --- a/backends/opkg/pk-backend-opkg.c +++ b/backends/opkg/pk-backend-opkg.c @@ -20,6 +20,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +#include #include #include #include @@ -47,6 +48,22 @@ typedef struct { PkBackend *backend; } SearchParams; +static int __opkg_lock__ = 0; +static inline void opkg_thread_lock() +{ + while ( __opkg_lock__ ) + usleep(500); + __opkg_lock__ = 1; +} + +static inline void opkg_thread_unlock() +{ + if (! __opkg_lock__ ) { + pk_debug("Warning: opkg_thread_unlock without lock before!!\n"); + } + __opkg_lock__ = 0; +} + static void opkg_unknown_error (PkBackend *backend, gint error_code, gchar *failed_cmd) { @@ -236,6 +253,7 @@ backend_refresh_cache_thread (PkBackend *backend) opkg_unknown_error (backend, ret, "Refreshing cache"); } pk_backend_finished (backend); + opkg_thread_unlock(); return (ret == 0); } @@ -246,6 +264,7 @@ backend_refresh_cache_thread (PkBackend *backend) static void backend_refresh_cache (PkBackend *backend, gboolean force) { + opkg_thread_lock(); pk_backend_set_status (backend, PK_STATUS_ENUM_REFRESH_CACHE); pk_backend_set_percentage (backend, PK_BACKEND_PERCENTAGE_INVALID); @@ -260,15 +279,26 @@ backend_refresh_cache (PkBackend *backend, gboolean force) static void pk_opkg_package_list_cb (opkg_t *opkg, opkg_package_t *pkg, void *data) { - SearchParams *params = (SearchParams*) data; + SearchParams *params; gchar *uid; gchar *haystack; gint status, match; - PkFilterEnum filters = params->filters; + PkFilterEnum filters; + if (!opkg) { + pk_debug("opkg is NULL!!\n"); + return; + } + if (!data) { + pk_debug("data is NULL!!\n"); + return; + } if (!pkg->name) return; + params = (SearchParams*) data; + filters = params->filters; + switch (params->search_type) { case SEARCH_NAME: @@ -336,6 +366,7 @@ backend_search_thread (PkBackend *backend) opkg_list_packages (opkg, pk_opkg_package_list_cb, params); pk_backend_finished (params->backend); + opkg_thread_unlock(); g_free (params->needle); g_free (params); @@ -348,6 +379,7 @@ backend_search_name (PkBackend *backend, PkFilterEnum filters, const gchar *sear { SearchParams *params; + opkg_thread_lock(); pk_backend_set_status (backend, PK_STATUS_ENUM_QUERY); pk_backend_set_percentage (backend, PK_BACKEND_PERCENTAGE_INVALID); @@ -370,6 +402,7 @@ backend_search_description (PkBackend *backend, PkFilterEnum filters, const gcha { SearchParams *params; + opkg_thread_lock(); pk_backend_set_status (backend, PK_STATUS_ENUM_QUERY); pk_backend_set_percentage (backend, PK_BACKEND_PERCENTAGE_INVALID); @@ -389,6 +422,7 @@ backend_search_group (PkBackend *backend, PkFilterEnum filters, const gchar *sea { SearchParams *params; + opkg_thread_lock(); pk_backend_set_status (backend, PK_STATUS_ENUM_QUERY); pk_backend_set_percentage (backend, PK_BACKEND_PERCENTAGE_INVALID); @@ -431,12 +465,15 @@ backend_install_packages_thread (PkBackend *backend) } pk_backend_finished (backend); + opkg_thread_unlock(); return (err == 0); } static void backend_install_packages (PkBackend *backend, gchar **package_ids) { + opkg_thread_lock(); + pk_backend_set_percentage (backend, PK_BACKEND_PERCENTAGE_INVALID); pk_backend_set_status (backend, PK_STATUS_ENUM_INSTALL); @@ -493,6 +530,7 @@ backend_remove_packages_thread (PkBackend *backend) } pk_backend_finished (backend); + opkg_thread_unlock(); return (err == 0); } @@ -500,6 +538,8 @@ static void backend_remove_packages (PkBackend *backend, gchar **package_ids, gboolean allow_deps, gboolean autoremove) { gpointer *params; + + opkg_thread_lock(); pk_backend_set_status (backend, PK_STATUS_ENUM_REMOVE); pk_backend_set_percentage (backend, PK_BACKEND_PERCENTAGE_INVALID); @@ -540,12 +580,15 @@ backend_update_system_thread (PkBackend *backend) opkg_unknown_error (backend, err, "Upgrading system"); pk_backend_finished (backend); + opkg_thread_unlock(); return (err != 0); } static void backend_update_system (PkBackend *backend) { + opkg_thread_lock(); + pk_backend_set_status (backend, PK_STATUS_ENUM_UPDATE); pk_backend_set_percentage (backend, PK_BACKEND_PERCENTAGE_INVALID); @@ -571,6 +614,7 @@ backend_update_package_thread (PkBackend *backend) "Package not found"); pk_package_id_free (pi); pk_backend_finished (backend); + opkg_thread_unlock(); return FALSE; } @@ -581,6 +625,7 @@ backend_update_package_thread (PkBackend *backend) pk_package_id_free (pi); pk_backend_finished (backend); + opkg_thread_unlock(); return (err != 0); } @@ -589,10 +634,12 @@ backend_update_packages (PkBackend *backend, gchar **package_ids) { gint i; - pk_backend_set_status (backend, PK_STATUS_ENUM_UPDATE); - pk_backend_set_percentage (backend, PK_BACKEND_PERCENTAGE_INVALID); - for (i = 0; package_ids[i]; i++) { + + opkg_thread_lock(); + + pk_backend_set_status (backend, PK_STATUS_ENUM_UPDATE); + pk_backend_set_percentage (backend, PK_BACKEND_PERCENTAGE_INVALID); pk_backend_set_string (backend, "pkgid", package_ids[i]); pk_backend_thread_create (backend, backend_update_package_thread); } @@ -626,12 +673,14 @@ backend_get_updates_thread (PkBackend *backend) { opkg_list_upgradable_packages (opkg, pk_opkg_list_upgradable_cb, backend); pk_backend_finished (backend); + opkg_thread_unlock(); return TRUE; } static void backend_get_updates (PkBackend *backend, PkFilterEnum filters) { + opkg_thread_lock(); pk_backend_set_status (backend, PK_STATUS_ENUM_UPDATE); pk_backend_set_percentage (backend, PK_BACKEND_PERCENTAGE_INVALID); @@ -672,6 +721,7 @@ backend_get_details_thread (PkBackend *backend) { pk_backend_error_code (backend, PK_ERROR_ENUM_PACKAGE_ID_INVALID, "invalid package id"); pk_backend_finished (backend); + opkg_thread_unlock(); return FALSE; } @@ -683,6 +733,7 @@ backend_get_details_thread (PkBackend *backend) { pk_backend_error_code (backend, PK_ERROR_ENUM_PACKAGE_NOT_FOUND, NULL); pk_backend_finished (backend); + opkg_thread_unlock(); return FALSE; } @@ -698,15 +749,18 @@ backend_get_details_thread (PkBackend *backend) } pk_backend_details (backend, newid, NULL, group, pkg->description, pkg->url, pkg->size); + pk_backend_finished (backend); + opkg_thread_unlock(); + g_free (newid); opkg_package_free(pkg); - pk_backend_finished (backend); return TRUE; } static void backend_get_details (PkBackend *backend, const gchar *package_id) { + opkg_thread_lock(); pk_backend_set_percentage (backend, PK_BACKEND_PERCENTAGE_INVALID); pk_backend_thread_create (backend, backend_get_details_thread); }