commit 04323be88be878706bf1afafcc87dab878d077e3
parent 41f9a57ba6dd7df43ae1fe0c06e128992d90153d
Author: Anselm R. Garbe <garbeam@wmii.de>
Date: Mon, 3 Apr 2006 16:48:41 +0200
removed libcext/array.c
Diffstat:
6 files changed, 46 insertions(+), 84 deletions(-)
diff --git a/cmd/wm/fs.c b/cmd/wm/fs.c
@@ -575,8 +575,7 @@ xattach(IXPConn *c, Fcall *fcall)
IXPMap *new = cext_emallocz(sizeof(IXPMap));
new->qid = root_qid;
new->fid = fcall->fid;
- c->map = (IXPMap **)cext_array_attach((void **)c->map, new,
- sizeof(IXPMap *), &c->mapsz);
+ cext_vattach(ixp_map2vector(&c->map), new);
fcall->id = RATTACH;
fcall->qid = root_qid;
ixp_server_respond_fcall(c, fcall);
@@ -608,8 +607,7 @@ xwalk(IXPConn *c, Fcall *fcall)
if(nwqid == fcall->nwname) {
if(fcall->fid != fcall->newfid) {
m = cext_emallocz(sizeof(IXPMap));
- c->map = (IXPMap **)cext_array_attach((void **)c->map, m,
- sizeof(IXPMap *), &c->mapsz);
+ cext_vattach(ixp_map2vector(&c->map), m);
}
m->qid = dir;
m->fid = fcall->newfid;
@@ -680,7 +678,7 @@ xremove(IXPConn *c, Fcall *fcall)
if(type != FsDlabel)
return Enoperm;
/* clunk */
- cext_array_detach((void **)c->map, m, &c->mapsz);
+ cext_vdetach(ixp_map2vector(&c->map), m);
free(m);
switch(type) {
case FsDlabel:
@@ -1363,7 +1361,7 @@ xclunk(IXPConn *c, Fcall *fcall)
update_keys();
else if(type == FsFrules)
update_rules();
- cext_array_detach((void **)c->map, m, &c->mapsz);
+ cext_vdetach(ixp_map2vector(&c->map), m);
free(m);
fcall->id = RCLUNK;
ixp_server_respond_fcall(c, fcall);
@@ -1403,8 +1401,8 @@ write_event(char *event)
{
unsigned int i = 0;
- for(i = 0; (i < srv.connsz) && srv.conn[i]; i++) {
- IXPConn *c = srv.conn[i];
+ for(i = 0; i < srv.conn.size; i++) {
+ IXPConn *c = srv.conn.data[i];
if(c->is_pending) {
/* pending reads on /event only, no qid checking */
IXPMap *m = ixp_server_fid2map(c, c->pending.fid);
diff --git a/libcext/Makefile b/libcext/Makefile
@@ -3,7 +3,7 @@
include ../config.mk
-SRC = array.c emallocz.c estrdup.c strlcat.c strlcpy.c strtonum.c tokenize.c vector.c
+SRC = emallocz.c estrdup.c strlcat.c strlcpy.c strtonum.c tokenize.c vector.c
OBJ = ${SRC:.c=.o}
diff --git a/libcext/array.c b/libcext/array.c
@@ -1,44 +0,0 @@
-/*
- * (C)opyright MMIV-MMVI Anselm R. Garbe <garbeam at gmail dot com>
- * See LICENSE file for license details.
- */
-
-#include <stdlib.h>
-
-#include "cext.h"
-
-void **
-cext_array_attach(void **array, void *p, unsigned int psize, unsigned int *size)
-{
- unsigned int i;
- if(!array) {
- *size = 2;
- array = cext_emallocz(psize * (*size));
- }
- for(i = 0; (i < (*size)) && array[i]; i++);
- if(i >= (*size)) {
- void **tmp = array;
- unsigned int newsz = (*size) * 2;
- array = cext_emallocz(psize * newsz);
- for(i = 0; i < (*size); i++)
- array[i] = tmp[i];
- free(tmp);
- *size = newsz;
- }
- array[i] = p;
- return array;
-}
-
-void
-cext_array_detach(void **array, void *p, unsigned int *size)
-{
- unsigned int i;
- if(!array)
- return;
- for(i = 0; (i < (*size)) && array[i] && array[i] != p; i++);
- if((i >= (*size)) || !array[i])
- return; /* not found */
- for(; (i + 1 < (*size)) && array[i + 1]; i++)
- array[i] = array[i + 1];
- array[i] = nil;
-}
diff --git a/libcext/cext.h b/libcext/cext.h
@@ -9,10 +9,6 @@
#define nil (void *)0
#endif
-/* array.c */
-void ** cext_array_attach(void **array, void *p, unsigned int psize, unsigned int *size);
-void cext_array_detach(void **array, void *p, unsigned int *size);
-
/* emallocz.c */
void *cext_emallocz(unsigned int size);
diff --git a/libixp/ixp.h b/libixp/ixp.h
@@ -154,21 +154,22 @@ struct IXPMap {
Qid qid;
};
+
+VECTOR(MapVector, IXPMap *);
struct IXPConn {
int fd;
IXPServer *srv;
void (*read) (IXPConn *);
void (*close) (IXPConn *);
- IXPMap **map;
- unsigned int mapsz;
+ MapVector map;
Fcall pending;
int is_pending;
};
+VECTOR(ConnVector, IXPConn *);
struct IXPServer {
int running;
- IXPConn **conn;
- unsigned int connsz;
+ ConnVector conn;
int maxfd;
fd_set rd;
};
@@ -239,6 +240,7 @@ unsigned int ixp_server_receive_fcall(IXPConn *c, Fcall *fcall);
int ixp_server_respond_fcall(IXPConn *c, Fcall *fcall);
int ixp_server_respond_error(IXPConn *c, Fcall *fcall, char *errstr);
void ixp_server_close(IXPServer *s);
+Vector *ixp_map2vector(MapVector *mv);
/* socket.c */
int ixp_connect_sock(char *address);
diff --git a/libixp/server.c b/libixp/server.c
@@ -18,6 +18,18 @@
static unsigned char *msg[IXP_MAX_MSG];
+static Vector *
+conn2vector(ConnVector *cv)
+{
+ return (Vector *) cv;
+}
+
+Vector *
+ixp_map2vector(MapVector *mv)
+{
+ return (Vector *) mv;
+}
+
IXPConn *ixp_server_open_conn(IXPServer *s, int fd, void (*read)(IXPConn *c),
void (*close)(IXPConn *c))
{
@@ -26,21 +38,19 @@ IXPConn *ixp_server_open_conn(IXPServer *s, int fd, void (*read)(IXPConn *c),
c->srv = s;
c->read = read;
c->close = close;
- s->conn = (IXPConn **)cext_array_attach((void **)s->conn, c,
- sizeof(IXPConn *), &s->connsz);
+ cext_vattach(conn2vector(&s->conn), c);
return c;
}
void
ixp_server_close_conn(IXPConn *c)
{
- unsigned int i;
IXPServer *s = c->srv;
- cext_array_detach((void **)s->conn, c, &s->connsz);
- if(c->map) {
- for(i = 0; (i < c->mapsz) && c->map[i]; i++)
- free(c->map[i]);
- free(c->map);
+ cext_vdetach(conn2vector(&s->conn), c);
+ while(c->map.size) {
+ IXPMap *m = c->map.data[0];
+ cext_vdetach(ixp_map2vector(&c->map), m);
+ free(m);
}
shutdown(c->fd, SHUT_RDWR);
close(c->fd);
@@ -52,11 +62,11 @@ prepare_select(IXPServer *s)
{
int i;
FD_ZERO(&s->rd);
- for(i = 0; (i < s->connsz) && s->conn[i]; i++) {
- if(s->maxfd < s->conn[i]->fd)
- s->maxfd = s->conn[i]->fd;
- if(s->conn[i]->read)
- FD_SET(s->conn[i]->fd, &s->rd);
+ for(i = 0; i < s->conn.size; i++) {
+ if(s->maxfd < s->conn.data[i]->fd)
+ s->maxfd = s->conn.data[i]->fd;
+ if(s->conn.data[i]->read)
+ FD_SET(s->conn.data[i]->fd, &s->rd);
}
}
@@ -64,10 +74,10 @@ static void
handle_conns(IXPServer *s)
{
int i;
- for(i = 0; (i < s->connsz) && s->conn[i]; i++)
- if(FD_ISSET(s->conn[i]->fd, &s->rd) && s->conn[i]->read)
+ for(i = 0; i < s->conn.size; i++)
+ if(FD_ISSET(s->conn.data[i]->fd, &s->rd) && s->conn.data[i]->read)
/* call read handler */
- s->conn[i]->read(s->conn[i]);
+ s->conn.data[i]->read(s->conn.data[i]);
}
char *
@@ -77,7 +87,7 @@ ixp_server_loop(IXPServer *s)
s->running = 1;
/* main loop */
- while(s->running && s->conn) {
+ while(s->running) {
prepare_select(s);
r = select(s->maxfd + 1, &s->rd, 0, 0, 0);
@@ -95,9 +105,9 @@ IXPMap *
ixp_server_fid2map(IXPConn *c, unsigned int fid)
{
unsigned int i;
- for(i = 0; (i < c->mapsz) && c->map[i]; i++)
- if(c->map[i]->fid == fid)
- return c->map[i];
+ for(i = 0; i < c->map.size; i++)
+ if(c->map.data[i]->fid == fid)
+ return c->map.data[i];
return nil;
}
@@ -146,7 +156,7 @@ void
ixp_server_close(IXPServer *s)
{
unsigned int i;
- for(i = 0; (i < s->connsz) && s->conn[i]; i++)
- if(s->conn[i]->close)
- s->conn[i]->close(s->conn[i]);
+ for(i = 0; i < s->conn.size; i++)
+ if(s->conn.data[i]->close)
+ s->conn.data[i]->close(s->conn.data[i]);
}