Triton Repository branch, master, updated. cfd1e1547f33a4583795e2fdd5829febc7b9093c
This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "Triton Repository". The branch, master has been updated via cfd1e1547f33a4583795e2fdd5829febc7b9093c (commit) via e0f5f90ce33253a330978b88f3085eece0a3c6d2 (commit) from d081a8fe850bb42e495eb8e63e821dc9be2d95af (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit cfd1e1547f33a4583795e2fdd5829febc7b9093c Author: Dries Kimpe <[email protected]> Date: Thu Jun 2 16:10:26 2011 -0500 Uncomment remote mpi test; keeps on rebuilding... commit e0f5f90ce33253a330978b88f3085eece0a3c6d2 Author: Dries Kimpe <[email protected]> Date: Thu Jun 2 16:10:10 2011 -0500 socket resource + tools/tests ----------------------------------------------------------------------- Summary of changes: code/configure.ac | 4 + code/src/aesop/parser/tests/remote/module.mk.in | 32 ++-- code/src/common/resources/aesocket/aesocket.c | 169 ++++++++++++++++ code/src/common/resources/aesocket/aesocket.hae | 19 ++ code/src/common/resources/aesocket/module.mk.in | 5 + .../common/resources/aesocket/test/module.mk.in | 4 + code/src/common/resources/aesocket/test/simple.ae | 204 ++++++++++++++++++++ code/src/socket/module.mk.in | 5 + code/src/socket/test/echo-server.ae | 136 +++++++++++++ code/src/socket/test/module.mk.in | 4 + code/src/socket/triton-socket.ae | 90 +++++++++ code/src/socket/triton-socket.hae | 17 ++ 12 files changed, 673 insertions(+), 16 deletions(-) create mode 100644 code/src/common/resources/aesocket/aesocket.c create mode 100644 code/src/common/resources/aesocket/aesocket.hae create mode 100644 code/src/common/resources/aesocket/module.mk.in create mode 100644 code/src/common/resources/aesocket/test/module.mk.in create mode 100644 code/src/common/resources/aesocket/test/simple.ae create mode 100644 code/src/socket/module.mk.in create mode 100644 code/src/socket/test/echo-server.ae create mode 100644 code/src/socket/test/module.mk.in create mode 100644 code/src/socket/triton-socket.ae create mode 100644 code/src/socket/triton-socket.hae Diff of changes: diff --git a/code/configure.ac b/code/configure.ac index 054891b..0be5007 100644 --- a/code/configure.ac +++ b/code/configure.ac @@ -252,6 +252,8 @@ src/common/resources/timer/test/module.mk src/common/resources/timer/module.mk src/common/resources/scheduling/module.mk src/common/resources/scheduling/test/module.mk +src/common/resources/aesocket/module.mk +src/common/resources/aesocket/test/module.mk src/net/module.mk src/net/test/module.mk src/net/mpi/module.mk @@ -283,6 +285,8 @@ src/zeroconf/module.mk src/net/mock/module.mk src/kv/module.mk src/kv/test/module.mk +src/socket/module.mk +src/socket/test/module.mk doc/module.mk ]) diff --git a/code/src/aesop/parser/tests/remote/module.mk.in b/code/src/aesop/parser/tests/remote/module.mk.in index cd75523..cb17bf0 100644 --- a/code/src/aesop/parser/tests/remote/module.mk.in +++ b/code/src/aesop/parser/tests/remote/module.mk.in @@ -27,22 +27,22 @@ $(FULLMODNAME2).d: $(DIR_TESTREMOTE)/test-remote-mock-embedded-buffers.aer ifneq (,$(BUILD_MPI)) -REMOTE_TESTLIB_MODULES += $(DIR_TESTREMOTE)/test_remote_mpi -REMOTE_MODSRC_$(DIR_TESTREMOTE)/test_remote_mpi := $(DIR_TESTREMOTE)/test-remote-mpi.aer -MODNAME3 := test_remote_mpi -FULLMODNAME3 := $(DIR_TESTREMOTE)/$(MODNAME3) - -$(FULLMODNAME3)_stubs.hae $(FULLMODNAME3)_module.h $(FULLMODNAME3)_module.o $(DIR_TESTREMOTE)/test-remote-mpi.o: $(FULLMODNAME3).dummy - $(Q) " AERCC $(FULLMODNAME3)" - $(E)$(builddir)/maint/aercc -m $(call RMOD_SERVICE,$(FULLMODNAME3)) \ - -d $(call RMOD_REGDIR,$(FULLMODNAME3)) \ - $(patsubst %,$(srcdir)/%,$(call RMOD_FILES,$(FULLMODNAME3))) \ - -c $(call MCC_AE,$(FULLMODNAME3)) $(VA) $(DA) $(AEPRETTY) \ - -- $(CFLAGS) $(LIBCFLAGS) $(CWARNS) $(call MODCFLAGS_AE,$(FULLMODNAME3)) - -$(FULLMODNAME3).d: $(DIR_TESTREMOTE)/test-remote-mpi.aer - $(Q) " DEP $@" - $(E)CC=$(call MCC_AE,$(FULLMODNAME3)) $(srcdir)/maint/depend-aer.sh $(DIR_TESTREMOTE) $(MODNAME3) $(LIBCFLAGS) $(CFLAGS) $(call MODCFLAGS_AE,$FULLMODNAME3) $< > $@ +#REMOTE_TESTLIB_MODULES += $(DIR_TESTREMOTE)/test_remote_mpi +#REMOTE_MODSRC_$(DIR_TESTREMOTE)/test_remote_mpi := $(DIR_TESTREMOTE)/test-remote-mpi.aer +#MODNAME3 := test_remote_mpi +#FULLMODNAME3 := $(DIR_TESTREMOTE)/$(MODNAME3) + +#$(FULLMODNAME3)_stubs.hae $(FULLMODNAME3)_module.h $(FULLMODNAME3)_module.o $(DIR_TESTREMOTE)/test-remote-mpi.o: $(FULLMODNAME3).dummy +# $(Q) " AERCC $(FULLMODNAME3)" +# $(E)$(builddir)/maint/aercc -m $(call RMOD_SERVICE,$(FULLMODNAME3)) \ +# -d $(call RMOD_REGDIR,$(FULLMODNAME3)) \ +# $(patsubst %,$(srcdir)/%,$(call RMOD_FILES,$(FULLMODNAME3))) \ +# -c $(call MCC_AE,$(FULLMODNAME3)) $(VA) $(DA) $(AEPRETTY) \ +# -- $(CFLAGS) $(LIBCFLAGS) $(CWARNS) $(call MODCFLAGS_AE,$(FULLMODNAME3)) + +#$(FULLMODNAME3).d: $(DIR_TESTREMOTE)/test-remote-mpi.aer +# $(Q) " DEP $@" +# $(E)CC=$(call MCC_AE,$(FULLMODNAME3)) $(srcdir)/maint/depend-aer.sh $(DIR_TESTREMOTE) $(MODNAME3) $(LIBCFLAGS) $(CFLAGS) $(call MODCFLAGS_AE,$FULLMODNAME3) $< > $@ REMOTE_TESTLIB_MODULES += $(DIR_TESTREMOTE)/test_remote_fault REMOTE_MODSRC_$(DIR_TESTREMOTE)/test_remote_fault := $(DIR_TESTREMOTE)/test-remote-fault-injector.aer diff --git a/code/src/common/resources/aesocket/aesocket.c b/code/src/common/resources/aesocket/aesocket.c new file mode 100644 index 0000000..8ace840 --- /dev/null +++ b/code/src/common/resources/aesocket/aesocket.c @@ -0,0 +1,169 @@ +#include "src/aesop/aesop.h" +#include "src/aesop/op.h" +#include "src/aesop/opcache.h" +#include "src/common/resources/aesocket/aesocket.h" +#include "src/common/triton-init.h" + +#include <assert.h> + +#ifndef __AESOP_LIBEV +# error Socket resource requires libev for now! +#endif + +#include "src/common/libev/ev.h" + + +#define AESOCKET_DEFAULT_SIZE 1024 + +static ae_opcache_t aesocket_opcache = NULL; +static int triton_aesocket_resource_id; + +struct aesocket_op +{ + ae_op_id_t op_id; + struct ae_op op; + triton_ret_t tret; + ev_io io; +}; + +static triton_mutex_t aesocket_mutex = TRITON_MUTEX_INITIALIZER; + +static void aesocket_fd_ready (EV_P_ ev_io * io, int revents) +{ + struct ae_op * op = (struct ae_op *) io->data; + struct aesocket_op * socket_op = + ae_op_entry(io->data, struct aesocket_op, op); + + struct ev_loop * eloop = ae_resource_get_eloop (op->ctx); + ev_io_stop (eloop, io); + ae_opcache_complete_op (aesocket_opcache, op, triton_ret_t, TRITON_SUCCESS); + ae_resource_request_poll (op->ctx, triton_aesocket_resource_id); +} + +ae_define_post(triton_ret_t, triton_aesocket_ready, int fd, int mode) +{ + struct ae_op * op; + struct aesocket_op * socket_op; + + if(!aesocket_opcache) + { + triton_err(triton_log_default, "Error: aesocket resource not initialized."); + assert(0); + } + + op = ae_opcache_get(aesocket_opcache); + ae_op_fill(op); + + socket_op = ae_op_entry(op, struct aesocket_op, op); + socket_op->op_id = ae_id_gen(triton_aesocket_resource_id, (uint64_t)(op->cache_id)); + socket_op->tret = TRITON_SUCCESS; + + *__ae_op_id = socket_op->op_id; + + int flags = (mode & AESOCKET_READ ? EV_READ : 0 ) + | (mode & AESOCKET_WRITE ? EV_WRITE : 0 ); + + assert (flags && "Need to specify one of AESOCKET_READ|AESOCKET_WRITE"); + + struct ev_loop * eloop = ae_resource_get_eloop (op->ctx); + + ev_io_init (&socket_op->io, aesocket_fd_ready, fd, flags); + socket_op->io.data = op; + + // how to prevent method from calling callback immediately? (or is this + // OK) + ev_io_start (eloop, &socket_op->io); + + return TRITON_SUCCESS; +} + +static triton_ret_t triton_aesocket_poll(ae_context_t context) +{ + return TRITON_SUCCESS; +} + +static triton_ret_t triton_aesocket_cancel(ae_context_t triton_ctx, ae_op_id_t op_id) +{ + int cache_id, resource_id; + struct ae_op * op; + struct aesocket_op * socket_op; + ae_context_t ctx; + + /* lock to keep the op from disappearing out from under us due to + * completion + */ + triton_mutex_lock(&aesocket_mutex); + + cache_id = ae_id_lookup(op_id, &resource_id); + assert(resource_id == triton_aesocket_resource_id); + op = ae_opcache_lookup(aesocket_opcache, (int)cache_id); + socket_op = ae_op_entry(op, struct aesocket_op, op); + + //ae_ops_del(op); + + /* trigger callback immediately; no need to wait for a poll cycle */ + ctx = op->ctx; + + struct ev_loop * eloop = ae_resource_get_eloop (op->ctx); + ev_io_stop (eloop, &socket_op->io); + + if (ev_is_pending (&socket_op->io)) + { + // The operation is completed but callback was not called yet. + ev_clear_pending (eloop, &socket_op->io); + } + + triton_mutex_unlock(&aesocket_mutex); + + // calls callback and return op entry to the cache + ae_opcache_complete_op(aesocket_opcache, op, triton_ret_t, + TRITON_ERR_CANCELED); + + ae_resource_request_poll(ctx, triton_aesocket_resource_id); + + return TRITON_SUCCESS; +} + +struct ae_resource triton_aesocket_resource = +{ + .resource_name = "aesocket", + .poll_context = triton_aesocket_poll, + .cancel = triton_aesocket_cancel +}; + +__attribute__((constructor)) void triton_aesocket_init_register(void); + +__attribute__((constructor)) void triton_aesocket_init_register(void) +{ + triton_init_register("triton.resource.aesocket", triton_aesocket_init, + triton_aesocket_finalize, NULL, "aesop.control"); +} + +triton_ret_t triton_aesocket_init (void) +{ + triton_ret_t tret; + int ret; + + tret = AE_OPCACHE_INIT (struct aesocket_op, op, AESOCKET_DEFAULT_SIZE, &aesocket_opcache); + if (tret != TRITON_SUCCESS) + { + return tret; + } + + return ae_resource_register (&triton_aesocket_resource, &triton_aesocket_resource_id); +} + +void triton_aesocket_finalize (void) +{ + ae_resource_unregister(triton_aesocket_resource_id); + ae_opcache_destroy(aesocket_opcache); +} + +/* + * Local variables: + * c-indent-level: 4 + * c-basic-offset: 4 + * End: + * + * vim: ts=8 sts=4 sw=4 expandtab + */ diff --git a/code/src/common/resources/aesocket/aesocket.hae b/code/src/common/resources/aesocket/aesocket.hae new file mode 100644 index 0000000..4918f7f --- /dev/null +++ b/code/src/common/resources/aesocket/aesocket.hae @@ -0,0 +1,19 @@ +#ifndef TRITON_AESOCKET_HAE +#define TRITON_AESOCKET_HAE + +#include "src/aesop/aesop.h" + +enum +{ + AESOCKET_READ = 0x01, + AESOCKET_WRITE = 0x02 +}; + +__blocking triton_ret_t triton_aesocket_ready (int fd, int mode); + +triton_ret_t triton_aesocket_init (void); + +void triton_aesocket_finalize (void); + +#endif + diff --git a/code/src/common/resources/aesocket/module.mk.in b/code/src/common/resources/aesocket/module.mk.in new file mode 100644 index 0000000..d87f450 --- /dev/null +++ b/code/src/common/resources/aesocket/module.mk.in @@ -0,0 +1,5 @@ +DIR := src/common/resources/aesocket + +AESOP_HDR += $(DIR)/aesocket.hae + +LIBSRC += $(DIR)/aesocket.c diff --git a/code/src/common/resources/aesocket/test/module.mk.in b/code/src/common/resources/aesocket/test/module.mk.in new file mode 100644 index 0000000..4377688 --- /dev/null +++ b/code/src/common/resources/aesocket/test/module.mk.in @@ -0,0 +1,4 @@ +DIR := src/common/resources/aesocket/test + +AETESTSRC += $(DIR)/simple.ae + diff --git a/code/src/common/resources/aesocket/test/simple.ae b/code/src/common/resources/aesocket/test/simple.ae new file mode 100644 index 0000000..d3f6f9e --- /dev/null +++ b/code/src/common/resources/aesocket/test/simple.ae @@ -0,0 +1,204 @@ +#include "src/aesop/aesop.h" +#include "src/aesop/aesop-support.hae" +#include "src/common/resources/timer/timer.hae" +#include "src/common/resources/aesocket/aesocket.hae" + +#include <unistd.h> +#include <fcntl.h> +#include <stdio.h> +#include <assert.h> + +static __blocking int test1 () +{ + int fd; + char filename[128]; + strcpy (filename, "/tmp/aesocketXXXXXX"); + + fd = mkstemp (filename); + + pwait + { + pbranch + { + triton_aesocket_ready (fd, AESOCKET_WRITE); + aesop_cancel_branches_wait (); + } + pbranch + { + triton_ret_t tret; + tret = triton_timer (10000); + assert (tret != TRITON_SUCCESS && "File did not become read??"); + } + } + + close (fd); + + return 0; +} + +static __blocking triton_ret_t doSendRecv (int * fd) +{ + size_t todo = 1024*1024*64; + triton_ret_t ret = TRITON_SUCCESS; + pwait + { + pbranch + { + int i; + i=0; + char buf[4096]; + int iter2 = 0; + while (i < todo) + { + int r; + triton_ret_t tret; + ++iter2; + tret = triton_aesocket_ready (fd[0], AESOCKET_READ); + if (tret != TRITON_SUCCESS) + { + ret = tret; + printf ("Cancelled read!"); + pbreak; + } + printf ("R"); + r= read (fd[0], &buf[0], sizeof(buf)); + if (r< 0) + perror ("read"); + i += r; + } + } + pbranch + { + int i; + i=0; + char buf[1024]; + int w; + int iter = 0; + while (i< todo) + { + triton_ret_t tret; + ++iter; + tret = triton_aesocket_ready (fd[1], AESOCKET_WRITE); + if (tret != TRITON_SUCCESS) + { + ret = tret; + printf ("Cancelled write!"); + pbreak; + } + printf ("W"); + w = write (fd[1], &buf[0], sizeof(buf)); + if (w < 0) + perror ("write"); + i += w; + } + } + } + return ret; +} + +static __blocking int test2 () +{ + int fd[2]; + if (pipe (&fd[0]) < 0) + { + perror ("pipe"); + assert (0); + } + fcntl (fd[0], F_SETFL, O_NONBLOCK); + fcntl (fd[1], F_SETFL, O_NONBLOCK); + + pwait + { + pbranch + { + triton_ret_t ret; + ret = doSendRecv (fd); + if (ret == TRITON_SUCCESS) + { + printf ("Test done... Cancelling timeout!\n"); + aesop_cancel_branches_wait (); + } + else + { + printf ("Test cancelled!\n"); + } + } + pbranch + { + triton_ret_t ret; + ret = triton_timer (10000); + if (ret == TRITON_SUCCESS) + { + printf ("Cancelling!"); + aesop_cancel_branches_wait (); + } + else + { + printf ("Cancelling timer\n"); + } + } + } + + close (fd[0]); + close (fd[1]); + + return 0; +} + +static __blocking int dotest () +{ + test1 (); + test2 (); + return 0; +} + +int done = 0; +int cb_ret; + +static void done_callback(void *up, int ret) +{ + done = 1; + cb_ret = ret; +} + +int main (int argc, char ** args) +{ + triton_ret_t ret; + ae_context_t ctx; + ae_hints_t hints; + ae_op_id_t op_id; + + triton_aesocket_init(); + triton_timer_init (); + ae_context_create(&ctx, "timer", "aesocket"); + + ae_hints_init(&hints); + ret = ae_post_blocking(dotest, done_callback, NULL, &hints, ctx, &op_id, + &cb_ret); + if(ret == TRITON_SUCCESS) + { + int pc = 0; + while(!done) + { + ae_poll(ctx, 1000); +// printf("polled %d times\n", ++pc); + } + } + triton_error_assert(ret); + + ae_hints_destroy(&hints); + ae_context_destroy(ctx); + triton_timer_finalize (); + triton_aesocket_finalize(); + + return cb_ret; +} + +/* + * Local variables: + * c-indent-level: 4 + * c-basic-offset: 4 + * End: + * + * vim: ft=c ts=8 sts=4 sw=4 expandtab + */ diff --git a/code/src/socket/module.mk.in b/code/src/socket/module.mk.in new file mode 100644 index 0000000..e4c3e80 --- /dev/null +++ b/code/src/socket/module.mk.in @@ -0,0 +1,5 @@ +DIR := src/socket + +AELIBSRC += $(DIR)/triton-socket.ae +AESOP_HDR += $(DIR)/triton-socket.hae + diff --git a/code/src/socket/test/echo-server.ae b/code/src/socket/test/echo-server.ae new file mode 100644 index 0000000..4331e7c --- /dev/null +++ b/code/src/socket/test/echo-server.ae @@ -0,0 +1,136 @@ +#include "src/aesop/aesop.h" +#include "src/socket/triton-socket.hae" +#include "src/common/resources/aesocket/aesocket.hae" +#include "src/common/resources/timer/timer.hae" + +#include <sys/types.h> +#include <sys/socket.h> +#include <arpa/inet.h> +#include <fcntl.h> +#include <unistd.h> + +int done = 0; +int cb_ret; + +#define LISTENPORT 9999 + + +static void done_callback(void *up, int ret) +{ + done = 1; + cb_ret = ret; +} + +static __blocking void handleConnection (int fd) +{ + char buf[4096]; + triton_ret_t ret; + int len; + int written; + + printf ("New connection (fd %i)!\n", fd); + + /* mark socket as nonblocking */ + fcntl (fd, F_SETFL, O_NONBLOCK); + + pbranch + { + + do + { + ret = triton_read (fd, &buf[0], sizeof(buf), &len); + assert (ret == TRITON_SUCCESS); + printf ("Got data on fd %i: %i\n", fd, len); + + //triton_timer (9000); + + ret = triton_write (fd, &buf[0], len, &written); + assert (ret == TRITON_SUCCESS); + printf ("Wrote data to fd %i: %i\n", fd, written); + } while (0); + + close (fd); + } +} + +static __blocking int dotest () +{ + int listensocket; + struct sockaddr_in addr; + + + listensocket = socket (AF_INET, SOCK_STREAM, 0); + if (listensocket < 0) + { + perror ("Error creating socket"); + return 0; + } + + fcntl (listensocket, F_SETFL, O_NONBLOCK); + + memset (&addr, 0, sizeof (addr)); + addr.sin_family = AF_INET; + addr.sin_addr.s_addr = htonl(INADDR_ANY); + addr.sin_port = htons(LISTENPORT); + + if (bind(listensocket, (struct sockaddr *) &addr, sizeof(addr)) < 0) + { + perror ("Error binding listen socket"); + return 0; + } + + if (listen(listensocket, SOMAXCONN) < 0 ) + { + perror ("Error putting socket in listen state"); + return 0; + } + + while (1) + { + triton_ret_t ret; + int newsocket; + + ret = triton_accept (listensocket, 0, 0, &newsocket); + if (ret != TRITON_SUCCESS) + break; + + handleConnection (newsocket); + } + + return 0; +} + + +int main (int argc, char ** args) +{ + triton_ret_t ret; + ae_context_t ctx; + ae_hints_t hints; + ae_op_id_t op_id; + + triton_aesocket_init(); + triton_timer_init (); + ae_context_create(&ctx, "timer", "aesocket"); + + ae_hints_init(&hints); + ret = ae_post_blocking(dotest, done_callback, NULL, &hints, ctx, &op_id, + &cb_ret); + if(ret == TRITON_SUCCESS) + { + int pc = 0; + while(!done) + { + ae_poll(ctx, 1000); + } + } + triton_error_assert(ret); + + ae_hints_destroy(&hints); + ae_context_destroy(ctx); + triton_timer_finalize (); + triton_aesocket_finalize(); + + return cb_ret; +} + + diff --git a/code/src/socket/test/module.mk.in b/code/src/socket/test/module.mk.in new file mode 100644 index 0000000..d018abc --- /dev/null +++ b/code/src/socket/test/module.mk.in @@ -0,0 +1,4 @@ +DIR := src/socket/test + +AETESTSRC += $(DIR)/echo-server.ae + diff --git a/code/src/socket/triton-socket.ae b/code/src/socket/triton-socket.ae new file mode 100644 index 0000000..a35fa10 --- /dev/null +++ b/code/src/socket/triton-socket.ae @@ -0,0 +1,90 @@ +#include "triton-socket.hae" +#include "src/common/resources/aesocket/aesocket.hae" + +#include <unistd.h> +#include <assert.h> + + +__blocking triton_ret_t triton_accept (int sockfd, struct sockaddr * addr, + socklen_t * addrlen, int * newfd) +{ + triton_ret_t ret; + int r; + + do + { + ret = triton_aesocket_ready (sockfd, AESOCKET_READ|AESOCKET_WRITE); + if (ret != TRITON_SUCCESS) + return ret; + + r = accept (sockfd, addr, addrlen); + if (r >= 0) + break; + + if (errno == EAGAIN || errno == EWOULDBLOCK) + continue; + + assert (0); + + } while (1); + + *newfd = r; + + return TRITON_SUCCESS; +} + +__blocking triton_ret_t triton_read (int fd, void * buf, size_t count, int * len) +{ + triton_ret_t ret; + int r; + + do + { + ret = triton_aesocket_ready (fd, AESOCKET_READ); + if (ret != TRITON_SUCCESS) + return ret; + + r = read (fd, buf, count); + *len = r; + + if (r >= 0) + break; + + if (errno == EAGAIN || errno == EWOULDBLOCK) + continue; + + assert (0); + + } while (1); + + return TRITON_SUCCESS; +} + +__blocking triton_ret_t triton_write (int fd, const void * buf, size_t count, int * len) +{ + triton_ret_t ret; + int r; + + do + { + ret = triton_aesocket_ready (fd, AESOCKET_WRITE); + if (ret != TRITON_SUCCESS) + return ret; + + r = write (fd, buf, count); + *len = r; + + if (r >= 0) + break; + + if (errno == EAGAIN || errno == EWOULDBLOCK) + continue; + + assert (0); + + } while (1); + + return TRITON_SUCCESS; +} + + diff --git a/code/src/socket/triton-socket.hae b/code/src/socket/triton-socket.hae new file mode 100644 index 0000000..603a41f --- /dev/null +++ b/code/src/socket/triton-socket.hae @@ -0,0 +1,17 @@ +#ifndef SOCKET_TRITON_SOCKET_HAE +#define SOCKET_TRITON_SOCKET_HAE + +#include <sys/types.h> +#include <sys/socket.h> +#include "src/common/triton-error.h" +#include "src/aesop/aesop.h" + + +__blocking triton_ret_t triton_accept (int sockfd, struct sockaddr * addr, + socklen_t * addrlen, int * newfd); + +__blocking triton_ret_t triton_read (int fd, void * buf, size_t count, int * ret); + +__blocking triton_ret_t triton_write (int fd, const void * buf, size_t count, int * ret); + +#endif hooks/post-receive -- Triton Repository
participants (1)
-
noreply@mcs.anl.gov