+ // If reference count == 0, remove from main list
+ if( Node->ReferenceCount > 0 )
+ return ;
+
+ // Locate on list and remove
+ tPTY **prev_np;
+ if( pty->Name[0] ) {
+ RWLock_AcquireWrite(&glPTY_NamedPTYs);
+ prev_np = &gpPTY_FirstNamedPTY;
+ }
+ else {
+ RWLock_AcquireWrite(&glPTY_NumPTYs);
+ prev_np = &gpPTY_FirstNumPTY;
+ }
+
+ // Search list until *prev_np is equal to pty
+ for( tPTY *tmp = *prev_np; *prev_np != pty && tmp; prev_np = &tmp->Next, tmp = tmp->Next )
+ ;
+
+ // Remove
+ if( *prev_np != pty ) {
+ Log_Error("PTY", "PTY %p(%i/%s) not on list at deletion time", pty, pty->NumericName, pty->Name);
+ }
+ else {
+ *prev_np = pty->Next;
+ }
+
+ // Clean up lock
+ if( pty->Name[0] ) {
+ RWLock_Release(&glPTY_NamedPTYs);
+ giPTY_NamedCount --;
+ }
+ else {
+ RWLock_Release(&glPTY_NumPTYs);
+ giPTY_NumCount --;
+ }
+
+ // If there are no open children, we can safely free this PTY
+ if( pty->ClientNode.ReferenceCount == 0 )
+ free(pty);