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); }
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; } } }