LINUX.ORG.RU

Почему у потока меняется ID?

 ,


1

3

По мере выполнения потока в некоторый момент вдруг меняется его ID. Иными словами с некоторого момента времени pthread_self() начинает выдавать не тот ID потока, что был изначально. Причем новый ID по значению равен младшей части изначального. Что-то не пойму, как такое может быть. И даже не соображу пока, где искать ошибки.

Ответ на: комментарий от unt1tled

код-то покаж, может ты чето не то делаешь

Вероятность того, что я что-то не то делаю весьма высока, ибо, как показывает практика, обычно таки ошибки рано или поздно находятся у себя любимого, нежели во вне.

Вот только что показывать то, весь код? Пожалуйста. http://sourceforge.net/projects/bxfm/

Запостить основную функцию потока можно конечно. Только, думаю, дело не в ней. Там простая последовательность вызовов библиотечных и не библиотечных функций. При входе в одну из функций вся беда и происходит.

zloy_starper ★★★
() автор топика
Ответ на: комментарий от unt1tled
void * NewIfaceWindowThread(void * arg)
{
	IfaceBranche * IbPtr;
	char * config_fn, * ptr;
	Arg args[10];
	int n, i;
	Widget form;
	
	IbPtr = (IfaceBranche *) arg;
	
#ifdef DEBUG
	printf("!!!!!!!!Start Iface thread %d on %s address %p\n", IbPtr->thread_number, IbPtr->current_wd, IbPtr);
#endif
	
//	XtToolkitThreadInitialize();  
//	XtSetLanguageProc(NULL, NULL, NULL);
//	IbPtr->top_level = XtVaAppInitialize(&(IbPtr->app), "XmBryanFM", NULL, 0, NULL, 0,
//				NULL, NULL, 0);

#ifdef USE_INOTIFY
	IbPtr->i_fd = inotify_init();
#endif	
	
	IbPtr->top_level = XtVaOpenApplication (&(IbPtr->app), "XmBryanFM", NULL, 0, &glob_argc, glob_argv,
								NULL, sessionShellWidgetClass, NULL);
#ifdef DEBUG
	printf("Init app\n");
#endif

	if (!file_name_atom_ready)
	{
		FILE_NAME = XInternAtom (XtDisplay(IbPtr->top_level), "FILE_NAME", False);
		file_name_atom_ready = 1;
	}
	
	if (!delete_window_atom_ready)
	{
		WM_DELETE_WINDOW = XInternAtom (XtDisplay(IbPtr->top_level), "WM_DELETE_WINDOW", False);
		delete_window_atom_ready = 1;
	}

	if (!copy_atom_ready)
	{
		CopyAtom = XInternAtom(XtDisplay(IbPtr->top_level), "x-special/gnome-copied-files", False);
		copy_atom_ready = 1;
	}

#ifdef DEBUG
	printf("Init atom %ld\n", WM_DELETE_WINDOW);
#endif

	XtVaSetValues(IbPtr->top_level, XmNdeleteResponse, XmDO_NOTHING, NULL);
	{
		char cc;
		XtVaGetValues(IbPtr->top_level, XmNdeleteResponse, &cc, NULL);
#ifdef DEBUG
		if (cc == XmDO_NOTHING)
			printf("Mode no\n");
		else 
			printf("Mode yes\n");
#endif
	}

	XmAddWMProtocolCallback(IbPtr->top_level, WM_DELETE_WINDOW, CloseWindowCB, (XtPointer) IbPtr);

#ifdef DEBUG
	printf("Init close window callback\n");
#endif


	/* This block of code creates the main application window.  I will eventually
	* move this to an external function.  Eventually... */

	n = 0;
	XtSetArg(args[n], XmNwidth, 600);
	n++;
	XtSetArg(args[n], XmNheight, 450);
	n++;
	IbPtr->fm_main_window = XmCreateMainWindow(IbPtr->top_level, "fm_main_window", args, n);
/*****!!!!!*****/
//	XtAddCallback(IbPtr->fm_main_window, XmNdestroyCallback, MainWinDestroyCB, (XtPointer) NULL);

	XtManageChild(IbPtr->fm_main_window);

#ifdef DEBUG
	printf("Main wondow created\n");
#endif
	IbPtr->fm_menubar = CreateMenuBar(IbPtr);

#ifdef DEBUG
	printf("Menu bar created\n");
#endif

	IbPtr->parsed_trans = XtParseTranslationTable(dragTranslations);
	XtAppAddActions(IbPtr->app, dragActions, XtNumber(dragActions));

	IbPtr->fm_scroll_win = XtVaCreateWidget ("MainView", xmNlListWidgetClass, IbPtr->fm_main_window, 
											XmNuserData, (XtPointer) IbPtr, NULL);

//	XtAddCallback(IbPtr->fm_scroll_win, XmNdestroyCallback, ScrollWinDestroyCB, (XtPointer) NULL);
	SetFileViewAttributs(IbPtr);

#ifdef DEBUG
	printf("OK+1\n");
#endif


	form = XmCreateForm(IbPtr->fm_main_window, "fm_command_form", NULL, 0);



	n = 0;
	XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); n++;
	XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
	XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); n++;
	XtSetArg(args[n], XmNuserData, (XtPointer) IbPtr); n++;

	IbPtr->stop_load_dir = XmCreatePushButton(form, "Stop", args, n);

	XtAddCallback(IbPtr->stop_load_dir, XmNactivateCallback, StopLoadDir, (XtPointer) IbPtr);

	n = 0;
	XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++;
	XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
	XtSetArg (args[n], XmNrightAttachment, XmATTACH_WIDGET); n++;
	XtSetArg (args[n], XmNrightWidget, IbPtr->stop_load_dir); n++;
	XtSetArg(args[n], XmNuserData, (XtPointer) IbPtr); n++;

	IbPtr->go = XmCreatePushButton(form, "Go", args, n);

	XtAddCallback(IbPtr->go, XmNactivateCallback, fm_openitem, (XtPointer) 11);

	n = 0;
	XtSetArg(args[n], XmNuserData, (XtPointer) IbPtr); n++;
	XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++;
	XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
	XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
	XtSetArg (args[n], XmNrightAttachment, XmATTACH_WIDGET); n++;
	XtSetArg (args[n], XmNrightWidget, IbPtr->go); n++;



	IbPtr->fm_textfield = XmCreateTextField(form, "fm_textfield", args, n);
