diff options
Diffstat (limited to 'src/squeue')
-rw-r--r-- | src/squeue/squeue.c | 76 | ||||
-rw-r--r-- | src/squeue/squeue.h | 1 | ||||
-rw-r--r-- | src/squeue/squeue.vapi | 2 |
3 files changed, 61 insertions, 18 deletions
diff --git a/src/squeue/squeue.c b/src/squeue/squeue.c index 0386784..0d134f0 100644 --- a/src/squeue/squeue.c +++ b/src/squeue/squeue.c @@ -1,5 +1,6 @@ #include "squeue.h" #include <unistd.h> +#include <errno.h> #include <stdlib.h> #include <sys/ipc.h> #include <signal.h> @@ -10,7 +11,7 @@ #include <string.h> #define POOL_SIZE ITEM_MAX*ITEM_SIZE -#define ITEM_SIZE 80 +#define ITEM_SIZE 512 #define ITEM_MAX 10 int squeue_release(const char *file) @@ -29,36 +30,63 @@ int squeue_release(const char *file) return shmctl(shmid, IPC_RMID,NULL); } +extern int errno; struct squeue_t *squeue_open(const char *file, int mode) { struct squeue_t *q; char *pool; int shmid; - key_t k = ftok(file, 0xa3); + key_t k; + + k = ftok(file, 0x34); + if (k == -1) { + perror("ftok"); + squeue_release(file); + close(creat(file, 0666)); + chmod(file, 0666); + k = ftok(file, 0xa3); + if (k == -1) { + perror("ftok"); + return NULL; + } + } _retry: - shmid = shmget(k, POOL_SIZE, 0666); + shmid = shmget(k, POOL_SIZE, 0666|(mode==Q_CREAT)?IPC_CREAT:0); if (shmid == -1) { - if (mode == Q_WAIT) { - usleep(200); - goto _retry; - } - shmid = shmget(k, POOL_SIZE, 0666|IPC_EXCL|((mode==Q_CREAT)?IPC_CREAT:0)); + perror("shmget1"); + shmid = shmget(k, POOL_SIZE, 0666|((mode==Q_CREAT)?IPC_CREAT:0)); if (shmid == -1) { - if (mode == Q_WAIT) { - usleep(200); - goto _retry; + perror("shmget2"); + if (errno == EEXIST) + shmid = shmget(k, POOL_SIZE, 0666 |IPC_CREAT); + + if (shmid == -1) { + if (mode == Q_WAIT) { + usleep(100); + goto _retry; + } + perror("shmget"); + return NULL; } - perror("shmget"); - return NULL; } } if (mode == Q_WAIT) mode = Q_OPEN; - pool = shmat(shmid, NULL, k); + /* fix perms */ + if (mode == Q_CREAT) { + struct shmid_ds sd; + shmctl(shmid, IPC_STAT, &sd); + sd.shm_perm.uid = 1000; + sd.shm_perm.gid = 1000; + sd.shm_perm.mode = sd.shm_perm.mode|0666; + shmctl(shmid, IPC_SET, &sd); + } + + pool = shmat(shmid, NULL, 0); if (((int)pool) == -1) { - perror("shmat\n"); + perror("shmat"); return NULL; } @@ -113,7 +141,7 @@ int squeue_push(struct squeue_t *q, const char *str, int lock) printf("buffer is full\n"); return -1; } - usleep(200); + usleep(100); } q->squeue_idx = 0; } @@ -132,6 +160,18 @@ int squeue_push(struct squeue_t *q, const char *str, int lock) return 0; } +int squeue_push2(struct squeue_t *q, const char *head, const char *str, int lock) +{ + int ret; + char *buf = malloc(strlen(head) + strlen(str) + 2); + strcpy(buf, head); + strcat(buf, ":"); + strcat(buf, str); + ret = squeue_push(q, buf, lock); + free(buf); + return ret; +} + int squeue_pop(struct squeue_t *q) { int i; @@ -175,7 +215,7 @@ char *squeue_get(struct squeue_t *q, int lock) return q->pool+i; } if (lock) - usleep(500); + usleep(100); } while (lock); return NULL; } @@ -226,7 +266,7 @@ int main() printf("get: (%s)\n", uh); squeue_pop(q); } - usleep(200); + usleep(100); } squeue_close(q); } else { diff --git a/src/squeue/squeue.h b/src/squeue/squeue.h index 4730e3d..e027d51 100644 --- a/src/squeue/squeue.h +++ b/src/squeue/squeue.h @@ -22,6 +22,7 @@ struct squeue_t *squeue_open(const char *file, int init); int squeue_close(struct squeue_t *q); void squeue_free(struct squeue_t *q); int squeue_push(struct squeue_t *q, const char *str, int lock); +int squeue_push2(struct squeue_t *q, const char *head, const char *str, int lock); int squeue_pop(struct squeue_t *q); char *squeue_get(struct squeue_t *q, int lock); void squeue_stats(struct squeue_t *q); diff --git a/src/squeue/squeue.vapi b/src/squeue/squeue.vapi index b8d82d4..0f66713 100644 --- a/src/squeue/squeue.vapi +++ b/src/squeue/squeue.vapi @@ -19,6 +19,8 @@ namespace SQueues { public static SQueue* open(string file, int mode); [CCode (cname = "squeue_push")] public int push(string msg, int l); + [CCode (cname = "squeue_push2")] + public int push2(string cmd, string msg, int l); [CCode (cname = "squeue_get")] public weak string get(int l); [CCode (cname = "squeue_pop")] |