[MinGW/pthreads-win32] Wychodzenie z watku w DLL = blad?

0

Hej,

Korzystam z portu pthreads do win32. Mam sobie funkcje:

void *SQL_AuthThread(void *qp);

ktora wywoluje w ten sposob:

SQL_threads[i].rc = pthread_create(&SQL_threads[i].thread, NULL, SQL_AuthThread, (void *)q);

Gdy watek konczy prace program sie zawiesza powodujac blad (program wykonal nieprawidlowa operacje). Probowalem i przez pthread_exit(NULL), i przez return NULL, ciagle zwis. Jakies sugestie?

Z gory dzieki,

Rookie One

0

Wpuść to w GDB, pokaż wynik backtrace'a.

0

Obawiam sie ze nic z tego. Aplikacja hosta sie nie uruchamia z gdb. :/ Czegokolwiek bym nie sprobowal, program staje w momencie inicjalizacji OpenGL. Jakis inny pomysl?

Moze pomoze listing problematycznej funkcji:

void *SQL_AuthThread(void *qp) {
	MYSQL_RES *res;
	MYSQL_ROW row;
	t_hash hash;
	char *cmdbuf;
	char hashstr[8 * 5 + 1]; // kazdy z 4 calkowitych do 8 znakow + null
	my_ulonglong numrows;
	authQueryData_t *q = (authQueryData_t *)qp;
	
	if (!SQL_connection) {
		printFunc("[SQL]: Proba autoryzacji przy niezainicjowanym polaczeniu!\n");
		authSuccessFunc(q->clientNum);
		q->self->inuse = 0;
		pthread_exit(NULL);
	}
	
	// hashujemy haslo
	bnet_hash(&hash, sizeof(hash), q->password);
	strncpy(&hashstr[0], hash_get_str(hash), sizeof(hashstr));
	
	// wysylamy zapytanie do bazy MySQL
	cmdbuf = (char *)malloc(256); // jesli nie zalokujemy pamieci, sprintf zwroci NULL
	sprintf(cmdbuf, "SELECT uid, acct_passhash1 FROM %sBNET WHERE acct_username='%s'", tablePrefix, q->username);
	mysql_query(SQL_connection, cmdbuf);
	free((void *)cmdbuf);
	
	// pobieramy wynik
	res = mysql_store_result(SQL_connection);
	if (mysql_errno(SQL_connection)) {
		printFunc("[SQL]: Blad przy pobieraniu wyniku zapytania: %s", mysql_error(SQL_connection));
		switch (mysql_errno(SQL_connection)) {
			case CR_SERVER_GONE_ERROR:
				printFunc(" (wysylanie zapytania nie powiodlo sie)\n");
				break;
			case CR_SERVER_LOST:
				printFunc(" (brak odpowiedzi na zapytanie)\n");
				break;
			default:
				printFunc("\n");
		}
		q->self->inuse = 0;
		mysql_free_result(res);
		pthread_exit(NULL);
	}
	// dobieramy sie do danych
	numrows = mysql_num_rows(res);
	if (numrows == 1) { // mamy naszego usera
		//while ((row = mysql_fetch_row(res))) {
		row = mysql_fetch_row(res);
			if (mysql_errno(SQL_connection)) {
				printFunc("[SQL]: Blad przy pobieraniu wiersza: %s\n", mysql_error(SQL_connection));
				q->self->inuse = 0;
				mysql_free_result(res);
				pthread_exit(NULL);
			}
			if (!STRICMP(hashstr, row[1])) {
				q->userid = atoi(row[0]);
				authSuccessFunc(q->clientNum);
				q->self->inuse = 0;
				mysql_free_result(res);
				printFunc("Exiting thread\n");
                pthread_exit(NULL);
            }
        //}
		q->self->inuse = 0;
        authFailureFunc(q->clientNum);
		mysql_free_result(res);
        pthread_exit(NULL);
	} else if (numrows <= 0) {
		q->self->inuse = 0;
		authFailureFunc(q->clientNum);
		mysql_free_result(res);
		pthread_exit(NULL);
	} else { // to sie nie powinno zdarzyc - 2 userow o tych samych nickach? odrzuc i wypisz ostrzezenie w konsoli
		printFunc("[SQL]: UWAGA - %d uzytkownikow o tych samych danych: %s:%s!\n", numrows, q->username, q->password);
        q->self->inuse = 0;
		authFailureFunc(q->clientNum);
		mysql_free_result(res);
		pthread_exit(NULL);
	}
	// tu nigdy nie powinnismy dojsc
	mysql_free_result(res);
	q->self->inuse = 0;
	pthread_exit(NULL);
	return NULL; // zeby kompilator nie ostrzegal
}

Przy udanej probie logowania dostaje komunikat Exiting thread i w tym momencie program wisi. Przypominam, ze to DLL, a nie samodzielny program.

<EDIT>Napisalem testowy program konsolowy, w ktorym wszystko dziala jak trzeba. Co jest?</EDIT>

1 użytkowników online, w tym zalogowanych: 0, gości: 1