From: Sung-hun Kim Date: Mon, 25 Jul 2022 05:45:59 +0000 (+0900) Subject: util: resource: Assign an unique resource id when a new resouce is created X-Git-Tag: submit/tizen/20220727.085152~2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=07de2009a3690831b7522ca14c74ea3ea2368750;p=platform%2Fcore%2Fsystem%2Fpass.git util: resource: Assign an unique resource id when a new resouce is created When PASS-daemon restarted unexpectedly, a pass client which is survived in spite of PASS-daemon's restart can access resources by using its own resource id (which is valid for previous PASS daemon). To prevent this situation, PASS should assign a unique resource id for each created resource even if PASS daemon is restarted. To this end, PASS initializes a global resource id (g_resource_id) by using the value of gettimeofday(). So, each resource will be assigned time-reflected resource id, and uniqueness is ensured unless the number of created resources crosses the time consumed before restarted. Change-Id: I0e30addf01a0ee21b1f18aca56010d39d2c90c99 Signed-off-by: Sung-hun Kim --- diff --git a/include/util/resource.h b/include/util/resource.h index 2569ccb..95cd10b 100644 --- a/include/util/resource.h +++ b/include/util/resource.h @@ -175,6 +175,7 @@ void *get_resource_privdata(struct resource *resource); int get_resource_id(struct resource *resource); int get_resource_type(struct resource *resource); int get_resource_ts(struct resource *resource, int64_t *ts_start, int64_t *ts_end); +void init_resource_id(void); int set_resource_privdata(struct resource *resource, void *priv); diff --git a/src/monitor/request-server.c b/src/monitor/request-server.c index c1bf04a..8a221c5 100644 --- a/src/monitor/request-server.c +++ b/src/monitor/request-server.c @@ -59,6 +59,8 @@ static int request_server_func(void *ctx, void **result) if (!g_request_server_run) return THREAD_RETURN_DONE; + init_resource_id(); + /* 0. initialize server socket */ server_socket = socket(AF_INET, SOCK_STREAM, 0); if (server_socket < 0) { diff --git a/src/util/resource.c b/src/util/resource.c index 0e4f9bb..a6fc0b8 100644 --- a/src/util/resource.c +++ b/src/util/resource.c @@ -19,6 +19,7 @@ #include #include #include +#include #include #include @@ -178,6 +179,34 @@ void delete_resource(struct resource *resource) do_delete_resource(resource); } +static int clear_sign_bit(unsigned int val) +{ + return (int)((val << 1) >> 1); +} + +void init_resource_id(void) +{ + int val; + struct timeval tv; + + /* + * Initial g_resource_id is set by a combination of + * tv_sec and tv_usec values of gettimeofday(). + * It ensures that PASS assigns a unique resource id + * for each create_resource request. + * + * Even PASS is restarted, a newly initialized value + * of g_resource_id reflects the current value of + * gettimeofday(). Thus, the uniqueness in resource + * id is kept unless the number of created resources + * crosses the time consumed (in msecs) before + * restarted. + */ + gettimeofday(&tv, NULL); + val = tv.tv_sec * 1000 + tv.tv_usec / 1000; + g_resource_id = clear_sign_bit(val); +} + struct resource *create_resource(int resource_type) { const struct resource_driver *driver = NULL; @@ -195,7 +224,8 @@ struct resource *create_resource(int resource_type) if (!resource) return NULL; - resource->id = __sync_fetch_and_add(&g_resource_id, 1); + resource->id = clear_sign_bit( + (unsigned int)__sync_fetch_and_add(&g_resource_id, 1)); resource->type = resource_type; resource->name = g_strdup(driver->name); resource->driver = driver;