So, to revisit this. Still no luck, but I have made some interesting
observations.
When running my app in debug mode, if I hit ^C to break, or set a
break-point, mysteriously everything begins working perfectly for the
thread.
If I hit ^Z while the program is running, and then resume, that thread works
fine again too. However, if I try and talk to another thread, I have to ^Z
again and resume.
This is just so weird and bizarre I'm not sure what the problem is. I have
attached the code that I am using, so if anyone has any input, please let me
know. The code itself is very simple, so it beats the hell out of me why
it's not working like it should. Obviously, it's some weird buffering issue,
but if it is, it's way too low-level for me.
It's just driving me crazy because it's right at the point where I almost
have everything working, but this bites me, and blocks me until I can figure
it out.
- Adam
#!/usr/local/bin/perl -w
use strict;
use IO::Socket;
use threads;
use threads::shared;
my $sPort = '1692';
my $debug = 1;
my %tstate : shared;
my $socket = new IO::Socket::INET (
Type => SOCK_STREAM,
Proto => 'tcp',
Reuse => 1,
LocalPort => '1692',
Listen => 10,
);
die("Could not open socket: $!") unless $socket;
Debug("Creating the thread pool");
createThreadPool(5);
Debug("Done!");
while (1) {}
sub createThreadPool {
my ($threads) = @_;
for (my $i = 1; $i <= $threads; $i++) {
Debug("Creating server thread #$i");
my $cmdbworker =
threads->create(sub{cmdbServerThread($socket)})
;
}
}
sub cmdbServerThread {
my $tid = threads->tid;
{
lock(%tstate);
$tstate{$tid} = 'on';
}
Debug("Starting thread $tid");
my ($socket) = @_;
Debug("My socket is $socket");
while($tstate{$tid} = 'on') {
while (my $server = $socket->accept()) {
print $server "HI!";
while (my $conn = <$server>) {
Debug("Connection says: $conn");
}
}
}
}
sub Debug {
my ($message, $host) = @_;
my $tid = threads->tid();
$tid = 'parent' if ($tid == 0);
my $time = time;
print STDOUT "[$tid$host] $time: $message\n";
}
-----Original Message-----
From: Adam Meltzer [mailto:[EMAIL PROTECTED]
Sent: Wednesday, June 25, 2003 9:57 AM
To: [EMAIL PROTECTED]; Arthur Bergman
Cc: [EMAIL PROTECTED]
Subject: Re: ithreads: printing to std* is acting very broken for me
----- Original Message -----
From: "Arthur Bergman" <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Cc: <[EMAIL PROTECTED]>
Sent: Wednesday, June 25, 2003 3:00 AM
Subject: Re: ithreads: printing to std* is acting very broken for me
> Just one quick question, what happens when you turn off buffering and
> what platform are you using?
>
> Arthur
>
Ah. I should have mentioned this. I've tried using both $|=0 and $|=1 and
neither appears to make any difference. Oh, and this is under Solaris 2.
Sorry for not mentioning this before. I do need to search through the rest
of the program's components and make sure that nothing is overriding this
setting.
Is it possible also that there's a non-threadsafe module being invoked
somewhere in this application that's causing these issues? Most of the
modules that are being used aren't binary modules. DB_File is being used,
though. I wonder if that's causing any issues.
- Adam