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; }
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); }
public T dequeue() => MQ.mq_receive <T>(handle);
public void enqueue(T message) => MQ.mq_send(handle, message);