Index: trunk/FACT++/dim/README_v19.txt
===================================================================
--- trunk/FACT++/dim/README_v19.txt	(revision 12756)
+++ trunk/FACT++/dim/README_v19.txt	(revision 12757)
@@ -1,4 +1,4 @@
 
-                    DIM version 19.26 Release Notes
+                    DIM version 19.27 Release Notes
 
 Notes 1 and 2 for Unix Users only
@@ -17,5 +17,30 @@
 		Dns </dev/null >& dns.log &
 
-NOTE 3: The Version Number service provided by servers is now set to 1926.
+NOTE 3: The Version Number service provided by servers is now set to 1927.
+
+19/01/2012
+Changes for version 19.27:
+    - Updated the DIM Makefiles for MacOSX (Darwin)
+    - Added New possibilities to change DIM timeouts:
+	- 2 New Environment variables:
+	    - DIM_WRITE_TMOUT				(default: 5)
+	    - DIM_KEEPALIVE_TMOUT			(default: 15)
+	- Same functionality as the functions:
+	    - dim_set_write_timeout(int secs)
+	    - int dim_get_write_timeout()
+	    - dim_set_keepalive_timeout(int secs)	//new
+	    - int dim_get_keepalive_timeout()		//new
+	- The functions have precedence over the environment variables.
+    - The server per client exit_handler functionality 
+      (provided by dis_add_client_exit_handler()/dis_set_client_exit_handler())
+      wan not always working correctly (in case of write timeouts) - fixed.
+    - Changed the reporting of "Write Tiemout":
+	- Used to report only: 
+	    - "ERROR: Write Timeout, disconnecting from..."
+	- Now reports:
+	    - "WARNING: Write Timeout, writing to ..."
+	    - If it disconnects: "ERROR: Write Timeout, disconnecting from ..."
+	    - If it reconnects later: "INFO: Re-connected to ..." 
+
 
 14/09/2011
Index: trunk/FACT++/dim/dim/dim.h
===================================================================
--- trunk/FACT++/dim/dim/dim.h	(revision 12756)
+++ trunk/FACT++/dim/dim/dim.h	(revision 12757)
@@ -14,5 +14,5 @@
 #include "dim_common.h"
 
-#define DIM_VERSION_NUMBER 1926
+#define DIM_VERSION_NUMBER 1927
 
 #define MY_LITTLE_ENDIAN	0x1
@@ -203,4 +203,5 @@
 #define	TEST_TIME_VMS		30		/* Interval to test conn.    */
 #define	TEST_WRITE_TAG		25		/* DTQ tag for test writes   */
+#define	WRITE_TMOUT			5		/* Interval to wait while writing.    */
 
 #define	OPN_MAGIC		0xc0dec0de	/* Magic value 1st packet    */
Index: trunk/FACT++/dim/dim/dim_common.h
===================================================================
--- trunk/FACT++/dim/dim/dim_common.h	(revision 12756)
+++ trunk/FACT++/dim/dim/dim_common.h	(revision 12757)
@@ -202,4 +202,6 @@
 _DIM_PROTOE( void dis_set_debug_on,		() );
 _DIM_PROTOE( void dis_set_debug_off,	() );
+_DIM_PROTOE( void dim_set_keepalive_timeout,		(int secs) );
+_DIM_PROTOE( int dim_get_keepalive_timeout,		() );
 
 #ifdef WIN32
Index: trunk/FACT++/dim/src/dic.c
===================================================================
--- trunk/FACT++/dim/src/dic.c	(revision 12756)
+++ trunk/FACT++/dim/src/dic.c	(revision 12757)
@@ -1431,5 +1431,5 @@
 #endif
 */
-			dna_set_test_write(conn_id, TEST_TIME_OSK);
+			dna_set_test_write(conn_id, dim_get_keepalive_timeout());
 			dic_connp = &Dic_conns[conn_id];
 			strncpy( dic_connp->node_name, node_name,
Index: trunk/FACT++/dim/src/diccpp.cxx
===================================================================
--- trunk/FACT++/dim/src/diccpp.cxx	(revision 12756)
+++ trunk/FACT++/dim/src/diccpp.cxx	(revision 12757)
@@ -95,7 +95,6 @@
 int DimInfo::getTimestamp()
 {
-	int ret;
-
-	ret = dic_get_timestamp(itsId, &secs, &millisecs);
+
+	dic_get_timestamp(itsId, &secs, &millisecs);
 	return(secs);
 }
Index: trunk/FACT++/dim/src/dis.c
===================================================================
--- trunk/FACT++/dim/src/dis.c	(revision 12756)
+++ trunk/FACT++/dim/src/dis.c	(revision 12757)
@@ -133,4 +133,6 @@
 	int conn_id;
 	int exit_id;
+	char node[MAX_NODE_NAME];
+	char task[MAX_TASK_NAME];
 } EXIT_H;
 
@@ -1966,4 +1968,6 @@
 
 	DISABLE_AST
+	*secs = 0;
+	*millisecs = 0;
 	if(!serv_id)
 	{
@@ -1989,4 +1993,5 @@
 		*millisecs = servp->user_millisecs;
 	}
+/*
 	else
 	{
@@ -1994,4 +1999,5 @@
 		*millisecs = 0;
 	}
+*/
 	ENABLE_AST
 	return(1);
@@ -2345,4 +2351,7 @@
 	if(!(clip = find_client(conn_id)))
 	{
+		/*
+		dna_set_test_write(conn_id, 15);
+		*/
 		clip = (CLIENT *)malloc(sizeof(CLIENT));
 		clip->conn_id = conn_id;
@@ -2941,8 +2950,81 @@
 	ENABLE_AST
 }
-		
+	
+static void add_exit_handler_item(int conn_id, int tag)
+{
+	EXIT_H *newp;
+
+	DISABLE_AST
+	if(!Exit_h_head) 
+	{
+		Exit_h_head = (EXIT_H *)malloc(sizeof(EXIT_H));
+		sll_init( (SLL *) Exit_h_head );
+	}
+	if( (newp = (EXIT_H *)sll_search((SLL *) Exit_h_head, 
+		(char *)&conn_id, 4)) )
+	{
+		newp->conn_id = conn_id;
+		newp->exit_id = tag;
+		strcpy(newp->node, Net_conns[conn_id].node);
+		strcpy(newp->task, Net_conns[conn_id].task);
+	}
+	else
+	{
+		newp = (EXIT_H *)malloc(sizeof(EXIT_H));
+		newp->conn_id = conn_id;
+		newp->exit_id = tag;
+		strcpy(newp->node, Net_conns[conn_id].node);
+		strcpy(newp->task, Net_conns[conn_id].task);
+		sll_insert_queue( (SLL *) Exit_h_head, (SLL *) newp );
+	}
+	ENABLE_AST
+}
+
+static void rem_exit_handler_item(EXIT_H *exitp)
+{
+
+	DISABLE_AST
+	if(!Exit_h_head) 
+	{
+		ENABLE_AST
+		return;
+	}
+	sll_remove( (SLL *) Exit_h_head, (SLL *) exitp );
+	free(exitp);
+	ENABLE_AST
+}
+
+static EXIT_H *find_exit_handler_item(int conn_id)
+{
+	EXIT_H *exitp;
+
+	DISABLE_AST;
+	if(!Exit_h_head)
+	{
+		ENABLE_AST;
+		return((EXIT_H *)0);
+	}
+	if( (exitp = (EXIT_H *) sll_search((SLL *) Exit_h_head, (char *) &conn_id, 4)) )
+	{
+		ENABLE_AST;
+		return(exitp);
+	}
+	ENABLE_AST;
+	return((EXIT_H *)0);
+}
+
+static int check_exit_handler_item(EXIT_H *exitp, int conn_id)
+{
+	if( (!strcmp(exitp->node, Net_conns[conn_id].node)) &&
+		(!strcmp(exitp->task, Net_conns[conn_id].task)))
+	{
+		return exitp->exit_id;
+	}
+	return 0;
+}
+
 void add_exit_handler(int *tag, int *bufp, int *size)
 {
-	EXIT_H *newp;
+	EXIT_H *exitp;
 
 	if(size){}
@@ -2950,23 +3032,10 @@
 	if(*bufp)
 	{
-		if(!Exit_h_head) 
-		{
-			Exit_h_head = (EXIT_H *)malloc(sizeof(EXIT_H));
-			sll_init( (SLL *) Exit_h_head );
-		}
-		newp = (EXIT_H *)malloc(sizeof(EXIT_H));
-		newp->conn_id = Curr_conn_id;
-		newp->exit_id = *bufp;
-		sll_insert_queue( (SLL *) Exit_h_head, (SLL *) newp );
+		add_exit_handler_item(Curr_conn_id, *bufp);
 	}
 	else
 	{
-		if(!Exit_h_head) 
-			return;
-		if((newp = (EXIT_H *)sll_search((SLL *) Exit_h_head, 
-			(char *)&Curr_conn_id, 4)) )
-		{
-			sll_remove( (SLL *) Exit_h_head, (SLL *) newp );
-		}
+		if((exitp = find_exit_handler_item(Curr_conn_id)))
+			rem_exit_handler_item(exitp);
 	}
 }
@@ -2974,49 +3043,36 @@
 void dis_set_client_exit_handler(int conn_id, int tag)
 {
-	EXIT_H *newp;
-
-	DISABLE_AST
+	EXIT_H *exitp;
+
 	if(tag)
 	{
-		if(!Exit_h_head) 
-		{
-			Exit_h_head = (EXIT_H *)malloc(sizeof(EXIT_H));
-			sll_init( (SLL *) Exit_h_head );
-		}
-		if( (newp = (EXIT_H *)sll_search((SLL *) Exit_h_head, 
-			(char *)&conn_id, 4)) )
-		{
-			newp->conn_id = conn_id;
-			newp->exit_id = tag;
+		add_exit_handler_item(conn_id, tag);
+	}
+	else
+	{
+		if((exitp = find_exit_handler_item(conn_id)))
+			rem_exit_handler_item(exitp);
+	}
+}
+
+
+int do_exit_handler(int conn_id)
+{
+	register EXIT_H *exitp;
+	int exit_id;
+
+	DISABLE_AST;
+	if((exitp = find_exit_handler_item(conn_id)))
+	{
+		if((exit_id = check_exit_handler_item(exitp, conn_id)))
+		{
+			(Client_exit_user_routine)( &exit_id );
 		}
 		else
 		{
-			newp = (EXIT_H *)malloc(sizeof(EXIT_H));
-			newp->conn_id = conn_id;
-			newp->exit_id = tag;
-			sll_insert_queue( (SLL *) Exit_h_head, (SLL *) newp );
-		}
-	}
-	else
-	{
-		if(!Exit_h_head) 
-		{
-			ENABLE_AST
-			return;
-		}
-		if( (newp = (EXIT_H *)sll_search((SLL *) Exit_h_head, 
-			(char *)&conn_id, 4)) )
-		{
-			sll_remove( (SLL *) Exit_h_head, (SLL *) newp );
-		}
-	}
-	ENABLE_AST
-}
-
-int do_exit_handler(int conn_id)
-{
-	register EXIT_H *exitp;
-
-	DISABLE_AST;
+			rem_exit_handler_item(exitp);
+		}
+	}
+/*
 	if(!Exit_h_head)
 	{
@@ -3030,4 +3086,5 @@
 		free(exitp);
 	}
+*/
 	ENABLE_AST
 	return(1);
Index: trunk/FACT++/dim/src/discpp.cxx
===================================================================
--- trunk/FACT++/dim/src/discpp.cxx	(revision 12756)
+++ trunk/FACT++/dim/src/discpp.cxx	(revision 12757)
@@ -1332,8 +1332,7 @@
 int DimCommand::getTimestamp()
 {
-	int ret;
 
 	if(secs == 0)
-		ret = dis_get_timestamp(itsId, &secs, &millisecs);
+		dis_get_timestamp(itsId, &secs, &millisecs);
 	return(secs);
 }
