Beispiel #1
0
        public SharedMem(int srcChan, int dstChan, string name, long bufferSize)
        {
            if (name == null || name == "")
            {
                name = "Unnamed Channel";
            }

            this.name       = name;
            this.srcChan    = srcChan;
            this.dstChan    = dstChan;
            this.bufferSize = bufferSize;

            byte[]        dBytes = new byte[name.Length];
            ASCIIEncoding enc    = new ASCIIEncoding();

            shmemID = SharedMemNative.shmemchain_register_node_special(srcChan, dstChan, (int)bufferSize, enc.GetBytes(name));

            if (shmemID < 0)
            {
                throw new NotSupportedException("Failed to register shmem node. Error code #" + SharedMemNative.shmemchain_get_last_error() + " #" + SharedMemNative.shmemchain_get_last_errorcode());
            }

            /* try to get the real channel ids */
            foreach (NodeInfo info in GetNodeInfos())
            {
                if (info.shmemID == shmemID)
                {
                    this.srcChan = info.srcChan;
                    this.dstChan = info.dstChan;
                }
            }
        }
Beispiel #2
0
        public override int Read(byte[] buffer, int offset, int count)
        {
            int readParam = (int)readMode;

            if (SharedMemNative.shmemchain_get_last_error() != -100)
            {
                Log.AddMessage("Shmem Error: " + SharedMemNative.shmemchain_get_last_error() + " " + SharedMemNative.shmemchain_get_last_errorcode());
            }

            /* dynamic and time limited modes have the timeout in 100ms steps as parameter */
            if (readMode == eReadMode.Dynamic || readMode == eReadMode.TimeLimited || readMode == eReadMode.TimeLimitedNoPartial)
            {
                readParam |= ((readTimeout + 99) / 100);
            }

            /* directly read into buffer */
            if (offset == 0)
            {
                return((int)SharedMemNative.shmemchain_read_data(shmemID, buffer, (uint)count, readParam));
            }

            /* use a temporary buffer for writing at offset */
            byte[] tmpBuffer = new byte[count];
            int    ret       = (int)SharedMemNative.shmemchain_read_data(shmemID, tmpBuffer, (uint)count, readParam);

            Array.Copy(tmpBuffer, 0, buffer, offset, count);
            return(ret);
        }
Beispiel #3
0
        public static NodeInfo[] GetNodeInfos()
        {
            ArrayList nodes = new ArrayList();

            int[] nodeIds = new int[512];
            int   used    = SharedMemNative.shmemchain_get_all_nodes(nodeIds, nodeIds.Length);

            for (int pos = 0; pos < used; pos++)
            {
                byte[]  name = new byte[SharedMemNative.MAX_NAME_LENGTH];
                ulong[] data = new ulong[7];

                SharedMemNative.shmemchain_get_infos(nodeIds[pos], name, data);

                int stringLength = 0;
                while (name[stringLength] != (byte)0)
                {
                    stringLength++;
                }

                NodeInfo info = new NodeInfo();
                info.name         = new ASCIIEncoding().GetString(name, 0, stringLength);
                info.shmemID      = nodeIds[pos];
                info.srcChan      = (int)data[0];
                info.dstChan      = (int)data[1];
                info.bytesRead    = data[2];
                info.bytesWritten = data[3];
                info.bufferSize   = (uint)data[4];
                info.bufferUsed   = (uint)data[5];
                info.pct          = (int)data[6];

                nodes.Add(info);
            }

            return((NodeInfo[])nodes.ToArray(typeof(NodeInfo)));
        }
Beispiel #4
0
 public override void Write(byte[] buffer, int offset, int count)
 {
     Failed |= SharedMemNative.shmemchain_write_data_ex(shmemID, buffer, (uint)offset, (uint)count) < 0;
 }
Beispiel #5
0
 public override void Flush()
 {
     SharedMemNative.shmemchain_read_data(shmemID, null, 0, SharedMemNative.MODE_FLUSH);
 }
Beispiel #6
0
 public int Unregister()
 {
     return(SharedMemNative.shmemchain_unregister_node(shmemID));
 }