The branch, v4-6-test has been updated via c5d7a7d s4: torture: kernel oplocks. Add smb2.kernel-oplocks.kernel_oplocks8 via c64f58e s3: smbd: kernel oplocks. Replace retry_open() with setup_kernel_oplock_poll_open(). via 8e338d8 selftest: Also run smbtorture smb2.compound with aio enabled via 8212d13 torture: Add testcase for compound CREATE-WRITE-CLOSE request via d005547 smbd/aio: Do not go async for SMB2 compound requests via 13da33f smbd: Move check for SMB2 compound request to new function via 13e0f78 python: use communicate to fix Popen deadlock via 2514616 blackbox tests: method to check specific exit codes via 339f19a tevent: version 0.9.34 via 5cb686d tevent: Fix a race condition via 148ab67 lib: tevent: Remove select backend. via 61819d6 tevent: version 0.9.33 via bd4ced8 tevent: handle passing req = NULL to tevent_req_print() via 4cc205c tevent: avoid calling talloc_get_name(NULL) in tevent_req_default_print() via 3bafcb5 tevent: version 0.9.32 via c2159d1 tevent: include the finish location in tevent_req_default_print() via 82572f0 tevent: Simplify create_immediate via 9abf13e tevent_threads: Fix a rundown race introduced with 1828011317b via dd516b9 tevent: Fix a race condition in tevent context rundown via 5a6d5c4 tevent: Fix a memleak on FreeBSD via 1375ed8 tevent: Add tevent_re_initialise to threaded test via 83c8bb7 tevent: Re-init threading in tevent_re_initialise via 1ea66fb tevent: Factor out context initialization via 03b43ed tevent: Fix a typo via d4f07b4 Revert "tevent: Fix a race condition" from 6a43b1b tevent: Fix a race condition
https://git.samba.org/?p=samba.git;a=shortlog;h=v4-6-test - Log ----------------------------------------------------------------- commit c5d7a7d8af3797bda2d505c952336eda0e7fc35f Author: Jeremy Allison <j...@samba.org> Date: Thu Nov 9 09:59:23 2017 -0800 s4: torture: kernel oplocks. Add smb2.kernel-oplocks.kernel_oplocks8 Test if the server blocks whilst waiting on a kernel lease held by a non-smbd process. BUG: https://bugzilla.samba.org/show_bug.cgi?id=13121 Signed-off-by: Jeremy Allison <j...@samba.org> Reviewed-by: Ralph Boehme <s...@samba.org> Autobuild-User(master): Ralph Böhme <s...@samba.org> Autobuild-Date(master): Sat Nov 11 20:12:26 CET 2017 on sn-devel-144 (cherry picked from commit ad82557e1355107920ae80fd6a0df0f16d1bdb6c) Autobuild-User(v4-6-test): Karolin Seeger <ksee...@samba.org> Autobuild-Date(v4-6-test): Tue Nov 14 16:39:11 CET 2017 on sn-devel-144 commit c64f58eda991c7d8fa16a0d921682b8e35717d66 Author: Jeremy Allison <j...@samba.org> Date: Thu Nov 9 12:48:15 2017 -0800 s3: smbd: kernel oplocks. Replace retry_open() with setup_kernel_oplock_poll_open(). If a O_NONBLOCK open fails with EWOULDBLOCK, this code changes smbd to do a retry open every second, until either the timeout or we get a successful open. If we're opening a file that has a kernel lease set by a non-smbd process, this is the best we can do. Prior to this, smbd would block on the second open on such a leased file (not using O_NONBLOCK) which freezes active clients. Regression test to follow. BUG: https://bugzilla.samba.org/show_bug.cgi?id=13121 Signed-off-by: Jeremy Allison <j...@samba.org> Reviewed-by: Ralph Boehme <s...@samba.org> (cherry picked from commit 47c13fc10a2c9709e9511b2ffcf0e1004497887d) commit 8e338d8795346b1a06ff8e2365bd4df1cd693ce4 Author: Christof Schmitt <c...@samba.org> Date: Wed Sep 20 16:13:38 2017 -0700 selftest: Also run smbtorture smb2.compound with aio enabled BUG: https://bugzilla.samba.org/show_bug.cgi?id=13047 Signed-off-by: Christof Schmitt <c...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> Autobuild-User(master): Jeremy Allison <j...@samba.org> Autobuild-Date(master): Fri Sep 22 09:49:30 CEST 2017 on sn-devel-144 (backported from commit 3a360f552d6641952931d3aa8a9ce85a648de3e1) commit 8212d1356e7d87f8f4a27a2c0b28b58f281c6b8a Author: Christof Schmitt <c...@samba.org> Date: Wed Sep 20 16:07:50 2017 -0700 torture: Add testcase for compound CREATE-WRITE-CLOSE request BUG: https://bugzilla.samba.org/show_bug.cgi?id=13047 Signed-off-by: Christof Schmitt <c...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> (cherry picked from commit 508aebf40abe83b6319700260c405ada0566a46b) commit d0055479b34384fc6e2f10fee7ff036a44b2864d Author: Christof Schmitt <c...@samba.org> Date: Thu Sep 21 12:08:01 2017 -0700 smbd/aio: Do not go async for SMB2 compound requests BUG: https://bugzilla.samba.org/show_bug.cgi?id=13047 Signed-off-by: Christof Schmitt <c...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> (cherry picked from commit a2b081e159403e10295a1bc089b48e816ce698b9) commit 13da33f236048ab6aa63d266819e3a4373e7b43d Author: Christof Schmitt <c...@samba.org> Date: Thu Sep 21 17:41:25 2017 -0700 smbd: Move check for SMB2 compound request to new function BUG: https://bugzilla.samba.org/show_bug.cgi?id=13047 Signed-off-by: Christof Schmitt <c...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> (cherry picked from commit cfa2c3083080016a1288474b8879039db4dbf6b1) commit 13e0f78798ee989f8cb8063a85a6d340aba1a0ec Author: Joe Guo <j...@catalyst.net.nz> Date: Fri Sep 15 16:13:26 2017 +1200 python: use communicate to fix Popen deadlock `Popen.wait()` will deadlock when using stdout=PIPE and/or stderr=PIPE and the child process generates large output to a pipe such that it blocks waiting for the OS pipe buffer to accept more data. Use communicate() to avoid that. Signed-off-by: Joe Guo <j...@catalyst.net.nz> Reviewed-by: Douglas Bagnall <douglas.bagn...@catalyst.net.nz> Reviewed-by: Andrew Bartlett <abart...@samba.org> Autobuild-User(master): Andrew Bartlett <abart...@samba.org> Autobuild-Date(master): Thu Oct 19 09:27:16 CEST 2017 on sn-devel-144 BUG: https://bugzilla.samba.org/show_bug.cgi?id=13127 (cherry picked from commit 5dc773a5b00834c7a53130a73a48f49048bd55e8) commit 2514616309d3a999e225ce7c46a2d0a6cbbccb43 Author: Gary Lockyer <g...@catalyst.net.nz> Date: Wed Aug 16 13:52:25 2017 +1200 blackbox tests: method to check specific exit codes Signed-off-by: Gary Lockyer <g...@catalyst.net.nz> Reviewed-by: Douglas Bagnall <douglas.bagn...@catalyst.net.nz> Reviewed-by: Garming Sam <garm...@catalyst.net.nz> (cherry picked from commit 74ebcf6dfc84b6aab6838fa99e12808eb6b913d9) BUG: https://bugzilla.samba.org/show_bug.cgi?id=13127 commit 339f19a2233115741174eb29b96d252579ab7226 Author: Stefan Metzmacher <me...@samba.org> Date: Mon Nov 13 11:05:04 2017 +0100 tevent: version 0.9.34 * Remove unused select backend * Fix a race condition in tevent_threaded_schedule_immediate() (bug #13130) Signed-off-by: Stefan Metzmacher <me...@samba.org> Autobuild-User(master): Stefan Metzmacher <me...@samba.org> Autobuild-Date(master): Mon Nov 13 18:02:46 CET 2017 on sn-devel-144 (cherry picked from commit 2e573eead96b2e98dd8a15c9c8e470679e530392) commit 5cb686dd30d511dc2add9d38983ebe3ce42ba890 Author: Volker Lendecke <v...@samba.org> Date: Fri Nov 10 21:22:26 2017 +0100 tevent: Fix a race condition We can't rely on tctx to exist after we unlocked the mutex. It took a while, but this does lead to data corruption. If *tctx is replaced with something where tctx->wakeup_fd points to a real, existing file descriptor, we're screwed. And by screwed, this means file corruption on disk. Again. I am not tall enough for this business. http://bholley.net/blog/2015/must-be-this-tall-to-write-multi-threaded-code.html BUG: https://bugzilla.samba.org/show_bug.cgi?id=13130 Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> Autobuild-User(master): Jeremy Allison <j...@samba.org> Autobuild-Date(master): Sat Nov 11 03:20:09 CET 2017 on sn-devel-144 (cherry picked from commit 20cfcb7dbc5dd099384b76a76e3d35cf627100b6) Autobuild-User(v4-7-test): Karolin Seeger <ksee...@samba.org> Autobuild-Date(v4-7-test): Mon Nov 13 13:54:56 CET 2017 on sn-devel-144 (cherry picked from commit 5ec68b2e44e5c0c4e6fae362c7e36ad99124faa8) commit 148ab679e473adee407c187a3dd50eebec2c4486 Author: Jeremy Allison <j...@samba.org> Date: Tue Sep 12 12:08:38 2017 -0700 lib: tevent: Remove select backend. select() is no longer useful on modern systems. Signed-off-by: Jeremy Allison <j...@samba.org> Reviewed-by: Volker Lendecke <v...@samba.org> Autobuild-User(master): Volker Lendecke <v...@samba.org> Autobuild-Date(master): Sat Sep 16 08:35:39 CEST 2017 on sn-devel-144 (cherry picked from commit 2a003b1a576dcbbba0d60bae90427776a5c27867) commit 61819d6921e14c2a26d16274ef78b91bfec5b6ac Author: Stefan Metzmacher <me...@samba.org> Date: Fri Jul 21 14:34:59 2017 +0200 tevent: version 0.9.33 * make tevent_req_print() more robust against crashes Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> (cherry picked from commit 7ad3a99d462e4a43c9f64b0877111d5e58f56e6e) Autobuild-User(v4-7-test): Stefan Metzmacher <me...@samba.org> Autobuild-Date(v4-7-test): Sun Jul 23 14:41:25 CEST 2017 on sn-devel-144 (cherry picked from commit 892c3aaeb683f2ed51a60ac49fc2c2ea4dede6e8) commit bd4ced86101d32f030a433f77fe7bf264253e5f0 Author: Stefan Metzmacher <me...@samba.org> Date: Thu Jul 20 14:20:03 2017 +0200 tevent: handle passing req = NULL to tevent_req_print() Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> (cherry picked from commit ca3e98488a45aa143e4ba454b4ba8763f09a6f50) (cherry picked from commit ce417f5ceec42a70ab651bc3a0dc2ab29cb7efd2) commit 4cc205ca62389bb63e8953c2791065793b3462d6 Author: Stefan Metzmacher <me...@samba.org> Date: Thu Jul 20 14:16:44 2017 +0200 tevent: avoid calling talloc_get_name(NULL) in tevent_req_default_print() We have the same information available under req->internal.private_type. This way it's possible to call tevent_req_print() after tevent_req_received() was called. Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> (cherry picked from commit 21b56ffd983cc0b982bea55866bfa84c79133503) (cherry picked from commit 3d87c0660eba61ac4b02e43798aa82ee9e64b454) commit 3bafcb51a89ceeb76383868e4d96e92302162ef8 Author: Stefan Metzmacher <me...@samba.org> Date: Tue Jun 20 12:17:32 2017 +0200 tevent: version 0.9.32 * Fix mutex locking in tevent_threaded_context_destructor(). * Fix a memleak on FreeBSD. * Re-init threading in tevent_re_initialise(). * Include the finish location in tevent_req_default_print(). Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Volker Lendecke <v...@samba.org> Autobuild-User(master): Stefan Metzmacher <me...@samba.org> Autobuild-Date(master): Thu Jun 22 17:17:33 CEST 2017 on sn-devel-144 (cherry picked from commit e9b4978a764839a142d9f7c166db436bdabea82c) commit c2159d136900b77c46a28b941f2ab69fb1b9145c Author: Stefan Metzmacher <me...@samba.org> Date: Wed Jun 14 16:59:10 2017 +0200 tevent: include the finish location in tevent_req_default_print() It's verify useful when debugging code without a debugger to be able to use tevent_req_print() in DEBUG statements. Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Volker Lendecke <v...@samba.org> (cherry picked from commit d7f649b7044a5579d321cc1cfa7893a8221f6412) commit 82572f061796eecdbd3b2a3efdaaaff6e7a42eac Author: Volker Lendecke <v...@samba.org> Date: Sat Jun 17 21:26:27 2017 +0200 tevent: Simplify create_immediate Not much change, just 9 lines less of code. Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> (cherry picked from commit a7504f555eff101a10ded653ceac98d8294c1659) commit 9abf13e7e421ca1d44cce9866ad328dc1c35997d Author: Volker Lendecke <v...@samba.org> Date: Thu Jun 15 11:48:24 2017 +0200 tevent_threads: Fix a rundown race introduced with 1828011317b The race is easily reproduced by adding a poll(NULL,0,10) in between the two pthread_mutex_unlock calls in _tevent_threaded_schedule_immediate. Before 1828011317b, the main thread was signalled only after the helper had already unlocked event_ctx_mutex. Full explaination follows: ----------------------------------------------------------------- Inside _tevent_threaded_schedule_immediate() we have: 476 ret = pthread_mutex_unlock(&ev->scheduled_mutex); 477 if (ret != 0) { 478 abort(); 479 } HERE!!!! 481 ret = pthread_mutex_unlock(&tctx->event_ctx_mutex); 482 if (ret != 0) { 483 abort(); 484 } At the HERE!!! point, what happens is tevent_common_threaded_activate_immediate(), which is blocked on ev->scheduled_mutex, get released and does: 514 while (ev->scheduled_immediates != NULL) { 515 struct tevent_immediate *im = ev->scheduled_immediates; 516 DLIST_REMOVE(ev->scheduled_immediates, im); 517 DLIST_ADD_END(ev->immediate_events, im); 518 } - making an immediate event ready to be scheduled. This then returns into epoll_event_loop_once(), which then calls: 910 if (ev->immediate_events && 911 tevent_common_loop_immediate(ev)) { 912 return 0; 913 } which causes the immediate event to fire. This immediate event is the pthread job terminate event, which was previously set up in pthreadpool_tevent_job_signal() by: 198 if (state->tctx != NULL) { 199 /* with HAVE_PTHREAD */ 200 tevent_threaded_schedule_immediate(state->tctx, state->im, 201 pthreadpool_tevent_job_done, 202 state); So we now call pthreadpool_tevent_job_done() - which does: 225 TALLOC_FREE(state->tctx); calling tevent_threaded_context_destructor(): 384 ret = pthread_mutex_destroy(&tctx->event_ctx_mutex); <---------------- BOOM returns an error ! 385 if (ret != 0) { 386 abort(); 387 } as we haven't gotten to line 481 above (the line after HERE!!!!) so the tctx->event_ctx_mutex is still locked when we try to destroy it. So doing an additional: ret = pthread_mutex_lock(&tctx->event_ctx_mutex); ret = pthread_mutex_unlock(&tctx->event_ctx_mutex); (error checking elided) forces tevent_threaded_context_destructor() to wait until tctx->event_ctx_mutex is unlocked before it locks/unlocks and then is guaranteed safe to destroy. Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> Reviewed-by: Stefan Metzmacher <me...@samba.org> (cherry picked from commit 1fe7ec237a7036d76764ef1981de6b3000b2cfd3) commit dd516b9bafe1792d66b4a3fe9ea75f9627ba4290 Author: Volker Lendecke <v...@samba.org> Date: Wed May 24 16:22:34 2017 +0200 tevent: Fix a race condition in tevent context rundown We protect setting tctx->event_ctx=NULL with tctx->event_ctx_mutex. But in _tevent_threaded_schedule_immediate we have the classic TOCTOU race: After we checked "ev==NULL", looking at tevent_common_context_destructor the event context can go after _tevent_threaded_schedule_immediate checked. We need to serialize things a bit by keeping tctx->event_ctx_mutex locked while we reference "ev", in particular in the DLIST_ADD_END(ev->scheduled_immediates,im); I think the locking hierarchy is still maintained, tevent_atfork_prepare() first locks all the tctx locks, and then the scheduled_mutex. Also, I don't think this will impact parallelism too badly: event_ctx_mutex is only used to protect setting tctx->ev. Found by staring at code while fixing the FreeBSD memleak due to not destroying scheduled_mutex. Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> Autobuild-User(master): Jeremy Allison <j...@samba.org> Autobuild-Date(master): Fri Jun 9 00:45:26 CEST 2017 on sn-devel-144 (cherry picked from commit 1828011317b0a8142c3b66fff22661a962760574) commit 5a6d5c44ed0a90fbc49e5848310fa6af794f63db Author: Volker Lendecke <v...@samba.org> Date: Wed May 24 16:21:40 2017 +0200 tevent: Fix a memleak on FreeBSD FreeBSD has malloc'ed memory attached to mutexes. We need to clean this up. valgrind really helped here Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> (cherry picked from commit 00390ae27b6bd207add571d7975c37951e15a3e5) commit 1375ed8b1cf94f0d5e9d8d08d4c42b67a9914395 Author: Volker Lendecke <v...@samba.org> Date: Mon Jun 5 07:29:11 2017 +0200 tevent: Add tevent_re_initialise to threaded test Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> (cherry picked from commit ca715762418284a1a2acc81d40e9e429e407ce14) commit 83c8bb78e52f9025c7efcf41ad99d5ac85fd2076 Author: Volker Lendecke <v...@samba.org> Date: Mon Jun 5 07:16:17 2017 +0200 tevent: Re-init threading in tevent_re_initialise Without this threading is not usable after that call Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> (cherry picked from commit afe026d3030c0c05a31de872dd0d120511ba6652) commit 1ea66fbbb4688352617edff2f2319fc5cfaa455b Author: Volker Lendecke <v...@samba.org> Date: Mon Jun 5 06:58:37 2017 +0200 tevent: Factor out context initialization Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> (cherry picked from commit 97d912d99afb115e17f683a55aef447dc92ced49) commit 03b43ed40e784c69e087c26bf40b71176aab783a Author: Volker Lendecke <v...@samba.org> Date: Mon Jun 5 07:23:27 2017 +0200 tevent: Fix a typo Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> (cherry picked from commit b03475048a49db78422d1bfc11f2c69d56fbf87f) commit d4f07b4e2289ace7f5a548d143f59c532dfc31cc Author: Stefan Metzmacher <me...@samba.org> Date: Mon Nov 13 23:29:42 2017 +0100 Revert "tevent: Fix a race condition" This reverts commit 6a43b1b17902c8fbc319e13f31f6c9177f38371c. This will reapplied shortly in the correct order relative to other backports. Signed-off-by: Stefan Metzmacher <me...@samba.org> ----------------------------------------------------------------------- Summary of changes: .../ABI/{tevent-0.9.31.sigs => tevent-0.9.32.sigs} | 0 .../ABI/{tevent-0.9.31.sigs => tevent-0.9.33.sigs} | 0 .../ABI/{tevent-0.9.31.sigs => tevent-0.9.34.sigs} | 0 lib/tevent/testsuite.c | 8 + lib/tevent/tevent.c | 78 +++--- lib/tevent/tevent.h | 2 +- lib/tevent/tevent_internal.h | 1 - lib/tevent/tevent_req.c | 11 +- lib/tevent/tevent_select.c | 280 --------------------- lib/tevent/tevent_threads.c | 34 ++- lib/tevent/wscript | 4 +- python/samba/tests/__init__.py | 25 +- selftest/knownfail | 1 + source3/selftest/tests.py | 8 +- source3/smbd/aio.c | 8 + source3/smbd/globals.h | 1 + source3/smbd/open.c | 96 ++++--- source3/smbd/smb2_read.c | 2 +- source3/smbd/smb2_server.c | 5 + source3/torture/torture.c | 10 +- source4/torture/smb2/compound.c | 73 ++++++ source4/torture/smb2/oplock.c | 236 +++++++++++++++++ 22 files changed, 511 insertions(+), 372 deletions(-) copy lib/tevent/ABI/{tevent-0.9.31.sigs => tevent-0.9.32.sigs} (100%) copy lib/tevent/ABI/{tevent-0.9.31.sigs => tevent-0.9.33.sigs} (100%) copy lib/tevent/ABI/{tevent-0.9.31.sigs => tevent-0.9.34.sigs} (100%) delete mode 100644 lib/tevent/tevent_select.c Changeset truncated at 500 lines: diff --git a/lib/tevent/ABI/tevent-0.9.31.sigs b/lib/tevent/ABI/tevent-0.9.32.sigs similarity index 100% copy from lib/tevent/ABI/tevent-0.9.31.sigs copy to lib/tevent/ABI/tevent-0.9.32.sigs diff --git a/lib/tevent/ABI/tevent-0.9.31.sigs b/lib/tevent/ABI/tevent-0.9.33.sigs similarity index 100% copy from lib/tevent/ABI/tevent-0.9.31.sigs copy to lib/tevent/ABI/tevent-0.9.33.sigs diff --git a/lib/tevent/ABI/tevent-0.9.31.sigs b/lib/tevent/ABI/tevent-0.9.34.sigs similarity index 100% copy from lib/tevent/ABI/tevent-0.9.31.sigs copy to lib/tevent/ABI/tevent-0.9.34.sigs diff --git a/lib/tevent/testsuite.c b/lib/tevent/testsuite.c index 4783ab4..ee29e5b 100644 --- a/lib/tevent/testsuite.c +++ b/lib/tevent/testsuite.c @@ -1207,6 +1207,14 @@ static bool test_multi_tevent_threaded_2(struct torture_context *test, ev = tevent_context_init(test); torture_assert(test, ev != NULL, "tevent_context_init failed"); + /* + * tevent_re_initialise used to have a bug where it did not + * re-initialise the thread support after taking it + * down. Excercise that code path. + */ + ret = tevent_re_initialise(ev); + torture_assert(test, ret == 0, "tevent_re_initialise failed"); + tctx = tevent_threaded_context_create(ev, ev); torture_assert(test, tctx != NULL, "tevent_threaded_context_create failed"); diff --git a/lib/tevent/tevent.c b/lib/tevent/tevent.c index 65b101f..a2d2003 100644 --- a/lib/tevent/tevent.c +++ b/lib/tevent/tevent.c @@ -128,7 +128,6 @@ static void tevent_backend_init(void) done = true; - tevent_select_init(); tevent_poll_init(); tevent_poll_mt_init(); #if defined(HAVE_EPOLL) @@ -341,6 +340,11 @@ int tevent_common_context_destructor(struct tevent_context *ev) DLIST_REMOVE(ev->threaded_contexts, tctx); } + + ret = pthread_mutex_destroy(&ev->scheduled_mutex); + if (ret != 0) { + abort(); + } #endif tevent_common_wakeup_fini(ev); @@ -392,46 +396,26 @@ int tevent_common_context_destructor(struct tevent_context *ev) return 0; } -/* - create a event_context structure for a specific implemementation. - This must be the first events call, and all subsequent calls pass - this event_context as the first element. Event handlers also - receive this as their first argument. - - This function is for allowing third-party-applications to hook in gluecode - to their own event loop code, so that they can make async usage of our client libs - - NOTE: use tevent_context_init() inside of samba! -*/ -struct tevent_context *tevent_context_init_ops(TALLOC_CTX *mem_ctx, - const struct tevent_ops *ops, - void *additional_data) +static int tevent_common_context_constructor(struct tevent_context *ev) { - struct tevent_context *ev; int ret; - ev = talloc_zero(mem_ctx, struct tevent_context); - if (!ev) return NULL; - #ifdef HAVE_PTHREAD ret = pthread_once(&tevent_atfork_initialized, tevent_prep_atfork); if (ret != 0) { - talloc_free(ev); - return NULL; + return ret; } ret = pthread_mutex_init(&ev->scheduled_mutex, NULL); if (ret != 0) { - talloc_free(ev); - return NULL; + return ret; } ret = pthread_mutex_lock(&tevent_contexts_mutex); if (ret != 0) { pthread_mutex_destroy(&ev->scheduled_mutex); - talloc_free(ev); - return NULL; + return ret; } DLIST_ADD(tevent_contexts, ev); @@ -440,11 +424,40 @@ struct tevent_context *tevent_context_init_ops(TALLOC_CTX *mem_ctx, if (ret != 0) { abort(); } - #endif talloc_set_destructor(ev, tevent_common_context_destructor); + return 0; +} + +/* + create a event_context structure for a specific implemementation. + This must be the first events call, and all subsequent calls pass + this event_context as the first element. Event handlers also + receive this as their first argument. + + This function is for allowing third-party-applications to hook in gluecode + to their own event loop code, so that they can make async usage of our client libs + + NOTE: use tevent_context_init() inside of samba! +*/ +struct tevent_context *tevent_context_init_ops(TALLOC_CTX *mem_ctx, + const struct tevent_ops *ops, + void *additional_data) +{ + struct tevent_context *ev; + int ret; + + ev = talloc_zero(mem_ctx, struct tevent_context); + if (!ev) return NULL; + + ret = tevent_common_context_constructor(ev); + if (ret != 0) { + talloc_free(ev); + return NULL; + } + ev->ops = ops; ev->additional_data = additional_data; @@ -602,16 +615,7 @@ struct tevent_immediate *_tevent_create_immediate(TALLOC_CTX *mem_ctx, im = talloc(mem_ctx, struct tevent_immediate); if (im == NULL) return NULL; - im->prev = NULL; - im->next = NULL; - im->event_ctx = NULL; - im->create_location = location; - im->handler = NULL; - im->private_data = NULL; - im->handler_name = NULL; - im->schedule_location = NULL; - im->cancel_fn = NULL; - im->additional_data = NULL; + *im = (struct tevent_immediate) { .create_location = location }; return im; } @@ -875,6 +879,8 @@ int tevent_re_initialise(struct tevent_context *ev) { tevent_common_context_destructor(ev); + tevent_common_context_constructor(ev); + return ev->ops->context_init(ev); } diff --git a/lib/tevent/tevent.h b/lib/tevent/tevent.h index ba4bb4d..728cf62 100644 --- a/lib/tevent/tevent.h +++ b/lib/tevent/tevent.h @@ -1777,7 +1777,7 @@ void tevent_thread_proxy_schedule(struct tevent_thread_proxy *tp, * * It is the duty of the caller of tevent_threaded_context_create() to * keep the event context around longer than any - * tevent_threaded_context. tevent will abort if ev is talllc_free'ed + * tevent_threaded_context. tevent will abort if ev is talloc_free'ed * with an active tevent_threaded_context. * * If tevent is build without pthread support, this always returns diff --git a/lib/tevent/tevent_internal.h b/lib/tevent/tevent_internal.h index a5f1ebde..47ea39b 100644 --- a/lib/tevent/tevent_internal.h +++ b/lib/tevent/tevent_internal.h @@ -377,7 +377,6 @@ int tevent_common_check_signal(struct tevent_context *ev); void tevent_cleanup_pending_signal_handlers(struct tevent_signal *se); bool tevent_standard_init(void); -bool tevent_select_init(void); bool tevent_poll_init(void); void tevent_poll_event_add_fd_internal(struct tevent_context *ev, struct tevent_fd *fde); diff --git a/lib/tevent/tevent_req.c b/lib/tevent/tevent_req.c index e309c3d..15754d3 100644 --- a/lib/tevent/tevent_req.c +++ b/lib/tevent/tevent_req.c @@ -31,19 +31,24 @@ char *tevent_req_default_print(struct tevent_req *req, TALLOC_CTX *mem_ctx) { return talloc_asprintf(mem_ctx, "tevent_req[%p/%s]: state[%d] error[%lld (0x%llX)] " - " state[%s (%p)] timer[%p]", + " state[%s (%p)] timer[%p] finish[%s]", req, req->internal.create_location, req->internal.state, (unsigned long long)req->internal.error, (unsigned long long)req->internal.error, - talloc_get_name(req->data), + req->internal.private_type, req->data, - req->internal.timer + req->internal.timer, + req->internal.finish_location ); } char *tevent_req_print(TALLOC_CTX *mem_ctx, struct tevent_req *req) { + if (req == NULL) { + return talloc_strdup(mem_ctx, "tevent_req[NULL]"); + } + if (!req->private_print) { return tevent_req_default_print(req, mem_ctx); } diff --git a/lib/tevent/tevent_select.c b/lib/tevent/tevent_select.c deleted file mode 100644 index 55dd0b6..0000000 --- a/lib/tevent/tevent_select.c +++ /dev/null @@ -1,280 +0,0 @@ -/* - Unix SMB/CIFS implementation. - main select loop and event handling - Copyright (C) Andrew Tridgell 2003-2005 - Copyright (C) Stefan Metzmacher 2005-2009 - - ** NOTE! The following LGPL license applies to the tevent - ** library. This does NOT imply that all of Samba is released - ** under the LGPL - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 3 of the License, or (at your option) any later version. - - This library 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, see <http://www.gnu.org/licenses/>. -*/ - -#include "replace.h" -#include "system/filesys.h" -#include "system/select.h" -#include "tevent.h" -#include "tevent_util.h" -#include "tevent_internal.h" - -struct select_event_context { - /* a pointer back to the generic event_context */ - struct tevent_context *ev; - - /* the maximum file descriptor number in fd_events */ - int maxfd; -}; - -/* - create a select_event_context structure. -*/ -static int select_event_context_init(struct tevent_context *ev) -{ - struct select_event_context *select_ev; - - /* - * We might be called during tevent_re_initialise() - * which means we need to free our old additional_data. - */ - TALLOC_FREE(ev->additional_data); - - select_ev = talloc_zero(ev, struct select_event_context); - if (!select_ev) return -1; - select_ev->ev = ev; - - ev->additional_data = select_ev; - return 0; -} - -/* - recalculate the maxfd -*/ -static void calc_maxfd(struct select_event_context *select_ev) -{ - struct tevent_fd *fde; - - select_ev->maxfd = 0; - for (fde = select_ev->ev->fd_events; fde; fde = fde->next) { - if (fde->fd > select_ev->maxfd) { - select_ev->maxfd = fde->fd; - } - } -} - - -/* to mark the ev->maxfd invalid - * this means we need to recalculate it - */ -#define EVENT_INVALID_MAXFD (-1) - -/* - destroy an fd_event -*/ -static int select_event_fd_destructor(struct tevent_fd *fde) -{ - struct tevent_context *ev = fde->event_ctx; - struct select_event_context *select_ev = NULL; - - if (ev) { - select_ev = talloc_get_type_abort(ev->additional_data, - struct select_event_context); - - if (select_ev->maxfd == fde->fd) { - select_ev->maxfd = EVENT_INVALID_MAXFD; - } - } - - return tevent_common_fd_destructor(fde); -} - -/* - add a fd based event - return NULL on failure (memory allocation error) -*/ -static struct tevent_fd *select_event_add_fd(struct tevent_context *ev, TALLOC_CTX *mem_ctx, - int fd, uint16_t flags, - tevent_fd_handler_t handler, - void *private_data, - const char *handler_name, - const char *location) -{ - struct select_event_context *select_ev = - talloc_get_type_abort(ev->additional_data, - struct select_event_context); - struct tevent_fd *fde; - - if (fd < 0 || fd >= FD_SETSIZE) { - errno = EBADF; - return NULL; - } - - fde = tevent_common_add_fd(ev, mem_ctx, fd, flags, - handler, private_data, - handler_name, location); - if (!fde) return NULL; - - if ((select_ev->maxfd != EVENT_INVALID_MAXFD) - && (fde->fd > select_ev->maxfd)) { - select_ev->maxfd = fde->fd; - } - talloc_set_destructor(fde, select_event_fd_destructor); - - return fde; -} - -/* - event loop handling using select() -*/ -static int select_event_loop_select(struct select_event_context *select_ev, struct timeval *tvalp) -{ - fd_set r_fds, w_fds; - struct tevent_fd *fde; - int selrtn; - int select_errno; - - /* we maybe need to recalculate the maxfd */ - if (select_ev->maxfd == EVENT_INVALID_MAXFD) { - calc_maxfd(select_ev); - } - - FD_ZERO(&r_fds); - FD_ZERO(&w_fds); - - /* setup any fd events */ - for (fde = select_ev->ev->fd_events; fde; fde = fde->next) { - if (fde->fd < 0 || fde->fd >= FD_SETSIZE) { - tevent_debug(select_ev->ev, TEVENT_DEBUG_FATAL, - "ERROR: EBADF fd[%d] >= %d " - "select_event_loop_once\n", - fde->fd, FD_SETSIZE); - errno = EBADF; - return -1; - } - - if (fde->flags & TEVENT_FD_READ) { - FD_SET(fde->fd, &r_fds); - } - if (fde->flags & TEVENT_FD_WRITE) { - FD_SET(fde->fd, &w_fds); - } - } - - if (select_ev->ev->signal_events && - tevent_common_check_signal(select_ev->ev)) { - return 0; - } - - tevent_trace_point_callback(select_ev->ev, TEVENT_TRACE_BEFORE_WAIT); - selrtn = select(select_ev->maxfd+1, &r_fds, &w_fds, NULL, tvalp); - select_errno = errno; - tevent_trace_point_callback(select_ev->ev, TEVENT_TRACE_AFTER_WAIT); - - if (selrtn == -1 && select_errno == EINTR && - select_ev->ev->signal_events) { - tevent_common_check_signal(select_ev->ev); - return 0; - } - - if (selrtn == -1 && select_errno == EBADF) { - /* the socket is dead! this should never - happen as the socket should have first been - made readable and that should have removed - the event, so this must be a bug. This is a - fatal error. */ - tevent_debug(select_ev->ev, TEVENT_DEBUG_FATAL, - "ERROR: EBADF on select_event_loop_once\n"); - errno = select_errno; - return -1; - } - - if (selrtn == 0 && tvalp) { - /* we don't care about a possible delay here */ - tevent_common_loop_timer_delay(select_ev->ev); - return 0; - } - - if (selrtn > 0) { - /* at least one file descriptor is ready - check - which ones and call the handler, being careful to allow - the handler to remove itself when called */ - for (fde = select_ev->ev->fd_events; fde; fde = fde->next) { - uint16_t flags = 0; - - if (FD_ISSET(fde->fd, &r_fds) && (fde->flags & TEVENT_FD_READ)) { - flags |= TEVENT_FD_READ; - } - if (FD_ISSET(fde->fd, &w_fds) && (fde->flags & TEVENT_FD_WRITE)) { - flags |= TEVENT_FD_WRITE; - } - if (flags) { - DLIST_DEMOTE(select_ev->ev->fd_events, fde); - fde->handler(select_ev->ev, fde, flags, fde->private_data); - break; - } - } - } - - return 0; -} - -/* - do a single event loop using the events defined in ev -*/ -static int select_event_loop_once(struct tevent_context *ev, const char *location) -{ - struct select_event_context *select_ev = - talloc_get_type_abort(ev->additional_data, - struct select_event_context); - struct timeval tval; - - if (ev->signal_events && - tevent_common_check_signal(ev)) { - return 0; - } - - if (ev->threaded_contexts != NULL) { - tevent_common_threaded_activate_immediate(ev); - } - - if (ev->immediate_events && - tevent_common_loop_immediate(ev)) { - return 0; - } - - tval = tevent_common_loop_timer_delay(ev); - if (tevent_timeval_is_zero(&tval)) { - return 0; - } - - return select_event_loop_select(select_ev, &tval); -} -- Samba Shared Repository