checking backend ABI version
authorBoram Park <boram1288.park@samsung.com>
Thu, 18 Feb 2016 01:38:46 +0000 (10:38 +0900)
committerBoram Park <boram1288.park@samsung.com>
Fri, 19 Feb 2016 09:03:24 +0000 (18:03 +0900)
Change-Id: I484eb38ad2a62cec2b26cac62cc7abe578ef7b6f

src/tdm.c
src/tdm_backend.c

index 17c2b2b..1efea2c 100644 (file)
--- a/src/tdm.c
+++ b/src/tdm.c
@@ -639,6 +639,9 @@ _tdm_display_load_module_with_file(tdm_private_display *private_display, const c
         goto failed_load;
     }
 
+    private_display->module_data = module_data;
+    private_display->module = module;
+
     /* check if version, init() and deinit() are valid or not */
     ret = _tdm_display_check_module(module_data);
     if (ret != TDM_ERROR_NONE)
@@ -660,14 +663,13 @@ _tdm_display_load_module_with_file(tdm_private_display *private_display, const c
         goto failed_load;
     }
 
-    private_display->module_data = module_data;
-    private_display->module = module;
-
     TDM_INFO("Success to load module(%s)", file);
 
     return TDM_ERROR_NONE;
 failed_load:
     dlclose(module);
+    private_display->module_data = NULL;
+    private_display->module = NULL;
     return ret;
 }
 
index 6f98b0f..b95cfe8 100644 (file)
@@ -46,13 +46,37 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
     TDM_RETURN_VAL_IF_FAIL(dpy != NULL, TDM_ERROR_INVALID_PARAMETER); \
     private_display = (tdm_private_display*)dpy;
 
+static int
+_check_abi_version(tdm_backend_module *module, int abimaj, int abimin)
+{
+    int major = TDM_BACKEND_GET_ABI_MAJOR(module->abi_version);
+    int minor = TDM_BACKEND_GET_ABI_MINOR(module->abi_version);
+
+    if (major < abimaj) goto failed;
+    if (major > abimaj) return 1;
+    if (minor < abimin) goto failed;
+    return 1;
+failed:
+    TDM_ERR("The ABI version(%d.%d) of '%s' is less than %d.%d",
+            major, minor, module->name ? module->name : "unknown",
+            abimaj, abimin);
+    return 0;
+}
+
 EXTERN tdm_error
 tdm_backend_register_func_display(tdm_display *dpy, tdm_func_display *func_display)
 {
+    tdm_backend_module *module;
+
     BACKEND_FUNC_ENTRY();
 
     TDM_RETURN_VAL_IF_FAIL(func_display != NULL, TDM_ERROR_INVALID_PARAMETER);
 
+    /* the ABI version of backend module should be more than 1.1 */
+    module = private_display->module_data;
+    if (_check_abi_version(module, 1, 1) < 0)
+        return TDM_ERROR_BAD_MODULE;
+
     pthread_mutex_lock(&private_display->lock);
     private_display->func_display = *func_display;
     pthread_mutex_unlock(&private_display->lock);
@@ -63,10 +87,17 @@ tdm_backend_register_func_display(tdm_display *dpy, tdm_func_display *func_displ
 EXTERN tdm_error
 tdm_backend_register_func_output(tdm_display *dpy, tdm_func_output *func_output)
 {
+    tdm_backend_module *module;
+
     BACKEND_FUNC_ENTRY();
 
     TDM_RETURN_VAL_IF_FAIL(func_output != NULL, TDM_ERROR_INVALID_PARAMETER);
 
+    /* the ABI version of backend module should be more than 1.1 */
+    module = private_display->module_data;
+    if (_check_abi_version(module, 1, 1) < 0)
+        return TDM_ERROR_BAD_MODULE;
+
     pthread_mutex_lock(&private_display->lock);
     private_display->func_output = *func_output;
     pthread_mutex_unlock(&private_display->lock);
@@ -77,10 +108,17 @@ tdm_backend_register_func_output(tdm_display *dpy, tdm_func_output *func_output)
 EXTERN tdm_error
 tdm_backend_register_func_layer(tdm_display *dpy, tdm_func_layer *func_layer)
 {
+    tdm_backend_module *module;
+
     BACKEND_FUNC_ENTRY();
 
     TDM_RETURN_VAL_IF_FAIL(func_layer != NULL, TDM_ERROR_INVALID_PARAMETER);
 
+    /* the ABI version of backend module should be more than 1.1 */
+    module = private_display->module_data;
+    if (_check_abi_version(module, 1, 1) < 0)
+        return TDM_ERROR_BAD_MODULE;
+
     pthread_mutex_lock(&private_display->lock);
     private_display->func_layer = *func_layer;
     pthread_mutex_unlock(&private_display->lock);