public static PosixSemaphore Open(string name) { IntPtr semPtr = sem_open(name, (int)OpenFlags.O_CREAT, //TODO: fix OFlag (uint)(FilePermissions.S_IRUSR | FilePermissions.S_IWUSR), 0); if (semPtr == IntPtr.Zero) { throw new Exception($"Open PosixSemaphore failed. error = {Marshal.GetLastWin32Error()}"); } var ps = new PosixSemaphore(); ps.name = name; ps.sem = semPtr; ps.own = false; return(ps); }
/// <summary> /// Attempts to create the <see cref="EventWaitHandle"/> handles and initialise the node header and buffers. /// </summary> /// <returns>True if the events and nodes were initialised successfully.</returns> protected override bool DoOpen() { // Create signal events #if Linux if (IsOwnerOfSharedMemory) { DataExists = PosixSemaphore.Create(Name + "_evt_dataexists"); NodeAvailable = PosixSemaphore.Create(Name + "_evt_nodeavail"); } else { DataExists = PosixSemaphore.Open(Name + "_evt_dataexists"); NodeAvailable = PosixSemaphore.Open(Name + "_evt_nodeavail"); } #else DataExists = new EventWaitHandle(false, EventResetMode.AutoReset, Name + "_evt_dataexists"); NodeAvailable = new EventWaitHandle(false, EventResetMode.AutoReset, Name + "_evt_nodeavail"); #endif if (IsOwnerOfSharedMemory) { // Retrieve pointer to node header _nodeHeader = (NodeHeader *)(BufferStartPtr + NodeHeaderOffset); // Initialise the node header InitialiseNodeHeader(); // Initialise nodes entries InitialiseLinkedListNodes(); } else { // Load the NodeHeader _nodeHeader = (NodeHeader *)(BufferStartPtr + NodeHeaderOffset); NodeCount = _nodeHeader->NodeCount; NodeBufferSize = _nodeHeader->NodeBufferSize; } return(true); }