Index: trunk/FACT++/dim/src/dna.c
===================================================================
--- trunk/FACT++/dim/src/dna.c	(revision 12756)
+++ trunk/FACT++/dim/src/dna.c	(revision 12757)
@@ -31,7 +31,11 @@
 	int port;
 	SRC_TYPES src_type;
+	time_t last_used;
 } PENDING_OPEN;
 
+#define TMOUT_PENDING_CONN_TMOUT 3600
+#define MAX_TMOUT_PENDING_CONNS 10
 static PENDING_OPEN Pending_conns[MAX_CONNS];
+static PENDING_OPEN Pending_conns_tmout[MAX_TMOUT_PENDING_CONNS];
 
 static int DNA_Initialized = FALSE;
@@ -311,5 +315,5 @@
 		  {
 		    dna_report_error(conn_id, -1,
-				     "Write timeout, disconnecting from", DIM_ERROR, DIMTCPWRTMO);
+				     "Write timeout, writing to", DIM_WARNING, DIMTCPWRTMO);
 		    wrote = 0;
 		  }
@@ -526,7 +530,18 @@
 int dna_init()
 {
+	PENDING_OPEN *pending_connp;
+	int i, size;
+	
 	if(!DNA_Initialized)
 	{
 		conn_arr_create(SRC_DNA);
+		pending_connp = &Pending_conns[1];
+		size = MAX_CONNS;
+		for( i = 1; i < size; i++, pending_connp++ )
+			pending_connp->task_name[0] = '\0';
+		pending_connp = &Pending_conns_tmout[1];
+		size = MAX_TMOUT_PENDING_CONNS;
+		for( i = 1; i < size; i++, pending_connp++ )
+			pending_connp->task_name[0] = '\0';
 		DNA_Initialized = TRUE;
 	}
@@ -540,4 +555,6 @@
 	register int conn_id;
 
+	dna_init();
+/*
 	if(!DNA_Initialized)
 	{
@@ -545,4 +562,5 @@
 		DNA_Initialized = TRUE;
 	}
+*/
 	*protocol = PROTOCOL;
 	conn_id = conn_get();
@@ -600,11 +618,26 @@
 }
 
-static int ins_pend_conn( char *node, char *task, int port, SRC_TYPES src_type )
+static int ins_pend_conn( char *node, char *task, int port, SRC_TYPES src_type, int type, time_t last_used )
 {
 	register PENDING_OPEN *pending_connp;
-	register int i;
-
-	for( i = 1, pending_connp = &Pending_conns[1]; i < MAX_CONNS; 
-		i++, pending_connp++ )
+	register int i, size;
+	time_t oldest;
+	int oldesti;
+
+	if(type == 0)
+	{
+		pending_connp = &Pending_conns[1];
+		size = MAX_CONNS;
+		oldest = 0;
+	}
+	else
+	{
+		pending_connp = &Pending_conns_tmout[1];
+		size = MAX_TMOUT_PENDING_CONNS;
+		oldest = time(NULL);
+		oldesti = 1;
+	}
+
+	for( i = 1; i < size; i++, pending_connp++ )
 	{
 		if( pending_connp->task_name[0] == '\0' )
@@ -614,17 +647,58 @@
 			pending_connp->port = port;
 			pending_connp->src_type = src_type;
+			pending_connp->last_used = last_used;
 			return(i);
 		}
+		else
+		{
+			if(pending_connp->last_used < oldest)
+			{
+				oldest = pending_connp->last_used;
+				oldesti = i;
+			}
+		}
+	}
+	if(type != 0)
+	{
+		pending_connp = &Pending_conns_tmout[oldesti];
+		strcpy(pending_connp->node_name, node);
+		strcpy(pending_connp->task_name, task);
+		pending_connp->port = port;
+		pending_connp->src_type = src_type;
+		pending_connp->last_used = last_used;
+		return(oldesti);
 	}
 	return(0);
 }
 
