_mali_osk_errcode_t _mali_internal_profiling_start(u32 * limit) { _mali_osk_errcode_t ret; mali_profiling_entry *new_profile_entries; _mali_osk_mutex_wait(lock); if (MALI_PROFILING_STATE_RUNNING == prof_state) { _mali_osk_mutex_signal(lock); return _MALI_OSK_ERR_BUSY; } new_profile_entries = _mali_osk_valloc(*limit * sizeof(mali_profiling_entry)); if (NULL == new_profile_entries) { _mali_osk_vfree(new_profile_entries); return _MALI_OSK_ERR_NOMEM; } if (MALI_PROFILING_MAX_BUFFER_ENTRIES < *limit) { *limit = MALI_PROFILING_MAX_BUFFER_ENTRIES; } profile_mask = 1; while (profile_mask <= *limit) { profile_mask <<= 1; } profile_mask >>= 1; *limit = profile_mask; profile_mask--; /* turns the power of two into a mask of one less */ if (MALI_PROFILING_STATE_IDLE != prof_state) { _mali_osk_mutex_signal(lock); _mali_osk_vfree(new_profile_entries); return _MALI_OSK_ERR_INVALID_ARGS; /* invalid to call this function in this state */ } profile_entries = new_profile_entries; ret = _mali_timestamp_reset(); if (_MALI_OSK_ERR_OK == ret) { prof_state = MALI_PROFILING_STATE_RUNNING; } else { _mali_osk_vfree(profile_entries); profile_entries = NULL; } register_trace_mali_timeline_event(probe_mali_timeline_event, NULL); _mali_osk_mutex_signal(lock); return ret; }
inline _mali_osk_errcode_t _mali_osk_profiling_start(u32 * limit) { _mali_osk_errcode_t ret; mali_profiling_entry *new_profile_entries = _mali_osk_valloc(*limit * sizeof(mali_profiling_entry)); if(NULL == new_profile_entries) { return _MALI_OSK_ERR_NOMEM; } _mali_osk_lock_wait(lock, _MALI_OSK_LOCKMODE_RW); if (prof_state != MALI_PROFILING_STATE_IDLE) { _mali_osk_lock_signal(lock, _MALI_OSK_LOCKMODE_RW); _mali_osk_vfree(new_profile_entries); return _MALI_OSK_ERR_INVALID_ARGS; /* invalid to call this function in this state */ } if (*limit > MALI_PROFILING_MAX_BUFFER_ENTRIES) { *limit = MALI_PROFILING_MAX_BUFFER_ENTRIES; } profile_entries = new_profile_entries; profile_entry_count = *limit; ret = _mali_timestamp_reset(); if (ret == _MALI_OSK_ERR_OK) { prof_state = MALI_PROFILING_STATE_RUNNING; } else { _mali_osk_vfree(profile_entries); profile_entries = NULL; } _mali_osk_lock_signal(lock, _MALI_OSK_LOCKMODE_RW); return ret; }