libports is a convenience library for easier handling of Mach ports. It is documented in the Reference Manual.
libports is not (at least, not for now) a generalization / abstraction of Mach ports to the functionality the Hurd needs, that is, it is not meant to provide an interface independently of the underlying microkernel.
libports does not itself depend on libthreads, but the appropriate threading hooks are used if present, that is if libthreads is used by another component.
Message Processing
ports_manage_multithreaded
When a message is recieved, the thread acting as receiver checks if any other thread is also waiting for requests. If there is none, a new thread is spawned. Thus, the current thread continues processing the message while the newly created thread starts listening for new ones. (open issue hurd: multithreading.)
Also, there are configurable timeouts for translators who want to go away
when they are not used. (open issue hurd: there used to be bugs
in this area, id:"87hev152we.fsf@becket.becket.net"
, but it may be
fixed as of id:"20111030210045.GA4983@myhost"
,
hurd/hurd.git commit 9b5429e834cde56f73b8ff605e36afc7d9bb6e1b.)
Open Issues
Several on the Open Issues page
IRC, freenode, #hurd, 2013-11-14
<teythoon> # portinfo $(pgrep mach-defpager) | tail -n 1
<teythoon> 16819001: receive
<teythoon> is that normal ?
<braunr> it can be, yes
<braunr> port names can be renamed
<braunr> there are a few occurrences in the code
<braunr> see
http://www.gnu.org/software/hurd/gnumach-doc/Port-Names.html#Port-Names
<teythoon> I know
<braunr> mach-defpager/default_pager.c: kr = mach_port_rename(
default_pager_self,
<teythoon> heh, it is a pointer
<teythoon> I thought that'd make stuff inefficient in gnumach?
<braunr> it does
<braunr> such rights are moved from a regular fast-access table to a splay
tree
<braunr> but when i looked into it, there were never more than a few dozen
rights in these trees
<braunr> (which is why i didn't merge my radix tree in gnumach)
<teythoon> I've been contemplating to replace the libihash usage in
libports with a simple array
<braunr> consider a radix tree too then :)
<teythoon> well, I did
<braunr> ok
<teythoon> but I'm not convinced that it would do better than a simple
array (or the current ihash implementation)
<braunr> really ?
<teythoon> what do you hope to gain?
<braunr> i'm practically certain it would do better than the current ihash
code
<braunr> uh, speed
<braunr> the problem with an array or a hash table is resizing
<braunr> a well tuned radix tree (say 64 ot 512 items per node) can reduce
to a simple array for the common case
<teythoon> right
<teythoon> but consider the use case
<braunr> and scale very well for massive users such as file systems which
can reach several hundred thousand rights
<teythoon> hm
<braunr> an array could be very efficient as well
<braunr> i'm just concerned about resizing
<teythoon> but this is a problem with the current implementation as well
<braunr> sure
<braunr> we're not considering keeping it anyway
<braunr> this discussion is about array vs radix tree
<braunr> the radix tree also has the advantage to efficiently deal with
sparsely populated port name spaces
<braunr> to some degree
<braunr> which is probably what you're currently concerned with about this
weird port name in defpager :)
<teythoon> http://paste.debian.net/65780/
<teythoon> yes, but mach-defpager does not use libports
<braunr> ok
See also discussion on deficiencies, X15, IRC, freenode, #hurd, 2013-11-14.