* @def TAG
* @brief Logging tag for module name
*/
-#define TAG PCF("UQUEUE")
+#define TAG "UQUEUE"
u_queue_t *u_queue_create()
{
queue->element = element;
queue->count++;
OIC_LOG_V(DEBUG, TAG, "Queue Count : %d", queue->count);
-
- return CA_STATUS_OK;
}
return CA_STATUS_OK;
u_queue_message_t *u_queue_get_element(u_queue_t *queue)
{
- u_queue_element *next = NULL;
u_queue_element *element = NULL;
u_queue_message_t *message = NULL;
if (NULL == queue)
{
- OIC_LOG(DEBUG, TAG, "QueueAddElement FAIL, Invalid Queue");
+ OIC_LOG(DEBUG, TAG, "QueueGetElement FAIL, Invalid Queue");
return NULL;
}
if (NULL == element)
{
- OIC_LOG(DEBUG, TAG, "QueueGetElement : empty, no messages");
return NULL;
}
- next = element->next;
- queue->element = next;
+ queue->element = element->next;
queue->count--;
message = element->message;
CAResult_t u_queue_reset(u_queue_t *queue)
{
- CAResult_t error = CA_STATUS_FAILED;
-
if (NULL == queue)
{
OIC_LOG(DEBUG, TAG, "QueueReset FAIL, Invalid Queue");
while (NULL != queue->element)
{
- error = u_queue_remove_element(queue);
- if (error == CA_STATUS_FAILED)
- break;
+ u_queue_remove_element(queue);
}
if (NO_MESSAGES != queue->count)
}
return queue->element->message;
}
+
+CAResult_t u_queue_remove_req_elements(u_queue_t *queue,
+ QueueContextDataDestroy callback, void *ctx,
+ QueueDataDestroyFunction destroy)
+{
+ if (NULL == queue)
+ {
+ OIC_LOG(DEBUG, TAG, "QueueRemoveReqElement FAIL, Invalid Queue");
+ return CA_STATUS_FAILED;
+ }
+
+ if (NULL == callback)
+ {
+ OIC_LOG(DEBUG, TAG, "QueueRemoveReqElement FAIL, NULL callback");
+ return CA_STATUS_FAILED;
+ }
+
+ u_queue_element *cur = queue->element;
+ u_queue_element *prev = NULL;
+ u_queue_element *remove = NULL;
+
+ while (NULL != cur)
+ {
+ if (cur->message && callback(cur->message->msg, cur->message->size, ctx))
+ {
+ remove = cur;
+ if (NULL != prev)
+ {
+ prev->next = cur->next;
+ }
+ else
+ {
+ queue->element = cur->next;
+ }
+ cur = cur->next;
+ if (NULL != destroy)
+ {
+ destroy(remove->message->msg, remove->message->size);
+ }
+ else
+ {
+ OICFree(remove->message->msg);
+ }
+ OICFree(remove->message);
+ OICFree(remove);
+ queue->count--;
+ }
+ else
+ {
+ prev = cur;
+ cur = cur->next;
+ }
+ }
+ return CA_STATUS_OK;
+}
+