diff options
author | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2011-10-25 02:51:44 +0400 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2011-10-25 02:51:44 +0400 |
commit | 47463742e264d5bfbf81215ea7d907c4e9a3a1e1 (patch) | |
tree | bab7eea6ec1903c5922d3d9dcea9c99a4b1cc42e /intern | |
parent | 4cd1e6337e516015383f3c47886b180ee16d2e3a (diff) | |
parent | 5b6224c84719213883334bcd9d2c46216053fe35 (diff) |
Cycles: svn merge -r41232:41266 ^/trunk/blender
Diffstat (limited to 'intern')
-rw-r--r-- | intern/ghost/intern/GHOST_SystemCocoa.mm | 4 | ||||
-rw-r--r-- | intern/memutil/MEM_CacheLimiter.h | 38 | ||||
-rw-r--r-- | intern/memutil/MEM_CacheLimiterC-Api.h | 6 | ||||
-rw-r--r-- | intern/memutil/intern/MEM_CacheLimiterC-Api.cpp | 10 |
4 files changed, 50 insertions, 8 deletions
diff --git a/intern/ghost/intern/GHOST_SystemCocoa.mm b/intern/ghost/intern/GHOST_SystemCocoa.mm index ffc858d2fc5..d9eab56cfdc 100644 --- a/intern/ghost/intern/GHOST_SystemCocoa.mm +++ b/intern/ghost/intern/GHOST_SystemCocoa.mm @@ -1685,6 +1685,10 @@ GHOST_TSuccess GHOST_SystemCocoa::handleKeyEvent(void *eventPtr) } } + /* arrow keys should not have utf8 */ + if ((keyCode > 266) && (keyCode < 271)) + utf8_buf[0] = '\0'; + if ((keyCode == GHOST_kKeyQ) && (m_modifierMask & NSCommandKeyMask)) break; //Cmd-Q is directly handled by Cocoa diff --git a/intern/memutil/MEM_CacheLimiter.h b/intern/memutil/MEM_CacheLimiter.h index 7f858c323c0..5194c97fd78 100644 --- a/intern/memutil/MEM_CacheLimiter.h +++ b/intern/memutil/MEM_CacheLimiter.h @@ -125,6 +125,10 @@ class MEM_CacheLimiter { public: typedef typename std::list<MEM_CacheLimiterHandle<T> *, MEM_Allocator<MEM_CacheLimiterHandle<T> *> >::iterator iterator; + typedef intptr_t (*MEM_CacheLimiter_DataSize_Func) (void *data); + MEM_CacheLimiter(MEM_CacheLimiter_DataSize_Func getDataSize_) + : getDataSize(getDataSize_) { + } ~MEM_CacheLimiter() { for (iterator it = queue.begin(); it != queue.end(); it++) { delete *it; @@ -143,17 +147,36 @@ public: } void enforce_limits() { intptr_t max = MEM_CacheLimiter_get_maximum(); - intptr_t mem_in_use= MEM_get_memory_in_use(); - intptr_t mmap_in_use= MEM_get_mapped_memory_in_use(); + intptr_t mem_in_use, cur_size; if (max == 0) { return; } + + if(getDataSize) { + mem_in_use = total_size(); + } else { + mem_in_use = MEM_get_memory_in_use(); + } + for (iterator it = queue.begin(); - it != queue.end() && mem_in_use + mmap_in_use > max;) { + it != queue.end() && mem_in_use > max;) { iterator jt = it; ++it; + + if(getDataSize) { + cur_size= getDataSize((*jt)->get()->get_data()); + } else { + cur_size= mem_in_use; + } + (*jt)->destroy_if_possible(); + + if(getDataSize) { + mem_in_use-= cur_size; + } else { + mem_in_use-= cur_size - MEM_get_memory_in_use(); + } } } void touch(MEM_CacheLimiterHandle<T> * handle) { @@ -164,8 +187,17 @@ public: handle->me = it; } private: + intptr_t total_size() { + intptr_t size = 0; + for (iterator it = queue.begin(); it != queue.end(); it++) { + size+= getDataSize((*it)->get()->get_data()); + } + return size; + } + std::list<MEM_CacheLimiterHandle<T>*, MEM_Allocator<MEM_CacheLimiterHandle<T> *> > queue; + MEM_CacheLimiter_DataSize_Func getDataSize; }; #endif // MEM_CACHELIMITER_H diff --git a/intern/memutil/MEM_CacheLimiterC-Api.h b/intern/memutil/MEM_CacheLimiterC-Api.h index 72645b9ce7b..768842caee6 100644 --- a/intern/memutil/MEM_CacheLimiterC-Api.h +++ b/intern/memutil/MEM_CacheLimiterC-Api.h @@ -41,6 +41,9 @@ typedef struct MEM_CacheLimiterHandle_s MEM_CacheLimiterHandleC; /* function used to remove data from memory */ typedef void(*MEM_CacheLimiter_Destruct_Func)(void*); +/* function used to measure stored data element size */ +typedef intptr_t(*MEM_CacheLimiter_DataSize_Func) (void*); + #ifndef MEM_CACHELIMITER_H extern void MEM_CacheLimiter_set_maximum(int m); extern int MEM_CacheLimiter_get_maximum(void); @@ -54,7 +57,8 @@ extern int MEM_CacheLimiter_get_maximum(void); */ extern MEM_CacheLimiterC * new_MEM_CacheLimiter( - MEM_CacheLimiter_Destruct_Func data_destructor); + MEM_CacheLimiter_Destruct_Func data_destructor, + MEM_CacheLimiter_DataSize_Func data_size); /** * Delete MEM_CacheLimiter diff --git a/intern/memutil/intern/MEM_CacheLimiterC-Api.cpp b/intern/memutil/intern/MEM_CacheLimiterC-Api.cpp index 1bc011a5be0..cc8d2497f37 100644 --- a/intern/memutil/intern/MEM_CacheLimiterC-Api.cpp +++ b/intern/memutil/intern/MEM_CacheLimiterC-Api.cpp @@ -54,8 +54,8 @@ typedef std::list<MEM_CacheLimiterHandleCClass*, class MEM_CacheLimiterCClass { public: - MEM_CacheLimiterCClass(MEM_CacheLimiter_Destruct_Func data_destructor_) - : data_destructor(data_destructor_) { + MEM_CacheLimiterCClass(MEM_CacheLimiter_Destruct_Func data_destructor_, MEM_CacheLimiter_DataSize_Func data_size) + : data_destructor(data_destructor_), cache(data_size) { } ~MEM_CacheLimiterCClass(); @@ -142,10 +142,12 @@ static inline handle_t* cast(MEM_CacheLimiterHandleC * l) } MEM_CacheLimiterC * new_MEM_CacheLimiter( - MEM_CacheLimiter_Destruct_Func data_destructor) + MEM_CacheLimiter_Destruct_Func data_destructor, + MEM_CacheLimiter_DataSize_Func data_size) { return (MEM_CacheLimiterC*) new MEM_CacheLimiterCClass( - data_destructor); + data_destructor, + data_size); } void delete_MEM_CacheLimiter(MEM_CacheLimiterC * This) |