Browse Source

- fixed minor Makefile bugs
- added mmap shm support (-DSHM_MMAP)
- etc

Andrei Pelinescu-Onciul 24 năm trước cách đây
mục cha
commit
dcb5f364d0
11 tập tin đã thay đổi với 110 bổ sung31 xóa
  1. 4 2
      Makefile.defs
  2. 1 1
      Makefile.modules
  3. 1 1
      Makefile.rules
  4. 1 1
      config.h
  5. 5 4
      main.c
  6. 5 2
      modules/tm/sh_malloc.h
  7. 5 2
      modules/tm/t_funcs.c
  8. 2 2
      modules/tm/test/kill_sem.sh
  9. 43 2
      shm_mem.c
  10. 6 0
      shm_mem.h
  11. 37 14
      t_debug.cfg

+ 4 - 2
Makefile.defs

@@ -30,6 +30,8 @@ ARCH = $(shell uname -s)
 # -DSHM_MEM	
 #		compiles in shared mem. support, needed by some modules and
 #		by USE_SHM_MEM
+# -DSHM_MMAP
+#		use mmap instead of SYSV shared memory
 # -DPKG_MALLOC	
 #		uses a faster malloc (exclusive w/ USE_SHM_MEM)
 # -DUSE_SHM_MEM	
@@ -43,8 +45,8 @@ ARCH = $(shell uname -s)
 #		twice, trying to free a pointer alloc'ed with a different
 #		malloc etc.)
 DEFS= -DNAME='"$(NAME)"' -DVERSION='"$(RELEASE)"' -DARCH='"$(ARCH)"' \
-	 -DDNS_IP_HACK  -DSHM_MEM \
-	 -DPKG_MALLOC #-DDBG_QM_MALLOC -DNODEBUG
+	 -DDNS_IP_HACK  -DSHM_MEM -DSHM_MMAP\
+	 -DPKG_MALLOC -DNO_DEBUG #-DDBG_QM_MALLOC 
 #-DEXTRA_DEBUG
 # -DUSE_SHM_MEM
 #-DNO_DEBUG 

+ 1 - 1
Makefile.modules

@@ -19,7 +19,7 @@ ALLDEP+=../../Makefile.defs
 else
 # called by the main Makefile
 
-ALLDEP+=../../Makefile
+ALLDEP+=../../Makefile ../../Makefile.defs
 
 endif
 

+ 1 - 1
Makefile.rules

@@ -23,7 +23,7 @@
 
 
 # normal rules
-$(NAME): $(objs)
+$(NAME): $(objs) $(ALLDEP)
 	$(LD) $(LDFLAGS) $(objs) $(LIBS) -o $(NAME) 
 
 

+ 1 - 1
config.h

@@ -48,7 +48,7 @@
 #define PKG_MEM_POOL_SIZE 1024*1024
 
 /*used is SH_MEM is defined*/
-#define SHM_MEM_SIZE 1024*1024
+#define SHM_MEM_SIZE 128*1024*1024
 
 #define TIMER_TICK 1
 #define LONG_SLEEP	3600

+ 5 - 4
main.c

@@ -66,6 +66,9 @@ static char flags[]=
 #ifdef SHM_MEM
 ", SHM_MEM"
 #endif
+#ifdef SHM_MMAP
+", SHM_MMAP"
+#endif
 #ifdef PKG_MALLOC
 ", PKG_MALLOC"
 #endif
@@ -342,7 +345,8 @@ static void sig_usr(int signo)
 		if (is_main)
 			shm_mem_destroy();
 #endif
-		goto bye;
+		DPrint("Thank you for flying " NAME "\n");
+		exit(0);
 	} else if (signo==SIGUSR1) { /* statistic */
 #ifdef STATS
 		dump_all_statistic();
@@ -356,9 +360,6 @@ static void sig_usr(int signo)
 		shm_status();
 #endif
 	}
-bye:
-	DPrint("Thank you for flying " NAME "\n");
-	exit(0);
 }
 
 

+ 5 - 2
modules/tm/sh_malloc.h

@@ -14,13 +14,16 @@
 
 #define sh_malloc(size)		shm_malloc((size))
 #define sh_free(ptr)		shm_free((ptr))
+#define sh_status()			shm_status()
 
 #else
 
 #include <stdlib.h>
 
