Hi,

Thank you Lukas for looking at my problem.
The LSS-version of Nightshade is a clone of the official Nightsade version
+ keyboard shortcuts which can launch scripts, videos and music.
Each key of the 105 keys has a special function and it is specially
designed for a planetarium public show.
With bluetooth modules, we can drive the show with a Nintendo Wii remote ;
very useful.
http://www.lss-planetariums.info/index.php?lang=en&menu=hardware&page=keyboard

I tried to compile Nightshade-LSS on Ubuntu-12, Linux Mint and Mageia2 via
VirtualBox and i get exactly the same errors.
So, i think it is not a Gentoo problem...but nevertheless very annoying :-(

I looked at the Nightshade-LSS sources and it seems that the error occurs
with the nshade_shared_memory.h and nshade_shared_memory.cpp in
 ~/nightshade-11.7.1/nscontrol/src
I join the two files ; may be these files would help us.

Thank you very much,

--
Jacques






2012/10/10 mindrunner <ker...@ccube.de>

> Hi,
> i stepped little further in the last hours. I copied the ebuild to my
> layman overlay (luman) and tried to emerge. I got the same error you got
> compiling your special version!
> At the moment I am cloning the official bzr repository (>1GB) which
> means waiting a long time at 1mbit DSL :(
> When cloned, I will dig some more into the sources.
>
> the error we get here points to some wrong usage of the boost container,
> but i cannot tell any more right now.
>
> what exactly is the difference to your ns-version compared to vanilla one?
>
> I think just replacing version number and url should provide you a
> working ebuild.
> we can try this after compiling vanilla sucesfull.
>
>
> lukas
>
> On 10/09/2012 10:53 PM, Jacques Montier wrote:
> > Hi ,
> >
> > Thank you Lukas for your post.
> > The Nighshade soft i use is a LSS version compiled for small
> > planetariums by Yves Lhoumeau and Lionel Ruiz.
> > I can only get the sources here :
> >
> http://www.lss-planetariums.info/index.php?lang=en&menu=nightshade&page=nightshade
> > The sabayon Nightshade ebuild is different .
> > I agree with you, i very much prefer to install packages using ebuilds,
> > but i am afraid i am not able to develop any ebuild...
> > Sorry... :-(
> > Some months ago i successfully compiled Nightshade with boost-1.46.1-r1
> > ; but unfortunately it does not anymore compile even with the same boost
> > version...
> >
> > Thank you again,
> >
> > Cheers,
> >
> > --
> > Jacques
> >
> >
> > 2012/10/9 mindrunner <ker...@ccube.de <mailto:ker...@ccube.de>>
> >
> >     Hi,
> >     I always prefer to NOT install software this way into my gentoo.
> Instead
> >     of this I first check http://gpo.zugaina.org/ if there is already an
> >     ebuild or outdated ebuild for this piece of software. If not I begin
> to
> >     develop my own ebuild.
> >
> >     In this case there is already one (sabayon-overlay). However, you
> should
> >     NOT add sabayon overlay into your gentoo box. I got some weird
> problems
> >     doing this some time ago. I think this shoul only be used in sabayon
> >     distro, but I dont know exactly.
> >
> >     If you want to, I could copy it into my overlay (luman), which
> should be
> >     more safe not bricking your whole gentoo box.
> >
> >     Yeah, I know... you asked sth. completely different, but in my
> opinion,
> >     you should better do this way...
> >
> >     KLooking at you Problem tells me that you got a boost problem. Maybe
> >     wrong version you compile against?
> >
> >     Since I am writing my bachelor thesis right now, I have only little
> >     spartetime, but if you want to we could try to make a working ebuild
> on
> >     base of the sabayon one.
> >
> >
> >     regards
> >     Lukas
> >
> >
> >     On 10/09/2012 07:06 PM, Jacques Montier wrote:
> >     > Hi everybody,
> >     >
> >     > Since a few months i have a problem about compiling Nightshade
> soft.
> >     > Nightshade is a full dome planetarium opensource software.
> >     >
> >
> http://www.lss-planetariums.info/index.php?lang=en&menu=nightshade&page=nightshade
> >     > Nightshade is not in portage so i have to manually install it
> >     > (./configure, make and make install).
> >     > make fails with errors :
> >     >
> >     > -------------------------
> >     > In file included from /usr/include/boost/container/map.hpp:26:0,
> >     >                  from
> >     /usr/include/boost/interprocess/containers/map.hpp:19,
> >     >                  from nshade_shared_memory.h:34,
> >     >                  from nshade_shared_memory.cpp:30:
> >     > ------------------------
> >     > -----------------------
> >     > boost::interprocess::iset_index> > >, bool is_iterator = false, P0
> =
> >     > std::less<boost::uuids::uuid>, P1 =
> >     >
> >
> boost::interprocess::allocator<boost::container::container_detail::pair<boost::uuids::uuid,
> >     > boost::interprocess::offset_ptr<NshadeSharedMemoryConnection> >,
> >     > boost::interprocess::segment_manager<char,
> >     >
> >
> boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family>,
> >     > boost::interprocess::iset_index> >, size_t = long unsigned int]’
> >     > nshade_shared_memory.cpp:251:1:   instantiated from here
> >     > /usr/include/boost/container/map.hpp:147:1: erreur: invalid
> >     application
> >     > of ‘sizeof’ to incomplete type
> >     ‘boost::STATIC_ASSERTION_FAILURE<false>’
> >     > make[4]: *** [nshade_shared_memory.lo] Erreur 1
> >     >
> >     > I don't know how to solve that problem.
> >     > Have you any idea about it ?
> >     > Thank you very much,
> >     >
> >     > Cheers,
> >     >
> >     > --
> >     > Jacques
> >
> >
>
>
/*
 * Copyright (C) 2010 Digitalis Education Solutions, Inc.
 * Author: Trystan Larey-Williams
 * Date: 2-22-2010
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 3
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 *
 * Nightshade is a trademark of Digitalis Education Solutions, Inc.
 * See the TRADEMARKS file for trademark usage requirements.
 *
 */

/*
 * Helper class to manage named shared memory resources wraps read and write
 * calls in mutex for IPC safety
 */

#include "nshade_shared_memory.h"

using namespace boost::interprocess;
using namespace std;

NshadeSharedMemory::NshadeSharedMemory() {
	m_clsid = boost::uuids::random_generator()();
	m_shm = new managed_shared_memory( open_or_create, "/nightshadeSM", 4096000 );
    
	const ShmAlloc allocator( m_shm->get_segment_manager() );
	m_connections = m_shm->find_or_construct<ShmMap>(unique_instance)(std::less<boost::uuids::uuid>(), allocator);
	m_mutex       = m_shm->find_or_construct<interprocess_mutex>("global_mutex")();
	m_readerMutex = m_shm->find_or_construct<interprocess_mutex>("reader_mutex")();
	m_writerMutex = m_shm->find_or_construct<interprocess_mutex>("writer_mutex")();
	m_writeState  = m_shm->find_or_construct<NshadeWriteState>(unique_instance)(m_shm);
	m_readState   = m_shm->find_or_construct<NshadeReadState>(unique_instance)(m_shm);
	m_refCount    = m_shm->find_or_construct<ReferenceCounter>(unique_instance)();
	m_nsConf      = m_shm->find_or_construct<NshadeConf>(unique_instance)(m_shm);
	m_readPtr     = m_shm->find_or_construct<RTQPtr>("read_ptr")();
	m_writePtr    = m_shm->find_or_construct<RTQPtr>("write_ptr")();
	m_RTQGap      = m_shm->find_or_construct<RTQGap>(unique_instance)();

	if( m_refCount->m_ref == 0 ) {
		cout << "Nightshade Shared Memory Segment Initialized.\n";

		// Initialize 'fast' circular message buffer
		*m_writePtr = m_shm->construct<RTQueueNode>(anonymous_instance)();
		offset_ptr<RTQueueNode> tmp = *m_writePtr;
		for( unsigned int i = 0; i < RTQSIZE; i++ ) {
			tmp->next = m_shm->construct<RTQueueNode>(anonymous_instance)();
			tmp = tmp->next;
		}
		*m_readPtr = tmp;	     // Initialize reader one node behind writer
		tmp->next = *m_writePtr; // Close the circle
		*m_RTQGap = 1;
	}

	m_refCount->m_ref++;
	m_clientType = NshadeSharedMemoryConnection::user;
}

NshadeSharedMemory::~NshadeSharedMemory() {
	if( --m_refCount->m_ref == 0 ) {
		// Remove any unreleased connection objects
		for( ShmMap::iterator itr = m_connections->begin(); itr != m_connections->end(); itr++ ) {
			m_shm->destroy_ptr( (itr->second).get() );
		}
		m_connections->clear();

		// Cleanup shared instances
		try {
			m_shm->destroy<interprocess_mutex>("global_mutex");
			m_shm->destroy<interprocess_mutex>("reader_mutex");
			m_shm->destroy<interprocess_mutex>("writer_mutex");
			m_shm->destroy<NshadeReadState>(unique_instance);
			m_shm->destroy<NshadeWriteState>(unique_instance);
			m_shm->destroy<RTQPtr>("read_ptr");
			m_shm->destroy<RTQPtr>("write_ptr");
			m_shm->destroy<RTQGap>(unique_instance);
			m_shm->destroy<NshadeConf>(unique_instance);
			m_shm->destroy<ReferenceCounter>(unique_instance);
			m_shm->destroy<ShmMap>(unique_instance);
		}
		catch( ... ) {
			printf("Warning: Not all shared memory objects could be destroyed.\n");
		}

		// Tear-down shared memory
		delete m_shm;
		shared_memory_object::remove( "nightshadeSM" );
		cout << "Nightshade Shared Memory Segment Removed.\n";
	}
	else
		delete m_shm;
}

void NshadeSharedMemory::Connect( void ) {
	m_mutex->lock();
	if( m_connections->find(m_clsid) == m_connections->end() ) {
		offset_ptr<NshadeSharedMemoryConnection> obj = m_shm->construct<NshadeSharedMemoryConnection>(anonymous_instance)( m_shm );
		obj->SetOwner( m_clsid );
		obj->SetClientType( m_clientType );
		(*m_connections)[m_clsid] = obj;
	}
	m_mutex->unlock();
}

void NshadeSharedMemory::Disconnect( void ) {
	m_mutex->lock();
	ShmMap::iterator itr = m_connections->find(m_clsid);
	if( itr != m_connections->end() ) {
		m_shm->destroy_ptr( (itr->second).get() );
		m_connections->erase( m_clsid );
	}
	m_mutex->unlock();
}

boost::interprocess::offset_ptr<NshadeConf> NshadeSharedMemory::Config( void ) {
	return m_nsConf;
}

void NshadeSharedMemory::SetClientType( NshadeSharedMemoryConnection::Type type ) {
	m_clientType = type;
}

bool NshadeSharedMemory::TryLock() {
	return m_mutex->try_lock();
}

void NshadeSharedMemory::Lock() {
	m_mutex->lock();
}

void NshadeSharedMemory::UnLock() {
	m_mutex->unlock();
}

bool NshadeSharedMemory::Read( std::string& data ) {
	bool have_data = false;
//	cerr << "Available Shared Memory: " << m_shm->get_segment_manager()->get_free_memory() << endl;

	m_mutex->lock();
	try {
		ShmMap::iterator itr = m_connections->find(m_clsid);
		if( itr !=  m_connections->end() && !itr->second->Empty() ) {
			have_data = true;
			NshadeCommand cmd = itr->second->DeQueue();
			data = std::string( cmd.buf, cmd.length );
		}
	}
	catch( std::exception& e ) {
		m_mutex->unlock();
		cerr << e.what() << endl;
		cerr << "Available Shared Memory: " << m_shm->get_segment_manager()->get_free_memory() << endl;
		throw e;
	}

	m_mutex->unlock();
	return have_data;
}

void NshadeSharedMemory::Write( std::string data ) {
	m_mutex->lock();
	try {
		NshadeCommand cmd;
		unsigned int len = data.length();
		if( len >= NshadeCommand::szBuf )
			len = NshadeCommand::szBuf - 1;

		memcpy( (void*)cmd.buf, (void*)data.c_str(), len );
		cmd.length = len;

		for( ShmMap::iterator itr = m_connections->begin(); itr != m_connections->end(); itr++ ) {
			if( itr->second->Owner() !=  m_clsid && itr->second->ClientType() != m_clientType ) {
				itr->second->Queue( cmd );
			}
		}
	}
	catch( std::exception& e ) {
		m_mutex->unlock();
		cerr << e.what() << endl;
		cerr << "Available Shared Memory: " << m_shm->get_segment_manager()->get_free_memory() << endl;
		throw e;
	}

	m_mutex->unlock();
}

///////////////////////////////////////////////////////////////////////////////
// Experimental performance oriented RW methods. Do not currently have much
// effect on performance in practice and more effort is needed to integrate and
// encapsulate their data structures.
///////////////////////////////////////////////////////////////////////////////

bool NshadeSharedMemory::ReadRT( std::string& data ) {
	m_readerMutex->lock();

	m_mutex->lock();
	bool empty = *m_RTQGap == 1;
	m_mutex->unlock();

	if( empty ) {
		m_readerMutex->unlock();
		return false;
	}

	*m_readPtr = (*m_readPtr)->next;
	data = std::string( (*m_readPtr)->msg.buf, (*m_readPtr)->msg.length );

	m_mutex->lock();
		--(*m_RTQGap);
	m_mutex->unlock();

	m_readerMutex->unlock();
	return true;
}

void NshadeSharedMemory::WriteRT( std::string data ) {
	m_writerMutex->lock();

	m_mutex->lock();
	bool full = *m_RTQGap == (RTQSIZE - 1);
	m_mutex->unlock();

	if( full ) {
		m_writerMutex->unlock();
		return;
	}

	unsigned int len = data.length();
	if( len >= NshadeCommand::szBuf )
		len = NshadeCommand::szBuf - 1;
	memcpy( (void*)(*m_writePtr)->msg.buf, (void*)data.c_str(), len );
	(*m_writePtr)->msg.length = len;
	*m_writePtr = (*m_writePtr)->next;

	m_mutex->lock();
		++(*m_RTQGap);
	m_mutex->unlock();

	m_writerMutex->unlock();
}

/*
 * Copyright (C) 2010 Digitalis Education Solutions, Inc.
 * Author: Trystan Larey-Williams
 * Date: 2-22-2010
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 3
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 *
 * Nightshade is a trademark of Digitalis Education Solutions, Inc.
 * See the TRADEMARKS file for trademark usage requirements.
 *
 */

/*
 * Helper class to manage named shared memory resources wraps read and write
 * calls in mutex for IPC safety
 */

#pragma once

#include "nshade_shared_memory_connection.h"
#include "nshade_state.h"
#include <boost/interprocess/containers/map.hpp>
#include <boost/interprocess/containers/pair.hpp>
#include <boost/interprocess/allocators/allocator.hpp>
#include <boost/uuid/uuid.hpp>
#include <boost/uuid/uuid_generators.hpp>


// A single instance of this object is loaded into shared memory to track the number of active
// SharedMemory objects. When an instance of SharedMemory is destroyed it will check the count.
// If zero, the shared memory segment will be cleaned up and all shared data removed.
struct ReferenceCounter {
	ReferenceCounter() { m_ref = 0; };
	unsigned long m_ref;
};

class NshadeSharedMemory {
public:
	NshadeSharedMemory();
	virtual ~NshadeSharedMemory();

	void Connect( void );
	void Disconnect( void );
	bool ReadRT( std::string& data );
	void WriteRT( std::string data );
	bool Read( std::string& data );
	void Write( std::string data );
	boost::interprocess::offset_ptr<NshadeConf> Config( void );
	void SetClientType( NshadeSharedMemoryConnection::Type );

	// For nightshade suspend checking
	void Lock( void );
	void UnLock( void );
	bool TryLock( void );
	// end nightshade suspend checking

	boost::interprocess::offset_ptr<NshadeWriteState> m_writeState;
	boost::interprocess::offset_ptr<NshadeReadState> m_readState;

private:
	static const unsigned int RTQSIZE = 100;

	// Type definitions for IPC friendly linked-list container of connections to shared memory]
	typedef boost::interprocess::pair<boost::uuids::uuid,
			boost::interprocess::offset_ptr<NshadeSharedMemoryConnection> > ConnectionPair;

	typedef boost::interprocess::allocator<ConnectionPair,
			boost::interprocess::managed_shared_memory::segment_manager> ShmAlloc;

	typedef boost::interprocess::map<boost::uuids::uuid,
			boost::interprocess::offset_ptr<NshadeSharedMemoryConnection>, std::less<boost::uuids::uuid>, ShmAlloc> ShmMap;

	// Unique (for each process) pointer to shared memory
	boost::interprocess::managed_shared_memory* m_shm;

	// Pointers to shared objects within shared memory
	boost::interprocess::offset_ptr<NshadeConf> m_nsConf;
	boost::interprocess::offset_ptr<ReferenceCounter> m_refCount;
	boost::interprocess::offset_ptr<ShmMap> m_connections;
    boost::interprocess::offset_ptr<RTQPtr> m_writePtr;
	boost::interprocess::offset_ptr<RTQPtr> m_readPtr;
	boost::interprocess::offset_ptr<RTQGap> m_RTQGap;
	boost::interprocess::offset_ptr<boost::interprocess::interprocess_mutex> m_mutex;
	boost::interprocess::offset_ptr<boost::interprocess::interprocess_mutex> m_readerMutex;
	boost::interprocess::offset_ptr<boost::interprocess::interprocess_mutex> m_writerMutex;

	NshadeSharedMemoryConnection::Type m_clientType;
	boost::uuids::uuid m_clsid;
};

Reply via email to