[grilo-plugins] lua-factory: use wrapper for lua_pcall
- From: Bastien Nocera <hadess src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [grilo-plugins] lua-factory: use wrapper for lua_pcall
- Date: Mon, 21 Mar 2016 22:56:05 +0000 (UTC)
commit 311600c07463721c61b639a510fddaa18574ef95
Author: Victor Toso <me victortoso com>
Date: Mon Mar 7 22:54:26 2016 +0100
lua-factory: use wrapper for lua_pcall
Due improvements later in the patch series, it becomes useful to have
such wrapper. We always call the lua_gc after lua_pcall as current logic
flow expects it.
https://bugzilla.gnome.org/show_bug.cgi?id=763046
src/lua-factory/Makefile.am | 1 +
src/lua-factory/grl-lua-common.h | 3 +
src/lua-factory/grl-lua-factory.c | 50 +++++++++++++------------
src/lua-factory/grl-lua-library-operations.c | 52 ++++++++++++++++++++++++++
src/lua-factory/grl-lua-library.c | 18 +++++----
5 files changed, 92 insertions(+), 32 deletions(-)
---
diff --git a/src/lua-factory/Makefile.am b/src/lua-factory/Makefile.am
index fa64ef4..5092834 100644
--- a/src/lua-factory/Makefile.am
+++ b/src/lua-factory/Makefile.am
@@ -30,6 +30,7 @@ libgrlluafactory_la_SOURCES = \
grl-lua-factory.h \
grl-lua-library.c \
grl-lua-library.h \
+ grl-lua-library-operations.c \
grl-lua-common.h \
luafactoryresources.c \
luafactoryresources.h \
diff --git a/src/lua-factory/grl-lua-common.h b/src/lua-factory/grl-lua-common.h
index 603c139..fa5c12e 100644
--- a/src/lua-factory/grl-lua-common.h
+++ b/src/lua-factory/grl-lua-common.h
@@ -86,4 +86,7 @@ void grl_lua_library_push_grl_media (lua_State *L, GrlMedia *media);
void grl_lua_library_push_grl_options (lua_State *L, guint operation_id, GrlOperationOptions *options, GList
*keys);
void grl_lua_library_push_grl_callback (lua_State *L, OperationSpec *os);
+/* grl-lua-library-operations */
+gboolean grl_lua_operations_pcall (lua_State *L, gint nargs, OperationSpec *os, GError **err);
+
#endif /* _GRL_LUA_LIBRARY_COMMON_H_ */
diff --git a/src/lua-factory/grl-lua-factory.c b/src/lua-factory/grl-lua-factory.c
index 193008c..1cf2978 100644
--- a/src/lua-factory/grl-lua-factory.c
+++ b/src/lua-factory/grl-lua-factory.c
@@ -596,6 +596,8 @@ lua_plugin_source_init (GrlLuaFactorySource *lua_source)
lua_pushnil (L);
}
+ /* FIXME in order to supported async calls we should use
+ * grl_lua_operations_pcall */
if (lua_pcall (L, 1, 1, 0)) {
GRL_WARNING ("calling grl_source_init function failed: %s",
lua_tolstring (L, -1, NULL));
@@ -1507,6 +1509,7 @@ grl_lua_factory_source_search (GrlSource *source,
lua_State *L = lua_source->priv->l_st;
OperationSpec *os = NULL;
const gchar *text = NULL;
+ GError *err = NULL;
GRL_DEBUG ("grl_lua_factory_source_search");
@@ -1525,13 +1528,12 @@ grl_lua_factory_source_search (GrlSource *source,
lua_pushstring (L, text);
grl_lua_library_push_grl_options (L, ss->operation_id, ss->options, ss->keys);
grl_lua_library_push_grl_callback (L, os);
-
- if (lua_pcall (L, 3, 0, 0)) {
- GRL_WARNING ("%s '%s'", "calling search function fail:",
- lua_tolstring (L, -1, NULL));
- lua_pop (L, 1);
+ if (!grl_lua_operations_pcall (L, 3, os, &err)) {
+ if (err != NULL) {
+ GRL_WARNING ("calling search function failed: %s", err->message);
+ g_error_free (err);
+ }
}
- lua_gc (L, LUA_GCCOLLECT, 0);
}
static void
@@ -1541,6 +1543,7 @@ grl_lua_factory_source_browse (GrlSource *source,
GrlLuaFactorySource *lua_source = GRL_LUA_FACTORY_SOURCE (source);
lua_State *L = lua_source->priv->l_st;
OperationSpec *os = NULL;
+ GError *err = NULL;
GRL_DEBUG ("grl_lua_factory_source_browse");
@@ -1557,13 +1560,12 @@ grl_lua_factory_source_browse (GrlSource *source,
grl_lua_library_push_grl_media (L, bs->container);
grl_lua_library_push_grl_options (L, bs->operation_id, bs->options, bs->keys);
grl_lua_library_push_grl_callback (L, os);
-
- if (lua_pcall (L, 3, 0, 0)) {
- GRL_WARNING ("%s '%s'", "calling browse function fail:",
- lua_tolstring (L, -1, NULL));
- lua_pop (L, 1);
+ if (!grl_lua_operations_pcall (L, 3, os, &err)) {
+ if (err != NULL) {
+ GRL_WARNING ("calling browse function failed: %s", err->message);
+ g_error_free (err);
+ }
}
- lua_gc (L, LUA_GCCOLLECT, 0);
}
static void
@@ -1574,6 +1576,7 @@ grl_lua_factory_source_query (GrlSource *source,
lua_State *L = lua_source->priv->l_st;
OperationSpec *os = NULL;
const gchar *query = NULL;
+ GError *err = NULL;
GRL_DEBUG ("grl_lua_factory_source_query");
@@ -1592,13 +1595,12 @@ grl_lua_factory_source_query (GrlSource *source,
lua_pushstring (L, query);
grl_lua_library_push_grl_options (L, qs->operation_id, qs->options, qs->keys);
grl_lua_library_push_grl_callback (L, os);
-
- if (lua_pcall (L, 3, 0, 0)) {
- GRL_WARNING ("%s '%s'", "calling query function fail:",
- lua_tolstring (L, -1, NULL));
- lua_pop (L, 1);
+ if (!grl_lua_operations_pcall (L, 3, os, &err)) {
+ if (err != NULL) {
+ GRL_WARNING ("calling query function failed: %s", err->message);
+ g_error_free (err);
+ }
}
- lua_gc (L, LUA_GCCOLLECT, 0);
}
static void
@@ -1608,6 +1610,7 @@ grl_lua_factory_source_resolve (GrlSource *source,
GrlLuaFactorySource *lua_source = GRL_LUA_FACTORY_SOURCE (source);
lua_State *L = lua_source->priv->l_st;
OperationSpec *os = NULL;
+ GError *err = NULL;
GRL_DEBUG ("grl_lua_factory_source_resolve");
@@ -1625,13 +1628,12 @@ grl_lua_factory_source_resolve (GrlSource *source,
grl_lua_library_push_grl_media (L, rs->media);
grl_lua_library_push_grl_options (L, rs->operation_id, rs->options, rs->keys);
grl_lua_library_push_grl_callback (L, os);
-
- if (lua_pcall (L, 3, 0, 0)) {
- GRL_WARNING ("%s '%s'", "calling resolve function fail:",
- lua_tolstring (L, -1, NULL));
- lua_pop (L, 1);
+ if (!grl_lua_operations_pcall (L, 3, os, &err)) {
+ if (err != NULL) {
+ GRL_WARNING ("calling resolve function failed: %s", err->message);
+ g_error_free (err);
+ }
}
- lua_gc (L, LUA_GCCOLLECT, 0);
}
static gboolean
diff --git a/src/lua-factory/grl-lua-library-operations.c b/src/lua-factory/grl-lua-library-operations.c
new file mode 100644
index 0000000..031b624
--- /dev/null
+++ b/src/lua-factory/grl-lua-library-operations.c
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2016 Victor Toso.
+ *
+ * Contact: Victor Toso <me victortoso com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA
+ *
+ */
+
+#include "config.h"
+#include "grl-lua-common.h"
+
+/* =========================================================================
+ * Exported functions ======================================================
+ * ========================================================================= */
+
+/*
+ * This is a wrapper to do execute the lua_pcall and all internals that might
+ * be necessary to Lua-Library before calling the Lua function. The stack
+ * requirements are the same of lua_pcall, function and arguments in expected
+ * order.
+ */
+gboolean
+grl_lua_operations_pcall (lua_State *L,
+ gint nargs,
+ OperationSpec *os,
+ GError **err)
+{
+ if (lua_pcall (L, nargs, 0, 0)) {
+ gint error_code = (os) ? os->error_code : G_IO_ERROR_CANCELLED;
+ *err = g_error_new_literal (GRL_CORE_ERROR,
+ error_code,
+ lua_tolstring (L, -1, NULL));
+ lua_pop (L, 1);
+ }
+
+ lua_gc (L, LUA_GCCOLLECT, 0);
+ return (*err == NULL);
+}
diff --git a/src/lua-factory/grl-lua-library.c b/src/lua-factory/grl-lua-library.c
index a03a995..9b66da8 100644
--- a/src/lua-factory/grl-lua-library.c
+++ b/src/lua-factory/grl-lua-library.c
@@ -524,14 +524,15 @@ grl_util_fetch_done (GObject *source_object,
/* get userdata from the registry */
lua_rawgeti (L, LUA_REGISTRYINDEX, fo->lua_userdata);
- if (lua_pcall (L, 2, 0, 0)) {
- GRL_WARNING ("%s '%s'", "calling source callback function fail",
- lua_tolstring (L, -1, NULL));
+ if (!grl_lua_operations_pcall (L, 2, NULL, &err)) {
+ if (err != NULL) {
+ GRL_WARNING ("calling source callback function fail: %s", err->message);
+ g_error_free (err);
+ }
}
luaL_unref (L, LUA_REGISTRYINDEX, fo->lua_userdata);
luaL_unref (L, LUA_REGISTRYINDEX, fo->lua_callback);
- lua_gc (L, LUA_GCCOLLECT, 0);
for (i = 0; i < fo->num_urls; i++)
g_free (fo->results[i]);
@@ -660,14 +661,15 @@ grl_util_unzip_done (GObject *source_object,
/* get userdata from the registry */
lua_rawgeti (L, LUA_REGISTRYINDEX, uo->lua_userdata);
- if (lua_pcall (L, 2, 0, 0)) {
- GRL_WARNING ("%s '%s'", "calling source callback function fail",
- lua_tolstring (L, -1, NULL));
+ if (!grl_lua_operations_pcall (L, 2, NULL, &err)) {
+ if (err != NULL) {
+ GRL_WARNING ("calling source callback function fail: %s", err->message);
+ g_error_free (err);
+ }
}
luaL_unref (L, LUA_REGISTRYINDEX, uo->lua_userdata);
luaL_unref (L, LUA_REGISTRYINDEX, uo->lua_callback);
- lua_gc (L, LUA_GCCOLLECT, 0);
g_strfreev (results);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]