diff options
Diffstat (limited to 'src/lib')
| -rw-r--r-- | src/lib/dev.c | 6 | ||||
| -rw-r--r-- | src/lib/shm_ap_rbuff.c | 51 | ||||
| -rw-r--r-- | src/lib/shm_rdrbuff.c | 4 | 
3 files changed, 49 insertions, 12 deletions
| diff --git a/src/lib/dev.c b/src/lib/dev.c index 17c473ed..25c3fcd4 100644 --- a/src/lib/dev.c +++ b/src/lib/dev.c @@ -112,7 +112,7 @@ int ap_init(char * ap_name)                  return -1;          } -        _ap_instance->rb = shm_ap_rbuff_create(); +        _ap_instance->rb = shm_ap_rbuff_create_s();          if (_ap_instance->rb == NULL) {                  shm_rdrbuff_close(_ap_instance->rdrb);                  bmp_destroy(_ap_instance->fds); @@ -216,7 +216,7 @@ int flow_accept(char ** ae_name)                  return -1;          } -        _ap_instance->flows[cfd].rb = shm_ap_rbuff_open(recv_msg->api); +        _ap_instance->flows[cfd].rb = shm_ap_rbuff_open_n(recv_msg->api);          if (_ap_instance->flows[cfd].rb == NULL) {                  bmp_release(_ap_instance->fds, cfd);                  pthread_rwlock_unlock(&_ap_instance->flows_lock); @@ -347,7 +347,7 @@ int flow_alloc(char * dst_name,                  return -1;          } -        _ap_instance->flows[fd].rb = shm_ap_rbuff_open(recv_msg->api); +        _ap_instance->flows[fd].rb = shm_ap_rbuff_open_n(recv_msg->api);          if (_ap_instance->flows[fd].rb == NULL) {                  bmp_release(_ap_instance->fds, fd);                  pthread_rwlock_unlock(&_ap_instance->flows_lock); diff --git a/src/lib/shm_ap_rbuff.c b/src/lib/shm_ap_rbuff.c index 77e288a8..6cc9590e 100644 --- a/src/lib/shm_ap_rbuff.c +++ b/src/lib/shm_ap_rbuff.c @@ -40,6 +40,10 @@  #include <signal.h>  #include <sys/stat.h> +#define FN_MAX_CHARS 255 +#define NORTH false +#define SOUTH true +  #define SHM_RBUFF_FILE_SIZE (SHM_BUFFER_SIZE * sizeof(struct rb_entry)         \                               + 2 * sizeof(size_t) + sizeof(pthread_mutex_t)    \                               + 2 * sizeof (pthread_cond_t)) @@ -59,19 +63,23 @@ struct shm_ap_rbuff {          pthread_cond_t *  add;         /* SDU arrived */          pthread_cond_t *  del;         /* SDU removed */          pid_t             api;         /* api to which this rb belongs */ +        bool              dir;         /* direction, false = N */          int               fd;  }; -struct shm_ap_rbuff * shm_ap_rbuff_create() +static struct shm_ap_rbuff * shm_ap_rbuff_create(bool dir)  {          struct shm_ap_rbuff * rb;          int                   shm_fd;          struct rb_entry *     shm_base;          pthread_mutexattr_t   mattr;          pthread_condattr_t    cattr; -        char                  fn[25]; +        char                  fn[FN_MAX_CHARS]; -        sprintf(fn, SHM_AP_RBUFF_PREFIX "%d", getpid()); +        if (dir == SOUTH) +                sprintf(fn, SHM_AP_RBUFF_PREFIX "south.%d", getpid()); +        else +                sprintf(fn, SHM_AP_RBUFF_PREFIX "north.%d", getpid());          rb = malloc(sizeof(*rb));          if (rb == NULL) { @@ -150,18 +158,22 @@ struct shm_ap_rbuff * shm_ap_rbuff_create()          rb->fd  = shm_fd;          rb->api = getpid(); +        rb->dir = dir;          return rb;  } -struct shm_ap_rbuff * shm_ap_rbuff_open(pid_t api) +static struct shm_ap_rbuff * shm_ap_rbuff_open(pid_t api, bool dir)  {          struct shm_ap_rbuff * rb;          int                   shm_fd;          struct rb_entry *     shm_base; -        char                  fn[25]; +        char                  fn[FN_MAX_CHARS]; -        sprintf(fn, SHM_AP_RBUFF_PREFIX "%d", api); +        if (dir == SOUTH) +                sprintf(fn, SHM_AP_RBUFF_PREFIX "south.%d", api); +        else +                sprintf(fn, SHM_AP_RBUFF_PREFIX "north.%d", api);          rb = malloc(sizeof(*rb));          if (rb == NULL) { @@ -204,9 +216,31 @@ struct shm_ap_rbuff * shm_ap_rbuff_open(pid_t api)          rb->fd = shm_fd;          rb->api = api; +        rb->dir = dir;          return rb;  } + +struct shm_ap_rbuff * shm_ap_rbuff_create_n() +{ +        return shm_ap_rbuff_create(NORTH); +} + +struct shm_ap_rbuff * shm_ap_rbuff_create_s() +{ +        return shm_ap_rbuff_create(SOUTH); +} + +struct shm_ap_rbuff * shm_ap_rbuff_open_n(pid_t api) +{ +        return shm_ap_rbuff_open(api, NORTH); +} + +struct shm_ap_rbuff * shm_ap_rbuff_open_s(pid_t api) +{ +        return shm_ap_rbuff_open(api, SOUTH); +} +  void shm_ap_rbuff_close(struct shm_ap_rbuff * rb)  {          if (rb == NULL) { @@ -252,7 +286,10 @@ void shm_ap_rbuff_destroy(struct shm_ap_rbuff * rb)          if (close(rb->fd) < 0)                  LOG_DBG("Couldn't close shared memory."); -        sprintf(fn, SHM_AP_RBUFF_PREFIX "%d", rb->api); +        if (rb->dir == SOUTH) +                sprintf(fn, SHM_AP_RBUFF_PREFIX "south.%d", rb->api); +        else +                sprintf(fn, SHM_AP_RBUFF_PREFIX "north.%d", rb->api);          if (munmap(rb->shm_base, SHM_RBUFF_FILE_SIZE) == -1)                  LOG_DBG("Couldn't unmap shared memory."); diff --git a/src/lib/shm_rdrbuff.c b/src/lib/shm_rdrbuff.c index 93a889ce..07574f1a 100644 --- a/src/lib/shm_rdrbuff.c +++ b/src/lib/shm_rdrbuff.c @@ -139,13 +139,13 @@ static char * rdrb_filename(enum qos_cube qos)                  ++chars;          } while (qm > 0); -        str = malloc(strlen(SHM_RDRB_PREFIX) + chars + 2); +        str = malloc(strlen(SHM_RDRB_PREFIX) + chars + 1);          if (str == NULL) {                  LOG_ERR("Failed to create shm_rdrbuff: Out of Memory.");                  return NULL;          } -        sprintf(str, "%s.%d", SHM_RDRB_PREFIX, (int) qos); +        sprintf(str, "%s%d", SHM_RDRB_PREFIX, (int) qos);          return str;  } | 
