hrev47484 adds 3 changesets to branch 'master' old head: 192f01c669102651bdc81273811079e90e0a29e5 new head: 2f1684345e18c232cf915272bf567b9cc31c5f9d overview: http://cgit.haiku-os.org/haiku/log/?qt=range&q=2f16843+%5E192f01c ---------------------------------------------------------------------------- a0d8768: Adapt userlandfs kernel-addon to atomic_* API changes. * Remove volatile qualifiers, use atomic_get() for safe access * Fixes build of userlandfs 604770b: Adapt kernelland_emu to kernel API changes * Adapt to changes in kernel synchronization APIs. * Makes userlandfs work again. 2f16843: Use BPathFinder to find userlandfs add-ons * ...to make it work with packaged and non-packaged. [ Julian Harnath <julian.harnath@xxxxxxxxxxxxxx> ] ---------------------------------------------------------------------------- 8 files changed, 75 insertions(+), 60 deletions(-) .../userlandfs/kernel_add_on/KernelDebug.cpp | 2 +- .../userlandfs/kernel_add_on/Volume.cpp | 16 +++---- .../userlandfs/kernel_add_on/Volume.h | 12 ++--- .../userlandfs/server/UserlandFSServer.cpp | 35 +++++++++++---- .../file_systems/userlandfs/server/haiku/Jamfile | 1 - .../kernel/kernelland_emu/condition_variable.cpp | 4 +- src/tests/add-ons/kernel/kernelland_emu/lock.cpp | 46 +++++++++++++------- .../add-ons/kernel/kernelland_emu/scheduler.cpp | 19 -------- ############################################################################ Commit: a0d87686f4884c31d86e65b81889bf3d26fab703 URL: http://cgit.haiku-os.org/haiku/commit/?id=a0d8768 Author: Julian Harnath <julian.harnath@xxxxxxxxxxxxxx> Date: Fri Jul 11 22:08:57 2014 UTC Adapt userlandfs kernel-addon to atomic_* API changes. * Remove volatile qualifiers, use atomic_get() for safe access * Fixes build of userlandfs ---------------------------------------------------------------------------- diff --git a/src/add-ons/kernel/file_systems/userlandfs/kernel_add_on/KernelDebug.cpp b/src/add-ons/kernel/file_systems/userlandfs/kernel_add_on/KernelDebug.cpp index 7b4fa74..f033f99 100644 --- a/src/add-ons/kernel/file_systems/userlandfs/kernel_add_on/KernelDebug.cpp +++ b/src/add-ons/kernel/file_systems/userlandfs/kernel_add_on/KernelDebug.cpp @@ -12,7 +12,7 @@ #include "UserlandFS.h" #include "Volume.h" -static vint32 sCommandsAdded = 0; +static int32 sCommandsAdded = 0; // DebugUFS int diff --git a/src/add-ons/kernel/file_systems/userlandfs/kernel_add_on/Volume.cpp b/src/add-ons/kernel/file_systems/userlandfs/kernel_add_on/Volume.cpp index 0bfbed9..bfa20f6 100644 --- a/src/add-ons/kernel/file_systems/userlandfs/kernel_add_on/Volume.cpp +++ b/src/add-ons/kernel/file_systems/userlandfs/kernel_add_on/Volume.cpp @@ -207,7 +207,7 @@ struct Volume::IterativeFDIOCookie : public BReferenceable { // AutoIncrementer class Volume::AutoIncrementer { public: - AutoIncrementer(vint32* variable) + AutoIncrementer(int32* variable) : fVariable(variable) { if (fVariable) @@ -226,7 +226,7 @@ public: } private: - vint32* fVariable; + int32* fVariable; }; @@ -4520,27 +4520,27 @@ PRINT(("Volume::_PutAllPendingVNodes()\n")); return USERLAND_IOCTL_VNODE_COUNTING_DISABLED; } // Check whether there are open entities at the moment. - if (fOpenFiles > 0) { + if (atomic_get(&fOpenFiles) > 0) { PRINT(("Volume::_PutAllPendingVNodes() failed: open files\n")); return USERLAND_IOCTL_OPEN_FILES; } - if (fOpenDirectories > 0) { + if (atomic_get(&fOpenDirectories) > 0) { PRINT(("Volume::_PutAllPendingVNodes() failed: open dirs\n")); return USERLAND_IOCTL_OPEN_DIRECTORIES; } - if (fOpenAttributeDirectories > 0) { + if (atomic_get(&fOpenAttributeDirectories) > 0) { PRINT(("Volume::_PutAllPendingVNodes() failed: open attr dirs\n")); return USERLAND_IOCTL_OPEN_ATTRIBUTE_DIRECTORIES; } - if (fOpenAttributes > 0) { + if (atomic_get(&fOpenAttributes) > 0) { PRINT(("Volume::_PutAllPendingVNodes() failed: open attributes\n")); return USERLAND_IOCTL_OPEN_ATTRIBUTES; } - if (fOpenIndexDirectories > 0) { + if (atomic_get(&fOpenIndexDirectories) > 0) { PRINT(("Volume::_PutAllPendingVNodes() failed: open index dirs\n")); return USERLAND_IOCTL_OPEN_INDEX_DIRECTORIES; } - if (fOpenQueries > 0) { + if (atomic_get(&fOpenQueries) > 0) { PRINT(("Volume::_PutAllPendingVNodes() failed: open queries\n")); return USERLAND_IOCTL_OPEN_QUERIES; } diff --git a/src/add-ons/kernel/file_systems/userlandfs/kernel_add_on/Volume.h b/src/add-ons/kernel/file_systems/userlandfs/kernel_add_on/Volume.h index 0c47db5..9d43349 100644 --- a/src/add-ons/kernel/file_systems/userlandfs/kernel_add_on/Volume.h +++ b/src/add-ons/kernel/file_systems/userlandfs/kernel_add_on/Volume.h @@ -307,12 +307,12 @@ private: void* fUserlandVolume; ino_t fRootID; VNode* fRootNode; - vint32 fOpenFiles; - vint32 fOpenDirectories; - vint32 fOpenAttributeDirectories; - vint32 fOpenAttributes; - vint32 fOpenIndexDirectories; - vint32 fOpenQueries; + int32 fOpenFiles; + int32 fOpenDirectories; + int32 fOpenAttributeDirectories; + int32 fOpenAttributes; + int32 fOpenIndexDirectories; + int32 fOpenQueries; VNodeMap* fVNodes; IORequestIDMap* fIORequestInfosByID; IORequestStructMap* fIORequestInfosByStruct; ############################################################################ Commit: 604770b31331951e0f9b44b368c21dc2b004d920 URL: http://cgit.haiku-os.org/haiku/commit/?id=604770b Author: Julian Harnath <julian.harnath@xxxxxxxxxxxxxx> Date: Fri Jul 11 23:02:46 2014 UTC Adapt kernelland_emu to kernel API changes * Adapt to changes in kernel synchronization APIs. * Makes userlandfs work again. ---------------------------------------------------------------------------- diff --git a/src/add-ons/kernel/file_systems/userlandfs/server/haiku/Jamfile b/src/add-ons/kernel/file_systems/userlandfs/server/haiku/Jamfile index a70075a9c..52c74ea 100644 --- a/src/add-ons/kernel/file_systems/userlandfs/server/haiku/Jamfile +++ b/src/add-ons/kernel/file_systems/userlandfs/server/haiku/Jamfile @@ -29,7 +29,6 @@ SharedLibrary libuserlandfs_haiku_kernel.so lock.cpp low_resource_manager.cpp misc.cpp - scheduler.cpp slab.cpp vm.cpp diff --git a/src/tests/add-ons/kernel/kernelland_emu/condition_variable.cpp b/src/tests/add-ons/kernel/kernelland_emu/condition_variable.cpp index 968a6b7..19d8036 100644 --- a/src/tests/add-ons/kernel/kernelland_emu/condition_variable.cpp +++ b/src/tests/add-ons/kernel/kernelland_emu/condition_variable.cpp @@ -162,7 +162,7 @@ ConditionVariable::Publish(const void* object, const char* objectType) void -ConditionVariable::Unpublish(bool threadsLocked) +ConditionVariable::Unpublish() { ASSERT(fObject != NULL); @@ -194,7 +194,7 @@ ConditionVariable::Wait(uint32 flags, bigtime_t timeout) void -ConditionVariable::_Notify(bool all, bool threadsLocked, status_t result) +ConditionVariable::_Notify(bool all, status_t result) { MutexLocker locker(sConditionVariablesLock); diff --git a/src/tests/add-ons/kernel/kernelland_emu/lock.cpp b/src/tests/add-ons/kernel/kernelland_emu/lock.cpp index 5c2de20..84efe8b 100644 --- a/src/tests/add-ons/kernel/kernelland_emu/lock.cpp +++ b/src/tests/add-ons/kernel/kernelland_emu/lock.cpp @@ -43,6 +43,10 @@ struct rw_lock_waiter { #define RW_LOCK_FLAG_OWNS_NAME RW_LOCK_FLAG_CLONE_NAME +static status_t _mutex_lock_threads_locked(mutex* lock); +static void _mutex_unlock_threads_locked(mutex* lock); + + /*! Helper class playing the role of the kernel's thread spinlock. We don't use as spinlock as that could be expensive in userland (due to spinlock holder potentially being unscheduled), but a benaphore. @@ -83,7 +87,7 @@ struct ThreadSpinlock { } private: - vint32 fCount; + int32 fCount; sem_id fSemaphore; }; @@ -605,7 +609,7 @@ mutex_destroy(mutex* lock) != lock->holder) { panic("mutex_destroy(): there are blocking threads, but caller doesn't " "hold the lock (%p)", lock); - if (_mutex_lock(lock, true) != B_OK) + if (_mutex_lock_threads_locked(lock) != B_OK) return; } #endif @@ -634,9 +638,9 @@ mutex_switch_lock(mutex* from, mutex* to) #if !KDEBUG if (atomic_add(&from->count, 1) < -1) #endif - _mutex_unlock(from, true); + _mutex_unlock_threads_locked(from); - return mutex_lock_threads_locked(to); + return _mutex_lock_threads_locked(to); } @@ -653,15 +657,14 @@ mutex_switch_from_read_lock(rw_lock* from, mutex* to) _rw_lock_read_unlock(from, true); #endif - return mutex_lock_threads_locked(to); + return _mutex_lock_threads_locked(to); } -status_t -_mutex_lock(mutex* lock, bool threadsLocked) + +static status_t +_mutex_lock_threads_locked(mutex* lock) { - // lock only, if !threadsLocked - AutoLocker<ThreadSpinlock> locker(sThreadSpinlock, false, !threadsLocked); // Might have been released after we decremented the count, but before // we acquired the spinlock. @@ -695,13 +698,13 @@ _mutex_lock(mutex* lock, bool threadsLocked) // block get_user_thread()->wait_status = 1; - locker.Unlock(); + sThreadSpinlock.Unlock(); status_t error; while ((error = _kern_block_thread(0, 0)) == B_INTERRUPTED) { } - locker.Lock(); + sThreadSpinlock.Lock(); #if KDEBUG if (error == B_OK) @@ -712,12 +715,17 @@ _mutex_lock(mutex* lock, bool threadsLocked) } -void -_mutex_unlock(mutex* lock, bool threadsLocked) +status_t +_mutex_lock(mutex* lock, void*) { - // lock only, if !threadsLocked - AutoLocker<ThreadSpinlock> locker(sThreadSpinlock, false, !threadsLocked); + AutoLocker<ThreadSpinlock> locker(sThreadSpinlock); + return _mutex_lock_threads_locked(lock); +} + +static void +_mutex_unlock_threads_locked(mutex* lock) +{ #if KDEBUG if (find_thread(NULL) != lock->holder) { panic("_mutex_unlock() failure: thread %ld is trying to release " @@ -756,6 +764,14 @@ _mutex_unlock(mutex* lock, bool threadsLocked) } +void +_mutex_unlock(mutex* lock) +{ + AutoLocker<ThreadSpinlock> locker(sThreadSpinlock); + _mutex_unlock_threads_locked(lock); +} + + status_t _mutex_trylock(mutex* lock) { diff --git a/src/tests/add-ons/kernel/kernelland_emu/scheduler.cpp b/src/tests/add-ons/kernel/kernelland_emu/scheduler.cpp deleted file mode 100644 index 99fa85a..0000000 --- a/src/tests/add-ons/kernel/kernelland_emu/scheduler.cpp +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright 2002-2009, Haiku Inc. All Rights Reserved. - * Distributed under the terms of the MIT license. - * - * Authors: - * Ingo Weinhold, bonefish@xxxxxxxxxxxxxxx. - * Axel Dörfler, axeld@xxxxxxxxxxxxxxxx. - */ - -#include <kscheduler.h> - - -struct scheduler_ops kScheduler = { - NULL, - NULL, - NULL, - NULL, -}; -struct scheduler_ops* gScheduler = &kScheduler; ############################################################################ Revision: hrev47484 Commit: 2f1684345e18c232cf915272bf567b9cc31c5f9d URL: http://cgit.haiku-os.org/haiku/commit/?id=2f16843 Author: Julian Harnath <julian.harnath@xxxxxxxxxxxxxx> Date: Fri Jul 11 23:53:31 2014 UTC Use BPathFinder to find userlandfs add-ons * ...to make it work with packaged and non-packaged. ---------------------------------------------------------------------------- diff --git a/src/add-ons/kernel/file_systems/userlandfs/server/UserlandFSServer.cpp b/src/add-ons/kernel/file_systems/userlandfs/server/UserlandFSServer.cpp index a044d82..838ccbc 100644 --- a/src/add-ons/kernel/file_systems/userlandfs/server/UserlandFSServer.cpp +++ b/src/add-ons/kernel/file_systems/userlandfs/server/UserlandFSServer.cpp @@ -11,10 +11,13 @@ #include <Application.h> #include <Clipboard.h> +#include <Entry.h> #include <FindDirectory.h> #include <fs_interface.h> #include <Locker.h> #include <Path.h> +#include <PathFinder.h> +#include <StringList.h> #include <image_private.h> @@ -64,17 +67,33 @@ status_t UserlandFSServer::Init(const char* fileSystem, port_id port) { // get the add-on path - BPath addOnPath; - status_t error = find_directory(B_USER_ADDONS_DIRECTORY, &addOnPath); - if (error != B_OK) - RETURN_ERROR(error); - error = addOnPath.Append("userlandfs"); - if (error != B_OK) - RETURN_ERROR(error); - error = addOnPath.Append(fileSystem); + BPathFinder pathFinder; + BStringList paths; + status_t error = pathFinder.FindPaths(B_FIND_PATH_ADD_ONS_DIRECTORY, + "userlandfs", B_FIND_PATH_EXISTING_ONLY, paths); if (error != B_OK) RETURN_ERROR(error); + BPath addOnPath; + for (int index = 0; index < paths.CountStrings(); index++) { + error = addOnPath.SetTo(paths.StringAt(index)); + if (error != B_OK) + RETURN_ERROR(error); + + error = addOnPath.Append(fileSystem); + if (error != B_OK) + RETURN_ERROR(error); + + BEntry entry(addOnPath.Path()); + if (entry.Exists()) + break; + else + addOnPath.Unset(); + } + + if (addOnPath.InitCheck() != B_OK) + RETURN_ERROR(B_BAD_VALUE); + // load the add-on fAddOnImage = load_add_on(addOnPath.Path()); if (fAddOnImage < 0)