Fix SEGV during storage.

SVN revision: 68126
This commit is contained in:
Leif Middelschulte 2012-02-19 22:13:19 +00:00
parent 95cb1ce29f
commit e9ecce3b3f
2 changed files with 35 additions and 34 deletions

View File

@ -150,7 +150,7 @@ struct _E_Randr_Serialized_Crtc
Evas_Coord_Point pos; Evas_Coord_Point pos;
Ecore_X_Randr_Orientation orientation; Ecore_X_Randr_Orientation orientation;
//the serialized mode_info //the serialized mode_info
Ecore_X_Randr_Mode_Info mode_info; Ecore_X_Randr_Mode_Info *mode_info;
}; };
struct _E_Randr_Serialized_Setup_12 struct _E_Randr_Serialized_Setup_12

View File

@ -70,11 +70,12 @@ e_randr_12_serialized_output_policy_free(E_Randr_Serialized_Output_Policy *polic
} }
void void
_serialized_mode_info_free(Ecore_X_Randr_Mode_Info *mode_info) _mode_info_free(Ecore_X_Randr_Mode_Info *mode_info)
{ {
EINA_SAFETY_ON_NULL_RETURN(mode_info); EINA_SAFETY_ON_NULL_RETURN(mode_info);
free(mode_info->name); free(mode_info->name);
free(mode_info);
} }
void void
@ -86,7 +87,7 @@ _serialized_crtc_free(E_Randr_Serialized_Crtc *sc)
EINA_LIST_FREE (sc->outputs, so) EINA_LIST_FREE (sc->outputs, so)
_serialized_output_free(so); _serialized_output_free(so);
_serialized_mode_info_free(&sc->mode_info); _mode_info_free(sc->mode_info);
free(sc); free(sc);
} }
@ -117,36 +118,35 @@ _eina_list_data_index_get(const Eina_List *list, const void *data)
return -1; return -1;
} }
void Ecore_X_Randr_Mode_Info
_mode_info_clone(Ecore_X_Randr_Mode_Info *dst, const Ecore_X_Randr_Mode_Info *src) *_mode_info_clone(const Ecore_X_Randr_Mode_Info *src)
{ {
EINA_SAFETY_ON_NULL_RETURN(dst); Ecore_X_Randr_Mode_Info *mi = NULL;
if (!src) EINA_SAFETY_ON_NULL_RETURN_VAL(src, NULL);
{
dst->xid = Ecore_X_Randr_None;
dst->name = NULL;
return;
}
dst->xid = src->xid; mi = E_NEW(Ecore_X_Randr_Mode_Info, 1);
dst->width = src->width;
dst->height = src->height; mi->xid = src->xid;
dst->dotClock = src->dotClock; mi->width = src->width;
dst->hSyncStart = src->hSyncStart; mi->height = src->height;
dst->hSyncEnd = src->hSyncEnd; mi->dotClock = src->dotClock;
dst->hTotal = src->hTotal; mi->hSyncStart = src->hSyncStart;
dst->hSkew = src->hSkew; mi->hSyncEnd = src->hSyncEnd;
dst->vSyncStart = src->vSyncStart; mi->hTotal = src->hTotal;
dst->vSyncEnd = src->vSyncEnd; mi->hSkew = src->hSkew;
dst->vTotal = src->vTotal; mi->vSyncStart = src->vSyncStart;
mi->vSyncEnd = src->vSyncEnd;
mi->vTotal = src->vTotal;
if (src->nameLength > 0) if (src->nameLength > 0)
{ {
dst->name = malloc(src->nameLength + 1); mi->name = malloc(src->nameLength + 1);
strncpy(dst->name, src->name, src->nameLength); strncpy(mi->name, src->name, src->nameLength);
} }
dst->nameLength = src->nameLength; mi->nameLength = src->nameLength;
dst->modeFlags = src->modeFlags; mi->modeFlags = src->modeFlags;
return mi;
} }
E_Randr_Edid_Hash E_Randr_Edid_Hash
@ -224,6 +224,7 @@ _serialized_crtc_new(E_Randr_Crtc_Info *crtc_info)
//Get relative index of CRTC //Get relative index of CRTC
sc->index = _eina_list_data_index_get(e_randr_screen_info.rrvd_info.randr_info_12->crtcs, crtc_info); sc->index = _eina_list_data_index_get(e_randr_screen_info.rrvd_info.randr_info_12->crtcs, crtc_info);
//Create list of serialized outputs //Create list of serialized outputs
EINA_LIST_FOREACH(crtc_info->outputs, iter, output_info) EINA_LIST_FOREACH(crtc_info->outputs, iter, output_info)
{ {
@ -236,7 +237,7 @@ _serialized_crtc_new(E_Randr_Crtc_Info *crtc_info)
sc->pos.y = crtc_info->geometry.y; sc->pos.y = crtc_info->geometry.y;
sc->orientation = crtc_info->current_orientation; sc->orientation = crtc_info->current_orientation;
//Clone mode //Clone mode
_mode_info_clone(&sc->mode_info, crtc_info->current_mode); sc->mode_info = _mode_info_clone(crtc_info->current_mode);
return sc; return sc;
} }
@ -266,7 +267,7 @@ _12_serialized_setup_new(void)
if (!sc) if (!sc)
continue; continue;
ss->crtcs = eina_list_append(ss->crtcs, sc); ss->crtcs = eina_list_append(ss->crtcs, sc);
fprintf(stderr, "E_RANDR: Serialized CRTC %d (index %d) in mode %s.\n", ci->xid, sc->index, sc->mode_info.name ? sc->mode_info.name : "(disabled)"); fprintf(stderr, "E_RANDR: Serialized CRTC %d (index %d) in mode %s.\n", ci->xid, sc->index, (sc->mode_info ? sc->mode_info->name : "(disabled)"));
} }
/* /*
@ -395,7 +396,7 @@ _12_try_restore_configuration(void)
E_Randr_Crtc_Info *ci; E_Randr_Crtc_Info *ci;
Ecore_X_Randr_Output *outputs_array; Ecore_X_Randr_Output *outputs_array;
E_Randr_Output_Info *output_info; E_Randr_Output_Info *output_info;
Ecore_X_Randr_Mode_Info *mi; Ecore_X_Randr_Mode_Info *mi = NULL;
Ecore_X_Randr_Mode mode; Ecore_X_Randr_Mode mode;
Eina_List *iter, *outputs_list, *outputs_iter; Eina_List *iter, *outputs_list, *outputs_iter;
Eina_Bool ret = EINA_TRUE; Eina_Bool ret = EINA_TRUE;
@ -413,12 +414,12 @@ _12_try_restore_configuration(void)
outputs_list = _find_matching_outputs(sc->outputs); outputs_list = _find_matching_outputs(sc->outputs);
outputs_array = _outputs_to_array(outputs_list); outputs_array = _outputs_to_array(outputs_list);
fprintf(stderr, "E_RANDR: \tSerialized mode "); fprintf(stderr, "E_RANDR: \tSerialized mode ");
if (sc->mode_info.xid == Ecore_X_Randr_None) if (!sc->mode_info)
{ {
fprintf(stderr, "was disabled.\n"); fprintf(stderr, "was disabled.\n");
mode = Ecore_X_Randr_None; mode = Ecore_X_Randr_None;
} }
else if ((mi = _find_matching_mode_info(&sc->mode_info))) else if ((mi = _find_matching_mode_info(sc->mode_info)))
{ {
fprintf(stderr, "is now known under the name %s.\n", mi->name); fprintf(stderr, "is now known under the name %s.\n", mi->name);
mode = mi->xid; mode = mi->xid;
@ -428,8 +429,8 @@ _12_try_restore_configuration(void)
// The serialized mode is no longer available // The serialized mode is no longer available
mi->name = malloc(MODE_STR_LENGTH_MAX); mi->name = malloc(MODE_STR_LENGTH_MAX);
//IMPROVABLE: Use random string, like mktemp for files //IMPROVABLE: Use random string, like mktemp for files
snprintf(mi->name, (MODE_STR_LENGTH_MAX - 1), "%ux%u,%lu,%lu", sc->mode_info.width, sc->mode_info.height, sc->mode_info.dotClock, sc->mode_info.modeFlags); snprintf(mi->name, (MODE_STR_LENGTH_MAX - 1), "%ux%u,%lu,%lu", sc->mode_info->width, sc->mode_info->height, sc->mode_info->dotClock, sc->mode_info->modeFlags);
mi = &sc->mode_info; mi = sc->mode_info;
mode = ecore_x_randr_mode_info_add(e_randr_screen_info.root, mi); mode = ecore_x_randr_mode_info_add(e_randr_screen_info.root, mi);
if (mode == Ecore_X_Randr_None) if (mode == Ecore_X_Randr_None)
{ {