//	IbPtr->fm_textfield = XmCreateTextField(IbPtr->fm_main_window, "fm_textfield", args, n);
	XtAddCallback(IbPtr->fm_textfield, XmNactivateCallback, fm_openitem, (XtPointer)10);

#ifdef DEBUG
	printf("OK+2\n");
#endif


	XtManageChild(form);
	XtManageChild(IbPtr->go);
	XtManageChild(IbPtr->stop_load_dir);
	XtManageChild(IbPtr->fm_textfield);
	XtManageChild(IbPtr->fm_scroll_win);

	XtVaSetValues(IbPtr->stop_load_dir, XmNsensitive, False, NULL);

	XtAddCallback(IbPtr->fm_scroll_win, XmNdoubleClickCallback, fm_openitem, (XtPointer)20);
	XmMainWindowSetAreas(IbPtr->fm_main_window, IbPtr->fm_menubar, form, NULL, NULL,
							IbPtr->fm_scroll_win);
/*	XmMainWindowSetAreas(IbPtr->fm_main_window, IbPtr->fm_menubar, IbPtr->fm_textfield, NULL, NULL,
							IbPtr->fm_scroll_win);*/
#ifdef DEBUG
	printf("OK+3\n");
#endif

//	IbPtr->files = malloc(sizeof(struct filedata) * IbPtr->nfiles);
#ifdef DEBUG
	printf("OK+4\n");
#endif
  
	GetUserInfo();
#ifdef DEBUG
	printf("OK+5\n");
#endif


