pri-1991 wrote on Saturday, October 11, 2014:
Not able to run .exe of following example (threads.c) present in GLFW3 3.0.4 on ubuntu 14.04 using:
gcc -I …/deps/ threads.c …/deps/tinycthread.c -g -lGL -lGLU -lglfw3 -lX11 -lXxf86vm -lXrandr -lpthread -lXi -lm.
example(threads.c) is as follows:
//========================================================================
// Multithreading test
// Copyright (c) Camilla Berglund <elmindreda@elmindreda.org>
//
// This software is provided 'as-is', without any express or implied
// warranty. In no event will the authors be held liable for any damages
// arising from the use of this software.
//
// Permission is granted to anyone to use this software for any purpose,
// including commercial applications, and to alter it and redistribute it
// freely, subject to the following restrictions:
//
// 1. The origin of this software must not be misrepresented; you must not
// claim that you wrote the original software. If you use this software
// in a product, an acknowledgment in the product documentation would
// be appreciated but is not required.
//
// 2. Altered source versions must be plainly marked as such, and must not
// be misrepresented as being the original software.
//
// 3. This notice may not be removed or altered from any source
// distribution.
//
//========================================================================
//
// This test is intended to verify whether the OpenGL context part of
// the GLFW API is able to be used from multiple threads
//
//========================================================================
#include "tinycthread.h"
#include <GLFW/glfw3.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
typedef struct
{
GLFWwindow* window;
const char* title;
float r, g, b;
thrd_t id;
} Thread;
static volatile GLboolean running = GL_TRUE;
static void error_callback(int error, const char* description)
{
fprintf(stderr, "Error: %s\n", description);
}
static int thread_main(void* data)
{
const Thread* thread = (const Thread*) data;
glfwMakeContextCurrent(thread->window);
glfwSwapInterval(1);
while (running)
{
const float v = (float) fabs(sin(glfwGetTime() * 2.f));
glClearColor(thread->r * v, thread->g * v, thread->b * v, 0.f);
glClear(GL_COLOR_BUFFER_BIT);
glfwSwapBuffers(thread->window);
}
glfwMakeContextCurrent(NULL);
return 0;
}
int main(void)
{
int i, result;
Thread threads[] =
{
{ NULL, "Red", 1.f, 0.f, 0.f, 0 },
{ NULL, "Green", 0.f, 1.f, 0.f, 0 },
{ NULL, "Blue", 0.f, 0.f, 1.f, 0 }
};
const int count = sizeof(threads) / sizeof(Thread);
glfwSetErrorCallback(error_callback);
if (!glfwInit())
exit(EXIT_FAILURE);
glfwWindowHint(GLFW_VISIBLE, GL_FALSE);
for (i = 0; i < count; i++)
{
threads[i].window = glfwCreateWindow(200, 200,
threads[i].title,
NULL, NULL);
if (!threads[i].window)
{
glfwTerminate();
exit(EXIT_FAILURE);
}
glfwSetWindowPos(threads[i].window, 200 + 250 * i, 200);
glfwShowWindow(threads[i].window);
if (thrd_create(&threads[i].id, thread_main, threads + i) !=
thrd_success)
{
fprintf(stderr, "Failed to create secondary thread\n");
glfwTerminate();
exit(EXIT_FAILURE);
}
}
while (running)
{
glfwWaitEvents();
for (i = 0; i < count; i++)
{
if (glfwWindowShouldClose(threads[i].window))
running = GL_FALSE;
}
}
for (i = 0; i < count; i++)
thrd_join(threads[i].id, &result);
exit(EXIT_SUCCESS);
}
After compiling with gcc when I ran .exe, following appears on the terminal:
Program terminated with signal SIGABRT, Aborted.
#0 0x00007f5637754bb9 in __GI_raise (sig=sig@entry=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56
56 ../nptl/sysdeps/unix/sysv/linux/raise.c: No such file or directory.
(gdb) bt
#0 0x00007f5637754bb9 in __GI_raise (sig=sig@entry=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56
#1 0x00007f5637757fc8 in __GI_abort () at abort.c:89
#2 0x00007f563774da76 in __assert_fail_base (fmt=0x7f563789f370 "%s%s%s:%u: %s%sAssertion `%s' failed.\n%n",
assertion=assertion@entry=0x7f56360a8615 "!c->out.queue_len", file=file@entry=0x7f56360a8600 "../../src/xcb_conn.c", line=line@entry=186,
function=function@entry=0x7f56360a8630 "write_vec") at assert.c:92
#3 0x00007f563774db22 in __GI___assert_fail (assertion=0x7f56360a8615 "!c->out.queue_len", file=0x7f56360a8600 "../../src/xcb_conn.c",
line=186, function=0x7f56360a8630 "write_vec") at assert.c:101
#4 0x00007f563609ce5b in ?? () from /usr/lib/x86_64-linux-gnu/libxcb.so.1
#5 0x00007f563609d191 in ?? () from /usr/lib/x86_64-linux-gnu/libxcb.so.1
#6 0x00007f563609d8a7 in ?? () from /usr/lib/x86_64-linux-gnu/libxcb.so.1
#7 0x00007f563609d9c8 in xcb_take_socket () from /usr/lib/x86_64-linux-gnu/libxcb.so.1
#8 0x00007f5638663a38 in ?? () from /usr/lib/x86_64-linux-gnu/libX11.so.6
#9 0x00007f5638663b0e in ?? () from /usr/lib/x86_64-linux-gnu/libX11.so.6
#10 0x00007f5638664580 in _XReply () from /usr/lib/x86_64-linux-gnu/libX11.so.6
#11 0x00007f56389a0673 in ?? () from /usr/lib/x86_64-linux-gnu/mesa/libGL.so.1
#12 0x00007f563899e02b in ?? () from /usr/lib/x86_64-linux-gnu/mesa/libGL.so.1
#13 0x00007f563413e9a9 in ?? () from /usr/lib/x86_64-linux-gnu/dri/i965_dri.so
#14 0x00007f563413edc3 in ?? () from /usr/lib/x86_64-linux-gnu/dri/i965_dri.so
#15 0x00007f56341338f5 in ?? () from /usr/lib/x86_64-linux-gnu/dri/i965_dri.so
#16 0x0000000000403de3 in thread_main (data=0x7fff864450a0) at threads.c:66
#17 0x00000000004043bd in _thrd_wrapper_function (aArg=0x2525ca0) at ../deps/tinycthread.c:346
#18 0x00007f5638002182 in start_thread (arg=0x7f562a3c7700) at pthread_create.c:312
#19 0x00007f5637818fbd in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:111
Compilation of the above code along with #include “tinycthread.h” is successfully done. But while running .exe why am I facing the issue on UBUNTU 14.04…?
Even the same issue when I executed the .exe which is already present in GLFW 3.0.4.
Please help…!!!
The same code when executed on ubuntu 12.04, runs successfully.
Thanks in advance, any help would be appreciated.