我正在使用SDL2开发应用程序,并且我面临一些似乎与SDL_RenderDrawPoint
功能相关的泄漏。
我发现泄漏的代码如下所示
void set_img_pixel(t_img *img, int x, int y, t_color color)
{
if (x >= 0 && x < img->res.width && y >= 0 && y < img->res.height)
{
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL);
pthread_mutex_lock(&img->mutex);
SDL_SetRenderTarget(img->renderer, img->img);
SDL_SetRenderDrawColor(img->renderer, color.r * 255, color.g * 255,
color.b * 255, 255);
SDL_RenderDrawPoint(img->renderer, x, y);
pthread_mutex_unlock(&img->mutex);
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
}
}
当我尝试发表评论SDL_SetRenderTarget
和SDL_RenderDrawPoint
时,我没有泄密。
我的应用程序的每个线程都有一个泄漏,只有当线程完成工作时才会出现泄漏,这意味着当他们完成渲染并且他们调用pthread_exit(NULL)
时。
这是调用我的set_img_pixel
static int render_scene_p2(t_env *env)
{
int x;
int y;
unsigned int current_pixel_cpy;
ft_lock_mult_thread(env);
current_pixel_cpy = env->processed_pixels;
env->processed_pixels++;
ft_unlock_mult_thread(env);
if (current_pixel_cpy >= (unsigned int)(env->scene->camera->res.height *
env->scene->camera->res.width))
{
env->finish = 0;
return (0);
}
y = current_pixel_cpy / env->scene->camera->res.width;
x = current_pixel_cpy % env->scene->camera->res.width;
set_img_pixel(&env->bg_img, x, y, get_pixel_color(env, x, y));
return (1);
}
void *render_scene(void *arg)
{
t_env *env;
env = (t_env *)arg;
pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, NULL);
while (1)
{
if (render_scene_p2(env) == 0)
break ;
}
pthread_exit(NULL);
}