Advertisement
venkat_330

Message queue with GLIB

Aug 14th, 2013
160
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.66 KB | None | 0 0
  1.         ####MSG.H#######
  2.         #define MAX_MSG_SIZE 5120
  3.         typedef struct
  4.         {
  5.             int msgType;
  6.             int msgSize;
  7.             char msgBuf[MAX_MSG_SIZE];
  8.         }STRUCT_MSG;
  9.  
  10.         ####msg.c####
  11.         #include <glib.h>
  12.         #include <Msg.h>
  13.  
  14.         G_LOCK_DEFINE_STATIC (queue_memchunk);
  15.         static GMemChunk   *queue_memchunk = NULL;
  16.         static GTrashStack *free_queue_nodes = NULL;
  17.  
  18.         STRUCT_MSG *txMsg;
  19.  
  20.         //mqd_t msgQueueId[6];
  21.         GQueue *msgQueueId[6];
  22.  
  23.         int PostMessageQ(int channel, int msgType, char *msgBuf, int msgSize)
  24.         {
  25.             txMsg = (STRUCT_MSG*)malloc(sizeof(STRUCT_MSG));
  26.             txMsg->msgType = msgType;
  27.             txMsg->msgSize = msgSize;
  28.             memcpy(&txMsg->msgBuf[0],&msgBuf[0],msgSize);
  29.             g_queue_push_head (&msgQueueId[channel], (char *)&txMsg);
  30.             return 0;
  31.         }
  32.  
  33.         int PendMessageQ(int channel, STRUCT_MSG *rxMsgptr)
  34.         {
  35.             gpointer rxMsg;
  36.             rxMsg = g_queue_pop_head (&msgQueueId[channel]);
  37.             memcpy(&rxMsgptr[0],&rxMsg[0],sizeof(STRUCT_MSG));
  38.         }
  39.  
  40.  
  41.         GQueue*
  42.         g_queue_create (int channel)
  43.         {
  44.           G_LOCK (queue_memchunk);
  45.           msgQueueId[channel] = g_trash_stack_pop (&free_queue_nodes);
  46.  
  47.           if (!msgQueueId[channel])
  48.             {
  49.               if (!queue_memchunk)
  50.                 queue_memchunk = g_mem_chunk_new ("GLib GQueue chunk",
  51.                                                   sizeof (GNode),
  52.                                                   sizeof (GNode) * 128,
  53.                                                   G_ALLOC_ONLY);
  54.               msgQueueId[channel] = g_chunk_new (GQueue, queue_memchunk);
  55.             }
  56.           G_UNLOCK (queue_memchunk);
  57.  
  58.           msgQueueId[channel]->head = NULL;
  59.           msgQueueId[channel]->tail = NULL;
  60.           msgQueueId[channel]->length = 0;
  61.           //msgQueueId[channel] = queue;
  62.           return msgQueueId[channel];
  63.         }
  64.  
  65.         void
  66.         g_queue_free (GQueue *queue)
  67.         {
  68.           g_return_if_fail (queue != NULL);
  69.  
  70.           g_list_free (queue->head);
  71.  
  72.           G_LOCK (queue_memchunk);
  73.           g_trash_stack_push (&free_queue_nodes, queue);
  74.           G_UNLOCK (queue_memchunk);
  75.         }
  76.  
  77.         void
  78.         g_queue_push_head (GQueue  *queue,
  79.                            gpointer data)
  80.         {
  81.           g_return_if_fail (queue != NULL);
  82.  
  83.           queue->head = g_list_prepend (queue->head, data);
  84.           if (!queue->tail)
  85.             queue->tail = queue->head;
  86.           queue->length++;
  87.         }
  88.  
  89.         void
  90.         g_queue_push_head_link (GQueue *queue,
  91.                                 GList  *link)
  92.         {
  93.           g_return_if_fail (queue != NULL);
  94.           g_return_if_fail (link != NULL);
  95.           g_return_if_fail (link->prev != NULL);
  96.           g_return_if_fail (link->next != NULL);
  97.  
  98.           link->next = queue->head;
  99.           if (queue->head)
  100.             queue->head->prev = link;
  101.           else
  102.             queue->tail = link;
  103.           queue->head = link;
  104.           queue->length++;
  105.         }
  106.  
  107.         void
  108.         g_queue_push_tail (GQueue  *queue,
  109.                            gpointer data)
  110.         {
  111.           g_return_if_fail (queue != NULL);
  112.  
  113.           queue->tail = g_list_append (queue->tail, data);
  114.           if (queue->tail->next)
  115.             queue->tail = queue->tail->next;
  116.           else
  117.             queue->head = queue->tail;
  118.           queue->length++;
  119.         }
  120.  
  121.         void
  122.         g_queue_push_tail_link (GQueue *queue,
  123.                                 GList  *link)
  124.         {
  125.           g_return_if_fail (queue != NULL);
  126.           g_return_if_fail (link != NULL);
  127.           g_return_if_fail (link->prev != NULL);
  128.           g_return_if_fail (link->next != NULL);
  129.  
  130.           link->prev = queue->tail;
  131.           if (queue->tail)
  132.             queue->tail->next = link;
  133.           else
  134.             queue->head = link;
  135.           queue->tail = link;
  136.           queue->length++;
  137.         }
  138.  
  139.         gpointer
  140.         g_queue_pop_head (GQueue *queue)
  141.         {
  142.           g_return_val_if_fail (queue != NULL, NULL);
  143.  
  144.           if (queue->head)
  145.             {
  146.               GList *node = queue->head;
  147.               gpointer data = node->data;
  148.  
  149.               queue->head = node->next;
  150.               if (queue->head)
  151.                 queue->head->prev = NULL;
  152.               else
  153.                 queue->tail = NULL;
  154.               g_list_free_1 (node);
  155.               queue->length--;
  156.               printf("First in line is %s\n",data );
  157.               return data;
  158.             }
  159.  
  160.           return NULL;
  161.         }
  162.  
  163.         GList*
  164.         g_queue_pop_head_link (GQueue *queue)
  165.         {
  166.           g_return_val_if_fail (queue != NULL, NULL);
  167.  
  168.           if (queue->head)
  169.             {
  170.               GList *node = queue->head;
  171.  
  172.               queue->head = node->next;
  173.               if (queue->head)
  174.                 {
  175.                   queue->head->prev = NULL;
  176.                   node->next = NULL;
  177.                 }
  178.               else
  179.                 queue->tail = NULL;
  180.               queue->length--;
  181.  
  182.               return node;
  183.             }
  184.  
  185.           return NULL;
  186.         }
  187.  
  188.         gpointer
  189.         g_queue_pop_tail (GQueue *queue)
  190.         {
  191.           g_return_val_if_fail (queue != NULL, NULL);
  192.  
  193.           if (queue->tail)
  194.             {
  195.               GList *node = queue->tail;
  196.               gpointer data = node->data;
  197.  
  198.               queue->tail = node->prev;
  199.               if (queue->tail)
  200.                 queue->tail->next = NULL;
  201.               else
  202.                 queue->head = NULL;
  203.               queue->length--;
  204.               g_list_free_1 (node);
  205.  
  206.               return data;
  207.             }
  208.  
  209.           return NULL;
  210.         }
  211.  
  212.         GList*
  213.         g_queue_pop_tail_link (GQueue *queue)
  214.         {
  215.           g_return_val_if_fail (queue != NULL, NULL);
  216.  
  217.           if (queue->tail)
  218.             {
  219.               GList *node = queue->tail;
  220.  
  221.               queue->tail = node->prev;
  222.               if (queue->tail)
  223.                 {
  224.                   queue->tail->next = NULL;
  225.                   node->prev = NULL;
  226.                 }
  227.               else
  228.                 queue->head = NULL;
  229.               queue->length--;
  230.  
  231.               return node;
  232.             }
  233.  
  234.           return NULL;
  235.         }
  236.  
  237.         gboolean
  238.         g_queue_is_empty (GQueue *queue)
  239.         {
  240.           g_return_val_if_fail (queue != NULL, TRUE);
  241.  
  242.           return queue->head == NULL;
  243.         }
  244.  
  245.         gpointer
  246.         g_queue_peek_head (GQueue *queue)
  247.         {
  248.           g_return_val_if_fail (queue != NULL, NULL);
  249.  
  250.           return queue->head ? queue->head->data : NULL;
  251.         }
  252.  
  253.         gpointer
  254.         g_queue_peek_tail (GQueue *queue)
  255.         {
  256.           g_return_val_if_fail (queue != NULL, NULL);
  257.  
  258.           return queue->tail ? queue->tail->data : NULL;
  259.         }
  260.  
  261.         ###main.c####
  262.  
  263.         int main(int argc, char *argv[])
  264.         {
  265.             STRUCT_MSG test;
  266.             printf("MsgBuf Valusse is ::");
  267.             g_queue_create(1);
  268.             g_queue_create(2);
  269.             PostMessageQ(1,4,"testmesg",8);
  270.             PendMessageQ(1,&test);
  271.             printf("MIAN MsgBuf Value is :: %s\n",test.msgBuf);
  272.             PendMessageQ(2,&test);
  273.             printf("ENd of main");
  274.             return 0;
  275.         }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement