[svn-commits] nadi: branch crichter/0.4.0 r38851 - /team/crichter/0.4.0/channels/chan_misdn.c

svn-commits at lists.digium.com svn-commits at lists.digium.com
Fri Aug 4 01:48:25 MST 2006


Author: nadi
Date: Fri Aug  4 03:48:17 2006
New Revision: 38851

URL: http://svn.digium.com/view/asterisk?rev=38851&view=rev
Log:
using unnamed semaphore for syncing in misdn_thread.

Modified:
    team/crichter/0.4.0/channels/chan_misdn.c

Modified: team/crichter/0.4.0/channels/chan_misdn.c
URL: http://svn.digium.com/view/asterisk/team/crichter/0.4.0/channels/chan_misdn.c?rev=38851&r1=38850&r2=38851&view=diff
==============================================================================
--- team/crichter/0.4.0/channels/chan_misdn.c (original)
+++ team/crichter/0.4.0/channels/chan_misdn.c Fri Aug  4 03:48:17 2006
@@ -39,8 +39,7 @@
 #include <sys/ioctl.h>
 #include <signal.h>
 #include <sys/file.h>
-#include <sys/ipc.h>
-#include <sys/sem.h>
+#include <semaphore.h>
 
 #include <asterisk/channel.h>
 #include <asterisk/config.h>
@@ -256,7 +255,6 @@
 /* the main schedule context for stuff like l1 watcher, overlap dial, ... */
 static struct sched_context *misdn_tasks = NULL;
 static pthread_t misdn_tasks_thread;
-static int misdn_tasks_semid;
 
 static void chan_misdn_log(int level, int port, char *tmpl, ...);
 
@@ -446,11 +444,6 @@
 {
 	int wait;
 	struct sigaction sa;
-	struct sembuf semb = {
-		.sem_num = 0,
-		.sem_op = 1,
-		.sem_flg = 0
-	};
 
 	sa.sa_handler = sighandler;
 	sa.sa_flags = SA_NODEFER;
@@ -458,7 +451,7 @@
 	sigaddset(&sa.sa_mask, SIGUSR1);
 	sigaction(SIGUSR1, &sa, NULL);
 	
-	semop(misdn_tasks_semid, &semb, 1);
+	sem_post((sem_t *)data);
 
 	while (1) {
 		wait = ast_sched_wait(misdn_tasks);
@@ -473,44 +466,21 @@
 
 static void misdn_tasks_init (void)
 {
-	key_t key;
-	union {
-		int val;
-		struct semid_ds *buf;
-		unsigned short *array;
-		struct seminfo *__buf;
-	} semu;
-	struct sembuf semb = {
-		.sem_num = 0,
-		.sem_op = -1,
-		.sem_flg = 0
-	};
-	
-	chan_misdn_log(4, 0, "Starting misdn_tasks thread\n");
-	
-	key = ftok("/etc/asterisk/misdn.conf", 'E');
-	if (key == -1) {
-		perror("chan_misdn: Failed to create a semaphore key!");
-		exit(1);
-	}
-
-	misdn_tasks_semid = semget(key, 10, 0666 | IPC_CREAT);
-	if (misdn_tasks_semid == -1) {
-		perror("chan_misdn: Failed to get a semaphore!");
-		exit(1);
-	}
-
-	semu.val = 0;
-	if (semctl(misdn_tasks_semid, 0, SETVAL, semu) == -1) {
+	sem_t blocker;
+	int i = 5;
+
+	if (sem_init(&blocker, 0, 0)) {
 		perror("chan_misdn: Failed to initialize semaphore!");
 		exit(1);
 	}
 
+	chan_misdn_log(4, 0, "Starting misdn_tasks thread\n");
+	
 	misdn_tasks = sched_context_create();
-	pthread_create(&misdn_tasks_thread, NULL, misdn_tasks_thread_func, NULL);
-
-	semop(misdn_tasks_semid, &semb, 1);
-	semctl(misdn_tasks_semid, 0, IPC_RMID, semu);
+	pthread_create(&misdn_tasks_thread, NULL, misdn_tasks_thread_func, &blocker);
+
+	while (sem_wait(&blocker) && --i);
+	sem_destroy(&blocker);
 }
 
 static void misdn_tasks_destroy (void)



More information about the svn-commits mailing list