-static int find_pend_conn( char *node, char *task, int port, SRC_TYPES src_type )
+static int find_pend_conn( char *node, char *task, int port, SRC_TYPES src_type, int type )
 {
 	register PENDING_OPEN *pending_connp;
-	register int i;
-
-	for( i = 1, pending_connp = &Pending_conns[1]; i < MAX_CONNS; 
-		i++, pending_connp++ )
+	register int i, size;
+	time_t curr_time;
+
+	if(type == 0)
+	{
+		pending_connp = &Pending_conns[1];
+		size = MAX_CONNS;
+	}
+	else
+	{
+		pending_connp = &Pending_conns_tmout[1];
+		size = MAX_TMOUT_PENDING_CONNS;
+		curr_time = time(NULL);
+		for( i = 1; i < size; i++, pending_connp++ )
+		{
+			if( pending_connp->task_name[0] != '\0' )
+			{
+				if( curr_time - pending_connp->last_used > TMOUT_PENDING_CONN_TMOUT )
+				{
+					pending_connp->task_name[0] = '\0';
+				}
+			}
+		}
+		pending_connp = &Pending_conns_tmout[1];
+	}
+	for( i = 1; i < size; i++, pending_connp++ )
 	{
 		if( (!strcmp(pending_connp->node_name, node)) &&
@@ -640,7 +714,17 @@
 
 
-static void rel_pend_conn( int conn_id )
-{
-	Pending_conns[conn_id].task_name[0] = '\0';
+static void rel_pend_conn( int id, int type )
+{
+	register PENDING_OPEN *pending_connp;
+
+	if(type == 0)
+	{
+		pending_connp = &Pending_conns[id];
+	}
+	else
+	{
+		pending_connp = &Pending_conns_tmout[id];
+	}
+	pending_connp->task_name[0] = '\0';
 }	
 
@@ -657,8 +741,11 @@
 
 	if(server_protocol){}
+	dna_init();
+/*
 	if(!DNA_Initialized) {
 		conn_arr_create(SRC_DNA);
 		DNA_Initialized = TRUE;
 	}
+*/
 	conn_id = conn_get();
 	dna_connp = &Dna_conns[conn_id] ;
@@ -676,5 +763,5 @@
 		{
 #endif
-		if(!find_pend_conn(server_node, server_task, port, src_type))
+		if(!find_pend_conn(server_node, server_task, port, src_type, 0))
 		{
 			if(src_type == SRC_DIS)
@@ -690,5 +777,5 @@
 			else
 				dna_report_error( conn_id, tcpip_code, str, DIM_ERROR, DIMTCPCNERR );
-			ins_pend_conn(server_node, server_task, port, src_type);
+			ins_pend_conn(server_node, server_task, port, src_type, 0, 0);
 		}
 #ifdef VMS
@@ -699,5 +786,5 @@
 		return(0);
 	}
-	if( (id = find_pend_conn(server_node, server_task, port, src_type)) )
+	if( (id = find_pend_conn(server_node, server_task, port, src_type, 0)) )
 	{
 		if(src_type == SRC_DIS)
@@ -712,5 +799,5 @@
 		else
 			dna_report_error( conn_id, -1, str, DIM_INFO, DIMTCPCNEST );
-		rel_pend_conn(id);
+		rel_pend_conn(id, 0);
 	}
 	dna_connp->state = RD_HDR;
@@ -744,5 +831,14 @@
 {
 	if(conn_id > 0)
+	{
+		if(Net_conns[conn_id].write_timedout)
+		{
+		    dna_report_error(conn_id, -1,
+				     "Write timeout, disconnecting from", DIM_ERROR, DIMTCPWRTMO);
+			if(!find_pend_conn(Net_conns[conn_id].node, Net_conns[conn_id].task, 0, 0, 1))
+				ins_pend_conn(Net_conns[conn_id].node, Net_conns[conn_id].task, 0, 0, 1, time(NULL));
+		}
 		release_conn(conn_id);
+	}
 	return(1);
 }
@@ -810,5 +906,5 @@
 		if(Net_conns[conn_id].node[0])
 		{
-			sprintf(str," %s on node %s",
+			sprintf(str," %s@%s",
 		       Net_conns[conn_id].task, Net_conns[conn_id].node);
 			strcat(msg, str);
@@ -829,6 +925,12 @@
 static void save_node_task(int conn_id, DNA_NET *buffer)
 {
+	int id;
 	strcpy(Net_conns[conn_id].node, buffer->node);
 	strcpy(Net_conns[conn_id].task, buffer->task);
-}
-
+	if((id = find_pend_conn(Net_conns[conn_id].node, Net_conns[conn_id].task, 0, 0, 1)))
+	{
+		dna_report_error( conn_id, -1, "Re-connected to", DIM_INFO, DIMDNSCNEST );
+		rel_pend_conn(id, 1);
+	}
+}
+
Index: trunk/FACT++/dim/src/dns.c
===================================================================
--- trunk/FACT++/dim/src/dns.c	(revision 12756)
+++ trunk/FACT++/dim/src/dns.c	(revision 12757)
@@ -310,5 +310,5 @@
 		if(strcmp(Dns_conns[conn_id].task_name,"DIS_DNS"))
 		{
-			dna_set_test_write(conn_id, 10);
+			dna_set_test_write(conn_id, dim_get_keepalive_timeout());
 		}
 		Dns_conns[conn_id].old_n_services = 0;
@@ -329,5 +329,5 @@
 		{
 			if(strcmp(Dns_conns[conn_id].task_name,"DIS_DNS"))
-				dna_set_test_write(conn_id, 10);
+				dna_set_test_write(conn_id, dim_get_keepalive_timeout());
 			dim_print_date_time();
 			printf( " Server %s out of error\n",
@@ -650,5 +650,6 @@
 			release_conn(conn_id);
 		}
-		Dns_conns[conn_id].validity = -Dns_conns[conn_id].validity;
+		else
+			Dns_conns[conn_id].validity = -Dns_conns[conn_id].validity;
 	}
 }		
@@ -716,4 +717,9 @@
 			dic_packet.pid = 0;
 			dic_packet.size = htovl(DNS_DIC_HEADER);
+			dim_print_date_time();
+			printf(" Connection from %s refused, stopping client pid=%s\n",
+					Net_conns[conn_id].node,
+					Net_conns[conn_id].task);
+			fflush(stdout);
 			if( !dna_write_nowait(conn_id, &dic_packet, DNS_DIC_HEADER) )
 			{
@@ -723,11 +729,5 @@
 					Net_conns[conn_id].node);
 				fflush(stdout);
-				release_conn(conn_id);
-			}
-			dim_print_date_time();
-			printf(" Connection from %s refused, stopping client pid=%s\n",
-					Net_conns[conn_id].node,
-					Net_conns[conn_id].task);
-			fflush(stdout);
+			}
 			release_conn(conn_id);
 
@@ -826,4 +826,6 @@
 	dic_packet.pid = 0;
 	dic_packet.size = htovl(DNS_DIC_HEADER);
+	if( Dns_conns[conn_id].src_type == SRC_NONE )
+		dna_set_test_write(conn_id, dim_get_keepalive_timeout());
 	if( !(servp = service_exists(serv_regp->service_name)) ) 
 	{
@@ -986,5 +988,5 @@
 	DNS_DIC_PACKET packet;
 	char *ptr;
-	int i;
+	int i, to_release = 0;
 
 	nodep = servp->node_head;
@@ -1016,4 +1018,5 @@
 					Net_conns[nodep->conn_id].node);
 			fflush(stdout);
+			to_release = nodep->conn_id;
 /*
 release_conn(nodep->conn_id);
@@ -1035,4 +1038,6 @@
 */
 	}
+	if(to_release)
+		release_conn(to_release);
 }
 
