Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 15 Mar 1999 17:27:49 -0500
From:      "Bosko Milekic" <bmilekic@dsuper.net>
To:        "FreeBsd" <bsd@obr.software602.cz>
Cc:        <freebsd-hackers@freebsd.org>
Subject:   Re: thread  and socket
Message-ID:  <005001be6f33$0f817470$0100000a@jehovah.technokratis.com>

next in thread | raw e-mail | index | archive | help

You'll have to excuse my previous post. (whoopsy). :-)

    The reason you may be having this problem may be related to the fact that
the global integer 'errno' that you are checking is not really 'thread-safe.'
    The copy of the code you are running contains only one global int errno, and
when you check for it in the thread (e.g. when it's re-enterant), there is a
problem.

Stevens proposes saving the initial value of 'errno' before going elsewhere. You
would declare another int (e.g. saveerrno) and do something like:
    saveerrno = errno;
(and then go ahead with your function(s) in the thread)

I gave you as an example the global value 'errno,' but you should check any
functions you call in threads and make sure that they are thread-safe...

I am not very proficient with threads, but I can see an alternative to your
problem (if you are still having it).
Instead of having your thread go non-blocking, just allow it to block, the
kernel will just run some other thread until their is data ready for the blocked
function... in your main copy of the code, you can set your own timer which,
after expiry, checks whether or not a global buffer has been filled (the buffer
would only be filled if recvfrom() returns), and if it hasn't, it can kill the
thread, knowing that there was no data to be read...


Regards,
Bosko M.
____________________________________________________________________________
Bosko Milekic    bmilekic@oracle.dsuper.net    http://www.dsuper.net/~bmilekic/
Delphi SuperNet             +1.888.787.3768             http://www.supernet.ca/

-----Original Message-----
From: FreeBsd <bsd@obr.software602.cz>
To: Bosko Milekic <bmilekic@oracle.dsuper.net>
Cc: freebsd-hackers@FreeBSD.ORG <freebsd-hackers@FreeBSD.ORG>
Date: Monday, March 15, 1999 4:19 AM
Subject: Re: thread and socket


:in multithreaded app is recvfrom only waiting for data, but cannot finish
:with EAGAIN error, when I set SO_RCVTIMEO. I need stop recv function after
:timeout. in the non threaded version rcv is finish after timeout (no data
:is received) , but in multi threaded ver doesn't stop and still is waiting
:for data. any data is not comming and ercvfrom is still wiating. WHY?????
:thanks.
:honza
:
:
:On Sun, 14 Mar 1999, Bosko Milekic wrote:
:
:>
:> I've had a little trouble understanding you... :-)
:>
:> Here's an excerpt from the man page, though... if this isn't what you were
:> looking for, please clarify a bit...
:>
:> --snip--
:>     In the non-threaded library getsockopt() is implemented as the
:> getsockopt syscall.
:>
:>     In the threaded library, the getsockopt syscall is assembled to
_thread_sys_getsockopt()
:> and getsockopt() is implemented as a function which locks s for read and
:> write, then calls _thread_sys_getsockopt().
:>      Before returning, getsockopt() unlocks s.
:> --snip--
:>
:> Regards,
:> Bosko.
:>
:> --
:> Bosko Milekic <bmilekic@supernet.ca>  http://www.supernet.ca/~bmilekic/
:> Delphi SuperNet     voice: (+1) 514 281-7500     fax: (+1) 514 281-6599
:> PGP Key available upon request.
:>
:



To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?005001be6f33$0f817470$0100000a>