/*	load_dir(IbPtr, IbPtr->current_wd);*/


#ifdef DEBUG
	printf("OK+6\n");
#endif

	XtVaSetValues(IbPtr->top_level, XmNtitle, IbPtr->current_wd, NULL);
	XtVaSetValues(IbPtr->fm_textfield, XmNvalue, IbPtr->current_wd, NULL);
#ifdef DEBUG
	printf("OK+7\n");
#endif

/*	WM_DELETE_WINDOW = XInternAtom(XtDisplay(IbPtr->top_level), "WM_DELETE_WINDOW", False);
	XmAddWMProtocolCallback(IbPtr->top_level, WM_DELETE_WINDOW, CloseWinCB, (XtPointer) IbPtr);
	XtVaSetValues(IbPtr->top_level, XmNdeleteResponse, XmDO_NOTHING, NULL);*/

	XtRealizeWidget(IbPtr->top_level);
#ifdef DEBUG
	printf("OK+8\n");
#endif
	DrawFileArea(IbPtr);

#ifdef DEBUG
	printf("OK+9\n");
#endif

	/* Learn some stuff about the system */
//	scan_for_smb();

#ifdef USE_INOTIFY
	IbPtr->inp_id = XtAppAddInput(IbPtr->app, IbPtr->i_fd, (XtPointer) XtInputReadMask, InotifyInput, (XtPointer) IbPtr);
#endif

	XtAppMainLoop(IbPtr->app);
#ifdef DEBUG
	printf("AppMainLoop terminated\n");
#endif
	
	XtDestroyWidget(IbPtr->top_level);
//		XtDestroyWidget(IbPtr->fm_main_window);

#ifdef DEBUG
	printf("Top level destroyed\n");
#endif

	XtDestroyApplicationContext(IbPtr->app);

#ifdef DEBUG
	printf("App context destroyed\n");
#endif

#ifdef USE_INOTIFY
	close(IbPtr->i_fd);
#endif
/*	magic_detach();
	exit(0);*/

	return NULL;
}

zloy_starper ★★★
() автор топика
Ответ на: комментарий от zloy_starper

блин, что это за фигня? сделай тесткейс, в котором происходит тоже самое и смотри как он себя ведет

если так же, то суй сюда, разберемся

unt1tled ★★★★
()
Последнее исправление: unt1tled (всего исправлений: 1)
Ответ на: комментарий от zloy_starper

Я тогда проблемы не вижу. А как ты его вообще выводишь то, pthread_id ? Покажи код.

joy4eg ★★★★★
()
Ответ на: комментарий от zloy_starper

Значит, CreateMenuBar где-то портит память. Пробовал прогнать под valgrind или asan?

vzzo ★★★
()

Это код основной функции потока. Соответственно я вывожу/сравниваю для отладки ID потока, который записан в структуру потока родительским потоком при его создании и ID от pthread_self.

