forked from enlightenment/efl
ecore-drm: Add local function to free outputs and on any errors during
create, call it Basically, this will fix a potential leak (and a potential case of a false output getting added) IF during creation of outputs, something fails. @fix Signed-off-by: Chris Michael <cp.michael@samsung.com>
This commit is contained in:
parent
3408f1bd6d
commit
41147645d7
|
@ -366,8 +366,11 @@ _ecore_drm_output_create(Ecore_Drm_Device *dev, drmModeRes *res, drmModeConnecto
|
|||
}
|
||||
}
|
||||
|
||||
if (!output->current_mode)
|
||||
output->current_mode = _ecore_drm_output_mode_add(output, &crtc_mode);
|
||||
if ((!output->current_mode) && (crtc_mode.clock != 0))
|
||||
{
|
||||
output->current_mode = _ecore_drm_output_mode_add(output, &crtc_mode);
|
||||
if (!output->current_mode) goto mode_err;
|
||||
}
|
||||
|
||||
/* #ifdef HAVE_GBM */
|
||||
/* if ((dev->use_hw_accel) && (dev->gbm)) */
|
||||
|
@ -394,11 +397,14 @@ _ecore_drm_output_create(Ecore_Drm_Device *dev, drmModeRes *res, drmModeConnecto
|
|||
DBG("Setup Output %d for Software Rendering", output->crtc_id);
|
||||
}
|
||||
|
||||
/* TODO */
|
||||
/* TODO: Backlight */
|
||||
|
||||
return output;
|
||||
|
||||
mode_err:
|
||||
eina_stringshare_del(output->make);
|
||||
eina_stringshare_del(output->model);
|
||||
eina_stringshare_del(output->name);
|
||||
EINA_LIST_FREE(output->modes, mode)
|
||||
free(mode);
|
||||
drmModeFreeCrtc(output->crtc);
|
||||
|
@ -407,6 +413,26 @@ mode_err:
|
|||
return NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
_ecore_drm_output_free(Ecore_Drm_Output *output)
|
||||
{
|
||||
Ecore_Drm_Output_Mode *mode;
|
||||
|
||||
if (!output) return;
|
||||
|
||||
eina_stringshare_del(output->make);
|
||||
eina_stringshare_del(output->model);
|
||||
eina_stringshare_del(output->name);
|
||||
|
||||
EINA_LIST_FREE(output->modes, mode)
|
||||
free(mode);
|
||||
|
||||
drmModeFreeCrtc(output->crtc);
|
||||
dev->crtc_allocator &= ~(1 << output->crtc_id);
|
||||
|
||||
free(output);
|
||||
}
|
||||
|
||||
void
|
||||
_ecore_drm_output_frame_finish(Ecore_Drm_Output *output)
|
||||
{
|
||||
|
@ -521,15 +547,16 @@ ecore_drm_outputs_create(Ecore_Drm_Device *dev)
|
|||
{
|
||||
/* free the connector */
|
||||
drmModeFreeConnector(conn);
|
||||
_ecore_drm_output_free(output);
|
||||
continue;
|
||||
}
|
||||
|
||||
output->drm_fd = dev->drm.fd;
|
||||
dev->outputs = eina_list_append(dev->outputs, output);
|
||||
|
||||
if (!(enc = drmModeGetEncoder(dev->drm.fd, conn->encoder_id)))
|
||||
{
|
||||
drmModeFreeConnector(conn);
|
||||
_ecore_drm_output_free(output);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -537,6 +564,7 @@ ecore_drm_outputs_create(Ecore_Drm_Device *dev)
|
|||
{
|
||||
drmModeFreeEncoder(enc);
|
||||
drmModeFreeConnector(conn);
|
||||
_ecore_drm_output_free(output);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -544,6 +572,8 @@ ecore_drm_outputs_create(Ecore_Drm_Device *dev)
|
|||
|
||||
drmModeFreeCrtc(crtc);
|
||||
drmModeFreeEncoder(enc);
|
||||
|
||||
dev->outputs = eina_list_append(dev->outputs, output);
|
||||
}
|
||||
|
||||
/* free the connector */
|
||||
|
|
Loading…
Reference in New Issue