Add the offsetof macro to libctdb
authorRonnie Sahlberg <ronniesahlberg@gmail.com>
Wed, 2 Jun 2010 05:13:32 +0000 (15:13 +1000)
committerRonnie Sahlberg <ronniesahlberg@gmail.com>
Wed, 2 Jun 2010 05:13:32 +0000 (15:13 +1000)
change all calls to new_ctdb_request() to use the offset macro to calculate the correct size (instead of allocating one byte too many and hoping the alignment padding saves us.)

libctdb/ctdb.c
libctdb/libctdb_private.h
libctdb/messages.c

index e49e3d8cde3ef3ebab7f827e454fe4320c30e48c..39f4bab2a2eb5fb06df3b49b0d285884a5024b80 100644 (file)
@@ -346,7 +346,7 @@ struct ctdb_request *new_ctdb_control_request(struct ctdb_connection *ctdb,
        struct ctdb_request *req;
        struct ctdb_req_control *pkt;
 
-       req = new_ctdb_request(sizeof(*pkt) + extra, callback, cbdata);
+       req = new_ctdb_request(offsetof(struct ctdb_req_control, data) + extra, callback, cbdata);
        if (!req)
                return NULL;
 
@@ -632,7 +632,7 @@ ctdb_readrecordlock_send(struct ctdb_db *ctdb_db, TDB_DATA key,
        lock->held = false;
 
        /* Get ready in case we need to send a migrate request. */
-       req = new_ctdb_request(sizeof(*req->hdr.call)
+       req = new_ctdb_request(offsetof(struct ctdb_req_call, data)
                               + key.dsize, callback, cbdata);
        if (!req) {
                ctdb_release_lock(lock);
index f016be0c68daf0a779f711b6092db61aaae601eb..ba5ee44883a6fdf8e4c711371da800dd3422ae36 100644 (file)
@@ -7,6 +7,10 @@
 #include <ctdb.h>
 #include <ctdb_protocol.h>
 
+#ifndef offsetof
+#define offsetof(t,f) ((unsigned int)&((t *)0)->f)
+#endif
+
 struct message_handler_info;
 struct ctdb_reply_call;
 
index 26f90aa0d98365d0513c891fca9a8739a3de5d18..aa997bc9f9f4ee2b519b47920f5cea1e520c5012 100644 (file)
@@ -99,7 +99,7 @@ int ctdb_send_message(struct ctdb_connection *ctdb,
        struct ctdb_req_message *pkt;
 
        /* We just discard it once it's finished: no reply. */
-       req = new_ctdb_request(sizeof(*pkt) + data.dsize,
+       req = new_ctdb_request(offsetof(struct ctdb_req_message, data) + data.dsize,
                               ctdb_cancel_callback, NULL);
        if (!req) {
                return -1;