From e53f16d957ffa3a6a4f63d9ebce8cd867d8725cd Mon Sep 17 00:00:00 2001 From: Pekka Riikonen Date: Wed, 4 Jul 2007 17:21:21 +0000 Subject: [PATCH] Added SilcStack suppor to FD Stream API. --- lib/silcutil/silcfdstream.c | 32 ++++++++++++++++++-------- lib/silcutil/silcfdstream.h | 31 ++++++++++++++++++------- lib/silcutil/tests/test_silcfdstream.c | 4 ++-- 3 files changed, 47 insertions(+), 20 deletions(-) diff --git a/lib/silcutil/silcfdstream.c b/lib/silcutil/silcfdstream.c index a618c634..d2875f95 100644 --- a/lib/silcutil/silcfdstream.c +++ b/lib/silcutil/silcfdstream.c @@ -28,6 +28,7 @@ const SilcStreamOps silc_fd_stream_ops; /* FD stream context */ typedef struct { const SilcStreamOps *ops; + SilcStack stack; SilcSchedule schedule; SilcStreamNotifier notifier; void *notifier_context; @@ -67,28 +68,34 @@ SILC_TASK_CALLBACK(silc_fd_stream_io) /* Create file descriptor stream */ -SilcStream silc_fd_stream_create(int fd) +SilcStream silc_fd_stream_create(int fd, SilcStack stack) { if (fd < 1) return NULL; - return silc_fd_stream_create2(fd, 0); + return silc_fd_stream_create2(fd, 0, stack); } /* Create stream with two file descriptors */ -SilcStream silc_fd_stream_create2(int read_fd, int write_fd) +SilcStream silc_fd_stream_create2(int read_fd, int write_fd, SilcStack stack) { SilcFDStream stream; - stream = silc_calloc(1, sizeof(*stream)); - if (!stream) + if (stack) + stack = silc_stack_alloc(0, stack); + + stream = silc_scalloc(stack, 1, sizeof(*stream)); + if (!stream) { + silc_stack_free(stack); return NULL; + } SILC_LOG_DEBUG(("Creating new fd stream %p", stream)); stream->ops = &silc_fd_stream_ops; stream->fd1 = read_fd; stream->fd2 = write_fd; + stream->stack = stack; return stream; } @@ -96,7 +103,7 @@ SilcStream silc_fd_stream_create2(int read_fd, int write_fd) /* Create by opening file */ SilcStream silc_fd_stream_file(const char *filename, SilcBool reading, - SilcBool writing) + SilcBool writing, SilcStack stack) { const char *read_file = NULL, *write_file = NULL; @@ -108,12 +115,13 @@ SilcStream silc_fd_stream_file(const char *filename, SilcBool reading, if (reading) read_file = filename; - return silc_fd_stream_file2(read_file, write_file); + return silc_fd_stream_file2(read_file, write_file, stack); } /* Create by opening two files */ -SilcStream silc_fd_stream_file2(const char *read_file, const char *write_file) +SilcStream silc_fd_stream_file2(const char *read_file, const char *write_file, + SilcStack stack) { SilcStream stream; int fd1 = 0, fd2 = 0; @@ -136,7 +144,7 @@ SilcStream silc_fd_stream_file2(const char *read_file, const char *write_file) return NULL; } - stream = silc_fd_stream_create2(fd1, fd2); + stream = silc_fd_stream_create2(fd1, fd2, stack); if (!stream) { silc_file_close(fd1); silc_file_close(fd2); @@ -277,8 +285,12 @@ SilcBool silc_fd_stream_close(SilcStream stream) void silc_fd_stream_destroy(SilcStream stream) { + SilcFDStream fd_stream = stream; + SilcStack stack = fd_stream->stack; + silc_fd_stream_close(stream); - silc_free(stream); + silc_sfree(stack, stream); + silc_stack_free(stack); } /* Sets stream notification callback for the stream */ diff --git a/lib/silcutil/silcfdstream.h b/lib/silcutil/silcfdstream.h index f64d6b53..64946c3f 100644 --- a/lib/silcutil/silcfdstream.h +++ b/lib/silcutil/silcfdstream.h @@ -38,7 +38,7 @@ * * SYNOPSIS * - * SilcStream silc_fd_stream_create(int fd); + * SilcStream silc_fd_stream_create(int fd, SilcStack stack); * * DESCRIPTION * @@ -49,14 +49,18 @@ * If the silc_stream_set_notifier is called the stream is set to * non-blocking mode. * + * If `stack' is non-NULL all memory is allocated from the `stack' and + * will be released back to `stack' after the stream is destroyed. + * ***/ -SilcStream silc_fd_stream_create(int fd); +SilcStream silc_fd_stream_create(int fd, SilcStack stack); /****f* silcutil/SilcFDStreamAPI/silc_fd_stream_create2 * * SYNOPSIS * - * SilcStream silc_fd_stream_create2(int read_fd, int write_fd); + * SilcStream silc_fd_stream_create2(int read_fd, int write_fd, + * SilcStack stack); * * DESCRIPTION * @@ -68,15 +72,18 @@ SilcStream silc_fd_stream_create(int fd); * If the silc_stream_set_notifier is called the stream is set to * non-blocking mode. * + * If `stack' is non-NULL all memory is allocated from the `stack' and + * will be released back to `stack' after the stream is destroyed. + * ***/ -SilcStream silc_fd_stream_create2(int read_fd, int write_fd); +SilcStream silc_fd_stream_create2(int read_fd, int write_fd, SilcStack stack); /****f* silcutil/SilcFDStreamAPI/silc_fd_stream_file * * SYNOPSIS * * SilcStream silc_fd_stream_file(const char *filename, SilcBool reading, - * SilcBool writing); + * SilcBool writing, SilcStack stack); * * DESCRIPTION * @@ -88,16 +95,20 @@ SilcStream silc_fd_stream_create2(int read_fd, int write_fd); * If the silc_stream_set_notifier is called the stream is set to * non-blocking mode. * + * If `stack' is non-NULL all memory is allocated from the `stack' and + * will be released back to `stack' after the stream is destroyed. + * ***/ SilcStream silc_fd_stream_file(const char *filename, SilcBool reading, - SilcBool writing); + SilcBool writing, SilcStack stack); /****f* silcutil/SilcFDStreamAPI/silc_fd_stream_file2 * * SYNOPSIS * * SilcStream silc_fd_stream_file2(const char *read_file, - * const char *write_file); + * const char *write_file, + * SilcStack stack); * * DESCRIPTION * @@ -107,8 +118,12 @@ SilcStream silc_fd_stream_file(const char *filename, SilcBool reading, * If the silc_stream_set_notifier is called the stream is set to * non-blocking mode. * + * If `stack' is non-NULL all memory is allocated from the `stack' and + * will be released back to `stack' after the stream is destroyed. + * ***/ -SilcStream silc_fd_stream_file2(const char *read_file, const char *write_file); +SilcStream silc_fd_stream_file2(const char *read_file, const char *write_file, + SilcStack stack); /****f* silcutil/SilcFDStreamAPI/silc_fd_stream_get_info * diff --git a/lib/silcutil/tests/test_silcfdstream.c b/lib/silcutil/tests/test_silcfdstream.c index cd95c6ce..f69ce14b 100644 --- a/lib/silcutil/tests/test_silcfdstream.c +++ b/lib/silcutil/tests/test_silcfdstream.c @@ -58,7 +58,7 @@ SILC_FSM_STATE(st_readwrite) } SILC_LOG_DEBUG(("Creating FD stream (two fds)")); - stream = silc_fd_stream_create2(fd1, fd2); + stream = silc_fd_stream_create2(fd1, fd2, NULL); if (!stream) { SILC_LOG_DEBUG(("Error creating stream")); goto err; @@ -133,7 +133,7 @@ SILC_FSM_STATE(st_write) SILC_LOG_DEBUG(("Open file /tmp/test_silcfdstream for writing")); SILC_LOG_DEBUG(("Creating FD stream")); unlink("/tmp/test_silcfdstream"); - stream = silc_fd_stream_file("/tmp/test_silcfdstream", FALSE, TRUE); + stream = silc_fd_stream_file("/tmp/test_silcfdstream", FALSE, TRUE, NULL); if (!stream) { SILC_LOG_DEBUG(("Error creating stream")); goto err; -- 2.24.0