[SCM] Samba Shared Repository - branch master updated
Jeremy Allison
jra at samba.org
Wed Oct 5 01:52:03 UTC 2016
The branch, master has been updated
via 23e77c5 messaging: Avoid crashes
via 4ce599d messaging: Avoid a default tevent_fd
via 6c21d99 messaging: Disable the correct fde on error
via 7099ba8 messaging: Make messaging_dgm_register_tevent_context return a tevent_fd
via fdc52ab messaging4: Postpone messages to the right tevent context
via 6d3c064 messaging: Act on messages within the right context
via 82dd356 messaging: Pass "ev" to messaging_dispatch_rec
via 85c4137 messages_dgm_ref: Pass receiving "ev" to recv_cb
via fc0b35b messages_dgm: Pass receiving "ev" to recv_cb
via 88cdb23 messages_dgm: Pass down event_ctx one level
via 56de9c5 messages_dgm: Drop a segment if we can't ship it for 60 seconds
via 8a515a2 tevent: Add tevent_req_reset_endtime
via cd1ab02 messaging: Optimize self-sends
via 1cf8526 lib: Add messaging_rec_create
via f9a8441 messaging: add an overflow test
via ddffebc lib: Remove poll_funcs
via f0e3ceb lib: Remove unix_msg
via 40bbf94 messages_dgm: Convert to pthreadpool_tevent
via 48425d2 pthreadpool: Add a small test for pthreadpool_tevent
via ca43af9 pthreadpool_tevent: Drop running jobs on talloc_free
via 9708ccc pthreadpool_tevent: Move the pthreadpool_tevent_job_state declaration
via 1a3d081 pthreadpool_pipe: Implement EBUSY for _destroy
via 77b7dea pthreadpool: Use detached threads
via 2d6b6c2 pthreadpool: Make "shutdown" a bool
via d5cc7be tevent: Make talloc_free safe when threaded_contexts exist
via 5b3019c tevent: Add tevent_common_wakeup_fd()
via d90f325 tevent: Rename wakeup fds
via 0ecefd5 tevent: Add tevent_update_timer()
via c834efa tevent: Factor out tevent_common_insert_timer
via 85221cd messaging4: Fix signed/unsigned hickups
from a782148 README.Coding: Add clang-format style file
https://git.samba.org/?p=samba.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit 23e77c56197d3db4271392ce1993930239e683be
Author: Volker Lendecke <vl at samba.org>
Date: Fri Sep 30 06:42:40 2016 -0700
messaging: Avoid crashes
With the latest patches we defer messages to a messaging_context's default
context, the one that it was created with. This is another incarnation of
085542fc93b3 (I believe): messaging contexts can outlive their tevent contexts.
In this case, the tevent_schedule_immediate(msg_ctx->event_ctx) has nothing to
schedule on and will crash. This patch uses the fact that tevent_fd's can
outlive their event_contexts. When the tevent_context dies, all tevent_fd's
will get their flags set to 0. The tevent_handles in messages_dgm_ref always
have TEVENT_FD_READ set, so a 0 flags field indicates the tevent_context has
died.
Signed-off-by: Volker Lendecke <vl at samba.org>
Pair-Programmed-With: Stefan Metzmacher <metze at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
Autobuild-User(master): Jeremy Allison <jra at samba.org>
Autobuild-Date(master): Wed Oct 5 03:51:43 CEST 2016 on sn-devel-144
commit 4ce599dcd2f5975df52b4392dc8a8e87b57a3f80
Author: Volker Lendecke <vl at samba.org>
Date: Fri Sep 30 06:42:40 2016 -0700
messaging: Avoid a default tevent_fd
Instead, rely on messaging_dgm_ref to always request a tevent_handle.
Signed-off-by: Volker Lendecke <vl at samba.org>
Pair-Programmed-With: Stefan Metzmacher <metze at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 6c21d9977fc1c8b8cb3ffd4922ee7b1597452343
Author: Volker Lendecke <vl at samba.org>
Date: Fri Sep 30 06:42:40 2016 -0700
messaging: Disable the correct fde on error
We might be called from different event contexts and thus
via different fde's
Signed-off-by: Volker Lendecke <vl at samba.org>
Pair-Programmed-With: Stefan Metzmacher <metze at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 7099ba8770f3f38c37d9b910ac1898647bfd96f0
Author: Volker Lendecke <vl at samba.org>
Date: Fri Sep 30 06:42:40 2016 -0700
messaging: Make messaging_dgm_register_tevent_context return a tevent_fd
Signed-off-by: Volker Lendecke <vl at samba.org>
Pair-Programmed-With: Stefan Metzmacher <metze at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit fdc52abbf45c6362ae208142b0f3ee9a17e16fe4
Author: Volker Lendecke <vl at samba.org>
Date: Wed Sep 28 16:05:25 2016 -0700
messaging4: Postpone messages to the right tevent context
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 6d3c064f1a5d4471b5c68abf40ce21f71a55d564
Author: Volker Lendecke <vl at samba.org>
Date: Fri Sep 23 19:35:10 2016 -0700
messaging: Act on messages within the right context
Only look at "classic" messaging_register handlers in the main event
context loop
If we're sitting in a nested event context, only act upon the
messaging_filtered_read ones that are registered in the nested context.
Postpone everything else via an immediate to the main tevent context
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 82dd3562a5edc43e81a2ac897a329d6b06b097ad
Author: Volker Lendecke <vl at samba.org>
Date: Fri Sep 23 19:28:10 2016 -0700
messaging: Pass "ev" to messaging_dispatch_rec
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 85c41375fd10d07a5dd6f3b65def3930eb65baf5
Author: Volker Lendecke <vl at samba.org>
Date: Fri Sep 23 18:36:15 2016 -0700
messages_dgm_ref: Pass receiving "ev" to recv_cb
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit fc0b35b41cea5a02d9eec7dc438d54ed34758069
Author: Volker Lendecke <vl at samba.org>
Date: Fri Sep 23 18:36:15 2016 -0700
messages_dgm: Pass receiving "ev" to recv_cb
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 88cdb233d3194f904f40cc689520d27c7cd6777d
Author: Volker Lendecke <vl at samba.org>
Date: Fri Sep 23 17:07:20 2016 -0700
messages_dgm: Pass down event_ctx one level
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 56de9c53fb25dfff93f719e79bf7e3cc809f8a07
Author: Volker Lendecke <vl at samba.org>
Date: Mon Sep 12 14:12:10 2016 +0200
messages_dgm: Drop a segment if we can't ship it for 60 seconds
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 8a515a2d10e63f5ad19089d9bd47d6f20c620c6c
Author: Volker Lendecke <vl at samba.org>
Date: Mon Sep 12 13:02:26 2016 +0200
tevent: Add tevent_req_reset_endtime
We might decide at some point that we don't want a request to
time out
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit cd1ab02530a696071b7d5f43c3e2ab94c6b1713b
Author: Volker Lendecke <vl at samba.org>
Date: Mon Jul 25 16:31:18 2016 +0200
messaging: Optimize self-sends
We need to go through the event loop, which messaging_dgm_send does. We can
also use a tevent_immediate for the same purpose. Right now the main user is
messaging_ctdb: Here strace looks a bit weird when we receive a message.
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 1cf8526c6024dcf7f6fb7eba1394de6d05eefd25
Author: Volker Lendecke <vl at samba.org>
Date: Fri Sep 23 19:06:56 2016 -0700
lib: Add messaging_rec_create
Essentially a wrapper around messaging_rec_dup
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit f9a84411e81d67311452228979648c9dd87a4631
Author: Volker Lendecke <vl at samba.org>
Date: Fri Sep 9 16:51:25 2016 +0200
messaging: add an overflow test
Send 1000 messages without picking them up. Then destroy the sending messaging
context.
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit ddffebc0fed80c9937e39c3a8b6b39fc78c2c372
Author: Volker Lendecke <vl at samba.org>
Date: Wed Sep 28 14:44:03 2016 -0700
lib: Remove poll_funcs
unix_msg was the only user
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit f0e3cebc54657dab003c9ff139f5db1730f607a9
Author: Volker Lendecke <vl at samba.org>
Date: Wed Sep 28 14:35:21 2016 -0700
lib: Remove unix_msg
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 40bbf9494f675d1d4ac226d77978d25ca6bfd78f
Author: Volker Lendecke <vl at samba.org>
Date: Fri Sep 9 16:51:00 2016 +0200
messages_dgm: Convert to pthreadpool_tevent
This itself adds a lot of code, however it removes the unix_msg library.
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 48425d2cf096a860817cf945eeaf8e95db035e80
Author: Volker Lendecke <vl at samba.org>
Date: Fri Sep 9 16:42:05 2016 +0200
pthreadpool: Add a small test for pthreadpool_tevent
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit ca43af97d219f2de836a50ecaf24532445a3da66
Author: Volker Lendecke <vl at samba.org>
Date: Fri Sep 9 13:28:51 2016 +0200
pthreadpool_tevent: Drop running jobs on talloc_free
Enable us to destroy a pthreadpool_tevent structure with active jobs
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 9708ccc6d7d54211395b2a53d567118cb37bd308
Author: Volker Lendecke <vl at samba.org>
Date: Fri Sep 9 13:27:13 2016 +0200
pthreadpool_tevent: Move the pthreadpool_tevent_job_state declaration
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 1a3d081c995de9ff8a7047e9b77cd532c3dffa97
Author: Volker Lendecke <vl at samba.org>
Date: Fri Sep 9 15:18:41 2016 +0200
pthreadpool_pipe: Implement EBUSY for _destroy
Restore EBUSY on pthreadpool_pipe_destroy.
We need to count jobs in pthreadpool_pipe so that pthreadpool can exit with
active jobs. Unfortunately this makes pthreadpool_pipe_add_job non-threadsafe.
We could add mutexes around "num_jobs", but this would mean another set of
pthread_atfork functions. As we don't use threaded pthreadpool_pipe_add_job
except in the tests, just remove the tests...
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 77b7dea2d988a9944f795e2efae24aeb16009f5f
Author: Volker Lendecke <vl at samba.org>
Date: Fri Sep 9 13:07:57 2016 +0200
pthreadpool: Use detached threads
So far we used joinable threads. This prevented pthreadpool_destroy with
blocked threads. This patch converts pthreadpool to detached threads. Now
pthreadpool_destroy does not have to wait for the idle threads to finish, it
can immediately return. pthreadpool_destroy will tell all threads to exit, and
the last active thread will actually free(pthreadpool).
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 2d6b6c24469d2207132d16cb23b32697e3371134
Author: Volker Lendecke <vl at samba.org>
Date: Wed Sep 7 20:37:21 2016 +0200
pthreadpool: Make "shutdown" a bool
Just a small cleanup
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit d5cc7be95994b24f30b821cf5f666c9b9209400c
Author: Volker Lendecke <vl at samba.org>
Date: Wed Sep 7 20:25:36 2016 +0200
tevent: Make talloc_free safe when threaded_contexts exist
I did not find a way to do this safely without a mutex per threaded_context.
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 5b3019cb91f732f95f65c228a2483788f54faa8b
Author: Volker Lendecke <vl at samba.org>
Date: Wed Sep 7 19:47:55 2016 +0200
tevent: Add tevent_common_wakeup_fd()
This prepares tevent run-down with active threads.
It has the advantage to not depend on talloc'ed structs. It is needed to make
talloc_free(tevent_context) safe when tevent_threaded_contexts are still
around.
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit d90f325878f8aab5c66ac304e501627040788138
Author: Volker Lendecke <vl at samba.org>
Date: Wed Sep 7 19:17:21 2016 +0200
tevent: Rename wakeup fds
This makes the reading end of the signalling pipe special: If we have eventfd,
this is the same as the write fd. Without eventfd, it will have to be a
separate fd. This moves the requirement to #ifdef from the writing end to the
reading end. Why? We'll use the writing end somewhere else too soon, and this
patch avoids an #ifdef in that new place.
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 0ecefd5bf91ae8297569dc862d7259e942d895fe
Author: Volker Lendecke <vl at samba.org>
Date: Wed Aug 31 15:39:59 2016 +0200
tevent: Add tevent_update_timer()
This will be a quicker way to time out sending sockets in messaging_dgm. Right
now cleanup of out-sockets is a bit coarse. The ideal would be to kill a socket
after being idle n seconds. This would mean to free and re-install a timer on
every packet. tevent_update_timer will be quite a bit cheaper.
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit c834efabd685198c570503bfc8394ff80899cef5
Author: Volker Lendecke <vl at samba.org>
Date: Wed Aug 31 15:03:16 2016 +0200
tevent: Factor out tevent_common_insert_timer
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 85221cd882cd0622bdab30d60e7907e520019905
Author: Volker Lendecke <vl at samba.org>
Date: Fri Sep 23 18:43:04 2016 -0700
messaging4: Fix signed/unsigned hickups
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
-----------------------------------------------------------------------
Summary of changes:
lib/poll_funcs/poll_funcs.h | 131 ---
lib/poll_funcs/poll_funcs_tevent.c | 684 ----------------
lib/poll_funcs/poll_funcs_tevent.h | 38 -
lib/poll_funcs/wscript_build | 5 -
lib/tevent/ABI/tevent-0.9.30.sigs | 3 +
lib/tevent/tevent.c | 99 ++-
lib/tevent/tevent.h | 17 +
lib/tevent/tevent_internal.h | 10 +-
lib/tevent/tevent_req.c | 5 +
lib/tevent/tevent_threads.c | 38 +-
lib/tevent/tevent_timed.c | 88 ++-
source3/lib/messages.c | 169 +++-
source3/lib/messages_dgm.c | 951 ++++++++++++++++++++--
source3/lib/messages_dgm.h | 7 +-
source3/lib/messages_dgm_ref.c | 42 +-
source3/lib/messages_dgm_ref.h | 3 +-
source3/lib/pthreadpool/pthreadpool.c | 199 ++---
source3/lib/pthreadpool/pthreadpool.h | 9 +-
source3/lib/pthreadpool/pthreadpool_pipe.c | 28 +-
source3/lib/pthreadpool/pthreadpool_tevent.c | 39 +-
source3/lib/pthreadpool/tests.c | 302 +++----
source3/lib/unix_msg/test_drain.c | 83 --
source3/lib/unix_msg/test_source.c | 93 ---
source3/lib/unix_msg/tests.c | 271 -------
source3/lib/unix_msg/unix_msg.c | 1094 --------------------------
source3/lib/unix_msg/unix_msg.h | 121 ---
source3/lib/unix_msg/wscript_build | 18 -
source3/wscript_build | 6 +-
source4/lib/messaging/messaging.c | 75 +-
source4/lib/messaging/tests/messaging.c | 76 ++
wscript_build | 1 -
31 files changed, 1655 insertions(+), 3050 deletions(-)
delete mode 100644 lib/poll_funcs/poll_funcs.h
delete mode 100644 lib/poll_funcs/poll_funcs_tevent.c
delete mode 100644 lib/poll_funcs/poll_funcs_tevent.h
delete mode 100644 lib/poll_funcs/wscript_build
delete mode 100644 source3/lib/unix_msg/test_drain.c
delete mode 100644 source3/lib/unix_msg/test_source.c
delete mode 100644 source3/lib/unix_msg/tests.c
delete mode 100644 source3/lib/unix_msg/unix_msg.c
delete mode 100644 source3/lib/unix_msg/unix_msg.h
delete mode 100644 source3/lib/unix_msg/wscript_build
Changeset truncated at 500 lines:
diff --git a/lib/poll_funcs/poll_funcs.h b/lib/poll_funcs/poll_funcs.h
deleted file mode 100644
index b16f07f..0000000
--- a/lib/poll_funcs/poll_funcs.h
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * Unix SMB/CIFS implementation.
- * Copyright (C) Volker Lendecke 2013
- *
- * 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
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-/**
- * @file poll_funcs.h
- *
- * @brief event loop abstraction
- */
-
-/*
- * This is inspired by AvahiWatch, the avahi event loop abstraction.
- */
-
-#ifndef __POLL_FUNCS_H__
-#define __POLL_FUNCS_H__
-
-#include "replace.h"
-
-/**
- * poll_watch and poll_timeout are undefined here, every implementation can
- * implement its own structures.
- */
-
-struct poll_watch;
-struct poll_timeout;
-
-struct poll_funcs {
-
- /**
- * @brief Create a new file descriptor watch
- *
- * @param[in] funcs The callback array
- * @param[in] fd The fd to watch
- * @param[in] events POLLIN and POLLOUT or'ed together
- * @param[in] callback Function to call by the implementation
- * @param[in] private_data Pointer to give back to callback
- *
- * @return A new poll_watch struct
- */
-
- struct poll_watch *(*watch_new)(
- const struct poll_funcs *funcs, int fd, short events,
- void (*callback)(struct poll_watch *w, int fd,
- short events, void *private_data),
- void *private_data);
-
- /**
- * @brief Change the watched events for a struct poll_watch
- *
- * @param[in] w The poll_watch to change
- * @param[in] events new POLLIN and POLLOUT or'ed together
- */
-
- void (*watch_update)(struct poll_watch *w, short events);
-
- /**
- * @brief Read events currently watched
- *
- * @param[in] w The poll_watch to inspect
- *
- * @returns The events currently watched
- */
-
- short (*watch_get_events)(struct poll_watch *w);
-
- /**
- * @brief Free a struct poll_watch
- *
- * @param[in] w The poll_watch struct to free
- */
-
- void (*watch_free)(struct poll_watch *w);
-
-
- /**
- * @brief Create a new timeout watch
- *
- * @param[in] funcs The callback array
- * @param[in] tv The time when the timeout should trigger
- * @param[in] callback Function to call at time "tv"
- * @param[in] private_data Pointer to give back to callback
- *
- * @return A new poll_timeout struct
- */
-
- struct poll_timeout *(*timeout_new)(
- const struct poll_funcs *funcs, const struct timeval tv,
- void (*callback)(struct poll_timeout *t, void *private_data),
- void *private_data);
-
- /**
- * @brief Change the timeout of a watch
- *
- * @param[in] t The timeout watch to change
- * @param[in] tv The new trigger time
- */
-
- void (*timeout_update)(struct poll_timeout *t,
- const struct timeval tv);
-
- /**
- * @brief Free a poll_timeout
- *
- * @param[in] t The poll_timeout to free
- */
-
- void (*timeout_free)(struct poll_timeout *t);
-
- /**
- * @brief private data for use by the implementation
- */
-
- void *private_data;
-};
-
-#endif
diff --git a/lib/poll_funcs/poll_funcs_tevent.c b/lib/poll_funcs/poll_funcs_tevent.c
deleted file mode 100644
index 4dd09a2..0000000
--- a/lib/poll_funcs/poll_funcs_tevent.c
+++ /dev/null
@@ -1,684 +0,0 @@
-/*
- * Unix SMB/CIFS implementation.
- * Copyright (C) Volker Lendecke 2013,2014
- *
- * 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
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include "poll_funcs_tevent.h"
-#include "tevent.h"
-#include "system/select.h"
-#include "lib/util/dlinklist.h"
-
-/*
- * A poll_watch is asked for by the engine using this library via
- * funcs->watch_new(). It represents interest in "fd" becoming readable or
- * writable.
- */
-
-struct poll_watch {
- struct poll_funcs_state *state;
- size_t slot; /* index into state->watches[] */
- int fd;
- int events;
- void (*callback)(struct poll_watch *w, int fd, short events,
- void *private_data);
- void *private_data;
-};
-
-struct poll_timeout {
- struct poll_funcs_state *state;
- size_t slot; /* index into state->timeouts[] */
- struct timeval tv;
- void (*callback)(struct poll_timeout *t, void *private_data);
- void *private_data;
-};
-
-struct poll_funcs_state {
- /*
- * "watches" is the array of all watches that we have handed out via
- * funcs->watch_new(). The "watches" array can contain NULL pointers.
- */
- struct poll_watch **watches;
-
- /*
- * Like "watches" for timeouts;
- */
- struct poll_timeout **timeouts;
-
- /*
- * "contexts is the array of tevent_contexts that serve
- * "watches". "contexts" can contain NULL pointers.
- */
- struct poll_funcs_tevent_context **contexts;
-};
-
-struct poll_funcs_tevent_context {
- struct poll_funcs_tevent_handle *handles;
- struct poll_funcs_state *state;
- unsigned slot; /* index into state->contexts[] */
- struct tevent_context *ev;
- struct tevent_fd **fdes; /* same indexes as state->watches[] */
- struct tevent_timer **timers; /* same indexes as state->timeouts[] */
-};
-
-/*
- * poll_funcs_tevent_register() hands out a struct poll_funcs_tevent_handle as
- * a void *. poll_funcs_tevent_register allows tevent_contexts to be
- * registered multiple times, and we can't add a tevent_fd for the same fd's
- * multiple times. So we have to share one poll_funcs_tevent_context.
- */
-struct poll_funcs_tevent_handle {
- struct poll_funcs_tevent_handle *prev, *next;
- struct poll_funcs_tevent_context *ctx;
-};
-
-static uint16_t poll_events_to_tevent(short events)
-{
- uint16_t ret = 0;
-
- if (events & POLLIN) {
- ret |= TEVENT_FD_READ;
- }
- if (events & POLLOUT) {
- ret |= TEVENT_FD_WRITE;
- }
- return ret;
-}
-
-static short tevent_to_poll_events(uint16_t flags)
-{
- short ret = 0;
-
- if (flags & TEVENT_FD_READ) {
- ret |= POLLIN;
- }
- if (flags & TEVENT_FD_WRITE) {
- ret |= POLLOUT;
- }
- return ret;
-}
-
-/*
- * Find or create a free slot in state->watches[]
- */
-static bool poll_funcs_watch_find_slot(struct poll_funcs_state *state,
- size_t *slot)
-{
- struct poll_watch **watches;
- size_t i, num_watches, num_contexts;
-
- num_watches = talloc_array_length(state->watches);
-
- for (i=0; i<num_watches; i++) {
- if (state->watches[i] == NULL) {
- *slot = i;
- return true;
- }
- }
-
- watches = talloc_realloc(state, state->watches, struct poll_watch *,
- num_watches + 1);
- if (watches == NULL) {
- return false;
- }
- watches[num_watches] = NULL;
- state->watches = watches;
-
- num_contexts = talloc_array_length(state->contexts);
-
- for (i=0; i<num_contexts; i++) {
- struct tevent_fd **fdes;
- struct poll_funcs_tevent_context *c = state->contexts[i];
- if (c == NULL) {
- continue;
- }
- fdes = talloc_realloc(c, c->fdes, struct tevent_fd *,
- num_watches + 1);
- if (fdes == NULL) {
- state->watches = talloc_realloc(
- state, state->watches, struct poll_watch *,
- num_watches);
- return false;
- }
- c->fdes = fdes;
-
- fdes[num_watches] = NULL;
- }
-
- *slot = num_watches;
-
- return true;
-}
-
-static void poll_funcs_fde_handler(struct tevent_context *ev,
- struct tevent_fd *fde, uint16_t flags,
- void *private_data);
-static int poll_watch_destructor(struct poll_watch *w);
-
-static struct poll_watch *tevent_watch_new(
- const struct poll_funcs *funcs, int fd, short events,
- void (*callback)(struct poll_watch *w, int fd, short events,
- void *private_data),
- void *private_data)
-{
- struct poll_funcs_state *state = talloc_get_type_abort(
- funcs->private_data, struct poll_funcs_state);
- struct poll_watch *w;
- size_t i, slot, num_contexts;
-
- if (!poll_funcs_watch_find_slot(state, &slot)) {
- return NULL;
- }
-
- w = talloc(state->watches, struct poll_watch);
- if (w == NULL) {
- return NULL;
- }
- w->state = state;
- w->slot = slot;
- w->fd = fd;
- w->events = poll_events_to_tevent(events);
- w->fd = fd;
- w->callback = callback;
- w->private_data = private_data;
- state->watches[slot] = w;
-
- talloc_set_destructor(w, poll_watch_destructor);
-
- num_contexts = talloc_array_length(state->contexts);
-
- for (i=0; i<num_contexts; i++) {
- struct poll_funcs_tevent_context *c = state->contexts[i];
- if (c == NULL) {
- continue;
- }
- c->fdes[slot] = tevent_add_fd(c->ev, c->fdes, w->fd, w->events,
- poll_funcs_fde_handler, w);
- if (c->fdes[slot] == NULL) {
- goto fail;
- }
- }
- return w;
-
-fail:
- TALLOC_FREE(w);
- return NULL;
-}
-
-static int poll_watch_destructor(struct poll_watch *w)
-{
- struct poll_funcs_state *state = w->state;
- size_t num_contexts = talloc_array_length(state->contexts);
- size_t slot = w->slot;
- size_t i;
-
- TALLOC_FREE(state->watches[slot]);
-
- for (i=0; i<num_contexts; i++) {
- struct poll_funcs_tevent_context *c = state->contexts[i];
- if (c == NULL) {
- continue;
- }
- TALLOC_FREE(c->fdes[slot]);
- }
-
- return 0;
-}
-
-static void tevent_watch_update(struct poll_watch *w, short events)
-{
- struct poll_funcs_state *state = w->state;
- size_t num_contexts = talloc_array_length(state->contexts);
- size_t slot = w->slot;
- size_t i;
-
- w->events = poll_events_to_tevent(events);
-
- for (i=0; i<num_contexts; i++) {
- struct poll_funcs_tevent_context *c = state->contexts[i];
- if (c == NULL) {
- continue;
- }
- tevent_fd_set_flags(c->fdes[slot], w->events);
- }
-}
-
-static short tevent_watch_get_events(struct poll_watch *w)
-{
- return tevent_to_poll_events(w->events);
-}
-
-static void tevent_watch_free(struct poll_watch *w)
-{
- TALLOC_FREE(w);
-}
-
-static bool poll_funcs_timeout_find_slot(struct poll_funcs_state *state,
- size_t *slot)
-{
- struct poll_timeout **timeouts;
- size_t i, num_timeouts, num_contexts;
-
- num_timeouts = talloc_array_length(state->timeouts);
-
- for (i=0; i<num_timeouts; i++) {
- if (state->timeouts[i] == NULL) {
- *slot = i;
- return true;
- }
- }
-
- timeouts = talloc_realloc(state, state->timeouts,
- struct poll_timeout *,
- num_timeouts + 1);
- if (timeouts == NULL) {
- return false;
- }
- timeouts[num_timeouts] = NULL;
- state->timeouts = timeouts;
-
- num_contexts = talloc_array_length(state->contexts);
-
- for (i=0; i<num_contexts; i++) {
- struct tevent_timer **timers;
- struct poll_funcs_tevent_context *c = state->contexts[i];
- if (c == NULL) {
- continue;
- }
- timers = talloc_realloc(c, c->timers, struct tevent_timer *,
- num_timeouts + 1);
- if (timers == NULL) {
- state->timeouts = talloc_realloc(
- state, state->timeouts, struct poll_timeout *,
- num_timeouts);
- return false;
- }
- c->timers = timers;
-
- timers[num_timeouts] = NULL;
- }
-
- *slot = num_timeouts;
-
- return true;
-}
-
-static void poll_funcs_timer_handler(struct tevent_context *ev,
- struct tevent_timer *te,
- struct timeval current_time,
- void *private_data);
-static int poll_timeout_destructor(struct poll_timeout *t);
-
-static struct poll_timeout *tevent_timeout_new(
- const struct poll_funcs *funcs, const struct timeval tv,
- void (*callback)(struct poll_timeout *t, void *private_data),
- void *private_data)
-{
- struct poll_funcs_state *state = talloc_get_type_abort(
- funcs->private_data, struct poll_funcs_state);
- struct poll_timeout *t;
- size_t i, slot, num_contexts;
-
- if (!poll_funcs_timeout_find_slot(state, &slot)) {
- return NULL;
- }
-
- t = talloc(state->timeouts, struct poll_timeout);
- if (t == NULL) {
- return NULL;
- }
- t->state = state;
- t->slot = slot;
- t->tv = tv;
- t->callback = callback;
- t->private_data = private_data;
-
- talloc_set_destructor(t, poll_timeout_destructor);
-
- num_contexts = talloc_array_length(state->contexts);
-
- for (i=0; i<num_contexts; i++) {
- struct poll_funcs_tevent_context *c = state->contexts[i];
- if (c == NULL) {
- continue;
- }
- c->timers[slot] = tevent_add_timer(
--
Samba Shared Repository
More information about the samba-cvs
mailing list