Exemplo n.º 1
0
LSMessageHandlerResult
_LSCustomMessageHandler(_LSTransportMessage *message, void *context)
{
    /* add the messages to our internal queue */
    LSHandle *sh = (LSHandle*)context;
    _LSTransportMessageRef(message);
    LSCustomMessageQueuePush(sh->custom_message_queue, message);
    return LSMessageHandlerResultHandled;
}
Exemplo n.º 2
0
/**
 *******************************************************************************
 * @brief Allocate a new serial list item.
 *
 * @param  serial   IN  serial (token)
 *
 * @retval  item on success
 * @retval  NULL on failure
 *******************************************************************************
 */
_LSTransportSerialListItem*
_LSTransportSerialListItemNew(LSMessageToken serial, _LSTransportMessage *message)
{
    _LSTransportSerialListItem *item = g_slice_new0(_LSTransportSerialListItem);

    item->serial = serial;
    _LSTransportMessageRef(message);
    item->message = message;

    return item;
}
static void
test_LSTransportIncoming_execute(int number_of_messages)
{
    _LSTransportIncoming *inqueue = _LSTransportIncomingNew();

    /* Is incoming message queue constructed? */
    g_assert(NULL != inqueue);
    g_assert(NULL != inqueue->complete_messages);

    /* The mutex should be initialized. */
    g_assert_cmpint(pthread_mutex_trylock(&inqueue->lock), !=, EINVAL);
    pthread_mutex_unlock(&inqueue->lock);

    _LSTransportMessage *messages[number_of_messages];
    int i;

    /* Fill queue with (possible) test data. */
    for(i = 0; i < number_of_messages; i++)
    {
        _LSTransportMessage *message = _LSTransportMessageNewRef(LS_TRANSPORT_MESSAGE_DEFAULT_PAYLOAD_SIZE);
        /* Increment ref count (possible to check message ref count after _LSTransportIncomingFree) */
        _LSTransportMessageRef(message);
        g_assert_cmpint(message->ref, ==, 2);
        messages[i] = message;

        g_queue_push_head(inqueue->complete_messages, message);
    }

    /* Simulate the message are processed */
    while (!g_queue_is_empty(inqueue->complete_messages))
    {
        _LSTransportMessage *message = g_queue_pop_head(inqueue->complete_messages);
        _LSTransportMessageUnref(message);
    }

    /* Free the struct. */
    _LSTransportIncomingFree(inqueue);

    /* The mutex should be destroyed. */
    g_assert_cmpint(pthread_mutex_trylock(&inqueue->lock), ==, EINVAL);

    /* See if the messages in the queue were unreferenced. */
    for(i = 0; i < number_of_messages; i++)
    {
        g_assert_cmpint(messages[i]->ref, ==, 1);
    }

    /* Cleanup. All testing is now over. */
    for(i = 0; i < number_of_messages; i++)
    {
        _LSTransportMessageUnref(messages[i]);
    }
}
Exemplo n.º 4
0
void
LSCustomMessageQueuePush(LSCustomMessageQueue *q, _LSTransportMessage *message)
{
    _LSTransportMessageRef(message);
    
    /* lock queue */
    pthread_mutex_lock(&q->lock);

    g_queue_push_tail(q->queue, message);
    
    /* unlock queue */
    pthread_mutex_unlock(&q->lock);

}
Exemplo n.º 5
0
/** 
* @brief Allocate LSMessage from _LSTransportMessage with a refcount of 1.
* 
* @param  transport_msg 
*
* @retval
*/
LSMessage *
_LSMessageNewRef(_LSTransportMessage *transport_msg, LSHandle *sh)
{
    LSMessage *message = g_new0(LSMessage, 1);
    if (message)
    {
        if (transport_msg)
            message->transport_msg = _LSTransportMessageRef(transport_msg);

        message->sh  = sh;
        message->ref = 1;
        //g_debug("%s(%p)", __FUNCTION__, message);
    }
    return message;
}
Exemplo n.º 6
0
/**
 *******************************************************************************
 * @brief Pops a message from the serial queue and removes it from the serial map.
 *
 * @attention locks the serial info lock
 *
 * @param  serial_info  IN  serial info
 *
 * @retval message on success
 * @retval NULL on empty serial queue
 *******************************************************************************
 */
_LSTransportMessage*
_LSTransportSerialPopHead(_LSTransportSerial *serial_info)
{
    _LSTransportMessage *message = NULL;
    SERIAL_INFO_LOCK(&serial_info->lock);

    _LSTransportSerialListItem *item = g_queue_pop_head(serial_info->queue);
    if (item)
    {
        message = item->message;
        _LSTransportMessageRef(message);
        g_hash_table_remove(serial_info->map, &item->serial);
        _LSTransportSerialListItemFree(item);
    }

    SERIAL_INFO_UNLOCK(&serial_info->lock);

    return message;
}