Index: trunk/FACT++/dim/src/examples/test_client.c
===================================================================
--- trunk/FACT++/dim/src/examples/test_client.c	(revision 12756)
+++ trunk/FACT++/dim/src/examples/test_client.c	(revision 12757)
@@ -25,13 +25,12 @@
 
 TT t;
-/*
-void big_rout( tag, buf, size )
-int *buf;
-int *tag, *size;
+
+void big_rout( int *tag, int *buf, int *size )
 {
 
-	printf("Received %d for TestMem\n", *buf);
+	if(size){}
+	printf("Received %d for TestMem_%d\n", *buf, *tag);
 }
-*/
+
 
 void got_servers( int *tag, char *list, int *size)
@@ -57,5 +56,6 @@
 void version_rout( int *tag, int *buf, int *size)
 {
-	printf("Received VERSION %x, %d\n", buf, *size);
+	if(tag){}
+	printf("Received VERSION %x, %d\n", (long)buf, *size);
 }
 
@@ -64,6 +64,6 @@
 int *tag, *size;
 {
+/*
 	char *format;
-/*
 	format = dic_get_format(0);
 	printf("Received format = %s %08x, %d\n",format, format, *size);
@@ -122,4 +122,5 @@
 	printf("%s\n",aux);
 	strcpy(client_str,argv[1]);
+
 	for(i = 0; i< 10; i++)
 	{
@@ -136,8 +137,11 @@
 	dic_info_service( str, MONITORED, 0, 0, 0, version_rout, 0,
 			  NULL, 0 );
-/*	
-	sprintf(aux,"%s/TestMem",argv[2]);
-	dic_info_service( aux, MONITORED, 0, 0, 0, big_rout, 0,
+/*
+	for(i = 0; i < 20; i++)
+	{
+		sprintf(aux,"%s/TestMem_%d",argv[2], i);
+		dic_info_service( aux, MONITORED, 0, 0, 0, big_rout, i,
 			  &no_link, 4 );
+	}
 */
 /*
Index: trunk/FACT++/dim/src/examples/test_server.c
===================================================================
--- trunk/FACT++/dim/src/examples/test_server.c	(revision 12756)
+++ trunk/FACT++/dim/src/examples/test_server.c	(revision 12757)
@@ -20,7 +20,7 @@
 TT t;
 
-/*
+
 int big_buff[1024];
-*/
+
 
 void cmnd_rout(int *tag, TT *buf, int *size)
@@ -64,8 +64,10 @@
 int main(int argc, char **argv)
 {
-	int i, id, *ptr;
+	int i, id, *ptr/*, big_ids[20]*/;
 	char aux[80];
-	char name[84], name1[132];
+	char name[84]/*, name1[132]*/;
+/*
 	int on = 0;
+*/
 	long dnsid = 0;
 	char extra_dns[128];
@@ -133,4 +135,5 @@
 	}
 */
+
 /*
 	for(i = 1; i <= 200; i++)
Index: trunk/FACT++/dim/src/examples/test_server.cxx
===================================================================
--- trunk/FACT++/dim/src/examples/test_server.cxx	(revision 12756)
+++ trunk/FACT++/dim/src/examples/test_server.cxx	(revision 12757)
@@ -97,10 +97,11 @@
 }
 
+DimService *bool_serv[10];
 void add_serv_bool(const bool & boolval)
 {
-	DimService *serv;
 
 //	serv = new DimService("TEST/BOOLVAL_CONST",(short &)boolval);
-	serv = new DimService("TEST/BOOLVAL_CONST","C:1", (void *)&boolval, 1);
+	bool_serv[0] = new DimService("TEST/BOOLVAL_CONST","C:1", (void *)&boolval, 1);
+	bool_serv[1] = new DimService("TEST/BOOLVAL_CONST1","C:1", (void *)&boolval, 1);
 }
 
@@ -131,4 +132,7 @@
 	DimService *new_servint;
 
+//	DimService *dim = new DimService("test","C");
+//	delete dim;
+
 	DimServer::start("TEST");
 	extraDns = DimUtil::getEnvVar("EXTRA_DNS_NODE");
@@ -186,5 +190,4 @@
 	{
 		sleep(5);
-
 /*
 		while(cmdsvr.hasNext())
@@ -200,4 +203,5 @@
 			boolval = 0;
 		ival++;
+		bool_serv[1]->updateService();
 		
 		int inCallback = DimServer::inCallback();
Index: trunk/FACT++/dim/src/tcpip.c
===================================================================
--- trunk/FACT++/dim/src/tcpip.c	(revision 12756)
+++ trunk/FACT++/dim/src/tcpip.c	(revision 12757)
@@ -89,5 +89,7 @@
 static int DIM_IO_valid = 1;
 
-static int Write_timeout = 5;
+static int Keepalive_timeout_set = 0;
+static int Write_timeout = WRITE_TMOUT;
+static int Write_timeout_set = 0;
 static int Write_buffer_size = TCP_SND_BUF_SIZE;
 static int Read_buffer_size = TCP_RCV_BUF_SIZE;
@@ -96,12 +98,38 @@
 int Tcpip_max_io_data_read = TCP_RCV_BUF_SIZE - 16;
 
+void dim_set_keepalive_timeout(int secs)
+{
+	Keepalive_timeout_set = secs;
+}
+
+int dim_get_keepalive_timeout()
+{
+	int ret;
+	extern int get_keepalive_tmout();
+
+	if(!(ret = Keepalive_timeout_set))
+	{
+		ret = get_keepalive_tmout();
+	}
+	return(ret);
+}
+
 void dim_set_write_timeout(int secs)
 {
-  Write_timeout = secs;
+	Write_timeout = secs;
+	Write_timeout_set = 1;
 }
 
 int dim_get_write_timeout()
 {
-  return(Write_timeout);
+	int ret;
+	extern int get_write_tmout();
+
+	if(!Write_timeout_set)
+	{
+		if((ret = get_write_tmout()))
+			Write_timeout = ret;
+	}
+	return(Write_timeout);
 }
 
@@ -196,6 +224,10 @@
 	void tcpip_pipe_sig_handler();
 #endif
-
-	if(init_done) return(1);
+	extern int get_write_tmout();
+
+	if(init_done) 
+		return(1);
+
+	dim_get_write_timeout();
 #ifdef WIN32
 	init_sock();
@@ -462,5 +494,5 @@
    val = 3;
    setsockopt(channel, IPPROTO_TCP, TCP_KEEPCNT, (char*)&val, sizeof(val));
-   val = 2;
+   val = tmout/3;
    setsockopt(channel, IPPROTO_TCP, TCP_KEEPINTVL, (char*)&val, sizeof(val));
 }
@@ -490,12 +522,16 @@
 void tcpip_set_test_write(int conn_id, int timeout)
 {
+
 #if defined(__linux__) && !defined (darwin)
 	tcpip_set_keepalive(Net_conns[conn_id].channel, timeout);
 #else
+
 	Net_conns[conn_id].timr_ent = dtq_add_entry( queue_id, timeout, 
 		tcpip_test_write, conn_id );
 	Net_conns[conn_id].timeout = timeout;
 	Net_conns[conn_id].last_used = time(NULL);
-#endif
+
+#endif
+
 }
 
Index: trunk/FACT++/dim/src/utilities.c
===================================================================
--- trunk/FACT++/dim/src/utilities.c	(revision 12756)
+++ trunk/FACT++/dim/src/utilities.c	(revision 12757)
@@ -284,2 +284,24 @@
 	}
 }
+
+int get_keepalive_tmout()
+{
+	char	*p;
+
+	if( (p = getenv("DIM_KEEPALIVE_TMOUT")) == NULL )
+		return(TEST_TIME_OSK);
+	else {
+		return(atoi(p));
+	}
+}
+
+int get_write_tmout()
+{
+	char	*p;
+
+	if( (p = getenv("DIM_WRITE_TMOUT")) == NULL )
+		return(0);
+	else {
+		return(atoi(p));
+	}
+}
