* Now gets the net_socket module in init_stack() to make sure it's initialized

as long as the stack is loaded.
* This fixes another regression from moving the socket API into the kernel.
* Thanks to Romain for reporting this!


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@30198 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler
2009-04-16 10:54:07 +00:00
parent 32537299cb
commit 7caa5d430c
2 changed files with 138 additions and 123 deletions
@@ -1604,6 +1604,7 @@ socket_std_ops(int32 op, ...)
return B_OK; return B_OK;
} }
case B_MODULE_UNINIT: case B_MODULE_UNINIT:
ASSERT(sSocketList.IsEmpty());
mutex_destroy(&sSocketLock); mutex_destroy(&sSocketLock);
#ifdef ADD_DEBUGGER_COMMANDS #ifdef ADD_DEBUGGER_COMMANDS
+37 -23
View File
@@ -1,5 +1,5 @@
/* /*
* Copyright 2006-2008, Haiku, Inc. All Rights Reserved. * Copyright 2006-2009, Haiku, Inc. All Rights Reserved.
* Distributed under the terms of the MIT License. * Distributed under the terms of the MIT License.
* *
* Authors: * Authors:
@@ -338,7 +338,8 @@ chain::Lookup(hash_table *chains, int family, int type, int protocol)
/*static*/ struct chain* /*static*/ struct chain*
chain::Add(hash_table *chains, int family, int type, int protocol, va_list modules) chain::Add(hash_table* chains, int family, int type, int protocol,
va_list modules)
{ {
struct chain* chain = new (std::nothrow) ::chain(family, type, protocol); struct chain* chain = new (std::nothrow) ::chain(family, type, protocol);
if (chain == NULL) if (chain == NULL)
@@ -431,7 +432,7 @@ get_domain_protocols(net_socket *socket)
struct chain* chain; struct chain* chain;
{ {
MutexLocker locker(&sChainLock); MutexLocker _(sChainLock);
chain = chain::Lookup(sProtocolChains, socket->family, socket->type, chain = chain::Lookup(sProtocolChains, socket->family, socket->type,
socket->type == SOCK_RAW ? 0 : socket->protocol); socket->type == SOCK_RAW ? 0 : socket->protocol);
@@ -446,7 +447,7 @@ get_domain_protocols(net_socket *socket)
// create net_protocol objects for the protocols in the chain // create net_protocol objects for the protocols in the chain
status_t status = chain->Acquire(); status_t status = chain->Acquire();
if (status < B_OK) if (status != B_OK)
return status; return status;
net_protocol* last = NULL; net_protocol* last = NULL;
@@ -484,7 +485,7 @@ put_domain_protocols(net_socket *socket)
struct chain* chain; struct chain* chain;
{ {
MutexLocker locker(&sChainLock); MutexLocker _(sChainLock);
chain = chain::Lookup(sProtocolChains, socket->family, socket->type, chain = chain::Lookup(sProtocolChains, socket->family, socket->type,
socket->protocol); socket->protocol);
@@ -521,7 +522,7 @@ get_domain_datalink_protocols(net_interface *_interface)
struct chain* chain; struct chain* chain;
{ {
MutexLocker locker(&sChainLock); MutexLocker _(sChainLock);
chain = chain::Lookup(sDatalinkProtocolChains, interface->domain->family, chain = chain::Lookup(sDatalinkProtocolChains, interface->domain->family,
interface->device_interface->device->type, 0); interface->device_interface->device->type, 0);
@@ -539,8 +540,8 @@ get_domain_datalink_protocols(net_interface *_interface)
for (int32 i = 0; chain->infos[i] != NULL; i++) { for (int32 i = 0; chain->infos[i] != NULL; i++) {
net_datalink_protocol* protocol; net_datalink_protocol* protocol;
status_t status = ((net_datalink_protocol_module_info *)chain->infos[i])->init_protocol( status_t status = ((net_datalink_protocol_module_info*)
interface, &protocol); chain->infos[i])->init_protocol(interface, &protocol);
if (status < B_OK) { if (status < B_OK) {
// free protocols we already initialized // free protocols we already initialized
uninit_domain_datalink_protocols(interface); uninit_domain_datalink_protocols(interface);
@@ -572,7 +573,7 @@ put_domain_datalink_protocols(net_interface *_interface)
struct chain* chain; struct chain* chain;
{ {
MutexLocker locker(&sChainLock); MutexLocker _(sChainLock);
chain = chain::Lookup(sDatalinkProtocolChains, interface->domain->family, chain = chain::Lookup(sDatalinkProtocolChains, interface->domain->family,
interface->device_interface->device->type, 0); interface->device_interface->device->type, 0);
@@ -593,9 +594,11 @@ get_domain_receiving_protocol(net_domain *_domain, uint32 type,
struct net_domain_private* domain = (net_domain_private*)_domain; struct net_domain_private* domain = (net_domain_private*)_domain;
struct chain* chain; struct chain* chain;
TRACE(("get_domain_receiving_protocol(family %d, type %lu)\n", domain->family, type)); TRACE(("get_domain_receiving_protocol(family %d, type %lu)\n",
domain->family, type));
{ {
MutexLocker locker(&sChainLock); MutexLocker _(sChainLock);
chain = chain::Lookup(sReceivingProtocolChains, domain->family, chain = chain::Lookup(sReceivingProtocolChains, domain->family,
type, 0); type, 0);
@@ -604,7 +607,7 @@ get_domain_receiving_protocol(net_domain *_domain, uint32 type,
} }
status_t status = chain->Acquire(); status_t status = chain->Acquire();
if (status < B_OK) if (status != B_OK)
return status; return status;
*_module = (net_protocol_module_info*)chain->infos[0]; *_module = (net_protocol_module_info*)chain->infos[0];
@@ -619,7 +622,7 @@ put_domain_receiving_protocol(net_domain *_domain, uint32 type)
struct chain* chain; struct chain* chain;
{ {
MutexLocker locker(&sChainLock); MutexLocker _(sChainLock);
chain = chain::Lookup(sReceivingProtocolChains, domain->family, chain = chain::Lookup(sReceivingProtocolChains, domain->family,
type, 0); type, 0);
@@ -666,7 +669,8 @@ register_domain_datalink_protocols(int family, int type, ...)
TRACE(("register_domain_datalink_protocol(%d.%d)\n", family, type)); TRACE(("register_domain_datalink_protocol(%d.%d)\n", family, type));
MutexLocker locker(&sChainLock); MutexLocker locker(&sChainLock);
struct chain *chain = chain::Lookup(sDatalinkProtocolChains, family, type, 0); struct chain* chain
= chain::Lookup(sDatalinkProtocolChains, family, type, 0);
if (chain != NULL) if (chain != NULL)
return B_OK; return B_OK;
@@ -680,8 +684,8 @@ register_domain_datalink_protocols(int family, int type, ...)
if (chain == NULL) if (chain == NULL)
return B_NO_MEMORY; return B_NO_MEMORY;
// Add datalink interface protocol as the last protocol in the chain; it's name // Add datalink interface protocol as the last protocol in the chain; it's
// stays unset, so that it won't be part of the release/acquire process. // name stays unset, so that it won't be part of the release/acquire process.
uint32 count = 0; uint32 count = 0;
while (chain->modules[count] != NULL) { while (chain->modules[count] != NULL) {
@@ -699,13 +703,15 @@ register_domain_receiving_protocol(int family, int type, const char *moduleName)
TRACE(("register_domain_receiving_protocol(%d.%d, %s)\n", family, type, TRACE(("register_domain_receiving_protocol(%d.%d, %s)\n", family, type,
moduleName)); moduleName));
MutexLocker locker(&sChainLock); MutexLocker _(sChainLock);
struct chain *chain = chain::Lookup(sReceivingProtocolChains, family, type, 0); struct chain* chain
= chain::Lookup(sReceivingProtocolChains, family, type, 0);
if (chain != NULL) if (chain != NULL)
return B_OK; return B_OK;
chain = chain::Add(sReceivingProtocolChains, family, type, 0, moduleName, NULL); chain = chain::Add(sReceivingProtocolChains, family, type, 0, moduleName,
NULL);
if (chain == NULL) if (chain == NULL)
return B_NO_MEMORY; return B_NO_MEMORY;
@@ -742,15 +748,15 @@ status_t
init_stack() init_stack()
{ {
status_t status = init_domains(); status_t status = init_domains();
if (status < B_OK) if (status != B_OK)
return status; return status;
status = init_interfaces(); status = init_interfaces();
if (status < B_OK) if (status != B_OK)
goto err1; goto err1;
status = init_timers(); status = init_timers();
if (status < B_OK) if (status != B_OK)
goto err2; goto err2;
status = init_notifications(); status = init_notifications();
@@ -761,6 +767,11 @@ init_stack()
strerror(status)); strerror(status));
} }
module_info* dummy;
status = get_module(NET_SOCKET_MODULE_NAME, &dummy);
if (status != B_OK)
goto err3;
mutex_init(&sChainLock, "net chains"); mutex_init(&sChainLock, "net chains");
mutex_init(&sInitializeChainLock, "net intialize chains"); mutex_init(&sInitializeChainLock, "net intialize chains");
@@ -818,6 +829,7 @@ err6:
err5: err5:
mutex_destroy(&sInitializeChainLock); mutex_destroy(&sInitializeChainLock);
mutex_destroy(&sChainLock); mutex_destroy(&sChainLock);
err3:
uninit_timers(); uninit_timers();
err2: err2:
uninit_interfaces(); uninit_interfaces();
@@ -832,6 +844,7 @@ uninit_stack()
{ {
TRACE(("Unloading network stack\n")); TRACE(("Unloading network stack\n"));
put_module(NET_SOCKET_MODULE_NAME);
uninit_timers(); uninit_timers();
uninit_interfaces(); uninit_interfaces();
uninit_domains(); uninit_domains();
@@ -848,7 +861,8 @@ uninit_stack()
uint32 cookie = 0; uint32 cookie = 0;
while (true) { while (true) {
struct family *family = (struct family *)hash_remove_first(sFamilies, &cookie); struct family* family = (struct family*)hash_remove_first(sFamilies,
&cookie);
if (family == NULL) if (family == NULL)
break; break;