aboutsummaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
Diffstat (limited to 'src/core')
-rw-r--r--src/core/defs.h4
-rw-r--r--src/core/message.c32
-rw-r--r--src/core/message.h2
-rw-r--r--src/core/msgqueue.c4
-rw-r--r--src/core/pipe.c10
-rw-r--r--src/core/socket.c16
6 files changed, 44 insertions, 24 deletions
diff --git a/src/core/defs.h b/src/core/defs.h
index 9687215d..0fe894b1 100644
--- a/src/core/defs.h
+++ b/src/core/defs.h
@@ -39,4 +39,8 @@ typedef int64_t nni_duration; // Relative time (usec).
#define NNI_TIME_ZERO ((nni_time) 0)
#define NNI_SECOND (1000000)
+// Structure allocation conveniences.
+#define NNI_ALLOC_STRUCT(s) nni_alloc(sizeof (*(s)))
+#define NNI_FREE_STRUCT(s) nni_free((s), sizeof (*(s)))
+
#endif // CORE_DEFS_H
diff --git a/src/core/message.c b/src/core/message.c
index 6fafc64c..3135cc95 100644
--- a/src/core/message.c
+++ b/src/core/message.c
@@ -233,14 +233,14 @@ nni_msg_alloc(nni_msg **mp, size_t sz)
nni_msg *m;
int rv;
- if ((m = nni_alloc(sizeof (*m))) == NULL) {
+ if ((m = NNI_ALLOC_STRUCT(m)) == NULL) {
return (NNG_ENOMEM);
}
// 64-bytes of header, including room for 32 bytes
// of headroom and 32 bytes of trailer.
if ((rv = nni_chunk_grow(&m->m_header, 32, 32)) != 0) {
- nni_free(m, sizeof (*m));
+ NNI_FREE_STRUCT(m);
return (rv);
}
@@ -256,7 +256,7 @@ nni_msg_alloc(nni_msg **mp, size_t sz)
}
if (rv != 0) {
nni_chunk_free(&m->m_header);
- nni_free(m, sizeof (*m));
+ NNI_FREE_STRUCT(m);
}
if ((rv = nni_chunk_append(&m->m_body, NULL, sz)) != 0) {
// Should not happen since we just grew it to fit.
@@ -270,23 +270,39 @@ nni_msg_alloc(nni_msg **mp, size_t sz)
int
-nni_msg_dup(nni_msg **dup, const nni_msg *src)
+nni_msg_dup(nni_msg **dup, nni_msg *src)
{
nni_msg *m;
+ nni_msgopt *mo;
+ nni_msgopt *newmo;
int rv;
- if ((m = nni_alloc(sizeof (*m))) == NULL) {
+ if ((m = NNI_ALLOC_STRUCT(m)) == NULL) {
return (NNG_ENOMEM);
}
if ((rv = nni_chunk_dup(&m->m_header, &src->m_header)) != 0) {
- nni_free(m, sizeof (*m));
+ NNI_FREE_STRUCT(m);
return (rv);
}
if ((rv = nni_chunk_dup(&m->m_body, &src->m_body)) != 0) {
nni_chunk_free(&m->m_header);
- nni_free(m, sizeof (*m));
+ NNI_FREE_STRUCT(m);
return (rv);
}
+
+ NNI_LIST_FOREACH (&src->m_options, mo) {
+ newmo = nni_alloc(sizeof (*newmo) + mo->mo_sz);
+ if (newmo == NULL) {
+ nni_msg_free(m);
+ return (NNG_ENOMEM);
+ }
+ newmo->mo_val = ((char *) newmo + sizeof (*newmo));
+ newmo->mo_sz = mo->mo_sz;
+ newmo->mo_num = mo->mo_num;
+ memcpy(newmo->mo_val, mo->mo_val, mo->mo_sz);
+ nni_list_append(&m->m_options, newmo);
+ }
+
*dup = m;
return (0);
}
@@ -303,7 +319,7 @@ nni_msg_free(nni_msg *m)
nni_list_remove(&m->m_options, mo);
nni_free(mo, sizeof (*mo) + mo->mo_sz);
}
- nni_free(m, sizeof (*m));
+ NNI_FREE_STRUCT(m);
}
diff --git a/src/core/message.h b/src/core/message.h
index 4ce3c7fd..dff71646 100644
--- a/src/core/message.h
+++ b/src/core/message.h
@@ -15,7 +15,7 @@
extern int nni_msg_alloc(nni_msg **, size_t);
extern void nni_msg_free(nni_msg *);
extern int nni_msg_realloc(nni_msg *, size_t);
-extern int nni_msg_dup(nni_msg **, const nni_msg *);
+extern int nni_msg_dup(nni_msg **, nni_msg *);
extern void *nni_msg_header(nni_msg *, size_t *);
extern void *nni_msg_body(nni_msg *, size_t *);
extern int nni_msg_append(nni_msg *, const void *, size_t);
diff --git a/src/core/msgqueue.c b/src/core/msgqueue.c
index ba6aa6bb..4807fe0f 100644
--- a/src/core/msgqueue.c
+++ b/src/core/msgqueue.c
@@ -48,7 +48,7 @@ nni_msgqueue_create(nni_msgqueue **mqp, int cap)
// a message back at the end to do a retry.
alloc = cap + 2;
- if ((mq = nni_alloc(sizeof (*mq))) == NULL) {
+ if ((mq = NNI_ALLOC_STRUCT(mq)) == NULL) {
return (NNG_ENOMEM);
}
if ((rv = nni_mtx_init(&mq->mq_lock)) != 0) {
@@ -113,7 +113,7 @@ nni_msgqueue_destroy(nni_msgqueue *mq)
}
nni_free(mq->mq_msgs, mq->mq_alloc * sizeof (nng_msg *));
- nni_free(mq, sizeof (*mq));
+ NNI_FREE_STRUCT(mq);
}
diff --git a/src/core/pipe.c b/src/core/pipe.c
index 34db782a..177216bd 100644
--- a/src/core/pipe.c
+++ b/src/core/pipe.c
@@ -79,7 +79,7 @@ nni_pipe_destroy(nni_pipe *p)
if (p->p_pdata != NULL) {
nni_free(p->p_pdata, p->p_psize);
}
- nni_free(p, sizeof (*p));
+ NNI_FREE_STRUCT(p);
}
@@ -91,7 +91,7 @@ nni_pipe_create(nni_pipe **pp, nni_endpt *ep)
nni_protocol *proto = &sock->s_ops;
int rv;
- if ((p = nni_alloc(sizeof (*p))) == NULL) {
+ if ((p = NNI_ALLOC_STRUCT(p)) == NULL) {
return (NNG_ENOMEM);
}
p->p_sock = sock;
@@ -102,20 +102,20 @@ nni_pipe_create(nni_pipe **pp, nni_endpt *ep)
NNI_LIST_NODE_INIT(&p->p_node);
if ((p->p_pdata = nni_alloc(p->p_psize)) == NULL) {
- nni_free(p, sizeof (*p));
+ NNI_FREE_STRUCT(p);
return (NNG_ENOMEM);
}
rv = nni_thr_init(&p->p_recv_thr, proto->proto_pipe_recv, p->p_pdata);
if (rv != 0) {
nni_free(p->p_pdata, p->p_psize);
- nni_free(p, sizeof (*p));
+ NNI_FREE_STRUCT(p);
return (rv);
}
rv = nni_thr_init(&p->p_send_thr, proto->proto_pipe_send, p->p_pdata);
if (rv != 0) {
nni_thr_fini(&p->p_recv_thr);
nni_free(p->p_pdata, p->p_psize);
- nni_free(p, sizeof (*p));
+ NNI_FREE_STRUCT(p);
return (rv);
}
p->p_psize = sock->s_ops.proto_pipe_size;
diff --git a/src/core/socket.c b/src/core/socket.c
index 48cd25bc..a8904500 100644
--- a/src/core/socket.c
+++ b/src/core/socket.c
@@ -95,7 +95,7 @@ nni_socket_create(nni_socket **sockp, uint16_t proto)
if ((ops = nni_protocol_find(proto)) == NULL) {
return (NNG_ENOTSUP);
}
- if ((sock = nni_alloc(sizeof (*sock))) == NULL) {
+ if ((sock = NNI_ALLOC_STRUCT(sock)) == NULL) {
return (NNG_ENOMEM);
}
sock->s_ops = *ops;
@@ -110,19 +110,19 @@ nni_socket_create(nni_socket **sockp, uint16_t proto)
NNI_LIST_INIT(&sock->s_eps, nni_endpt, ep_node);
if ((rv = nni_mtx_init(&sock->s_mx)) != 0) {
- nni_free(sock, sizeof (*sock));
+ NNI_FREE_STRUCT(sock);
return (rv);
}
if ((rv = nni_cv_init(&sock->s_cv, &sock->s_mx)) != 0) {
nni_mtx_fini(&sock->s_mx);
- nni_free(sock, sizeof (*sock));
+ NNI_FREE_STRUCT(sock);
return (rv);
}
if ((rv = nni_thr_init(&sock->s_reaper, nni_reaper, sock)) != 0) {
nni_cv_fini(&sock->s_cv);
nni_mtx_fini(&sock->s_mx);
- nni_free(sock, sizeof (*sock));
+ NNI_FREE_STRUCT(sock);
return (rv);
}
@@ -130,7 +130,7 @@ nni_socket_create(nni_socket **sockp, uint16_t proto)
nni_thr_fini(&sock->s_reaper);
nni_cv_fini(&sock->s_cv);
nni_mtx_fini(&sock->s_mx);
- nni_free(sock, sizeof (*sock));
+ NNI_FREE_STRUCT(sock);
return (rv);
}
if ((rv = nni_msgqueue_create(&sock->s_urq, 0)) != 0) {
@@ -138,7 +138,7 @@ nni_socket_create(nni_socket **sockp, uint16_t proto)
nni_thr_fini(&sock->s_reaper);
nni_cv_fini(&sock->s_cv);
nni_mtx_fini(&sock->s_mx);
- nni_free(sock, sizeof (*sock));
+ NNI_FREE_STRUCT(sock);
return (rv);
}
@@ -148,7 +148,7 @@ nni_socket_create(nni_socket **sockp, uint16_t proto)
nni_thr_fini(&sock->s_reaper);
nni_cv_fini(&sock->s_cv);
nni_mtx_fini(&sock->s_mx);
- nni_free(sock, sizeof (*sock));
+ NNI_FREE_STRUCT(sock);
return (rv);
}
nni_thr_run(&sock->s_reaper);
@@ -235,7 +235,7 @@ nni_socket_close(nni_socket *sock)
nni_msgqueue_destroy(sock->s_uwq);
nni_cv_fini(&sock->s_cv);
nni_mtx_fini(&sock->s_mx);
- nni_free(sock, sizeof (*sock));
+ NNI_FREE_STRUCT(sock);
return (0);
}