Skip to content

Commit

Permalink
Don't crash if freeing a hardware surface after the video mode has been
Browse files Browse the repository at this point in the history
reset.  Fortunately we keep track of the video memory internally.
  • Loading branch information
Sam Lantinga committed Jul 12, 2001
1 parent 7075c20 commit 7f9bb1f
Showing 1 changed file with 25 additions and 23 deletions.
48 changes: 25 additions & 23 deletions src/video/dga/SDL_dgavideo.c
Expand Up @@ -740,42 +740,44 @@ static void DGA_FreeHWSurface(_THIS, SDL_Surface *surface)
vidmem_bucket *bucket, *freeable;

/* Look for the bucket in the current list */
bucket = (vidmem_bucket *)surface->hwdata;
if ( (bucket == NULL) || ! bucket->used ) {
return;
for ( bucket=&surfaces; bucket; bucket=bucket->next ) {
if ( bucket == (vidmem_bucket *)surface->hwdata ) {
break;
}
}

/* Add the memory back to the total */
if ( bucket && bucket->used ) {
/* Add the memory back to the total */
#ifdef DGA_DEBUG
printf("Freeing bucket of %d bytes\n", bucket->size);
#endif
surfaces_memleft += bucket->size;
surfaces_memleft += bucket->size;

/* Can we merge the space with surrounding buckets? */
bucket->used = 0;
if ( bucket->next && ! bucket->next->used ) {
/* Can we merge the space with surrounding buckets? */
bucket->used = 0;
if ( bucket->next && ! bucket->next->used ) {
#ifdef DGA_DEBUG
printf("Merging with next bucket, for %d total bytes\n", bucket->size+bucket->next->size);
#endif
freeable = bucket->next;
bucket->size += bucket->next->size;
bucket->next = bucket->next->next;
if ( bucket->next ) {
bucket->next->prev = bucket;
freeable = bucket->next;
bucket->size += bucket->next->size;
bucket->next = bucket->next->next;
if ( bucket->next ) {
bucket->next->prev = bucket;
}
free(freeable);
}
free(freeable);
}
if ( bucket->prev && ! bucket->prev->used ) {
if ( bucket->prev && ! bucket->prev->used ) {
#ifdef DGA_DEBUG
printf("Merging with previous bucket, for %d total bytes\n", bucket->prev->size+bucket->size);
#endif
freeable = bucket;
bucket->prev->size += bucket->size;
bucket->prev->next = bucket->next;
if ( bucket->next ) {
bucket->next->prev = bucket->prev;
freeable = bucket;
bucket->prev->size += bucket->size;
bucket->prev->next = bucket->next;
if ( bucket->next ) {
bucket->next->prev = bucket->prev;
}
free(freeable);
}
free(freeable);
}
surface->pixels = NULL;
surface->hwdata = NULL;
Expand Down

0 comments on commit 7f9bb1f

Please sign in to comment.