aboutsummaryrefslogtreecommitdiffstats
path: root/stacks/rsocket/src/rsocket_adpt.c
diff options
context:
space:
mode:
Diffstat (limited to 'stacks/rsocket/src/rsocket_adpt.c')
-rw-r--r--stacks/rsocket/src/rsocket_adpt.c258
1 files changed, 135 insertions, 123 deletions
diff --git a/stacks/rsocket/src/rsocket_adpt.c b/stacks/rsocket/src/rsocket_adpt.c
index 2839909..9496e96 100644
--- a/stacks/rsocket/src/rsocket_adpt.c
+++ b/stacks/rsocket/src/rsocket_adpt.c
@@ -19,10 +19,11 @@
#include <errno.h>
#include <dlfcn.h>
-#include "nstack_dmm_api.h"
-
+#include "nstack_callback_ops.h"
#include "rsocket_adpt.h"
#include "rdma/rsocket.h"
+#include "nstack_epoll_api.h"
+#include "nstack_rd_api.h"
#define RR_EVFD(u64) ((int)((u64) >> 32))
#define RR_RSFD(u64) ((int)((u64) & 0xFFFFFFFF))
@@ -36,77 +37,69 @@ rr_sapi_t g_sapi = { 0 };
int g_rr_log_level = -1;
-int
-rr_notify_event (void *pdata, int events)
-{
- int ret;
-
- ret = g_rr_var.event_cb (pdata, events);
-
- RR_DBG ("event_cb(%p, 0x%x)=%d,%d\n", pdata, events, ret, errno);
+void *rrd_table = NULL;
- return ret;
+void rr_notify_event(void *pdata, int events)
+{
+ g_rr_var.event_cb(pdata, events, EVENT_INFORM_APP);
}
-int
-rr_epoll_ctl (int op, int evfd, uint32_t events, int rsfd)
+int rr_epoll_ctl(int op, int evfd, uint32_t events, int rsfd)
{
- int ret;
- struct epoll_event event;
- event.events = events;
- event.data.u64 = RR_DATA (evfd, rsfd);
- ret = GSAPI (epoll_ctl) (g_rr_var.epfd, op, evfd, &event);
- return ret;
+ int ret;
+ struct epoll_event event;
+ event.events = events;
+ event.data.u64 = RR_DATA(evfd, rsfd);
+ ret = GSAPI(epoll_ctl) (g_rr_var.epfd, op, evfd, &event);
+ return ret;
}
-static void *
-rr_epoll_thread (void *arg)
+static void *rr_epoll_thread(void *arg)
{
- int i, ret, e;
- struct epoll_event events[RR_EV_NUM];
+ int i, ret, e;
+ struct epoll_event events[RR_EV_NUM];
- while (1)
+ while (1)
{
- ret = GSAPI (epoll_wait) (g_rr_var.epfd, events, RR_EV_NUM, 100);
- e = errno;
+ ret = GSAPI(epoll_wait) (g_rr_var.epfd, events, RR_EV_NUM, 100);
+ e = errno;
- for (i = 0; i < ret; ++i)
+ for (i = 0; i < ret; ++i)
{
- if (rr_rs_handle (RR_RSFD (events[i].data.u64), events[i].events))
+ if (rr_rs_handle(RR_RSFD(events[i].data.u64), events[i].events))
{
- (void) rr_ep_del (RR_EVFD (events[i].data.u64));
+ (void) rr_ep_del(RR_EVFD(events[i].data.u64));
}
}
- if (ret < 0)
+ if (ret < 0)
{
- RR_STAT_INC (RR_STAT_EPW_ERR);
- if (e == EINTR)
+ RR_STAT_INC(RR_STAT_EPW_ERR);
+ if (e == EINTR)
{
- RR_STAT_INC (RR_STAT_EPW_EINTR);
+ RR_STAT_INC(RR_STAT_EPW_EINTR);
}
- else if (e == ETIMEDOUT)
+ else if (e == ETIMEDOUT)
{
- RR_STAT_INC (RR_STAT_EPW_ETIMEOUT);
+ RR_STAT_INC(RR_STAT_EPW_ETIMEOUT);
}
- else
+ else
{
- RR_ERR ("epoll_wait()=%d:%d\n", ret, errno);
+ RR_ERR("epoll_wait()=%d:%d\n", ret, errno);
}
}
}
- return NULL;
+ return NULL;
}
-static int
-rr_init_sapi ()
+static int rr_init_sapi()
{
- void *handle = dlopen ("libc.so.6", RTLD_NOW | RTLD_GLOBAL);
- if (!handle)
+ void *handle = dlopen("libc.so.6", RTLD_NOW | RTLD_GLOBAL);
+ if (!handle)
{
- RR_ERR ("dlopen(libc.so.6):NULL\n");
- return -1;
+ RR_ERR("dlopen(libc.so.6):NULL\n");
+ return -1;
}
#define RR_SAPI(name) \
@@ -116,129 +109,148 @@ rr_init_sapi ()
#include "rsocket_sapi.h"
#undef RR_SAPI
- return 0;
+ return 0;
}
-static void
-rr_init_log ()
+static void rr_init_log()
{
- int level;
- char *log;
+ int level;
+ char *log;
- if (g_rr_log_level >= 0)
- return;
+ if (g_rr_log_level >= 0)
+ return;
- log = getenv ("RSOCKET_LOG");
- if (!log || !log[0])
+ log = getenv("RSOCKET_LOG");
+ if (!log || !log[0])
{
- g_rr_log_level = RR_LOG_OFF;
- return;
+ g_rr_log_level = RR_LOG_OFF;
+ return;
}
- level = atoi (log);
- if (level < 0 || level > 99999)
+ level = atoi(log);
+ if (level < 0 || level > 99999)
{
- g_rr_log_level = RR_LOG_OFF;
- return;
+ g_rr_log_level = RR_LOG_OFF;
+ return;
}
- g_rr_log_level = level;
+ g_rr_log_level = level;
}
-static int
-rsocket_init ()
+void *rsocket_get_ip_shmem()
{
- int ret;
+ return rrd_table;
+}
- rr_init_log ();
+static int rsocket_init()
+{
+ int ret;
+ rrd_table = nstack_local_rd_malloc();
+ if (!rrd_table)
+ {
+ RR_ERR("rsocket rd table create failed!");
+ return -1;
+ }
- if (rr_init_sapi ())
+ if (nstack_rd_parse("rsocket", rrd_table))
{
- return -1;
+ RR_WRN("no rd data got!");
+ RR_WRN("rsocket parse rd data failed");
+ nstack_rd_table_clear(rrd_table);
+ return -1;
}
- g_rr_var.epfd = GSAPI (epoll_create) (1);
- if (g_rr_var.epfd < 0)
- return g_rr_var.epfd;
+ rr_init_log();
- ret =
- pthread_create (&g_rr_var.epoll_threadid, NULL, rr_epoll_thread, NULL);
- if (ret)
+ if (rr_init_sapi())
{
- GSAPI (close) (g_rr_var.epfd);
- g_rr_var.epfd = -1;
- return ret;
+ return -1;
}
- (void) pthread_setname_np (g_rr_var.epoll_threadid, "rsocket_epoll");
- return 0;
-}
+ g_rr_var.epfd = GSAPI(epoll_create) (1);
-int
-rsocket_exit ()
-{
- if (g_rr_var.epfd >= 0)
+ if (g_rr_var.epfd < 0)
{
- (void) GSAPI (close) (g_rr_var.epfd);
- g_rr_var.epfd = -1;
+ return g_rr_var.epfd;
}
- return 0;
+ ret =
+ pthread_create(&g_rr_var.epoll_threadid, NULL, rr_epoll_thread, NULL);
+ if (ret)
+ {
+ GSAPI(close) (g_rr_var.epfd);
+ g_rr_var.epfd = -1;
+ return ret;
+ }
+ (void) pthread_setname_np(g_rr_var.epoll_threadid, "rsocket_epoll");
+
+ return 0;
}
-unsigned int
-rsocket_ep_ctl (int epFD, int proFD, int ctl_ops, struct epoll_event *event,
- void *pdata)
+int rsocket_exit()
{
- int ret;
- struct eventpoll *ep;
- unsigned int revents = 0;
+ if (g_rr_var.epfd >= 0)
+ {
+ (void) GSAPI(close) (g_rr_var.epfd);
+ g_rr_var.epfd = -1;
+ }
- RR_DBG ("(%d, %d, %d, 0x%x, %p)\n", epFD, proFD, ctl_ops, event->events,
- pdata);
+ return 0;
+}
- switch (ctl_ops)
+void *rsocket_ep_ctl(int proFD, int ctl_ops, void *pdata, void *event)
+{
+ int ret;
+ unsigned int revents = 0;
+ switch (ctl_ops)
{
- case nstack_ep_triggle_add:
- ret = rr_rs_ep_add (proFD, pdata, &revents);
- if (ret)
- return -1;
- return revents;
-
- case nstack_ep_triggle_mod:
- ret = rr_rs_ep_mod (proFD, pdata, &revents);
- if (ret)
- return -1;
- return revents;
- case nstack_ep_triggle_del:
- return rr_rs_ep_del (proFD);
+ case nstack_ep_triggle_add:
+ ret = rr_rs_ep_add(proFD, pdata, &revents);
+ if (ret)
+ return NULL;
+ *(int *) event = revents;
+ return pdata;
+ case nstack_ep_triggle_mod:
+ ret = rr_rs_ep_mod(proFD, pdata, &revents);
+ if (ret)
+ return NULL;
+ *(int *) event = revents;
+ return pdata;
+ case nstack_ep_triggle_del:
+ rr_rs_ep_del(proFD);
}
- return _err (EPERM);
+ return pdata;
+
}
-int
-rsocket_stack_register (nstack_proc_cb * proc_fun,
- nstack_event_cb * event_ops)
+int rsocket_getEvt(int fd)
{
- rr_init_log ();
+ return rr_getEvt(fd);
+}
+
+int rsocket_stack_register(nstack_socket_ops * ops,
+ nstack_event_ops * event_ops,
+ nstack_proc_ops * proc_fun)
+{
+ rr_init_log();
#define NSTACK_MK_DECL(ret, fn, args) \
do { \
- proc_fun->socket_ops.pf##fn = dlsym(event_ops->handle, "r"#fn); \
- if (!proc_fun->socket_ops.pf##fn) \
+ ops->pf##fn = dlsym(event_ops->handle, "r"#fn); \
+ if (!ops->pf##fn) \
RR_LOG("socket API '" #fn "' not found\n"); \
} while (0)
-#include "declare_syscalls.h"
+#include "declare_syscalls.h.tmpl"
#undef NSTACK_MK_DECL
- proc_fun->extern_ops.module_init = rsocket_init;
- proc_fun->extern_ops.ep_ctl = rsocket_ep_ctl;
- proc_fun->extern_ops.ep_getevt = NULL;
- proc_fun->extern_ops.module_init_child = rsocket_init;
-
- g_rr_var.type = event_ops->type;
- g_rr_var.event_cb = event_ops->event_cb;
+ proc_fun->module_init = rsocket_init;
+ proc_fun->ep_triggle = rsocket_ep_ctl;
+ proc_fun->ep_getEvt = rsocket_getEvt;
+ proc_fun->get_ip_shmem = rsocket_get_ip_shmem;
+ proc_fun->fork_init_child = rsocket_init;
+ g_rr_var.type = event_ops->type;
+ g_rr_var.event_cb = event_ops->event_cb;
- return 0;
+ return 0;
}