]> git.lizzy.rs Git - dragonnet.git/commitdiff
Correct mutex allocation
authorElias Fleckenstein <eliasfleckenstein@web.de>
Mon, 4 Oct 2021 08:44:36 +0000 (10:44 +0200)
committerElias Fleckenstein <eliasfleckenstein@web.de>
Mon, 4 Oct 2021 08:44:36 +0000 (10:44 +0200)
listen.c
listen.h
peer.c
peer.h
recv_thread.c

index 662958f0f1dc16e2dd9fb5e69783b311e92fee66..e2dcb29f74611b7e173e94bf02a9ba330c190ca1 100644 (file)
--- a/listen.c
+++ b/listen.c
@@ -14,9 +14,8 @@
 static bool dragonnet_peer_init_accepted(DragonnetPeer *p, int sock,
                struct sockaddr_in6 addr, DragonnetListener *l)
 {
-       p->mu = malloc(sizeof *p->mu);
-       pthread_rwlock_init(p->mu, NULL);
-       pthread_rwlock_wrlock(p->mu);
+       pthread_rwlock_init(&p->mu, NULL);
+       pthread_rwlock_wrlock(&p->mu);
 
        p->sock = sock;
        p->laddr = l->laddr;
@@ -34,7 +33,7 @@ static bool dragonnet_peer_init_accepted(DragonnetPeer *p, int sock,
                return false;
        }
 
-       pthread_rwlock_unlock(p->mu);
+       pthread_rwlock_unlock(&p->mu);
        return true;
 }
 
