Sync with the latest private
authorSung-jae Park <nicesj.park@samsung.com>
Wed, 8 Apr 2015 11:42:07 +0000 (20:42 +0900)
committerSung-jae Park <nicesj.park@samsung.com>
Wed, 8 Apr 2015 11:42:07 +0000 (20:42 +0900)
Launch the application asynchronously if it is an watch widget.

[model] Redwood,Kiran,B3(Wearable)
[binary_type] AP
[customer] Docomo/Orange/ATT/Open
[issue#] N/A
[problem]
[cause]
[solution]
[team] HomeTF
[request]
[horizontal_expansion]

Change-Id: I6df2aefe4c57f575512c11c0536e5dcae2ae1bb2

include/package.h
include/slave_life.h
src/package.c
src/server.c
src/slave_life.c

index 23daaf2..dd5e35c 100644 (file)
@@ -14,6 +14,8 @@
  * limitations under the License.
  */
 
+#define CATEGORY_WATCH_CLOCK   "org.tizen.wmanager.WATCH_CLOCK"
+
 enum alter_type {
        ALTER_CREATE,
        ALTER_DESTROY
index 24b2cbd..eeef228 100644 (file)
@@ -96,7 +96,7 @@ extern const int const slave_refcnt(struct slave_node *slave);
  * \param[in] period
  * \return slave_node
  */
-extern struct slave_node *slave_create(const char *name, int is_secured, const char *abi, const char *pkgname, int network, const char *hw_acceleration);
+extern struct slave_node *slave_create(const char *name, int is_secured, const char *abi, const char *pkgname, int network, const char *hw_acceleration, int launch_async);
 
 /*!
  * \brief
index 6ddf12b..8b10d29 100644 (file)
@@ -1125,6 +1125,7 @@ HAPI const char *package_category(struct pkg_info *info)
 static inline int assign_new_slave(const char *slave_pkgname, struct pkg_info *info)
 {
        char *s_name;
+       int launch_async = 0;
 
        s_name = util_slavename();
        if (!s_name) {
@@ -1132,8 +1133,10 @@ static inline int assign_new_slave(const char *slave_pkgname, struct pkg_info *i
                return WIDGET_ERROR_FAULT;
        }
 
-       DbgPrint("New slave[%s] is assigned for %s (using %s / abi[%s] / accel[%s])\n", s_name, info->widget_id, slave_pkgname, info->abi, info->hw_acceleration);
-       info->slave = slave_create(s_name, info->secured, info->abi, slave_pkgname, info->network, info->hw_acceleration);
+       launch_async = (!!package_category(info) && !strcmp(package_category(info), CATEGORY_WATCH_CLOCK));
+
+       DbgPrint("New slave[%s] is assigned for %s (using %s / abi[%s] / accel[%s] / launch_async[%d])\n", s_name, info->widget_id, slave_pkgname, info->abi, info->hw_acceleration, launch_async);
+       info->slave = slave_create(s_name, info->secured, info->abi, slave_pkgname, info->network, info->hw_acceleration, launch_async);
 
        DbgFree(s_name);
 
index da6c684..b9b5273 100644 (file)
@@ -64,8 +64,6 @@
 #define LAZY_GBAR_OPEN_TAG "lazy,gbar,open"
 #define LAZY_GBAR_CLOSE_TAG "lazy,gbar,close"
 
-#define CATEGORY_WATCH_CLOCK   "org.tizen.wmanager.WATCH_CLOCK"
-
 #define ACCESS_TYPE_DOWN 0
 #define ACCESS_TYPE_MOVE 1
 #define ACCESS_TYPE_UP 2
@@ -6479,7 +6477,7 @@ static inline __attribute__((always_inline)) int debug_mode_enabled(int pid, con
 
        slave = slave_find_by_pkgname(pkgname);
        if (!slave) {
-               slave = slave_create(slavename, secured, abi, pkgname, 0, acceleration);
+               slave = slave_create(slavename, secured, abi, pkgname, 0, acceleration, 0);
                if (!slave) {
                        return WIDGET_ERROR_FAULT;
                }
@@ -6592,7 +6590,7 @@ static struct packet *slave_hello(pid_t pid, int handle, const struct packet *pa
                                network = package_network(info);
                        }
 
-                       slave = slave_create(slavename, secured, abi, pkgname, network, acceleration);
+                       slave = slave_create(slavename, secured, abi, pkgname, network, acceleration, 0);
                        if (!slave) {
                                ErrPrint("Failed to create a new slave for %s\n", slavename);
                                DbgFree(widget_id);
@@ -8020,6 +8018,7 @@ static struct packet *slave_hello_sync(pid_t pid, int handle, const struct packe
        struct packet *result = NULL;
        struct slave_node *slave;
        const char *slavename;
+       const char *slave_pkgname;
        const char *acceleration;
        const char *abi;
        char *widget_id;
@@ -8028,8 +8027,8 @@ static struct packet *slave_hello_sync(pid_t pid, int handle, const struct packe
        char pkgname[pathconf("/", _PC_PATH_MAX)];
        double timestamp;
 
-       ret = packet_get(packet, "disss", &timestamp, &secured, &slavename, &acceleration, &abi);
-       if (ret != 5) {
+       ret = packet_get(packet, "dissss", &timestamp, &secured, &slavename, &slave_pkgname, &acceleration, &abi);
+       if (ret != 6) {
                ErrPrint("Parameter is not matched\n");
                goto out;
        }
@@ -8048,6 +8047,10 @@ static struct packet *slave_hello_sync(pid_t pid, int handle, const struct packe
        slave = slave_find_by_name(slavename);
        if (!slave) { /* Try again to find a slave using pid */
                slave = slave_find_by_pid(pid);
+               if (!slave) {
+                       slave = slave_find_by_pkgname(slave_pkgname);
+                       ErrPrint("Failed to find, Find it using pkgname(%s) - %p\n", slave_pkgname, slave);
+               }
        }
 
        if (aul_app_get_pkgname_bypid(pid, pkgname, sizeof(pkgname)) != AUL_R_OK) {
@@ -8194,7 +8197,11 @@ static struct packet *slave_hello_sync(pid_t pid, int handle, const struct packe
                                package_del_instance_by_category(CATEGORY_WATCH_CLOCK, NULL);
                        }
 
-                       slave = slave_create(slavename, secured, abi, pkgname, network, acceleration);
+                       /**
+                        * If a provider sent hello_sync, we will assumes it as a watch widget.
+                        * In this case, activate it again asynchronously.
+                        */
+                       slave = slave_create(slavename, secured, abi, pkgname, network, acceleration, 1);
                        if (!slave) {
                                ErrPrint("Failed to create a new slave for %s\n", slavename);
                                goto out;
index 492b156..05255fa 100644 (file)
@@ -77,6 +77,8 @@ struct slave_node {
        int reactivate_instances;
        int reactivate_slave;
 
+       int launch_async;
+
        pid_t pid;
 
        enum event_process {
@@ -296,7 +298,7 @@ static inline int xmonitor_resume_cb(void *data)
        return WIDGET_ERROR_NONE;
 }
 
-static inline struct slave_node *create_slave_node(const char *name, int is_secured, const char *abi, const char *pkgname, int network, const char *hw_acceleration)
+static inline struct slave_node *create_slave_node(const char *name, int is_secured, const char *abi, const char *pkgname, int network, const char *hw_acceleration, int launch_async)
 {
        struct slave_node *slave;
 
@@ -347,6 +349,7 @@ static inline struct slave_node *create_slave_node(const char *name, int is_secu
        slave->state = SLAVE_TERMINATED;
        slave->network = network;
        slave->relaunch_count = WIDGET_CONF_SLAVE_RELAUNCH_COUNT;
+       slave->launch_async = launch_async;
 
        xmonitor_add_event_callback(XMONITOR_PAUSED, xmonitor_pause_cb, slave);
        xmonitor_add_event_callback(XMONITOR_RESUMED, xmonitor_resume_cb, slave);
@@ -492,7 +495,7 @@ HAPI const int const slave_refcnt(struct slave_node *slave)
        return slave->refcnt;
 }
 
-HAPI struct slave_node *slave_create(const char *name, int is_secured, const char *abi, const char *pkgname, int network, const char *hw_acceleration)
+HAPI struct slave_node *slave_create(const char *name, int is_secured, const char *abi, const char *pkgname, int network, const char *hw_acceleration, int launch_async)
 {
        struct slave_node *slave;
 
@@ -504,7 +507,7 @@ HAPI struct slave_node *slave_create(const char *name, int is_secured, const cha
                return slave;
        }
 
-       slave = create_slave_node(name, is_secured, abi, pkgname, network, hw_acceleration);
+       slave = create_slave_node(name, is_secured, abi, pkgname, network, hw_acceleration, launch_async);
        if (!slave) {
                return NULL;
        }
@@ -660,7 +663,13 @@ static Eina_Bool relaunch_timer_cb(void *data)
                        bundle_add(param, WIDGET_CONF_BUNDLE_SLAVE_ABI, slave->abi);
                        bundle_add(param, WIDGET_CONF_BUNDLE_SLAVE_HW_ACCELERATION, slave->hw_acceleration);
 
-                       slave->pid = (pid_t)aul_launch_app(slave_pkgname(slave), param);
+                       if (slave->launch_async) {
+                               ErrPrint("Launch App Async [%s]\n", slave_pkgname(slave));
+                               slave->pid = (pid_t)aul_launch_app_async(slave_pkgname(slave), param);
+                       } else {
+                               ErrPrint("Launch App Sync [%s]\n", slave_pkgname(slave));
+                               slave->pid = (pid_t)aul_launch_app(slave_pkgname(slave), param);
+                       }
 
                        bundle_free(param);
 
@@ -760,7 +769,13 @@ HAPI int slave_activate(struct slave_node *slave)
                bundle_add(param, WIDGET_CONF_BUNDLE_SLAVE_ABI, slave->abi);
                bundle_add(param, WIDGET_CONF_BUNDLE_SLAVE_HW_ACCELERATION, slave->hw_acceleration);
 
-               slave->pid = (pid_t)aul_launch_app(slave_pkgname(slave), param);
+               if (slave->launch_async) {
+                       ErrPrint("Launch App Async [%s]\n", slave_pkgname(slave));
+                       slave->pid = (pid_t)aul_launch_app_async(slave_pkgname(slave), param);
+               } else {
+                       ErrPrint("Launch App Sync [%s]\n", slave_pkgname(slave));
+                       slave->pid = (pid_t)aul_launch_app(slave_pkgname(slave), param);
+               }
 
                bundle_free(param);
 
@@ -1437,7 +1452,7 @@ HAPI struct slave_node *slave_find_by_pkgname(const char *pkgname)
 
        EINA_LIST_FOREACH(s_info.slave_list, l, slave) {
                if (!strcmp(slave_pkgname(slave), pkgname)) {
-                       if (slave_pid(slave) == (pid_t)-1) {
+                       if (slave_pid(slave) == (pid_t)-1 || slave_pid(slave) == (pid_t)0) {
                                return slave;
                        }
                }
@@ -1875,7 +1890,8 @@ HAPI int slave_set_priority(struct slave_node *slave, int priority)
        }
 
        pid = slave_pid(slave);
-       if (pid < 0) {
+       if (pid <= 0) {
+               DbgPrint("Skip for %d\n", pid);
                return WIDGET_ERROR_INVALID_PARAMETER;
        }
 
@@ -1897,7 +1913,8 @@ HAPI int slave_priority(struct slave_node *slave)
        }
 
        pid = slave_pid(slave);
-       if (pid < 0) {
+       if (pid <= 0) {
+               DbgPrint("Skip for %d\n", pid);
                return WIDGET_ERROR_INVALID_PARAMETER;
        }