void * NewIfaceWindowThread(void * arg)
{
	IfaceBranche * IbPtr;
	char * config_fn, * ptr;
	Arg args[10];
	int n, i;
	Widget form;
	
	IbPtr = (IfaceBranche *) arg;
	
#ifdef DEBUG
	printf("!!!!!!!!Start Iface thread %d on %s address %p\n", IbPtr->thread_number, IbPtr->current_wd, IbPtr);
#endif
	
#ifdef DEBUG_THREAD
	printf("!!!!!!!!Start Iface thread %d: thread id from parent thread %lx self thread id %lx\n", IbPtr->thread_number, IbPtr->thread_id, pthread_self());
	if (pthread_equal(IbPtr->thread_id, pthread_self()))
			printf("THREAD ID OK\n");
		else
			printf("THREAD ID WRONG\n");
#endif

//	XtToolkitThreadInitialize();  
//	XtSetLanguageProc(NULL, NULL, NULL);
//	IbPtr->top_level = XtVaAppInitialize(&(IbPtr->app), "XmBryanFM", NULL, 0, NULL, 0,
//				NULL, NULL, 0);

#ifdef USE_INOTIFY
	IbPtr->i_fd = inotify_init();
#endif	
	
	IbPtr->top_level = XtVaOpenApplication (&(IbPtr->app), "XmBryanFM", NULL, 0, &glob_argc, glob_argv,
								NULL, sessionShellWidgetClass, NULL);
#ifdef DEBUG
	printf("Init app\n");
#endif

	if (!file_name_atom_ready)
	{
		FILE_NAME = XInternAtom (XtDisplay(IbPtr->top_level), "FILE_NAME", False);
		file_name_atom_ready = 1;
	}
	
	if (!delete_window_atom_ready)
	{
		WM_DELETE_WINDOW = XInternAtom (XtDisplay(IbPtr->top_level), "WM_DELETE_WINDOW", False);
		delete_window_atom_ready = 1;
	}

	if (!copy_atom_ready)
	{
		CopyAtom = XInternAtom(XtDisplay(IbPtr->top_level), "x-special/gnome-copied-files", False);
		copy_atom_ready = 1;
	}

#ifdef DEBUG
	printf("Init atom %ld\n", WM_DELETE_WINDOW);
#endif

	XtVaSetValues(IbPtr->top_level, XmNdeleteResponse, XmDO_NOTHING, NULL);
	{
		char cc;
		XtVaGetValues(IbPtr->top_level, XmNdeleteResponse, &cc, NULL);
#ifdef DEBUG
		if (cc == XmDO_NOTHING)
			printf("Mode no\n");
		else 
			printf("Mode yes\n");
#endif
	}

	XmAddWMProtocolCallback(IbPtr->top_level, WM_DELETE_WINDOW, CloseWindowCB, (XtPointer) IbPtr);

#ifdef DEBUG
	printf("Init close window callback\n");
#endif


	/* This block of code creates the main application window.  I will eventually
	* move this to an external function.  Eventually... */

	n = 0;
	XtSetArg(args[n], XmNwidth, 600);
	n++;
	XtSetArg(args[n], XmNheight, 450);
	n++;
	IbPtr->fm_main_window = XmCreateMainWindow(IbPtr->top_level, "fm_main_window", args, n);
/*****!!!!!*****/
//	XtAddCallback(IbPtr->fm_main_window, XmNdestroyCallback, MainWinDestroyCB, (XtPointer) NULL);

	XtManageChild(IbPtr->fm_main_window);

#ifdef DEBUG
	printf("Main wondow created\n");
#endif
	IbPtr->fm_menubar = CreateMenuBar(IbPtr);

#ifdef DEBUG_THREAD
	printf("!!!!!!!!Check Iface thread %d after call CreateMenuBar: thread id from parent thread %lx self thread id %lx\n", IbPtr->thread_number, IbPtr->thread_id, pthread_self());
	if (pthread_equal(IbPtr->thread_id, pthread_self()))
			printf("THREAD ID OK\n");
		else
			printf("THREAD ID WRONG\n");
#endif

#ifdef DEBUG
	printf("Menu bar created\n");
#endif

	IbPtr->parsed_trans = XtParseTranslationTable(dragTranslations);
	XtAppAddActions(IbPtr->app, dragActions, XtNumber(dragActions));

	IbPtr->fm_scroll_win = XtVaCreateWidget ("MainView", xmNlListWidgetClass, IbPtr->fm_main_window, 
											XmNuserData, (XtPointer) IbPtr, NULL);

//	XtAddCallback(IbPtr->fm_scroll_win, XmNdestroyCallback, ScrollWinDestroyCB, (XtPointer) NULL);
	SetFileViewAttributs(IbPtr);

#ifdef DEBUG
	printf("OK+1\n");
#endif


	form = XmCreateForm(IbPtr->fm_main_window, "fm_command_form", NULL, 0);



	n = 0;
	XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); n++;
	XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
	XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); n++;
	XtSetArg(args[n], XmNuserData, (XtPointer) IbPtr); n++;

	IbPtr->stop_load_dir = XmCreatePushButton(form, "Stop", args, n);

	XtAddCallback(IbPtr->stop_load_dir, XmNactivateCallback, StopLoadDir, (XtPointer) IbPtr);

	n = 0;
	XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++;
	XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
	XtSetArg (args[n], XmNrightAttachment, XmATTACH_WIDGET); n++;
	XtSetArg (args[n], XmNrightWidget, IbPtr->stop_load_dir); n++;
	XtSetArg(args[n], XmNuserData, (XtPointer) IbPtr); n++;

	IbPtr->go = XmCreatePushButton(form, "Go", args, n);

	XtAddCallback(IbPtr->go, XmNactivateCallback, fm_openitem, (XtPointer) 11);

	n = 0;
	XtSetArg(args[n], XmNuserData, (XtPointer) IbPtr); n++;
	XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++;
	XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
	XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
	XtSetArg (args[n], XmNrightAttachment, XmATTACH_WIDGET); n++;
	XtSetArg (args[n], XmNrightWidget, IbPtr->go); n++;



	IbPtr->fm_textfield = XmCreateTextField(form, "fm_textfield", args, n);