-#define sh_malloc(size)		shm_malloc((size))
-#define sh_free(ptr)		shm_free((ptr))
+#warn "you should define SHM_MEM"
+#define sh_malloc(size)		malloc((size))
+#define sh_free(ptr)		free((ptr))
+#define sh_status()
 
 #endif
 

+ 5 - 2
modules/tm/t_funcs.c

@@ -140,8 +140,11 @@ int t_add_transaction( struct sip_msg* p_msg, char* foo, char* bar )
 
    /* creates a new transaction */
    new_cell = build_cell( p_msg ) ;
-   if  ( !new_cell )
+   if  ( !new_cell ){
+	   LOG(L_ERR, "ERROR: add_transaction: out of mem:\n");
+	   sh_status();
       return -1;
+	}
    /*insert the transaction into hash table*/
    insert_into_hash_table( hash_table , new_cell );
    DBG("DEBUG: t_add_transaction: new transaction inserted, hash: %d\n", new_cell->hash_index );
@@ -1223,7 +1226,7 @@ int t_put_on_wait(  struct cell  *Trans  )
   if ( is_in_timer_list( (&(Trans->wait_tl)) , WT_TIMER_LIST) )
   {
      DBG("DEBUG: t_put_on_wait: already on wait\n");
-     return -1;
+     return 1;
   }
 
    DBG("DEBUG: t_put_on_wait: stopping timers (FR and RETR)\n");

+ 2 - 2
modules/tm/test/kill_sem.sh

@@ -1,4 +1,4 @@
 #!/bin/sh
 
-ipcrm sem `cat /proc/sysvipc/sem | awk '{ print $2; }'`
-ipcrm shm `ipcs -m | awk '{ print $2; }'` 
+ipcrm sem `ipcs -s |grep $(whoami) | awk '{ print $2; }'`
+ipcrm shm `ipcs -m | grep $(whoami) |awk '{ print $2; }'` 

+ 43 - 2
shm_mem.c

@@ -8,6 +8,16 @@
 #include "shm_mem.h"
 #include "config.h"
 
+#ifdef  SHM_MMAP
+
+#include <unistd.h>
+#include <sys/mman.h>
+#include <sys/types.h> /*open*/
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#endif
+
 
 /* define semun */
 #if defined(__GNU_LIBRARY__) && !defined(_SEM_SEMUN_UNDEFINED)
@@ -24,8 +34,9 @@
 
 
 
-
+#ifndef SHM_MMAP
 static int shm_shmid=-1; /*shared memory id*/
+#endif
 int shm_semid=-1; /*semaphore id*/
 static void* shm_mempool=(void*)-1;
 struct qm_block* shm_block;
