svn commit: samba r23024 - in branches: SAMBA_3_0/source/lib
SAMBA_3_0_26/source/lib
vlendec at samba.org
vlendec at samba.org
Sun May 20 20:11:26 GMT 2007
Author: vlendec
Date: 2007-05-20 20:11:23 +0000 (Sun, 20 May 2007)
New Revision: 23024
WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=23024
Log:
Ok, neither the duplicates_allowed nor the timeout argument to
message_send_pid is used anymore. Two users of duplicates_allowed: winbind and
the printer notify system.
I don't thing this really changes semantics: duplicates_allowed is hell racy
anyway, we can't guarantee that we don't send the same message in sequence
twice, and I think the only thing we can harm with the print notify is
performance.
For winbind I talked to G?\195?\188nther, and he did not seem too worried.
Volker
Modified:
branches/SAMBA_3_0/source/lib/messages.c
branches/SAMBA_3_0_26/source/lib/messages.c
Changeset:
Modified: branches/SAMBA_3_0/source/lib/messages.c
===================================================================
--- branches/SAMBA_3_0/source/lib/messages.c 2007-05-20 19:43:49 UTC (rev 23023)
+++ branches/SAMBA_3_0/source/lib/messages.c 2007-05-20 20:11:23 UTC (rev 23024)
@@ -4,6 +4,7 @@
Copyright (C) Andrew Tridgell 2000
Copyright (C) 2001 by Martin Pool
Copyright (C) 2002 by Jeremy Allison
+ Copyright (C) 2007 by Volker Lendecke
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -106,8 +107,7 @@
}
static NTSTATUS message_send_pid(struct server_id pid, int msg_type,
- const void *buf, size_t len,
- BOOL duplicates_allowed);
+ const void *buf, size_t len);
/****************************************************************************
A useful function for testing the message system.
@@ -120,7 +120,7 @@
DEBUG(1,("INFO: Received PING message from PID %s [%s]\n",
procid_str_static(&src), msg));
- message_send_pid(src, MSG_PONG, buf, len, True);
+ message_send_pid(src, MSG_PONG, buf, len);
}
/****************************************************************************
@@ -240,17 +240,13 @@
Send a message to a particular pid.
****************************************************************************/
-static NTSTATUS message_send_pid_internal(struct server_id pid, int msg_type,
- const void *buf, size_t len,
- BOOL duplicates_allowed,
- unsigned int timeout)
+static NTSTATUS message_send_pid(struct server_id pid, int msg_type,
+ const void *buf, size_t len)
{
TDB_DATA kbuf;
TDB_DATA dbuf;
- TDB_DATA old_dbuf;
struct message_rec rec;
- uint8 *ptr;
- struct message_rec prec;
+ int ret;
/* NULL pointer means implicit length zero. */
if (!buf) {
@@ -283,113 +279,19 @@
dbuf.dsize = len + sizeof(rec);
- if (duplicates_allowed) {
+ ret = tdb_append(tdb, kbuf, dbuf);
- /* If duplicates are allowed we can just append the message
- * and return. */
+ SAFE_FREE(dbuf.dptr);
- /* lock the record for the destination */
- if (timeout) {
- if (tdb_chainlock_with_timeout(tdb, kbuf,
- timeout) == -1) {
- DEBUG(0,("message_send_pid_internal: failed "
- "to get chainlock with timeout "
- "%ul.\n", timeout));
- return NT_STATUS_IO_TIMEOUT;
- }
- } else {
- if (tdb_chainlock(tdb, kbuf) == -1) {
- DEBUG(0,("message_send_pid_internal: failed "
- "to get chainlock.\n"));
- return NT_STATUS_LOCK_NOT_GRANTED;
- }
- }
- tdb_append(tdb, kbuf, dbuf);
- tdb_chainunlock(tdb, kbuf);
-
- SAFE_FREE(dbuf.dptr);
- errno = 0; /* paranoia */
- return message_notify(pid);
+ if (ret == -1) {
+ return NT_STATUS_INTERNAL_ERROR;
}
- /* lock the record for the destination */
- if (timeout) {
- if (tdb_chainlock_with_timeout(tdb, kbuf, timeout) == -1) {
- DEBUG(0,("message_send_pid_internal: failed to get "
- "chainlock with timeout %ul.\n", timeout));
- return NT_STATUS_IO_TIMEOUT;
- }
- } else {
- if (tdb_chainlock(tdb, kbuf) == -1) {
- DEBUG(0,("message_send_pid_internal: failed to get "
- "chainlock.\n"));
- return NT_STATUS_LOCK_NOT_GRANTED;
- }
- }
-
- old_dbuf = tdb_fetch(tdb, kbuf);
-
- if (!old_dbuf.dptr) {
- /* its a new record */
-
- tdb_store(tdb, kbuf, dbuf, TDB_REPLACE);
- tdb_chainunlock(tdb, kbuf);
-
- SAFE_FREE(dbuf.dptr);
- errno = 0; /* paranoia */
- return message_notify(pid);
- }
-
- /* Not a new record. Check for duplicates. */
-
- for(ptr = old_dbuf.dptr; ptr < old_dbuf.dptr + old_dbuf.dsize; ) {
- /*
- * First check if the message header matches, then, if it's a
- * non-zero sized message, check if the data matches. If so
- * it's a duplicate and we can discard it. JRA.
- */
-
- if (!memcmp(ptr, &rec, sizeof(rec))) {
- if (!len
- || (len
- && !memcmp( ptr + sizeof(rec), buf, len))) {
- tdb_chainunlock(tdb, kbuf);
- DEBUG(10,("message_send_pid_internal: "
- "discarding duplicate message.\n"));
- SAFE_FREE(dbuf.dptr);
- SAFE_FREE(old_dbuf.dptr);
- return NT_STATUS_OK;
- }
- }
- memcpy(&prec, ptr, sizeof(prec));
- ptr += sizeof(rec) + prec.len;
- }
-
- /* we're adding to an existing entry */
-
- tdb_append(tdb, kbuf, dbuf);
- tdb_chainunlock(tdb, kbuf);
-
- SAFE_FREE(old_dbuf.dptr);
- SAFE_FREE(dbuf.dptr);
-
errno = 0; /* paranoia */
return message_notify(pid);
}
/****************************************************************************
- Send a message to a particular pid - no timeout.
-****************************************************************************/
-
-static NTSTATUS message_send_pid(struct server_id pid, int msg_type,
- const void *buf, size_t len,
- BOOL duplicates_allowed)
-{
- return message_send_pid_internal(pid, msg_type, buf, len,
- duplicates_allowed, 0);
-}
-
-/****************************************************************************
Count the messages pending for a particular pid. Expensive....
****************************************************************************/
@@ -646,8 +548,7 @@
* the msg has already been deleted from the messages.tdb.*/
status = message_send_pid(crec.pid, msg_all->msg_type,
- msg_all->buf, msg_all->len,
- msg_all->duplicates);
+ msg_all->buf, msg_all->len);
if (NT_STATUS_EQUAL(status, NT_STATUS_INVALID_HANDLE)) {
@@ -860,8 +761,7 @@
struct server_id server,
uint32_t msg_type, const DATA_BLOB *data)
{
- return message_send_pid_internal(server, msg_type, data->data,
- data->length, True, 0);
+ return message_send_pid(server, msg_type, data->data, data->length);
}
NTSTATUS messaging_send_buf(struct messaging_context *msg_ctx,
Modified: branches/SAMBA_3_0_26/source/lib/messages.c
===================================================================
--- branches/SAMBA_3_0_26/source/lib/messages.c 2007-05-20 19:43:49 UTC (rev 23023)
+++ branches/SAMBA_3_0_26/source/lib/messages.c 2007-05-20 20:11:23 UTC (rev 23024)
@@ -4,6 +4,7 @@
Copyright (C) Andrew Tridgell 2000
Copyright (C) 2001 by Martin Pool
Copyright (C) 2002 by Jeremy Allison
+ Copyright (C) 2007 by Volker Lendecke
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -106,8 +107,7 @@
}
static NTSTATUS message_send_pid(struct server_id pid, int msg_type,
- const void *buf, size_t len,
- BOOL duplicates_allowed);
+ const void *buf, size_t len);
/****************************************************************************
A useful function for testing the message system.
@@ -120,7 +120,7 @@
DEBUG(1,("INFO: Received PING message from PID %s [%s]\n",
procid_str_static(&src), msg));
- message_send_pid(src, MSG_PONG, buf, len, True);
+ message_send_pid(src, MSG_PONG, buf, len);
}
/****************************************************************************
@@ -240,17 +240,13 @@
Send a message to a particular pid.
****************************************************************************/
-static NTSTATUS message_send_pid_internal(struct server_id pid, int msg_type,
- const void *buf, size_t len,
- BOOL duplicates_allowed,
- unsigned int timeout)
+static NTSTATUS message_send_pid(struct server_id pid, int msg_type,
+ const void *buf, size_t len)
{
TDB_DATA kbuf;
TDB_DATA dbuf;
- TDB_DATA old_dbuf;
struct message_rec rec;
- uint8 *ptr;
- struct message_rec prec;
+ int ret;
/* NULL pointer means implicit length zero. */
if (!buf) {
@@ -283,113 +279,19 @@
dbuf.dsize = len + sizeof(rec);
- if (duplicates_allowed) {
+ ret = tdb_append(tdb, kbuf, dbuf);
- /* If duplicates are allowed we can just append the message
- * and return. */
+ SAFE_FREE(dbuf.dptr);
- /* lock the record for the destination */
- if (timeout) {
- if (tdb_chainlock_with_timeout(tdb, kbuf,
- timeout) == -1) {
- DEBUG(0,("message_send_pid_internal: failed "
- "to get chainlock with timeout "
- "%ul.\n", timeout));
- return NT_STATUS_IO_TIMEOUT;
- }
- } else {
- if (tdb_chainlock(tdb, kbuf) == -1) {
- DEBUG(0,("message_send_pid_internal: failed "
- "to get chainlock.\n"));
- return NT_STATUS_LOCK_NOT_GRANTED;
- }
- }
- tdb_append(tdb, kbuf, dbuf);
- tdb_chainunlock(tdb, kbuf);
-
- SAFE_FREE(dbuf.dptr);
- errno = 0; /* paranoia */
- return message_notify(pid);
+ if (ret == -1) {
+ return NT_STATUS_INTERNAL_ERROR;
}
- /* lock the record for the destination */
- if (timeout) {
- if (tdb_chainlock_with_timeout(tdb, kbuf, timeout) == -1) {
- DEBUG(0,("message_send_pid_internal: failed to get "
- "chainlock with timeout %ul.\n", timeout));
- return NT_STATUS_IO_TIMEOUT;
- }
- } else {
- if (tdb_chainlock(tdb, kbuf) == -1) {
- DEBUG(0,("message_send_pid_internal: failed to get "
- "chainlock.\n"));
- return NT_STATUS_LOCK_NOT_GRANTED;
- }
- }
-
- old_dbuf = tdb_fetch(tdb, kbuf);
-
- if (!old_dbuf.dptr) {
- /* its a new record */
-
- tdb_store(tdb, kbuf, dbuf, TDB_REPLACE);
- tdb_chainunlock(tdb, kbuf);
-
- SAFE_FREE(dbuf.dptr);
- errno = 0; /* paranoia */
- return message_notify(pid);
- }
-
- /* Not a new record. Check for duplicates. */
-
- for(ptr = old_dbuf.dptr; ptr < old_dbuf.dptr + old_dbuf.dsize; ) {
- /*
- * First check if the message header matches, then, if it's a
- * non-zero sized message, check if the data matches. If so
- * it's a duplicate and we can discard it. JRA.
- */
-
- if (!memcmp(ptr, &rec, sizeof(rec))) {
- if (!len
- || (len
- && !memcmp( ptr + sizeof(rec), buf, len))) {
- tdb_chainunlock(tdb, kbuf);
- DEBUG(10,("message_send_pid_internal: "
- "discarding duplicate message.\n"));
- SAFE_FREE(dbuf.dptr);
- SAFE_FREE(old_dbuf.dptr);
- return NT_STATUS_OK;
- }
- }
- memcpy(&prec, ptr, sizeof(prec));
- ptr += sizeof(rec) + prec.len;
- }
-
- /* we're adding to an existing entry */
-
- tdb_append(tdb, kbuf, dbuf);
- tdb_chainunlock(tdb, kbuf);
-
- SAFE_FREE(old_dbuf.dptr);
- SAFE_FREE(dbuf.dptr);
-
errno = 0; /* paranoia */
return message_notify(pid);
}
/****************************************************************************
- Send a message to a particular pid - no timeout.
-****************************************************************************/
-
-static NTSTATUS message_send_pid(struct server_id pid, int msg_type,
- const void *buf, size_t len,
- BOOL duplicates_allowed)
-{
- return message_send_pid_internal(pid, msg_type, buf, len,
- duplicates_allowed, 0);
-}
-
-/****************************************************************************
Count the messages pending for a particular pid. Expensive....
****************************************************************************/
@@ -646,8 +548,7 @@
* the msg has already been deleted from the messages.tdb.*/
status = message_send_pid(crec.pid, msg_all->msg_type,
- msg_all->buf, msg_all->len,
- msg_all->duplicates);
+ msg_all->buf, msg_all->len);
if (NT_STATUS_EQUAL(status, NT_STATUS_INVALID_HANDLE)) {
@@ -860,8 +761,7 @@
struct server_id server,
uint32_t msg_type, const DATA_BLOB *data)
{
- return message_send_pid_internal(server, msg_type, data->data,
- data->length, True, 0);
+ return message_send_pid(server, msg_type, data->data, data->length);
}
NTSTATUS messaging_send_buf(struct messaging_context *msg_ctx,
More information about the samba-cvs
mailing list