forked from Bananymous/banan-os
				
			Kernel: Fix spinlock leaks with unix sockets
This commit is contained in:
		
							parent
							
								
									9d6656451a
								
							
						
					
					
						commit
						0066b20413
					
				|  | @ -289,10 +289,10 @@ namespace Kernel | ||||||
| 
 | 
 | ||||||
| 	BAN::ErrorOr<void> UnixDomainSocket::add_packet(BAN::ConstByteSpan packet) | 	BAN::ErrorOr<void> UnixDomainSocket::add_packet(BAN::ConstByteSpan packet) | ||||||
| 	{ | 	{ | ||||||
| 		auto state = m_packet_lock.lock(); | 		SpinLockGuard guard(m_packet_lock); | ||||||
| 		while (m_packet_sizes.full() || m_packet_size_total + packet.size() > s_packet_buffer_size) | 		while (m_packet_sizes.full() || m_packet_size_total + packet.size() > s_packet_buffer_size) | ||||||
| 		{ | 		{ | ||||||
| 			SpinLockAsMutex smutex(m_packet_lock, state); | 			SpinLockGuardAsMutex smutex(guard); | ||||||
| 			TRY(Thread::current().block_or_eintr_indefinite(m_packet_thread_blocker, &smutex)); | 			TRY(Thread::current().block_or_eintr_indefinite(m_packet_thread_blocker, &smutex)); | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  | @ -304,7 +304,6 @@ namespace Kernel | ||||||
| 			m_packet_sizes.push(packet.size()); | 			m_packet_sizes.push(packet.size()); | ||||||
| 
 | 
 | ||||||
| 		m_packet_thread_blocker.unblock(); | 		m_packet_thread_blocker.unblock(); | ||||||
| 		m_packet_lock.unlock(state); |  | ||||||
| 
 | 
 | ||||||
| 		epoll_notify(EPOLLIN); | 		epoll_notify(EPOLLIN); | ||||||
| 
 | 
 | ||||||
|  | @ -414,7 +413,7 @@ namespace Kernel | ||||||
| 
 | 
 | ||||||
| 	BAN::ErrorOr<size_t> UnixDomainSocket::recvfrom_impl(BAN::ByteSpan buffer, sockaddr*, socklen_t*) | 	BAN::ErrorOr<size_t> UnixDomainSocket::recvfrom_impl(BAN::ByteSpan buffer, sockaddr*, socklen_t*) | ||||||
| 	{ | 	{ | ||||||
| 		auto state = m_packet_lock.lock(); | 		SpinLockGuard guard(m_packet_lock); | ||||||
| 		while (m_packet_size_total == 0) | 		while (m_packet_size_total == 0) | ||||||
| 		{ | 		{ | ||||||
| 			if (m_info.has<ConnectionInfo>()) | 			if (m_info.has<ConnectionInfo>()) | ||||||
|  | @ -422,18 +421,12 @@ namespace Kernel | ||||||
| 				auto& connection_info = m_info.get<ConnectionInfo>(); | 				auto& connection_info = m_info.get<ConnectionInfo>(); | ||||||
| 				bool expected = true; | 				bool expected = true; | ||||||
| 				if (connection_info.target_closed.compare_exchange(expected, false)) | 				if (connection_info.target_closed.compare_exchange(expected, false)) | ||||||
| 				{ |  | ||||||
| 					m_packet_lock.unlock(state); |  | ||||||
| 					return 0; | 					return 0; | ||||||
| 				} |  | ||||||
| 				if (!connection_info.connection) | 				if (!connection_info.connection) | ||||||
| 				{ |  | ||||||
| 					m_packet_lock.unlock(state); |  | ||||||
| 					return BAN::Error::from_errno(ENOTCONN); | 					return BAN::Error::from_errno(ENOTCONN); | ||||||
| 				} |  | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 			SpinLockAsMutex smutex(m_packet_lock, state); | 			SpinLockGuardAsMutex smutex(guard); | ||||||
| 			TRY(Thread::current().block_or_eintr_indefinite(m_packet_thread_blocker, &smutex)); | 			TRY(Thread::current().block_or_eintr_indefinite(m_packet_thread_blocker, &smutex)); | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  | @ -453,7 +446,6 @@ namespace Kernel | ||||||
| 		m_packet_size_total -= nread; | 		m_packet_size_total -= nread; | ||||||
| 
 | 
 | ||||||
| 		m_packet_thread_blocker.unblock(); | 		m_packet_thread_blocker.unblock(); | ||||||
| 		m_packet_lock.unlock(state); |  | ||||||
| 
 | 
 | ||||||
| 		epoll_notify(EPOLLOUT); | 		epoll_notify(EPOLLOUT); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue