From 29e37d884277ecf79735206faa776287d03c239f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Wed, 4 Nov 2009 12:19:59 +0000 Subject: [PATCH] * Made BTokenSpace not throw any exceptions on memory shortage. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@33874 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- headers/private/app/TokenSpace.h | 2 +- src/kits/app/TokenSpace.cpp | 23 ++++++++++++++++++----- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/headers/private/app/TokenSpace.h b/headers/private/app/TokenSpace.h index c90709d586..c221d1de30 100644 --- a/headers/private/app/TokenSpace.h +++ b/headers/private/app/TokenSpace.h @@ -39,7 +39,7 @@ class BTokenSpace : public BLocker { ~BTokenSpace(); int32 NewToken(int16 type, void* object); - void SetToken(int32 token, int16 type, void* object); + bool SetToken(int32 token, int16 type, void* object); bool RemoveToken(int32 token); bool CheckToken(int32 token, int16 type) const; diff --git a/src/kits/app/TokenSpace.cpp b/src/kits/app/TokenSpace.cpp index 4477fe5def..c8fae5b432 100644 --- a/src/kits/app/TokenSpace.cpp +++ b/src/kits/app/TokenSpace.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2007, Haiku. + * Copyright 2001-2009, Haiku. * Distributed under the terms of the MIT License. * * Authors: @@ -38,9 +38,15 @@ BTokenSpace::NewToken(int16 type, void* object) BAutolock locker(this); token_info tokenInfo = { type, object, NULL }; - int32 token = fTokenCount++; + int32 token = fTokenCount; - fTokenMap[token] = tokenInfo; + try { + fTokenMap[token] = tokenInfo; + } catch (std::bad_alloc& exception) { + return -1; + } + + fTokenCount++; return token; } @@ -52,17 +58,24 @@ BTokenSpace::NewToken(int16 type, void* object) Don't mix NewToken() and this method unless you know what you're doing. */ -void +bool BTokenSpace::SetToken(int32 token, int16 type, void* object) { BAutolock locker(this); token_info tokenInfo = { type, object, NULL }; - fTokenMap[token] = tokenInfo; + + try { + fTokenMap[token] = tokenInfo; + } catch (std::bad_alloc& exception) { + return false; + } // this makes sure SetToken() plays more or less nice with NewToken() if (token >= fTokenCount) fTokenCount = token + 1; + + return true; }