Corba/Mico reincarnation through the ServantManager

I'm using Mico/Corba to Programm a Predictiongame. I've got a Problem with the server. The Problem is the reincarnation of saved files through the ServantManager. The incarnation of new Game Objects works fine also the serialisation and unserialisation does. After restarting the Server i would like to reincarnate the Game Objects. The ServantManager calls the incarnate method once for the first file but thats it. It doesn't hang or throws an exception. I can't figure out why he does it only once. Is there any good documentation for that? I haven't found anything that could help me to find the resolution for this problem.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
::Predictiongame::Game_ptr Gameplay_impl::loadSavedGame() {
	// generate a ObjectID so that the ServantManager can
	// decide what Objekttyp has to be generated
	char oidstr[255];
	sprintf(oidstr,"games//game_%d.dat",gameCnt);
	PortableServer::ObjectId_var tmpoid=PortableServer::string_to_ObjectId(oidstr);

	// Generate a reference for a "virtual" Object.
	// The Servant Manager generates a Object with caling the incarnate() method.
	// But he does it only the first time. Why???
	CORBA::Object_var obj = mypoa->create_reference_with_id (tmpoid,"IDL:Game:1.0");
	assert (!CORBA::is_nil (obj));
	::Predictiongame::Game_ptr aref = ::Predictiongame::Game::_narrow (obj);
	assert (!CORBA::is_nil (aref));
	oid[gameCnt] = mypoa->reference_to_id(aref); // get id of the Game Objekt and save it in a array
	gameCnt ++;
	return aref;	
}



// incarnate-method in the Implementation of the ServantManager
PortableServer::Servant GameManager::incarnate (const PortableServer::ObjectId & oid,PortableServer::POA_ptr poa) {
	CORBA::String_var name = PortableServer::ObjectId_to_string (oid);
	cout << "INCARNATE oid: " << PortableServer::ObjectId_to_string(oid) << endl;
	// decide on the basis of the ObjectID what kind of Object has to be generated
	if(strstr(PortableServer::ObjectId_to_string(oid),"game")){
		Game_impl* game = new Game_impl(name);
		game->unserialize();			
		svGameMap[game] = game;
		return game;
	}
	else if(...
		...

	return NULL;
}


int main (int argc, char *argv[]){
	orb = CORBA::ORB_init (argc, argv);
	CORBA::Object_var poaobj = orb->resolve_initial_references ("RootPOA");
	PortableServer::POA_var poa = PortableServer::POA::_narrow (poaobj);
	PortableServer::POAManager_var mgr = poa->the_POAManager();

	CORBA::PolicyList pl;
	pl.length(2);
	pl[0] = poa->create_request_processing_policy (PortableServer::USE_SERVANT_MANAGER);
	pl[1] = poa->create_lifespan_policy (PortableServer::PERSISTENT);
	PortableServer::POA_var gamepoa = poa->create_POA ("Games", PortableServer::POAManager::_nil(), pl);
	PortableServer::POAManager_var gamemgr = gamepoa->the_POAManager();
	
	// activate ServantManager
	GameManager * am = new GameManager;
	PortableServer::ServantManager_var amref = am->_this ();
	gamepoa->set_servant_manager (amref);

 	...
	
	// generate Gameplay
	Gameplay_impl * predGame = new Gameplay_impl (gamepoa); 
	PortableServer::ObjectId_var oid = PortableServer::string_to_ObjectId ("Gameplay");


	gameplaypoa->activate_object_with_id (*oid, predGame);

	...

	// activate POAs
	mgr->activate ();
	gamemgr->activate ();

	int fileCnt = cntFiles("games//");

	// reincarnate all saved Game Objects.
	for(int i = 0;i < fileCnt;i++){
		predGame->loadSavedGame();
	}
	orb->run();

	...

	return 0;
}


Any help would be much appreciated!
Last edited on
I've found a solution. The repoid must be unique too.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
::Predictiongame::Game_ptr Gameplay_impl::loadSavedGame() {
	// generate a ObjectID so that the ServantManager can
	// decide what Objekttyp has to be generated
	char repoid[255];
	sprintf(repoid,"IDL:Game:1.%d", gameCnt);
	
	char oidstr[255];
	sprintf(oidstr,"games//game_%d.dat",gameCnt);
	PortableServer::ObjectId_var tmpoid=PortableServer::string_to_ObjectId(oidstr);

	// Generate a reference for a "virtual" Object.
	// The Servant Manager generates a Object with caling the incarnate() method.
	CORBA::Object_var obj = mypoa->create_reference_with_id (tmpoid,repoid);
	assert (!CORBA::is_nil (obj));
	::Predictiongame::Game_ptr aref = ::Predictiongame::Game::_narrow (obj);
	assert (!CORBA::is_nil (aref));
	oid[gameCnt] = mypoa->reference_to_id(aref); // get id of the Game Objekt and save it in a array
	gameCnt ++;
	return aref;	
}
Topic archived. No new replies allowed.