diff options
Diffstat (limited to 'sysdep/unix/io.c')
-rw-r--r-- | sysdep/unix/io.c | 63 |
1 files changed, 34 insertions, 29 deletions
diff --git a/sysdep/unix/io.c b/sysdep/unix/io.c index b216e63b..4030b86b 100644 --- a/sysdep/unix/io.c +++ b/sysdep/unix/io.c @@ -422,14 +422,37 @@ sk_next(sock *s) } static void -sk_free(resource *r) +sk_alloc_bufs(sock *s) { - sock *s = (sock *) r; + if (!s->rbuf && s->rbsize) + s->rbuf = s->rbuf_alloc = xmalloc(s->rbsize); + s->rpos = s->rbuf; + if (!s->tbuf && s->tbsize) + s->tbuf = s->tbuf_alloc = xmalloc(s->tbsize); + s->tpos = s->ttx = s->tbuf; +} +static void +sk_free_bufs(sock *s) +{ if (s->rbuf_alloc) - xfree(s->rbuf_alloc); + { + xfree(s->rbuf_alloc); + s->rbuf = s->rbuf_alloc = NULL; + } if (s->tbuf_alloc) - xfree(s->tbuf_alloc); + { + xfree(s->tbuf_alloc); + s->tbuf = s->tbuf_alloc = NULL; + } +} + +static void +sk_free(resource *r) +{ + sock *s = (sock *) r; + + sk_free_bufs(s); if (s->fd >= 0) { close(s->fd); @@ -440,6 +463,13 @@ sk_free(resource *r) } } +void +sk_reallocate(sock *s) +{ + sk_free_bufs(s); + sk_alloc_bufs(s); +} + static void sk_dump(resource *r) { @@ -589,31 +619,6 @@ bad: } static void -sk_alloc_bufs(sock *s) -{ - if (!s->rbuf && s->rbsize) - s->rbuf = s->rbuf_alloc = xmalloc(s->rbsize); - s->rpos = s->rbuf; - if (!s->tbuf && s->tbsize) - s->tbuf = s->tbuf_alloc = xmalloc(s->tbsize); - s->tpos = s->ttx = s->tbuf; -} - -void -sk_reallocate(sock *s) -{ - if(!s) return; - - if (s->rbuf_alloc) - xfree(s->rbuf_alloc); - s->rbuf = NULL; - if (s->tbuf_alloc) - xfree(s->tbuf_alloc); - s->tbuf = NULL; - sk_alloc_bufs(s); -} - -static void sk_tcp_connected(sock *s) { s->type = SK_TCP; |