summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--parser/widget_plugin_parser_internal.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/parser/widget_plugin_parser_internal.c b/parser/widget_plugin_parser_internal.c
index dc424eb..0ac5335 100644
--- a/parser/widget_plugin_parser_internal.c
+++ b/parser/widget_plugin_parser_internal.c
@@ -26,6 +26,9 @@
#include "widget_plugin_parser_internal.h"
+#define BUSY_WAITING_USEC 50000 /* 0.05 sec */
+#define BUSY_WAITING_MAX 20 /* wait for max 1 sec */
+
void _free_support_size(gpointer data)
{
struct support_size *size = (struct support_size *)data;
@@ -104,6 +107,17 @@ static const char *_get_db_path(uid_t uid)
return path;
}
+static int __db_busy_handler(void *data, int count)
+{
+ if (count < BUSY_WAITING_MAX) {
+ usleep(BUSY_WAITING_USEC);
+ return 1;
+ }
+
+ /* sqlite3_prepare_v2 will return SQLITE_BUSY */
+ return 0;
+}
+
sqlite3 *_open_db(uid_t uid, bool readonly)
{
int ret;
@@ -125,6 +139,14 @@ sqlite3 *_open_db(uid_t uid, bool readonly)
return NULL;
}
+ ret = sqlite3_busy_handler(db, __db_busy_handler, NULL);
+ if (ret != SQLITE_OK) {
+ LOGE("Failed to register busy handler: %s",
+ sqlite3_errmsg(db));
+ sqlite3_close_v2(db);
+ return NULL;
+ }
+
/* turn on foreign keys */
if (sqlite3_exec(db, "PRAGMA foreign_keys = ON", NULL, NULL, NULL)) {
sqlite3_close_v2(db);