diff --git a/legacy/ecore/src/lib/ecore/Ecore.h b/legacy/ecore/src/lib/ecore/Ecore.h index 3c7192a409..d02a593d77 100644 --- a/legacy/ecore/src/lib/ecore/Ecore.h +++ b/legacy/ecore/src/lib/ecore/Ecore.h @@ -349,6 +349,8 @@ extern "C" { Eina_Bool try_no_queue); EAPI Eina_Bool ecore_thread_pool_data_add(Ecore_Thread *thread, const char *key, const void *value, Eina_Bool direct); + EAPI void *ecore_thread_pool_data_modify_or_add(Ecore_Thread *thread, const char *key, + const void *value); EAPI void *ecore_thread_pool_data_find(Ecore_Thread *thread, const char *key); EAPI Eina_Bool ecore_thread_pool_data_del(Ecore_Thread *thread, const char *key); EAPI Eina_Bool ecore_thread_cancel(Ecore_Thread *thread); diff --git a/legacy/ecore/src/lib/ecore/ecore_thread.c b/legacy/ecore/src/lib/ecore/ecore_thread.c index 6f15dbfbac..2045ce8049 100644 --- a/legacy/ecore/src/lib/ecore/ecore_thread.c +++ b/legacy/ecore/src/lib/ecore/ecore_thread.c @@ -849,6 +849,38 @@ ecore_thread_pool_data_add(Ecore_Thread *thread, const char *key, const void *va #endif } +/** + * @brief Modify data in the pool, or add if not found + * @param thread The thread context + * @param key The name string to add the data with + * @param value The data to add + * @param direct If true, this will not copy the key string (like eina_hash_direct_add) + * @return The old data associated with @p key on success if modified, NULL if added + * This adds/modifies data in the thread context, adding only if modify fails. + * This function can only be called by a heavy_run thread INSIDE the thread. + * All data added to the thread pool must be freed in the thread's func_end/func_cancel + * functions to avoid leaks. + */ +EAPI void * +ecore_thread_pool_data_modify_or_add(Ecore_Thread *thread, const char *key, const void *value) +{ + Ecore_Pthread_Worker *worker = (Ecore_Pthread_Worker *) thread; + if ((!thread) || (!key) || (!value)) + return NULL; +#ifdef EFL_HAVE_PTHREAD + if (worker->u.long_run.self != pthread_self()) return NULL; + + if (!worker->u.long_run.hash) + worker->u.long_run.hash = eina_hash_string_small_new(NULL); + + if (!worker->u.long_run.hash) + return NULL; + + return eina_hash_modify_or_add(worker->u.long_run.hash, key, value); +#else + return NULL; +#endif +} /** * @brief Find data in the pool's data