4 * Copyright (c) 2014 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: Suresh Kumar N <suresh.n@samsung.com>
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
25 #include <user_request.h>
27 #include "manager_types.h"
28 #include "manager_queue.h"
29 #include "internal/manager_internal.h"
31 #define INVALID_PEEK_INDEX (-1)
34 enum tcore_request_command command;
35 GSList *ur_list; /* UR list */
38 /******************************* Internal APIs *******************************/
39 static void __unref_ur(gpointer data)
41 UserRequest *ur = data;
42 tcore_user_request_unref(ur);
45 static void __clear_queue(GQueue *manager_queue)
47 ManagerQueueNode *node = NULL;
49 while (NULL != (node = g_queue_pop_head(manager_queue))) {
50 g_slist_free_full(node->ur_list, __unref_ur);
55 static gint __get_peek_index(GQueue *manager_queue, enum tcore_request_command command)
57 UserRequest *ur = NULL;
60 g_assert(manager_queue != NULL);
63 * Peek each 'node' and check if there is a 'ur'
64 * with matching 'command'.
67 ur = g_queue_peek_nth(manager_queue, peek_index);
71 if (tcore_user_request_get_command(ur) == command)
77 return ((ur == NULL) ? INVALID_PEEK_INDEX : peek_index);
80 static GQueue *__get_queue(Manager *manager)
82 TcorePlugin *plugin = tcore_manager_get_plugin(manager);
83 PrivateData *priv_data = tcore_plugin_ref_user_data(plugin);
84 g_assert(priv_data != NULL);
86 return priv_data->manager_queue;
89 /******************************* External APIs *******************************/
90 GQueue *manager_queue_init(void)
92 GQueue *manager_queue = g_queue_new();
94 if (G_UNLIKELY(!manager_queue)) {
95 err("Failed to create Manager queue");
98 g_queue_init(manager_queue);
100 return manager_queue;
103 void manager_queue_deinit(GQueue *manager_queue)
109 * In case Queue is NOT empty, then clear the queue.
111 if (g_queue_is_empty(manager_queue) == FALSE)
112 __clear_queue(manager_queue);
114 g_queue_free(manager_queue);
117 void manager_queue_enqueue(Manager *manager, UserRequest *ur)
119 GQueue *manager_queue;
121 g_assert(manager != NULL);
122 g_assert(ur != NULL);
124 manager_queue = __get_queue(manager);
125 g_assert(manager_queue != NULL);
128 ur = tcore_user_request_ref(ur);
129 g_queue_push_tail(manager_queue, ur);
132 gboolean manager_queue_probe_command(Manager *manager,
133 enum tcore_request_command command)
135 GQueue *manager_queue;
138 g_assert(manager != NULL);
139 g_assert(command != 0);
141 manager_queue = __get_queue(manager);
142 g_assert(manager_queue != NULL);
144 peek_index = __get_peek_index(manager_queue, command);
146 return (peek_index == INVALID_PEEK_INDEX ? FALSE : TRUE);
149 guint manager_get_queue_length(Manager *manager,
150 enum tcore_request_command command)
152 GQueue *manager_queue;
153 guint queue_length = 0;
155 g_assert(manager != NULL);
156 g_assert(command != 0);
158 manager_queue = __get_queue(manager);
159 g_assert(manager_queue != NULL);
161 queue_length = g_queue_get_length(manager_queue);
166 UserRequest *manager_queue_dequeue(Manager *manager)
168 UserRequest *ur = NULL;
169 GQueue *manager_queue;
171 g_assert(manager != NULL);
173 manager_queue = __get_queue(manager);
174 g_assert(manager_queue != NULL);
176 if (g_queue_get_length(manager_queue) == 0)
179 ur = (UserRequest *)g_queue_pop_head(manager_queue);
180 g_assert(ur != NULL);
182 tcore_user_request_unref(ur);