From d081112cb7248eae9284e2aba7d528265c513049 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Sat, 19 Nov 2005 00:46:44 +0000 Subject: [PATCH] * removed tokens are no longer put on a stack and reused - every token is only used once now. If tokens were reused, you could eventually target the wrong (but valid again) messenger. * removed unused stuff (like GetList()). * some cleanup. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15028 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- headers/private/app/TokenSpace.h | 30 +++----------- src/kits/app/TokenSpace.cpp | 69 ++++++++++---------------------- 2 files changed, 28 insertions(+), 71 deletions(-) diff --git a/headers/private/app/TokenSpace.h b/headers/private/app/TokenSpace.h index 23682233e4..c2b2b7afc8 100644 --- a/headers/private/app/TokenSpace.h +++ b/headers/private/app/TokenSpace.h @@ -40,41 +40,23 @@ class BTokenSpace : public BLocker { ~BTokenSpace(); int32 NewToken(int16 type, void* object, - new_token_callback callback = NULL); + new_token_callback callback = NULL); bool RemoveToken(int32 token, remove_token_callback callback = NULL); bool CheckToken(int32 token, int16 type) const; status_t GetToken(int32 token, int16 type, void** object, - get_token_callback callback = NULL) const; - - status_t GetList(int32*& tokens, int32& count) const; - -// Possible expansion -// void Dump(BDataIO&, bool) const; -// int32 NewToken(void*, BDirectMessageTarget*, void (*)(short, void*)); -// bool SetTokenTarget(uint32, BDirectMessageTarget*); -// BDirectMessageTarget* TokenTarget(uint32 token, int16 type); + get_token_callback callback = NULL) const; private: - struct TTokenInfo { + struct token_info { int16 type; void* object; }; + typedef std::map TokenMap; - typedef std::map TTokenMap; - - TTokenMap fTokenMap; - std::stack fTokenBin; - int32 fTokenCount; + TokenMap fTokenMap; + int32 fTokenCount; }; -// Possible expansion -//_delete_tokens_(); -//_init_tokens_(); -//get_handler_token(short, void*); -//get_token_list(long, long*); -//new_handler_token(short, void*); -//remove_handler_token(short, void*); - extern _IMPEXP_BE BTokenSpace gDefaultTokens; } // namespace BPrivate diff --git a/src/kits/app/TokenSpace.cpp b/src/kits/app/TokenSpace.cpp index 8b35a54d09..d542dc49a8 100644 --- a/src/kits/app/TokenSpace.cpp +++ b/src/kits/app/TokenSpace.cpp @@ -19,10 +19,12 @@ namespace BPrivate { BTokenSpace gDefaultTokens; - // the one and only token space object per team + // the default token space - all handlers will go into that one BTokenSpace::BTokenSpace() + : + fTokenCount(1) { } @@ -38,16 +40,8 @@ BTokenSpace::NewToken(int16 type, void* object, { BAutolock locker(this); - TTokenInfo tokenInfo = { type, object }; - int32 token; - - if (fTokenBin.empty()) { - token = fTokenCount; - ++fTokenCount; - } else { - token = fTokenBin.top(); - fTokenBin.pop(); - } + token_info tokenInfo = { type, object }; + int32 token = fTokenCount++; fTokenMap[token] = tokenInfo; @@ -63,16 +57,14 @@ BTokenSpace::RemoveToken(int32 token, remove_token_callback callback) { BAutolock locker(this); - TTokenMap::iterator iter = fTokenMap.find(token); - if (iter == fTokenMap.end()) + TokenMap::iterator iterator = fTokenMap.find(token); + if (iterator == fTokenMap.end()) return false; if (callback) - callback(iter->second.type, iter->second.object); - - fTokenMap.erase(iter); - fTokenBin.push(token); + callback(iterator->second.type, iterator->second.object); + fTokenMap.erase(iterator); return true; } @@ -86,8 +78,8 @@ BTokenSpace::CheckToken(int32 token, int16 type) const { BAutolock locker(const_cast(*this)); - TTokenMap::const_iterator iter = fTokenMap.find(token); - if (iter != fTokenMap.end() && iter->second.type == type) + TokenMap::const_iterator iterator = fTokenMap.find(token); + if (iterator != fTokenMap.end() && iterator->second.type == type) return true; return false; @@ -95,44 +87,27 @@ BTokenSpace::CheckToken(int32 token, int16 type) const status_t -BTokenSpace::GetToken(int32 token, int16 type, void** object, +BTokenSpace::GetToken(int32 token, int16 type, void** _object, get_token_callback callback) const { BAutolock locker(const_cast(*this)); - TTokenMap::const_iterator iter = fTokenMap.find(token); - if (iter == fTokenMap.end() || iter->second.type != type) { - *object = NULL; + if (token < 1) + return B_ENTRY_NOT_FOUND; + + TokenMap::const_iterator iterator = fTokenMap.find(token); + + if (iterator == fTokenMap.end() || iterator->second.type != type) { + *_object = NULL; return B_ERROR; } - if (callback && !callback(iter->second.type, iter->second.object)) { - *object = NULL; + if (callback && !callback(iterator->second.type, iterator->second.object)) { + *_object = NULL; return B_ERROR; } - *object = iter->second.object; - - return B_OK; -} - - -status_t -BTokenSpace::GetList(int32*& tokens, int32& count) const -{ - BAutolock locker(const_cast(*this)); - - count = fTokenMap.size(); - tokens = (int32*)malloc(count * sizeof(int32)); - if (tokens == NULL) - return B_NO_MEMORY; - - TTokenMap::const_iterator iterator = fTokenMap.begin(); - for (int32 i = 0; iterator != fTokenMap.end(); i++) { - tokens[i] = iterator->first; - iterator++; - } - + *_object = iterator->second.object; return B_OK; }