Пытаюсь сделать многооконное приложение OpenGL. Для создания окна я заполняю структуру
typedef struct{
int ID; // identificator
char *title; // title of window
GLuint Tex; // texture for image inside window
int GL_ID; // identificator of OpenGL window
GLubyte *rawdata; // raw image data
int w; int h; // image size
pthread_t glthread;// thread identificator
pthread_mutex_t mutex;// mutex for operations with image
} windowData;
typedef struct list_{
windowData *data;
struct list_ *next;
struct list_ *prev;
} WinList;
Все это инициализируется успешно, открывается и работает. Но как только я открываю 2 окна и пытаюсь закрыть одно из них, происходит сегфолт.
Закрываю так:
int destroyWindow(int window, winIdType type){
windowData *win;
if(type == OPENGL)
win = searchWindow_byGLID(window);
else
win = searchWindow(window);
if(!win) return 0;
pthread_mutex_lock(&win->mutex);
glDeleteTextures(1, &win->Tex);
glFinish();
glutDestroyWindow(win->GL_ID);
win->GL_ID = 0; // reset for forEachWindow()
pthread_mutex_unlock(&win->mutex);
//removeWindow(win->ID);
totWindows--;
return 1;
}
removeWindow(win->ID);
, то сегфолт не происходит. Однако, если ее раскомментировать, то приложение падает.Вот функция removeWindow:
int removeWindow(int winID){
WinList *node = searchWindowList(winID);
if(!node) return 0;
WinList_freeNode(&node);
return 1;
}
void WinList_freeNode(WinList **node){
if(!node || !*node) return;
WinList *cur = *node;
windowData *win = cur->data;
FREE(win->title);
FREE(win->rawdata); // *
pthread_mutex_destroy(&win->mutex);
if(cur->prev)
cur->prev->next = cur->next;
if(cur->next)
cur->next->prev = cur->prev;
FREE(*node); // *
}
Что здесь может быть не так? Как правильно освободить память, использующуюся OpenGL'ем?
Итак, во всем были виноваты мои кривые руки.