55
55
#include < thread>
56
56
#include < map>
57
57
#include < utility>
58
+ #include < optional>
58
59
59
60
#include < fcntl.h>
60
61
#ifndef _MSC_VER
@@ -72,7 +73,13 @@ IE_CORE_DEFINERUNTIMETYPED( DisplayDriverServer );
72
73
namespace
73
74
{
74
75
75
- std::map<int , std::pair<DisplayDriverPtr, int >> mergeMap;
76
+ struct MergeDriverInfo
77
+ {
78
+ DisplayDriverPtr mergeDriver = nullptr ;
79
+ int mergeCount = 0 ;
80
+ };
81
+
82
+ std::map<int , MergeDriverInfo> g_mergeMap;
76
83
77
84
/* Set the FD_CLOEXEC flag for the given socket descriptor, so that it will not exist on child processes.*/
78
85
static void fixSocketFlags ( int socketDesc )
@@ -118,8 +125,7 @@ class DisplayDriverServer::Session : public RefCounted
118
125
DisplayDriverPtr m_displayDriver;
119
126
DisplayDriverServerHeader m_header;
120
127
CharVectorDataPtr m_buffer;
121
- bool m_mergeSession;
122
- int m_mergeId;
128
+ std::optional<int > m_mergeId;
123
129
};
124
130
125
131
class DisplayDriverServer ::PrivateData : public RefCounted
@@ -299,7 +305,7 @@ void DisplayDriverServer::handleAccept( DisplayDriverServer::SessionPtr session,
299
305
*/
300
306
301
307
DisplayDriverServer::Session::Session ( boost::asio::io_service& io_service ) :
302
- m_socket( io_service ), m_displayDriver(nullptr ), m_buffer( new CharVectorData( ) ), m_mergeSession( false ), m_mergeId(- 1 )
308
+ m_socket( io_service ), m_displayDriver(nullptr ), m_buffer( new CharVectorData( ) )
303
309
{
304
310
}
305
311
@@ -369,14 +375,18 @@ void DisplayDriverServer::Session::handleReadHeader( const boost::system::error_
369
375
{
370
376
try
371
377
{
372
- if ( !m_mergeSession )
378
+ if ( !m_mergeId. has_value () )
373
379
{
374
380
m_displayDriver->imageClose ();
375
381
}
376
- else if ( auto search = mergeMap. find (m_mergeId); search != mergeMap. end () && --mergeMap[m_mergeId]. second <= 0 )
382
+ else
377
383
{
378
- mergeMap.erase (m_mergeId);
379
- m_displayDriver->imageClose ();
384
+ auto &m = g_mergeMap.at (m_mergeId.value ()); // Error out if not found
385
+ if ( --m.mergeCount <= 0 )
386
+ {
387
+ g_mergeMap.erase (m_mergeId.value ());
388
+ m_displayDriver->imageClose ();
389
+ }
380
390
}
381
391
}
382
392
catch ( std::exception &e )
@@ -437,38 +447,31 @@ void DisplayDriverServer::Session::handleReadOpenParameters( const boost::system
437
447
438
448
const StringData *displayType = parameters->member <StringData>( " remoteDisplayType" , true /* throw if missing */ );
439
449
440
- const BoolData *mergeDriverData = parameters->member <BoolData>( " mergeDriver" , false );
441
- m_mergeSession = mergeDriverData && mergeDriverData->readable ();
442
-
443
450
// create a displayDriver using the factory function.
444
- if (!m_mergeSession )
451
+ if ( !parameters-> member <IntData>( " displayDriverServer:mergeId " , false ) )
445
452
{
446
453
m_displayDriver = DisplayDriver::create ( displayType->readable (), displayWindow->readable (), dataWindow->readable (), channelNames->readable (), parameters );
447
454
}
448
455
else
449
456
{
450
- m_mergeId = parameters->member <IntData>( " sessionId " , true /* throw if missing */ )->readable ();
457
+ m_mergeId = parameters->member <IntData>( " displayDriverServer:mergeId " , false /* throw if missing */ )->readable ();
451
458
452
459
// Check if merge ID in map, if not then create display driver and session count pair with merge ID.
453
- if (const auto search = mergeMap.find (m_mergeId); search == mergeMap.end ())
460
+ auto &m = g_mergeMap[m_mergeId.value ()];
461
+ if ( !m.mergeDriver )
454
462
{
455
- const IntData *sessionClientsData = parameters->member <IntData>( " sessionClients" , true /* throw if missing */ );
456
- mergeMap.emplace (
457
- m_mergeId,
458
- std::make_pair (
459
- DisplayDriver::create (
460
- displayType->readable (),
461
- displayWindow->readable (),
462
- displayWindow->readable (), // For merge we want dataWindow = displayWindow
463
- channelNames->readable (),
464
- parameters
465
- ),
466
- sessionClientsData->readable ()
467
- )
463
+ const IntData *sessionClientsData = parameters->member <IntData>( " displayDriverServer:mergeClients" , true /* throw if missing */ );
464
+ m.mergeDriver = DisplayDriver::create (
465
+ displayType->readable (),
466
+ displayWindow->readable (),
467
+ displayWindow->readable (), // For merge we want dataWindow = displayWindow
468
+ channelNames->readable (),
469
+ parameters
468
470
);
471
+ m.mergeCount = sessionClientsData->readable ();
469
472
}
470
473
// Merge ID is now in map, so load the display driver.
471
- m_displayDriver = mergeMap[m_mergeId]. first ;
474
+ m_displayDriver = m. mergeDriver ;
472
475
}
473
476
scanLineOrder = m_displayDriver->scanLineOrderOnly ();
474
477
acceptsRepeatedData = m_displayDriver->acceptsRepeatedData ();
0 commit comments