//	IbPtr->fm_textfield = XmCreateTextField(IbPtr->fm_main_window, "fm_textfield", args, n);
	XtAddCallback(IbPtr->fm_textfield, XmNactivateCallback, fm_openitem, (XtPointer)10);

#ifdef DEBUG
	printf("OK+2\n");
#endif


	XtManageChild(form);
	XtManageChild(IbPtr->go);
	XtManageChild(IbPtr->stop_load_dir);
	XtManageChild(IbPtr->fm_textfield);
	XtManageChild(IbPtr->fm_scroll_win);

	XtVaSetValues(IbPtr->stop_load_dir, XmNsensitive, False, NULL);

	XtAddCallback(IbPtr->fm_scroll_win, XmNdoubleClickCallback, fm_openitem, (XtPointer)20);
	XmMainWindowSetAreas(IbPtr->fm_main_window, IbPtr->fm_menubar, form, NULL, NULL,
							IbPtr->fm_scroll_win);
/*	XmMainWindowSetAreas(IbPtr->fm_main_window, IbPtr->fm_menubar, IbPtr->fm_textfield, NULL, NULL,
							IbPtr->fm_scroll_win);*/
#ifdef DEBUG
	printf("OK+3\n");
#endif

//	IbPtr->files = malloc(sizeof(struct filedata) * IbPtr->nfiles);
#ifdef DEBUG
	printf("OK+4\n");
#endif
  
	GetUserInfo();
#ifdef DEBUG
	printf("OK+5\n");
#endif


/*	load_dir(IbPtr, IbPtr->current_wd);*/


#ifdef DEBUG
	printf("OK+6\n");
#endif

	XtVaSetValues(IbPtr->top_level, XmNtitle, IbPtr->current_wd, NULL);
	XtVaSetValues(IbPtr->fm_textfield, XmNvalue, IbPtr->current_wd, NULL);
#ifdef DEBUG
	printf("OK+7\n");
#endif

/*	WM_DELETE_WINDOW = XInternAtom(XtDisplay(IbPtr->top_level), "WM_DELETE_WINDOW", False);
	XmAddWMProtocolCallback(IbPtr->top_level, WM_DELETE_WINDOW, CloseWinCB, (XtPointer) IbPtr);
	XtVaSetValues(IbPtr->top_level, XmNdeleteResponse, XmDO_NOTHING, NULL);*/

	XtRealizeWidget(IbPtr->top_level);
#ifdef DEBUG
	printf("OK+8\n");
#endif
	DrawFileArea(IbPtr);

#ifdef DEBUG
	printf("OK+9\n");
#endif

	/* Learn some stuff about the system */
//	scan_for_smb();

#ifdef USE_INOTIFY
	IbPtr->inp_id = XtAppAddInput(IbPtr->app, IbPtr->i_fd, (XtPointer) XtInputReadMask, InotifyInput, (XtPointer) IbPtr);
