Early Initialization of File Descriptors Conflicts With Daemon Best Practices
-----------------------------------------------------------------------------

                 Key: QPID-2367
                 URL: https://issues.apache.org/jira/browse/QPID-2367
             Project: Qpid
          Issue Type: Improvement
          Components: C++ Client
    Affects Versions: 0.5
         Environment: Linux (possibly all UNIX), c++, g++
            Reporter: Jason Schlauch


At least one file descriptor (in qpid/sys/epoll/EpollPoller.*) in the c++ 
client is global and declared as static.  In programs linked against the c++ 
qpid libs g++ generates code for allocation and, more importantly, 
initialization of these descriptors that occurs before main().  You can confirm 
this with gdb by breakpointing both the initialization and main() (the 
initialization break is hit first).

On the other hand, the canonical recipe for creating a UNIX daemon calls for 
the closing of all open file descriptors after fork()ing (where the fork() 
certainly occurs after main()).  While not an absolute requirement, closing all 
open file descriptors is considered a best practice.  A loop to close all 
descriptors is also common in boilerplate daemon creation code and has 
undoubtedly been cut-and-pasted into numerous daemons.

The net effect is that the typical daemon will close the file descriptor opened 
before main() in the c++ client library.  In the case of the epoll code this 
manifests as an inability to connect to the broker.

A fix for this would be to defer the initialization of the file descriptor 
(perhaps via the Singleton pattern or a move of the variables into a class 
member).

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


---------------------------------------------------------------------
Apache Qpid - AMQP Messaging Implementation
Project:      http://qpid.apache.org
Use/Interact: mailto:[email protected]

Reply via email to