Skip to content

Commit 9c2a2e1

Browse files
author
Linas Beresna
committed
Add tests and expose merge driver map
1 parent 6104274 commit 9c2a2e1

File tree

4 files changed

+73
-7
lines changed

4 files changed

+73
-7
lines changed

include/IECoreImage/DisplayDriverServer.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,14 @@ class IECOREIMAGE_API DisplayDriverServer : public IECore::RunTimeTyped
6767
using Port = int;
6868
#endif
6969

70+
struct MergeDriverInfo
71+
{
72+
DisplayDriverPtr mergeDriver = nullptr;
73+
int mergeCount = 0;
74+
};
75+
76+
using MergeMap = std::map<int, MergeDriverInfo>;
77+
7078
using PortRange = std::pair<Port, Port>;
7179

7280
/// A port number of 0 causes a free port to be chosen
@@ -91,6 +99,10 @@ class IECOREIMAGE_API DisplayDriverServer : public IECore::RunTimeTyped
9199
static void deregisterPortRange( const std::string &name );
92100
static const PortRange &registeredPortRange( const std::string &name );
93101

102+
// Get the number of merge drivers associated with
103+
// the current merge id.
104+
static const MergeDriverInfo &getMergeDriverInfo( int mergeId );
105+
94106
private:
95107

96108
// Session class

src/IECoreImage/DisplayDriverServer.cpp

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -73,13 +73,7 @@ IE_CORE_DEFINERUNTIMETYPED( DisplayDriverServer );
7373
namespace
7474
{
7575

76-
struct MergeDriverInfo
77-
{
78-
DisplayDriverPtr mergeDriver = nullptr;
79-
int mergeCount = 0;
80-
};
81-
82-
std::map<int, MergeDriverInfo> g_mergeMap;
76+
static DisplayDriverServer::MergeMap g_mergeMap;
8377

8478
/* Set the FD_CLOEXEC flag for the given socket descriptor, so that it will not exist on child processes.*/
8579
static void fixSocketFlags( int socketDesc )
@@ -271,6 +265,17 @@ const DisplayDriverServer::PortRange &DisplayDriverServer::registeredPortRange(
271265
return it->second;
272266
}
273267

268+
const DisplayDriverServer::MergeDriverInfo &DisplayDriverServer::getMergeDriverInfo( int mergeId )
269+
{
270+
auto it = g_mergeMap.find( mergeId );
271+
if( it == g_mergeMap.end() )
272+
{
273+
throw IECore::InvalidArgumentException( "DisplayDriverServer::getMergeCount : " + std::to_string(mergeId) + " is not in the merge map." );
274+
}
275+
276+
return it->second;
277+
}
278+
274279
DisplayDriverServer::Port DisplayDriverServer::portNumber()
275280
{
276281
return m_data->m_acceptor.local_endpoint().port();

src/IECoreImageBindings/DisplayDriverServerBinding.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,12 @@ boost::python::tuple registeredPortRange( const std::string &name )
7272
return boost::python::make_tuple( range.first, range.second );
7373
}
7474

75+
boost::python::tuple getMergeDriverInfo( int mergeId )
76+
{
77+
auto mergeDriverInfo = DisplayDriverServer::getMergeDriverInfo( mergeId );
78+
return boost::python::make_tuple( mergeDriverInfo.mergeDriver, mergeDriverInfo.mergeCount );
79+
}
80+
7581
} // namespace
7682

7783
namespace IECoreImageBindings
@@ -89,6 +95,7 @@ void bindDisplayDriverServer()
8995
.def( "registerPortRange", &::registerPortRange ).staticmethod( "registerPortRange" )
9096
.def( "deregisterPortRange", &DisplayDriverServer::deregisterPortRange ).staticmethod( "deregisterPortRange" )
9197
.def( "registeredPortRange", &registeredPortRange ).staticmethod( "registeredPortRange" )
98+
.def( "getMergeDriverInfo", &getMergeDriverInfo).staticmethod( "getMergeDriverInfo" )
9299
;
93100

94101
}

test/IECoreImage/DisplayDriverServerTest.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434

3535
import unittest
3636
import sys
37+
import imath
3738

3839
import IECore
3940
import IECoreImage
@@ -118,6 +119,47 @@ def testPortRangeRegistry( self ) :
118119
s2 = IECoreImage.DisplayDriverServer()
119120
self.assertEqual( s2.portNumber(), 45021 )
120121

122+
def testMergeMap( self ) :
123+
server = IECoreImage.DisplayDriverServer( 45001 )
124+
125+
displayWindow = imath.Box2i( imath.V2i(0,0), imath.V2i(100,100) )
126+
dataWindow = imath.Box2i( imath.V2i(0,0), imath.V2i(100,100) )
127+
128+
params = IECore.CompoundData()
129+
params['displayHost'] = IECore.StringData('localhost')
130+
params['displayPort'] = IECore.StringData( '45001' )
131+
params['displayDriverServer:mergeId'] = IECore.IntData( 42 )
132+
params['displayDriverServer:mergeClients'] = IECore.IntData( 2 )
133+
params["remoteDisplayType"] = IECore.StringData( "ImageDisplayDriver" )
134+
135+
idd1 = IECoreImage.ClientDisplayDriver( displayWindow, dataWindow, list( ["R", "G"] ), params )
136+
idd2 = IECoreImage.ClientDisplayDriver( displayWindow, dataWindow, list( ["R", "G"] ), params )
137+
138+
params['displayDriverServer:mergeId'] = IECore.IntData( 666 )
139+
params['displayDriverServer:mergeClients'] = IECore.IntData( 1 )
140+
idd3 = IECoreImage.ClientDisplayDriver( displayWindow, dataWindow, list( ["R", "G"] ), params )
141+
142+
# Test that the merge map has merge id 42 and that there are two clients
143+
mergeDriverInfo = IECoreImage.DisplayDriverServer.getMergeDriverInfo( 42 )
144+
self.assertEqual( mergeDriverInfo[1], 2 )
145+
146+
# Test that a new merge driver with a new id creates a new display driver
147+
mergeDriverInfo2 = IECoreImage.DisplayDriverServer.getMergeDriverInfo( 666 )
148+
self.assertNotEqual( mergeDriverInfo[0], mergeDriverInfo2[0] )
149+
150+
# Test that one image close will remove one client from the merge map
151+
idd1.imageClose()
152+
mergeDriverInfo = IECoreImage.DisplayDriverServer.getMergeDriverInfo( 42 )
153+
self.assertEqual( mergeDriverInfo[1], 1 )
154+
155+
# Test that after the last image close no clients are left in the map
156+
idd2.imageClose()
157+
self.assertRaises( RuntimeError, lambda : IECoreImage.DisplayDriverServer.getMergeDriverInfo( 42 ) )
158+
159+
idd3.imageClose()
160+
161+
server = None
162+
121163
if __name__ == "__main__":
122164
unittest.main()
123165

0 commit comments

Comments
 (0)