Hi all,
 
According to Zoran, using Tcl_RegisterChannel and Tcl_UnregisterChannel (both with the NULL interp as argument) doesn't look very good.
On my personal experience, I didn't have any troubles using this command, but the "close" problem I related few days ago that is not important for me as I open a socket forever.
 
Anyway, that's true that my module, and I think the "ns_chan" command as well, doesn't handle concurrent read/write from several threads. That may be a problem, but I never had a crash nor any problem with that on my site.
 
I think, using a "get" and "put" command to gain access to the channel in only 1 thread at a time can be fine, and I can implement that in my module.
The only problem I see is that if the thread cannot release the channel, other threads will be locked waiting for the channel.. That can be bad.
 
I will try to find time to have a look at the thread extension module to check their code.
 
Best regards.

Jean-Fabrice RABAUTE
Core Services - Enjoy the future today
http://www.core-services.fr
Mob: +33 (0)6 13 82 67 67

-----Message d'origine-----
De : AOLserver Discussion [mailto:[EMAIL PROTECTED]De la part de Jim Davidson
Envoyé : dimanche 6 juillet 2003 20:28
À : [EMAIL PROTECTED]
Objet : Re: [AOLSERVER] Tcl shared channels

 
Hi,
 
This makes sense although I'd suggest a specific command to create the resource with a name at startup.  The use would then be similar to nsdb handles:
 
at startup:
    set fp [open /my/file]
    ns_chan create myfile $fp
 
in a thread:
    set fp [ns_chan register myfile]
    ... use $fp as normal ...
    ns_chan unregister myfile $fp
 
 
You might want to use the subcommands "get" and "put" instead of "register" and "unregister" to clarify the thread is getting exclusive access to the resource.  Also, timeout support could be convienent, e.g.:
 
if ![ns_chan register myfile 200 fp] {
 ... handle timeout after 200ms ...
}
... use channel set in $fp ...
 
 
Finally, consider the deadlock detection code in nsdb as well although that may be going to far -- a note in the docs to always get channels in the same order should suffice.
 
-Jim
 
 
 
 
 
In a message dated 7/5/2003 2:11:31 PM Eastern Daylight Time, [EMAIL PROTECTED] writes:
On Saturday 05 July 2003 17:21, you wrote:
> Hi,
>
> I wrote the ns_chan code -- not surprised it doesn't work because the
> implementation seemed dubious at the time.

I strongly suggest to follow the following path....

Most of the time, the pattern of accessing Tcl channels from several threads
is so that one thread creates the channel and then passes it to some other
thread for further operation. Very seldom, one actually needs to access the
same channel from two or more threads simultaneously. This is pretty tricky
to do, considering all operations (filevents) user can apply to a channel
using Tcl API.

So, if this is true, then, the easiest thread-safe solution would be to simply
drop the "ns_chan share" command entirely.

Following scenario is thus possible (and available).

Thread A creates the channel by "open", "socket" or any other Tcl
and/or AOLserver command. It may operate on the channel, read from
it, write to it, register callbacks using "fileevent" and such...
At some point, thread A may "ns_chan unregister" the channel
puting it in the thread shared table (which is already in place).
The channel is left in parked state and stays there. After the
"ns_chan unregister", thread A would have no access to the channel
any more.

Thread B can "ns_chan register" the channel, effectively removing the
channel from the table and registering it in its current interp, thus
gaining ownership of the channel. When done with it, thread B can
simply close the channel or do "ns_chan unregister" to place it back
in the shared table, leaving it ready for some other thread to
"ns_chan register" it again.

The "ns_chan cleanup" and "ns_chan list" commands would receive
one optional argument which would select either the thread-private list
of registered channels or thread-shared table of parked channels.
I'm not sure how the syntax would look like, but one can do something
like "ns_chan list -shared" or "ns_chan cleanup -shared" or similar.
W/o the "-shared" option, operation would be applied on thread
private tables. With the "-shared" option, operation would be applied on
thread-shared tables.

That's basically it.

I would like to hear some opinions on this, from the people who would
like to use "ns_chan" functionality. Again, my experience is that the
described functionality is sufficient for most of the usage patterns.
I might be wrong, of course.

Well, any thoughts?

Cheers,
Zoran


--
AOLserver - http://www.aolserver.com/

To Remove yourself from this list, simply send an email to <[EMAIL PROTECTED]> with the
body of "SIGNOFF AOLSERVER" in the email message. You can leave the Subject: field of your email blank.

-- AOLserver - http://www.aolserver.com/

To Remove yourself from this list, simply send an email to <[EMAIL PROTECTED]> with the body of "SIGNOFF AOLSERVER" in the email message. You can leave the Subject: field of your email blank.

-- AOLserver - http://www.aolserver.com/

To Remove yourself from this list, simply send an email to <[EMAIL PROTECTED]> with the body of "SIGNOFF AOLSERVER" in the email message. You can leave the Subject: field of your email blank.

Reply via email to