nfs4: Make idmapper initialization lazy

This commit is contained in:
Pawel Dziepak
2012-08-09 17:18:41 +02:00
parent f7c35cf464
commit 2431c4521c
3 changed files with 15 additions and 8 deletions
@@ -16,7 +16,8 @@
#include "idmapper/IdMapper.h" #include "idmapper/IdMapper.h"
IdMap* gIdMapper = NULL; IdMap* gIdMapper = NULL;
mutex gIdMapperLock;
IdMap::IdMap() IdMap::IdMap()
@@ -41,6 +41,7 @@ private:
}; };
extern IdMap* gIdMapper; extern IdMap* gIdMapper;
extern mutex gIdMapperLock;
#endif // IDMAP_H #endif // IDMAP_H
@@ -76,6 +76,12 @@ nfs4_mount(fs_volume* volume, const char* device, uint32 flags,
{ {
status_t result; status_t result;
MutexLocker locker(gIdMapperLock);
gIdMapper = new(std::nothrow) IdMap;
if (gIdMapper == NULL)
return B_NO_MEMORY;
locker.Unlock();
ServerAddress address; ServerAddress address;
char path[256]; char path[256];
result = ParseArguments(args, &address, path); result = ParseArguments(args, &address, path);
@@ -706,23 +712,20 @@ nfs4_init()
if (gRPCServerManager == NULL) if (gRPCServerManager == NULL)
return B_NO_MEMORY; return B_NO_MEMORY;
gIdMapper = new(std::nothrow) IdMap; mutex_init(&gIdMapperLock, "idmapper Init Lock");
if (gIdMapper == NULL) { gIdMapper = NULL;
delete gRPCServerManager;
return B_NO_MEMORY;
}
gWorkQueue = new(std::nothrow) WorkQueue; gWorkQueue = new(std::nothrow) WorkQueue;
if (gWorkQueue == NULL || gWorkQueue->InitStatus() != B_OK) { if (gWorkQueue == NULL || gWorkQueue->InitStatus() != B_OK) {
delete gWorkQueue; delete gWorkQueue;
delete gIdMapper; mutex_destroy(&gIdMapperLock);
delete gRPCServerManager; delete gRPCServerManager;
return B_NO_MEMORY; return B_NO_MEMORY;
} }
gRPCCallbackServer = new(std::nothrow) RPC::CallbackServer; gRPCCallbackServer = new(std::nothrow) RPC::CallbackServer;
if (gRPCCallbackServer == NULL) { if (gRPCCallbackServer == NULL) {
delete gIdMapper; mutex_destroy(&gIdMapperLock);
delete gWorkQueue; delete gWorkQueue;
delete gRPCServerManager; delete gRPCServerManager;
return B_NO_MEMORY; return B_NO_MEMORY;
@@ -742,6 +745,8 @@ nfs4_uninit()
delete gWorkQueue; delete gWorkQueue;
delete gRPCServerManager; delete gRPCServerManager;
mutex_destroy(&gIdMapperLock);
return B_OK; return B_OK;
} }