#endif

	XtAppMainLoop(IbPtr->app);
#ifdef DEBUG
	printf("AppMainLoop terminated\n");
#endif
	
	XtDestroyWidget(IbPtr->top_level);
//		XtDestroyWidget(IbPtr->fm_main_window);

#ifdef DEBUG
	printf("Top level destroyed\n");
#endif

	XtDestroyApplicationContext(IbPtr->app);

#ifdef DEBUG
	printf("App context destroyed\n");
#endif

#ifdef USE_INOTIFY
	close(IbPtr->i_fd);
#endif
/*	magic_detach();
	exit(0);*/

	return NULL;
}

zloy_starper ★★★
() автор топика
Ответ на: комментарий от zloy_starper

Ты структурку, в которой хранишь старое значение, переезжаешь скорее всего.

Gvidon ★★★★
()

А это код функции CreateMenuBar/ Все аналогично.

Widget CreateMenuBar(IfaceBranche * IbPtr)
{
	Widget menubar_widget;
	Widget file_pulldown, dir_pulldown, edit_pulldown, show_pulldown;
	Widget file_cascade, dir_cascade, edit_cascade;
	Widget option_pulldown, toolbar_pulldown, help_pulldown;
	Widget option_cascade, toolbar_cascade, help_cascade;
	Widget file_new, file_run, file_cut, file_copy, file_paste, file_delete, file_info, file_close, file_exit;
	Widget file_sep1, file_sep2, file_sep3, file_find;
	Widget dir_create, dir_separator, dir_goto, dir_home; 
	Widget smb_separator, share_nfs, save_setting;
	Widget toolbar_add, toolbar_remove;
	Widget help_button, help_general, help_index, help_sep, help_about;
	XmString label_str;	
	Arg args[7];
	int   n;

	XmString copy_str, copy_as, move_str, move_as, delete_str, info_str, info_as, paste_str, paste_as;

#ifdef DEBUG_THREAD
	printf("!!!!!!!!Start MenuBar: Iface thread %d after call CreateMenuBar: thread id from parent thread %lx self thread id %lx\n", IbPtr->thread_number, IbPtr->thread_id, pthread_self());
	if (pthread_equal(IbPtr->thread_id, pthread_self()))
			printf("THREAD ID OK\n");
		else
			printf("THREAD ID WRONG\n");
#endif

	copy_str = XmStringCreateLocalized ("Copy");
	copy_as = XmStringCreateLocalized ("Ctrl+C");
	
	move_str = XmStringCreateLocalized ("Cut");
	move_as = XmStringCreateLocalized ("Ctl+X");

	delete_str = XmStringCreateLocalized ("Delete");

	info_str = XmStringCreateLocalized ("Info");
	info_as = XmStringCreateLocalized ("Ctrl+I");

	paste_str = XmStringCreateLocalized ("Paste");
	paste_as = XmStringCreateLocalized ("Ctrl+V");


	menubar_widget = XmCreateMenuBar(IbPtr->fm_main_window, "menubar", NULL, 0);

	XtManageChild(menubar_widget);
	
/***************************/
	file_pulldown = XmCreatePulldownMenu(menubar_widget, "file_pulldown", NULL, 0);
	IbPtr->file_pulldown = file_pulldown;

	label_str = XmStringCreateLocalized ("File");
	n = 0;
	XtSetArg (args[n], XmNmnemonic, 'F'); n++;
	XtSetArg (args[n], XmNlabelString, label_str); n++;
	XtSetArg (args[n], XmNsubMenuId, file_pulldown); n++;
	file_cascade = XmCreateCascadeButton (menubar_widget, "File", args, n);
	XtManageChild (file_cascade);
	XmStringFree (label_str);

	
	file_new = XtVaCreateManagedWidget("file_new", xmPushButtonWidgetClass,
										file_pulldown, NULL);

... и так далее в том же духе
zloy_starper ★★★
() автор топика

В итоге получаю:

!!!!!!!!Start Iface thread 1: thread id from parent thread 7f2c4afa1700 self thread id 7f2c4afa1700
THREAD ID OK
!!!!!!!!Start MenuBar: Iface thread 1 after call CreateMenuBar: thread id from parent thread 7f2c4afa1700 self thread id 4afa1700
THREAD ID WRONG
!!!!!!!!Check Iface thread 1 after call CreateMenuBar: thread id from parent thread 7f2c4afa1700 self thread id 7f2c4afa1700
THREAD ID OK

zloy_starper ★★★
() автор топика
Ответ на: комментарий от zloy_starper

Хотя это похоже больше на обрезание 64битного значения в 32битное. Оно не может как-то кривенько компилироваться?

vzzo ★★★
()
Ответ на: комментарий от vzzo

Хотя это похоже больше на обрезание 64битного значения в 32битное. Оно не может как-то кривенько компилироваться?

Вот это больше всего похоже на правду. Но странно то, что обрезается оно на входе в функцию. А по выходу оно то же, что и было. Хотя оно, наверное, при вызове функции копируется, а там уже перетирается чем-то.

zloy_starper ★★★
() автор топика
Ответ на: комментарий от zloy_starper

Собираешь всё вместе? Одним и тем же компилятором с одинаковыми опциями?

Gvidon ★★★★
()

Я как-то с жабкой на то же самое напоролся. Оказалось JVM дёргает каждую функцию в отдельном треде.

UVV ★★★★★
()

Все, конечно, оказалось просто как всегда. Второй раз наступаю на те же грабли. Разве что проявляются они немножко по разному в разных ситуациях. Ну да ладно. Посыпаю голову пеплом... В некоторых файлах (в т.ч. и там, где лежала CreateMenuBar) не был подключен хидер pthread.h.

zloy_starper ★★★
() автор топика
Ответ на: комментарий от true_admin

Могут! Это Си.

В данном случае вызов будет int возвращать (то есть будет приниматься как int pthread_self( )) :D

anonymous
()

Если весь проект пересобрать под 32 бита, то воспроизводится?

DELIRIUM ☆☆☆☆☆
()
Ответ на: комментарий от true_admin
$ cat main.c 
#include <stdio.h>
#include <stdint.h>

#if defined(TEST)
uint64_t get_random( );
#endif

int main(void)
{
    printf("%lu\n", get_random( ));
    return 0;
}

$ cat test.c 
#include <stdint.h>

uint64_t get_random(void)
{
    return ((uint64_t)42 << 42) | 42;
}

$ gcc main.c test.c -DTEST
$ ./a.out 
184717953466410
$ gcc main.c test.c 
main.c: In function ‘main’:
main.c:10:5: warning: format ‘%lu’ expects argument of type ‘long unsigned int’, but argument 2 has type ‘int’ [-Wformat=]
     printf("%lu\n", get_random( ));
     ^
$ ./a.out 
42
anonymous
()
Ответ на: комментарий от anonymous

Предупреждения компилятора читать никогда не пробовал?

Moreo
()
Ответ на: комментарий от anonymous

ОМГ, я понял, спасибо. Я внезапно для себя открыл что в статических либах не хранятся сигнатуры функций и линкер не может проверить соответствие типов. Я прав?

С c++ такого не будет потому что там name mangling, верно? Должно выдать что-нить про unresolved symbol.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

Я внезапно для себя открыл что в статических либах не хранятся сигнатуры функций и линкер не может проверить соответствие типов. Я прав?

И не только в статических, и не только в либах.

anonymous
()

Смотрю что человек скинул...

Посоны, а что, такое качество написания и форматирования (в архитектуру не вникал) кода считается нормальным?

deep-purple ★★★★★
()
Ответ на: комментарий от true_admin

Продолжай держать нас в курсе.

anonymous
()
Ответ на: комментарий от zloy_starper
#ifdef DEBUG
	...
#endif


ёпвшмть, почитай что-нибудь про логирование

d_Artagnan ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.