Re: ORBit2.8.3 thread problem
- From: Kuang-Chun Cheng <kccheng openate com>
- To: nshmyrev yandex ru, gnome-devel-list gnome org
- Cc:
- Subject: Re: ORBit2.8.3 thread problem
- Date: Tue, 07 Sep 2004 07:47:57 +0800
Hi,
I did some tests with echo-client-t.c (add a echo_client_thread(NULL)
just before g_thread_join(),
means invoke CORBA method from main thread) against different ORBit2
version.
The modified echo-client-t.c fail to run on ORBit2-2.8.x but it's OK to
run on
ORBit-2.10.x. It looks like a client side bug ... use server from
2.10.x and echo-client-t.c
from 2.8.x will hang up too.
Well, I still wonder what's wrong with thread support on 2.8.x.
Regards,
Kuang-Chun Cheng
kccheng openate com
nshmyrev wrote:
Well, I still can't reproduce you problems.
Let's do the following:
1. Please, upgrade ORBit for latest version. I use 2.10 and probably, your bug is already fixed there.
2. Let's reproduce you problem with your modification of echo-client-t.c from ORBit's test, since your first test is uncomplete (there is no server and I don't know what etk_ functions are doing). So, let's use echo-client-t.c for test (If problem is reproduced with new ORBit). Of course, modify it with echo_client_thread (NULL) as in your last mail.
3. After all, try to attach with gdb (do gdb --pid=pid)to process which hands up and do such commands:
a) info threads.
b) for every thread do backtrace with two gdb command (thread <number> then backtrace).
Let's see there results.
Shmyrev.
#include <stdio.h>
#include <stdlib.h>
#include "echo.h"
int niters = 100000;
int nthreads = 8;
char *server_ior;
CORBA_ORB orb;
static gpointer
echo_client_thread (gpointer data)
{
int i;
Echo echo_client;
CORBA_Environment *ev, real_ev;
CORBA_exception_init ((ev = &real_ev));
echo_client = CORBA_ORB_string_to_object (orb, server_ior, ev);
if (!echo_client) {
g_error ("[%p]: Cannot bind to %s\n",
g_thread_self (), server_ior);
return NULL;
}
for (i = 0; i < 4; i++) /* let others get started */
g_thread_yield ();
for (i = 0; i < niters; i++) {
char *str;
CORBA_double tmp;
Echo retval;
str = g_strdup_printf ("[%p]: Hello, world [%d]",
g_thread_self (), i);
Echo_doOneWay (echo_client, str, ev);
retval = Echo_echoString (echo_client, str, &tmp, ev);
g_free (str);
if (ev->_major != CORBA_NO_EXCEPTION) {
g_error ("[%p]: we got exception %s from echoString!\n",
g_thread_self (), ev->_id);
return NULL;
}
CORBA_Object_release (retval, ev);
}
CORBA_Object_release (echo_client, ev);
return data;
}
int
main (int argc, char *argv[])
{
int i;
GError *error = NULL;
GThread **threads;
CORBA_Environment *ev, real_ev;
CORBA_exception_init ((ev = &real_ev));
orb = CORBA_ORB_init (&argc, argv, "orbit-local-mt-orb", ev);
if (argc < 2) {
g_error ("Syntax: %s <server IOR> [<niters> [<nthreads>] ]\n",
argv [0]);
return 1;
}
server_ior = argv [1];
if (argc >= 3)
niters = atoi (argv [2]);
if (argc >= 4)
nthreads = atoi (argv [3]);
threads = g_new0 (GThread *, nthreads);
for (i = 0; i < nthreads; i++) {
threads [i] = g_thread_create (
echo_client_thread, &threads[i],
TRUE, &error);
if (error)
g_error ("Error spawning threads '%s'",
error->message);
}
#
# add this call will hang up for ORBit2-2.8.x, but work fine
# for ORBit2-2.10.x.
#
echo_client_thread (NULL);
for (i = 0; i < nthreads; i++) {
if (!(g_thread_join (threads [i]) == &threads [i]))
g_error ("Wierd thread join problem '%d'", i);
}
CORBA_ORB_destroy (orb, ev);
CORBA_Object_release ((CORBA_Object) orb, ev);
return 0;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]