/**********************************************************
* Celestial Systems                                      **
* This program illustrate the service of Message queue   **
* by which real-time tasks can exchange or pass data     **  
* through a Xenomai-managed queue of messages.            ** 
**********************************************************/

/* Include Files */

#include <linux/kernel.h>
#include <native/task.h>
#include <native/queue.h>
/* Global Defines */

#define TASK_PRIO  99       /* Highest RT priority */
#define TASK_MODE  0        /* No flags */
#define TASK_STKSZ 4096     /* Stack size (in bytes) */

/* Global variables */

RT_TASK  task_desc;        /*Task   Descriptor*/
RT_QUEUE queue_desc;       /*Queue  Descriptor */

/*Register a Module*/

static int __init my_module(void)
{
       int err,len;
       char messages[10] = "celestial";
       void *msg;
       len= sizeof(messages);

        /*Create an Message Queue*/

         err= rt_queue_create(&queue_desc,"KERN_QUEUE",100,Q_UNLIMITED,Q_SHARED | Q_FIFO);
         if(err)
         printk("Error in creating Queue,ERROR = %d\n",err);
         else
         printk("Queue Created\n");

       /* Allocate a Message queue buffer. */

         msg = rt_queue_alloc(&queue_desc,sizeof(messages));
         if (msg==NULL)
         printk("Allocation fail\n");
         else
          {
           printk("Message queue buffer is allocated\n");
           //strcpy(msg,messages[10]);
           memcpy(msg,&messages, sizeof(messages));

           /*Send a Message to a queue*/
	   
           err= rt_queue_send(&queue_desc,msg,sizeof(messages),Q_FIFO);
           if(err < 0)
           	printk("Error while sending,ERROR  =%d\n",err);
           else
           	printk("Number of receivers which got awaken  %d\n", err);
           
	  }
          printk("INIT DONE\n");
	   return 0;

}

static void __exit exit_module(void)
{
printk("deleting task and queue and unbinding them\n");
int ret;

/*ret= rt_queue_unbind(&q_desc);
if(ret!=0)
{
printk("can't unbind\n");
}*/
ret= rt_queue_delete(&queue_desc);
if(ret!=0)
{
printk("error in deleting queue %d\n",ret);
}
ret= rt_task_delete(&task_desc);
if(ret!=0)
{
printk("error in deleting task %d\n",ret);
}
printk("all items are deleted\n");
}

EXPORT_SYMBOL (queue_desc);
module_init(my_module);
module_exit(exit_module);
MODULE_LICENSE("GPL");