@@ -36,15 +47,36 @@ struct qm_block* shm_block;
 int shm_mem_init()
 {
 
-	struct shmid_ds shm_info;
 	union semun su;
+#ifdef SHM_MMAP
+	int fd;
+#else
+	struct shmid_ds shm_info;
+#endif
 	int ret;
 
+#ifdef SHM_MMAP
+	if (shm_mempool && (shm_mempool!=(void*)-1)){
+#else
 	if ((shm_shmid!=-1)||(shm_semid!=-1)||(shm_mempool!=(void*)-1)){
+#endif
 		LOG(L_CRIT, "BUG: shm_mem_init: shm already initialized\n");
 		return -1;
 	}
 	
+#ifdef SHM_MMAP
+	fd=open("/dev/zero", O_RDONLY);
+	if (fd==-1){
+		LOG(L_CRIT, "ERROR: shm_mem_init: could not open /dev/zero: %s\n",
+				strerror(errno));
+		return -1;
+	}
+	shm_mempool=mmap(0, SHM_MEM_SIZE, PROT_READ|PROT_WRITE, MAP_PRIVATE,
+						fd ,0);
+	/* close /dev/zero */
+	close(fd);
+#else
+	
 	shm_shmid=shmget(IPC_PRIVATE, SHM_MEM_SIZE, 0700);
 	if (shm_shmid==-1){
 		LOG(L_CRIT, "ERROR: shm_mem_init: could not allocate shared memory"
@@ -52,6 +84,7 @@ int shm_mem_init()
 		return -1;
 	}
 	shm_mempool=shmat(shm_shmid, 0, 0);
+#endif
 	if (shm_mempool==(void*)-1){
 		LOG(L_CRIT, "ERROR: shm_mem_init: could not attach shared memory"
 				" segment: %s\n", strerror(errno));
@@ -93,17 +126,25 @@ int shm_mem_init()
 
 void shm_mem_destroy()
 {
+#ifndef SHM_MMAP
 	struct shmid_ds shm_info;
+#endif
 	
 	DBG("shm_mem_destroy\n");
 	if (shm_mempool && (shm_mempool!=(void*)-1)) {
+#ifdef SHM_MMAP
+		munmap(shm_mempool, SHM_MEM_SIZE);
+#else
 		shmdt(shm_mempool);
+#endif
 		shm_mempool=(void*)-1;
 	}
+#ifndef SHM_MMAP
 	if (shm_shmid!=-1) {
 		shmctl(shm_shmid, IPC_RMID, &shm_info);
 		shm_shmid=-1;
 	}
+#endif
 	if (shm_semid!=-1) {
 		semctl(shm_semid, 0, IPC_RMID, (union semun)0);
 		shm_semid=-1;

+ 6 - 0
shm_mem.h

@@ -12,7 +12,13 @@
 #include <errno.h>
 #include <sys/types.h>
 #include <sys/ipc.h>
+
+#ifndef SHM_MMAP
+
 #include <sys/shm.h>
+
+#endif
+
 #include <sys/sem.h>
 #include <string.h>
 #include <errno.h>

+ 37 - 14
t_debug.cfg

@@ -1,12 +1,12 @@
-debug=9          # debug level (cmd line: -dddddddddd)
+debug=3          # debug level (cmd line: -dddddddddd)
 check_via=yes     # (cmd. line: -v)
 dns=on           # (cmd. line: -r)
 rev_dns=yes      # (cmd. line: -R)
-fork=no          # (cmd. line: -D)
-#children=5
+fork=yes          # (cmd. line: -D)
+children=4
 log_stderror=yes # (cmd line: -E)
 #port=5080
-#listen=192.168.99.100
+listen=127.0.0.1
 loop_checks=1
 # for more info: sip_router -h
 
@@ -16,35 +16,58 @@ loadmodule "modules/tm/tm.so"
 
 route{
 	#rewritehost("iptel.org");
-	log("trying forward to uri");
 #	forward(uri:host,uri:port);
 #	forward(127.0.0.1, 5090);
-	log("after forward");
+#	sethost("127.0.0.1");
+#	setport("5090");
 
 	if ( t_lookup_request()) {
 		if ( method=="ACK" )	{
 			log("SER: ACK received -> t_release\n");
-			t_forward("iptel.org", "5060" );
-			t_release();
+			if (! t_forward("127.0.0.1", "5090" )) {
+				log("SER: WARNING: bad forward\n");
+			};
+			if (! t_release()) {
+				log("SER: WARNING: bad t_release\n");
+			};
 		} else {
-			t_retransmit_reply();
+			if (! t_retransmit_reply()) {
+				log("SER: WARNING: bad t_retransmit_reply\n");
+			};
 			log("SER: yet another annoying retranmission\n");
 		};
 	} else {
-		t_add_transaction();
+		if (! t_add_transaction()){
+			log("SER: ERROR: t_add_transaction\n");
+		};
 		if (method=="CANCEL") {
 			log("SER: new CANCEL\n");
 			# XXX ... it wants me to put status code in ""
-			t_send_reply( "200", "glad to cancel");
+			if (! t_send_reply( "200", "glad to cancel")){
+				log("SER:ERROR: t_send_reply\n");
+			};
 		} else {
 			log("SER: new transaction\n");
-			t_send_reply("100", "trying -- your call is important to us");
+			if (! t_send_reply("100", "trying -- your call is important to us")
+				){
+				log("SER: ERROR: t_send_reply (100)\n");
+			};
 		};
 		#rewritehost("iptel.org");
 		# XXX ... it wants me to put port nr in ""
 		#t_forward("benetnash.fokus.gmd.de", "5080" );
-		#t_forward("iptel.org", "5060" );
-		t_forward_uri();
+		if (method=="BYE") {
+			log("SER: BYE received, HACK: forwarding to client\n");
+			if (! t_forward("127.0.0.1", "5000")){
+				log("SER:ERROR: t_forward (..., 5000)\n");
+			};
+				
+		}else{
+			if (! t_forward("127.0.0.1", "5090" )){
+				log("SER:ERROR: t_forward (..., 5090)\n");
+			};
+		};
+		#t_forward_uri();
 		# XXX ... it doesn't like default port numbers
 		# t_forward("fox.iptel.org" );
 		# XXX t_forward_uri ... not done yet