コード例 #1
0
        public MessageQueue(int length, string queueName)
        {
            int cbMessage = Marshal.SizeOf <T>();

            if (cbMessage > 8192)
            {
                throw new ArgumentOutOfRangeException("By default, Linux limits size of queue messages to 8kb");
            }
            if (length > 10)
            {
                throw new ArgumentOutOfRangeException("By default, Linux limits the queue to 10 pending messages");
            }

            int    pid  = Process.GetCurrentProcess().Id;
            string name = $"/{ queueName }.{ pid }";

            MessageQueueAttributes mqa = new MessageQueueAttributes()
            {
                flags       = eMessageQueueFlags.NonBlocking,
                maxMessages = length,
                messageSize = cbMessage
            };
            int fd = MQ.mq_open(name, queueFlags, eFileAccess.OwnerAllAccess, ref mqa);

            if (fd < 0)
            {
                throw LibC.exception("mq_open", fd);
            }

            handle    = fd;
            this.name = name;
        }
コード例 #2
0
 public void Dispose()
 {
     if (handle >= 0)
     {
         int res = MQ.mq_close(handle);
         if (res < 0)
         {
             throw LibC.exception("mq_close", res);
         }
         res = MQ.mq_unlink(name);
         if (res < 0)
         {
             throw LibC.exception("mq_unlink", res);
         }
     }
     GC.SuppressFinalize(this);
 }
コード例 #3
0
 public T dequeue() => MQ.mq_receive <T>(handle);
コード例 #4
0
 public void enqueue(T message) => MQ.mq_send(handle, message);