diff options
Diffstat (limited to 'ecp/src/ecp/dir/dir_srv.c')
-rw-r--r-- | ecp/src/ecp/dir/dir_srv.c | 85 |
1 files changed, 70 insertions, 15 deletions
diff --git a/ecp/src/ecp/dir/dir_srv.c b/ecp/src/ecp/dir/dir_srv.c index b4d030d..cbaafc5 100644 --- a/ecp/src/ecp/dir/dir_srv.c +++ b/ecp/src/ecp/dir/dir_srv.c @@ -6,14 +6,38 @@ #include "dir.h" #include "dir_srv.h" -int ecp_dir_init(ECPContext *ctx, ECPDirList *dir_online, ECPDirList *dir_shadow) { - ctx->dir_online = dir_online; - ctx->dir_shadow = dir_shadow; +int ecp_dir_create(ECPContext *ctx, ECPDirSrv *dir_srv, ECPDirList *dir_online, ECPDirList *dir_shadow) { + int rv; + +#ifdef ECP_WITH_PTHREAD + rv = pthread_mutex_init(&dir_srv->online.mutex, NULL); + if (rv) return ECP_ERR; + + rv = pthread_mutex_init(&dir_srv->shadow.mutex, NULL); + if (rv) { + pthread_mutex_destroy(&dir_srv->online.mutex); + return ECP_ERR; + } +#endif + + dir_srv->online.list = dir_online; + dir_srv->shadow.list = dir_shadow; + ctx->dir_srv = dir_srv; return ECP_OK; } -ssize_t ecp_dir_send_list(ECPConnection *conn, unsigned char mtype, ECPDirList *list) { +void ecp_dir_destroy(ECPContext *ctx) { + ECPDirSrv *dir_srv = ctx->dir_srv; + +#ifdef ECP_WITH_PTHREAD + pthread_mutex_destroy(&dir_srv->shadow.mutex); + pthread_mutex_destroy(&dir_srv->online.mutex); +#endif + +} + +ssize_t ecp_dir_send_list(ECPConnection *conn, unsigned char mtype, ECPDirTable *dir_table) { ECPBuffer packet; ECPBuffer payload; unsigned char pkt_buf[ECP_MAX_PKT]; @@ -33,7 +57,16 @@ ssize_t ecp_dir_send_list(ECPConnection *conn, unsigned char mtype, ECPDirList * hdr_size = msg - payload.buffer; msg_size = payload.size - hdr_size; - rv = ecp_dir_serialize(list, msg, msg_size); +#ifdef ECP_WITH_PTHREAD + pthread_mutex_lock(&dir_table->mutex); +#endif + + rv = ecp_dir_serialize(dir_table->list, msg, msg_size); + +#ifdef ECP_WITH_PTHREAD + pthread_mutex_unlock(&dir_table->mutex); +#endif + if (rv < 0) return rv; rv = ecp_pld_send(conn, &packet, &payload, ECP_SIZE_PLD(rv, mtype), 0); @@ -41,22 +74,33 @@ ssize_t ecp_dir_send_list(ECPConnection *conn, unsigned char mtype, ECPDirList * } ssize_t ecp_dir_send_upd(ECPConnection *conn) { - ECPContext *ctx = conn->sock->ctx; + ECPDirSrv *dir_srv = conn->sock->ctx->dir_srv; + ECPDirTable *dir_table = &dir_srv->shadow; ssize_t rv; - rv = ecp_dir_send_list(conn, ECP_MTYPE_DIR_UPD, ctx->dir_shadow); + rv = ecp_dir_send_list(conn, ECP_MTYPE_DIR_UPD, dir_table); return rv; } ssize_t ecp_dir_handle_upd(ECPConnection *conn, unsigned char *msg, size_t msg_size) { - ECPContext *ctx = conn->sock->ctx; + ECPDirSrv *dir_srv = conn->sock->ctx->dir_srv; + ECPDirTable *dir_table = &dir_srv->shadow; ssize_t rsize; ssize_t rv; - rsize = ecp_dir_parse(ctx->dir_shadow, msg, msg_size); +#ifdef ECP_WITH_PTHREAD + pthread_mutex_lock(&dir_table->mutex); +#endif + + rsize = ecp_dir_parse(dir_table->list, msg, msg_size); + +#ifdef ECP_WITH_PTHREAD + pthread_mutex_unlock(&dir_table->mutex); +#endif + if (rsize < 0) return rsize; - rv = ecp_dir_send_list(conn, ECP_MTYPE_DIR_REP, ctx->dir_shadow); + rv = ecp_dir_send_list(conn, ECP_MTYPE_DIR_REP, dir_table); if (rv < 0) return rv; return rsize; @@ -72,17 +116,28 @@ ssize_t ecp_dir_handle_req(ECPConnection *conn, unsigned char *msg, size_t msg_s } ssize_t ecp_dir_send_rep(ECPConnection *conn) { - ECPContext *ctx = conn->sock->ctx; + ECPDirSrv *dir_srv = conn->sock->ctx->dir_srv; + ECPDirTable *dir_table = &dir_srv->online; ssize_t rv; - rv = ecp_dir_send_list(conn, ECP_MTYPE_DIR_REP, ctx->dir_online); + rv = ecp_dir_send_list(conn, ECP_MTYPE_DIR_REP, dir_table); return rv; } ssize_t ecp_dir_handle_rep(ECPConnection *conn, unsigned char *msg, size_t msg_size) { - ECPContext *ctx = conn->sock->ctx; + ECPDirSrv *dir_srv = conn->sock->ctx->dir_srv; + ECPDirTable *dir_table = &dir_srv->shadow; ssize_t rv; - rv = ecp_dir_parse(ctx->dir_shadow, msg, msg_size); +#ifdef ECP_WITH_PTHREAD + pthread_mutex_lock(&dir_table->mutex); +#endif + + rv = ecp_dir_parse(dir_table->list, msg, msg_size); + +#ifdef ECP_WITH_PTHREAD + pthread_mutex_unlock(&dir_table->mutex); +#endif + return rv; -}
\ No newline at end of file +} |