@@ -58,9 +57,8 @@ DragonnetListener *dragonnet_listener_new(char *addr,
                void (*on_connect)(DragonnetPeer *p))
 {
        DragonnetListener *l = malloc(sizeof *l);
-       l->mu = malloc(sizeof *l->mu);
-       pthread_rwlock_init(l->mu, NULL);
-       pthread_rwlock_wrlock(l->mu);
+       pthread_rwlock_init(&l->mu, NULL);
+       pthread_rwlock_wrlock(&l->mu);
 
        l->sock = socket(AF_INET6, SOCK_STREAM, 0);
        l->on_connect = on_connect;
@@ -88,18 +86,18 @@ DragonnetListener *dragonnet_listener_new(char *addr,
                return NULL;
        }
 
-       pthread_rwlock_unlock(l->mu);
+       pthread_rwlock_unlock(&l->mu);
        return l;
 }
 
 void dragonnet_listener_run(DragonnetListener *l)
 {
-       pthread_rwlock_wrlock(l->mu);
+       pthread_rwlock_wrlock(&l->mu);
 
        assert(l->state == DRAGONNET_LISTENER_CREATED);
        l->state++;
 
-       pthread_rwlock_unlock(l->mu);
+       pthread_rwlock_unlock(&l->mu);
 
        while (l->state == DRAGONNET_LISTENER_ACTIVE) {
                struct sockaddr_in6 clt_addr;
@@ -122,18 +120,18 @@ void dragonnet_listener_run(DragonnetListener *l)
 
 void dragonnet_listener_close(DragonnetListener *l)
 {
-       pthread_rwlock_wrlock(l->mu);
+       pthread_rwlock_wrlock(&l->mu);
 
        assert(l->state == DRAGONNET_LISTENER_ACTIVE);
        close(l->sock);
        l->sock = 0;
        l->state++;
 
-       pthread_rwlock_unlock(l->mu);
+       pthread_rwlock_unlock(&l->mu);
 }
 
 void dragonnet_listener_delete(DragonnetListener *l)
 {
-       pthread_rwlock_destroy(l->mu);
+       pthread_rwlock_destroy(&l->mu);
        free(l);
 }
index f2e30b671a1bff0de3b5fd3d587158c7c47ed571..e1d96a359afa0472f9d0ab4a0f750659330ec342 100644 (file)
--- a/listen.h
+++ b/listen.h
@@ -17,7 +17,7 @@ typedef struct {
        void (*on_connect)(DragonnetPeer *p);
        DragonnetListenerState state;
 
-       pthread_rwlock_t *mu;
+       pthread_rwlock_t mu;
 } DragonnetListener;
 
 DragonnetListener *dragonnet_listener_new(char *addr,
diff --git a/peer.c b/peer.c
index ab73641f07c14df5b4597878e8f03b22e76f0f95..1329fc3488fe521640a0f7f3549c952eda095895 100644 (file)
--- a/peer.c
+++ b/peer.c
@@ -13,9 +13,8 @@ const struct timeval dragonnet_timeout = {
 
 static bool dragonnet_peer_init(DragonnetPeer *p, char *addr)
 {
-       p->mu = malloc(sizeof *p->mu);
-       pthread_rwlock_init(p->mu, NULL);
-       pthread_rwlock_wrlock(p->mu);
+       pthread_rwlock_init(&p->mu, NULL);
+       pthread_rwlock_wrlock(&p->mu);
 
        p->sock = socket(AF_INET6, SOCK_STREAM, 0);
        p->raddr = dragonnet_addr_parse_str(addr);
@@ -49,7 +48,7 @@ static bool dragonnet_peer_init(DragonnetPeer *p, char *addr)
 
        p->laddr = dragonnet_addr_parse_sock(sock_name);
 
-       pthread_rwlock_unlock(p->mu);
+       pthread_rwlock_unlock(&p->mu);
        return true;
 }
 
@@ -73,18 +72,18 @@ void dragonnet_peer_run(DragonnetPeer *p)
 
 void dragonnet_peer_close(DragonnetPeer *p)
 {
-       pthread_rwlock_wrlock(p->mu);
+       pthread_rwlock_wrlock(&p->mu);
 
        if (p->state == DRAGONNET_PEER_ACTIVE) {
                shutdown(p->sock, SHUT_RDWR);
                p->state++;
        }
 
-       pthread_rwlock_unlock(p->mu);
+       pthread_rwlock_unlock(&p->mu);
 }
 
 void dragonnet_peer_delete(DragonnetPeer *p)
 {
-       pthread_rwlock_destroy(p->mu);
+       pthread_rwlock_destroy(&p->mu);
        free(p);
 }
diff --git a/peer.h b/peer.h
index 15881544cb1a9478450d775d22e685c7fbf75274..f4a4d7d89b50786e0c6e07a133d562c864d9d963 100644 (file)
--- a/peer.h
+++ b/peer.h
@@ -18,7 +18,7 @@ typedef struct {
        DragonnetAddr laddr, raddr;
        DragonnetPeerState state;
 
-       pthread_rwlock_t *mu;
+       pthread_rwlock_t mu;
 } DragonnetPeer;
 
 DragonnetPeer *dragonnet_connect(char *addr);
index a0ee5c6f1b604f0c2eb01e004341197cf3ed6490..9a85d94b698bce7f16c681b107b9df1362959529 100644 (file)
@@ -12,17 +12,17 @@ void *dragonnet_peer_recv_thread(void *g_peer)
 {
        DragonnetPeer *p = (DragonnetPeer *) g_peer;
 
-       pthread_rwlock_wrlock(p->mu);
+       pthread_rwlock_wrlock(&p->mu);
        assert(p->state == DRAGONNET_PEER_CREATED);
        p->state++;
-       pthread_rwlock_unlock(p->mu);
+       pthread_rwlock_unlock(&p->mu);
 
        while (true) {
                uint16_t msg;
 
-               pthread_rwlock_rdlock(p->mu);
+               pthread_rwlock_rdlock(&p->mu);
                ssize_t len = recv(p->sock, &msg, sizeof msg, MSG_WAITALL);
-               pthread_rwlock_unlock(p->mu);
+               pthread_rwlock_unlock(&p->mu);
 
                if (len < 0 && errno != EWOULDBLOCK) {
                        perror("recv");
@@ -32,13 +32,13 @@ void *dragonnet_peer_recv_thread(void *g_peer)
 
                // connection closed
                if ((len >= 0 && len != sizeof msg) || errno == EWOULDBLOCK) {
-                       pthread_rwlock_wrlock(p->mu);
+                       pthread_rwlock_wrlock(&p->mu);
 
                        close(p->sock);
                        p->sock = 0;
                        p->state++;
 
-                       pthread_rwlock_unlock(p->mu);
+                       pthread_rwlock_unlock(&p->mu);
                        return NULL;
                }