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; } } }
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 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))); }
public override void Write(byte[] buffer, int offset, int count) { Failed |= SharedMemNative.shmemchain_write_data_ex(shmemID, buffer, (uint)offset, (uint)count) < 0; }
public override void Flush() { SharedMemNative.shmemchain_read_data(shmemID, null, 0, SharedMemNative.MODE_FLUSH); }
public int Unregister() { return(SharedMemNative.shmemchain_unregister_node(shmemID)); }