[haiku-commits] haiku: hrev51542 - in src: apps/charactermap system/boot/loader/net kits/tracker add-ons/kernel/drivers/network/wlan

  • From: waddlesplash@xxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Mon, 13 Nov 2017 20:53:13 +0100 (CET)

hrev51542 adds 7 changesets to branch 'master'
old head: c23b641cf1d0555ef7da2f1e4975c1aa4c688230
new head: ec0a48e837ea566f3c52ff2ce957a990063d5da3
overview: 
http://cgit.haiku-os.org/haiku/log/?qt=range&q=ec0a48e837ea+%5Ec23b641cf1d0

----------------------------------------------------------------------------

1939021364eb: CharacterMap: Use binary searches rather than linear lookups 
where possible.
  
  UnicodeBlockView::SelectBlockForCharacter and CharacterView::_FrameFor
  use the same linear search to find which block a character is in, so I
  refactored both to use a shared BlockForCharacter function in 
UnicodeBlocks.cpp
  that is a binary search. CharacterView::_BlockAt also had a TODO comment to
  use a binary search, so I rewrote it as a binary search. It's not the same
  search as the aforementioned BlockForCharacter function. These two changes
  ought to improve the overall performance of CharacterMap.
  
  Signed-off-by: Augustin Cavalier <waddlesplash@xxxxxxxxx>

                                       [ Dale Cieslak <dcieslak@xxxxxxxxx> ]

9037351c6cd4: Don't double-free the Ethernet interface
  
  It is currently done in both ~EthernetService() and ~NetStack().
  
  Since NetStack is where it's added and where an explicit accessor function is 
provided,
  choose that location.
  
  Signed-off-by: Augustin Cavalier <waddlesplash@xxxxxxxxx>

                                [ Andreas Faerber <andreas.faerber@xxxxxx> ]

74077e46e103: Add net_stack_cleanup()
  
  Add a cleanup function net_stack_cleanup() that calls a new 
NetStack::ShutDown() method.
  Make sure this method works even if the network stack was never initialized.
  
  Signed-off-by: Augustin Cavalier <waddlesplash@xxxxxxxxx>

                                [ Andreas Faerber <andreas.faerber@xxxxxx> ]

ce6fdd33ef1d: Detach UDP sockets on cleanup
  
  The UDP service does not own the UDP sockets. When shutting down,
  inform the bound sockets that the service is no longer available.
  This allows subsequent method calls to error out cleanly.
  
  Signed-off-by: Augustin Cavalier <waddlesplash@xxxxxxxxx>

                                [ Andreas Faerber <andreas.faerber@xxxxxx> ]

2960780faa7e: Wire up net_stack_cleanup()
  
  The NetStack.h header is currently not usable from C code. So while
  net_stack_init() is called from platform code, we cannot call
  net_stack_cleanup() from OpenFirmware's platform_start_kernel().
  Thus call it directly from main()'s cleanup TODO, having assured
  that the function is a no-op when no network stack was initialized.
  
  Signed-off-by: Augustin Cavalier <waddlesplash@xxxxxxxxx>

                                [ Andreas Faerber <andreas.faerber@xxxxxx> ]

a4d1e649209c: Make Alt-Up and Alt-W keys work for file panels.
  
  Fixes #11979
  
  Signed-off-by: Augustin Cavalier <waddlesplash@xxxxxxxxx>

                                  [ Owen <owenca@xxxxxxxxxxxxxxxxxxxxxxxx> ]

ec0a48e837ea: wlan/Jamfile: Update comments to properly reflect in-tree driver 
origin.

                              [ Augustin Cavalier <waddlesplash@xxxxxxxxx> ]

----------------------------------------------------------------------------

12 files changed, 123 insertions(+), 45 deletions(-)
headers/private/kernel/boot/net/NetStack.h      |  2 +
headers/private/kernel/boot/net/UDP.h           |  1 +
src/add-ons/kernel/drivers/network/wlan/Jamfile | 13 +++--
src/apps/charactermap/CharacterView.cpp         | 53 +++++++++++----------
src/apps/charactermap/UnicodeBlockView.cpp      | 21 +++-----
src/apps/charactermap/UnicodeBlocks.cpp         | 27 +++++++++++
src/apps/charactermap/UnicodeBlocks.h           |  2 +
src/kits/tracker/FilePanelPriv.cpp              | 11 +++++
src/system/boot/loader/main.cpp                 |  2 +
src/system/boot/loader/net/Ethernet.cpp         |  2 -
src/system/boot/loader/net/NetStack.cpp         | 19 ++++++++
src/system/boot/loader/net/UDP.cpp              | 15 ++++++

############################################################################

Commit:      1939021364eb4bf5cb9f30b13fa06249a9bd17c6
URL:         http://cgit.haiku-os.org/haiku/commit/?id=1939021364eb
Author:      Dale Cieslak <dcieslak@xxxxxxxxx>
Date:        Fri Jun  2 22:59:07 2017 UTC
Committer:   Augustin Cavalier <waddlesplash@xxxxxxxxx>
Commit-Date: Mon Nov 13 15:33:21 2017 UTC

CharacterMap: Use binary searches rather than linear lookups where possible.

UnicodeBlockView::SelectBlockForCharacter and CharacterView::_FrameFor
use the same linear search to find which block a character is in, so I
refactored both to use a shared BlockForCharacter function in UnicodeBlocks.cpp
that is a binary search. CharacterView::_BlockAt also had a TODO comment to
use a binary search, so I rewrote it as a binary search. It's not the same
search as the aforementioned BlockForCharacter function. These two changes
ought to improve the overall performance of CharacterMap.

Signed-off-by: Augustin Cavalier <waddlesplash@xxxxxxxxx>

----------------------------------------------------------------------------

diff --git a/src/apps/charactermap/CharacterView.cpp 
b/src/apps/charactermap/CharacterView.cpp
index 075c536..e4f41db 100644
--- a/src/apps/charactermap/CharacterView.cpp
+++ b/src/apps/charactermap/CharacterView.cpp
@@ -110,11 +110,11 @@ void
 CharacterView::ScrollToBlock(int32 blockIndex)
 {
        // don't scroll if the selected block is already in view.
-       // this prevents distracting jumps when crossing a block 
+       // this prevents distracting jumps when crossing a block
        // boundary in the character view.
-       if (IsBlockVisible(blockIndex))   
+       if (IsBlockVisible(blockIndex))
                return;
-               
+
        if (blockIndex < 0)
                blockIndex = 0;
        else if (blockIndex >= (int32)kNumUnicodeBlocks)
@@ -146,11 +146,11 @@ bool
 CharacterView::IsBlockVisible(int32 block) const
 {
        int32 topBlock = _BlockAt(BPoint(Bounds().left, Bounds().top));
-       int32 bottomBlock = _BlockAt(BPoint(Bounds().right, Bounds().bottom)); 
+       int32 bottomBlock = _BlockAt(BPoint(Bounds().right, Bounds().bottom));
 
-       if (block >= topBlock && block <= bottomBlock) 
+       if (block >= topBlock && block <= bottomBlock)
                return true;
-               
+
        return false;
 }
 
@@ -478,14 +478,25 @@ CharacterView::DoLayout()
 int32
 CharacterView::_BlockAt(BPoint point) const
 {
-       // TODO: use binary search
-       for (uint32 i = 0; i < kNumUnicodeBlocks; i++) {
-               if (!IsShowingBlock(i))
-                       continue;
+       uint32 min = 0;
+       uint32 max = kNumUnicodeBlocks;
+       uint32 guess = (max + min) / 2;
+
+       while ((max >= min) && (guess < kNumUnicodeBlocks - 1 )) {
+               if (fTitleTops[guess] <= point.y && fTitleTops[guess + 1] >= 
point.y) {
+                       if (!IsShowingBlock(guess))
+                               return -1;
+                       else
+                               return guess;
+               }
 
-               if (fTitleTops[i] <= point.y
-                       && (i == kNumUnicodeBlocks - 1 || fTitleTops[i + 1] > 
point.y))
-                       return i;
+               if (fTitleTops[guess + 1] < point.y) {
+                       min = guess + 1;
+               } else {
+                       max = guess - 1;
+               }
+
+               guess = (max + min) / 2;
        }
 
        return -1;
@@ -650,19 +661,11 @@ BRect
 CharacterView::_FrameFor(uint32 character) const
 {
        // find block containing the character
+       int32 blockNumber = BlockForCharacter(character);
 
-       // TODO: could use binary search here
-
-       for (uint32 i = 0; i < kNumUnicodeBlocks; i++) {
-               if (kUnicodeBlocks[i].end < character)
-                       continue;
-               if (kUnicodeBlocks[i].start > character) {
-                       // Character is not mapped
-                       return BRect();
-               }
-
-               int32 diff = character - kUnicodeBlocks[i].start;
-               int32 y = fTitleTops[i] + fTitleHeight
+       if (blockNumber > 0) {
+               int32 diff = character - kUnicodeBlocks[blockNumber].start;
+               int32 y = fTitleTops[blockNumber] + fTitleHeight
                        + (diff / fCharactersPerLine) * fCharacterHeight;
                int32 x = fGap / 2 + diff % fCharactersPerLine;
 
diff --git a/src/apps/charactermap/UnicodeBlockView.cpp 
b/src/apps/charactermap/UnicodeBlockView.cpp
index b40e40b..ee60811 100644
--- a/src/apps/charactermap/UnicodeBlockView.cpp
+++ b/src/apps/charactermap/UnicodeBlockView.cpp
@@ -123,22 +123,15 @@ void
 UnicodeBlockView::SelectBlockForCharacter(uint32 character)
 {
        // find block containing the character
+       int32 blockNumber = BlockForCharacter(character);
 
-       // TODO: could use binary search here
-       for (uint32 i = 0; i < kNumUnicodeBlocks; i++) {
-               if (kUnicodeBlocks[i].end < character)
-                       continue;
-               if (kUnicodeBlocks[i].start > character) {
-                       // Character is not mapped
-                       break;
-               }
+       if (blockNumber > 0) {
+               BlockListItem* block = fBlocks.ItemAt(blockNumber);
+
+               int32 blockIndex = IndexOf(block);
 
-               BlockListItem* block = fBlocks.ItemAt(i);
-               
-               int32 blockNum = IndexOf(block);
-               
-               if (blockNum >= 0) {
-                       Select(blockNum);
+               if (blockIndex >= 0) {
+                       Select(blockIndex);
                        ScrollToSelection();
                }
        }
diff --git a/src/apps/charactermap/UnicodeBlocks.cpp 
b/src/apps/charactermap/UnicodeBlocks.cpp
index d2aa295..a20d0de 100644
--- a/src/apps/charactermap/UnicodeBlocks.cpp
+++ b/src/apps/charactermap/UnicodeBlocks.cpp
@@ -257,3 +257,30 @@ const struct unicode_block_entry kUnicodeBlocks[] = {
 
 const uint32 kNumUnicodeBlocks
        = sizeof(kUnicodeBlocks) / sizeof(kUnicodeBlocks[0]);
+
+
+int32
+BlockForCharacter(const uint32 character)
+{
+       uint32 min = 0;
+       uint32 max = kNumUnicodeBlocks;
+       uint32 guess = (max + min) / 2;
+
+       while ((max >= min) && (guess < kNumUnicodeBlocks)) {
+               uint32 start = kUnicodeBlocks[guess].start;
+               uint32 end = kUnicodeBlocks[guess].end;
+
+               if (start <= character && end >= character)
+                       return guess;
+
+               if (end < character) {
+                       min = guess + 1;
+               } else {
+                       max = guess - 1;
+               }
+
+               guess = (max + min) / 2;
+       }
+
+       return -1;
+}
diff --git a/src/apps/charactermap/UnicodeBlocks.h 
b/src/apps/charactermap/UnicodeBlocks.h
index 4c6b99c..7e90382 100644
--- a/src/apps/charactermap/UnicodeBlocks.h
+++ b/src/apps/charactermap/UnicodeBlocks.h
@@ -23,4 +23,6 @@ extern const unicode_block kNoBlock;
 extern const struct unicode_block_entry kUnicodeBlocks[];
 extern const uint32 kNumUnicodeBlocks;
 
+int32 BlockForCharacter(const uint32 character);
+
 #endif // UNICODE_BLOCKS_H

############################################################################

Commit:      9037351c6cd422aad9c6e0dec3e5236b46d55f23
URL:         http://cgit.haiku-os.org/haiku/commit/?id=9037351c6cd4
Author:      Andreas Faerber <andreas.faerber@xxxxxx>
Date:        Sun Jun 13 14:44:09 2010 UTC
Committer:   Augustin Cavalier <waddlesplash@xxxxxxxxx>
Commit-Date: Mon Nov 13 15:46:32 2017 UTC

Don't double-free the Ethernet interface

It is currently done in both ~EthernetService() and ~NetStack().

Since NetStack is where it's added and where an explicit accessor function is 
provided,
choose that location.

Signed-off-by: Augustin Cavalier <waddlesplash@xxxxxxxxx>

----------------------------------------------------------------------------

diff --git a/src/system/boot/loader/net/Ethernet.cpp 
b/src/system/boot/loader/net/Ethernet.cpp
index 6e16756..e2724bc 100644
--- a/src/system/boot/loader/net/Ethernet.cpp
+++ b/src/system/boot/loader/net/Ethernet.cpp
@@ -77,8 +77,6 @@ EthernetService::~EthernetService()
 {
        if (fSendBuffer)
                fInterface->FreeSendReceiveBuffer(fSendBuffer);
-
-       delete fInterface;
 }
 
 // Init

############################################################################

Commit:      74077e46e1033bb48d78877b57b040c271a5beb4
URL:         http://cgit.haiku-os.org/haiku/commit/?id=74077e46e103
Author:      Andreas Faerber <andreas.faerber@xxxxxx>
Date:        Sun Jun 13 14:55:53 2010 UTC
Committer:   Augustin Cavalier <waddlesplash@xxxxxxxxx>
Commit-Date: Mon Nov 13 15:47:27 2017 UTC

Add net_stack_cleanup()

Add a cleanup function net_stack_cleanup() that calls a new 
NetStack::ShutDown() method.
Make sure this method works even if the network stack was never initialized.

Signed-off-by: Augustin Cavalier <waddlesplash@xxxxxxxxx>

----------------------------------------------------------------------------

diff --git a/headers/private/kernel/boot/net/NetStack.h 
b/headers/private/kernel/boot/net/NetStack.h
index f148732..5092d6e 100644
--- a/headers/private/kernel/boot/net/NetStack.h
+++ b/headers/private/kernel/boot/net/NetStack.h
@@ -26,6 +26,7 @@ private:
 public:
        static status_t CreateDefault();
        static NetStack *Default();
+       static status_t ShutDown();
 
        status_t AddEthernetInterface(EthernetInterface *interface);
 
@@ -53,6 +54,7 @@ private:
 // afterwards, which is supposed to add network interfaces.
 status_t net_stack_init();
 status_t platform_net_stack_init();
+status_t net_stack_cleanup();
 
 
 #endif // _BOOT_NET_STACK_H
diff --git a/src/system/boot/loader/net/NetStack.cpp 
b/src/system/boot/loader/net/NetStack.cpp
index 7a172ee..f420d94 100644
--- a/src/system/boot/loader/net/NetStack.cpp
+++ b/src/system/boot/loader/net/NetStack.cpp
@@ -120,6 +120,19 @@ NetStack::Default()
        return sNetStack;
 }
 
+
+status_t
+NetStack::ShutDown()
+{
+       if (sNetStack != NULL) {
+               delete sNetStack;
+               sNetStack = NULL;
+       }
+
+       return B_OK;
+}
+
+
 // AddEthernetInterface
 status_t
 NetStack::AddEthernetInterface(EthernetInterface *interface)
@@ -155,3 +168,9 @@ net_stack_init()
        return platform_net_stack_init();
 }
 
+
+status_t
+net_stack_cleanup()
+{
+       return NetStack::ShutDown();
+}

############################################################################

Commit:      ce6fdd33ef1dc4214d2c3edeb5692540753b7e3b
URL:         http://cgit.haiku-os.org/haiku/commit/?id=ce6fdd33ef1d
Author:      Andreas Faerber <andreas.faerber@xxxxxx>
Date:        Sun Jun 13 15:50:11 2010 UTC
Committer:   Augustin Cavalier <waddlesplash@xxxxxxxxx>
Commit-Date: Mon Nov 13 15:48:09 2017 UTC

Detach UDP sockets on cleanup

The UDP service does not own the UDP sockets. When shutting down,
inform the bound sockets that the service is no longer available.
This allows subsequent method calls to error out cleanly.

Signed-off-by: Augustin Cavalier <waddlesplash@xxxxxxxxx>

----------------------------------------------------------------------------

diff --git a/headers/private/kernel/boot/net/UDP.h 
b/headers/private/kernel/boot/net/UDP.h
index fd1bdd6..2b587f4 100644
--- a/headers/private/kernel/boot/net/UDP.h
+++ b/headers/private/kernel/boot/net/UDP.h
@@ -52,6 +52,7 @@ public:
        uint16 Port() const                     { return fPort; }
 
        status_t Bind(ip_addr_t address, uint16 port);
+       void Detach();
 
        status_t Send(ip_addr_t destinationAddress, uint16 destinationPort,
                ChainBuffer *buffer);
diff --git a/src/system/boot/loader/net/UDP.cpp 
b/src/system/boot/loader/net/UDP.cpp
index 10af060..5c4adbd 100644
--- a/src/system/boot/loader/net/UDP.cpp
+++ b/src/system/boot/loader/net/UDP.cpp
@@ -175,6 +175,15 @@ UDPSocket::Bind(ip_addr_t address, uint16 port)
 }
 
 
+void
+UDPSocket::Detach()
+{
+       fUDPService = NULL;
+               // This will lead to subsequent methods returning B_NO_INIT
+}
+
+
+
 status_t
 UDPSocket::Send(ip_addr_t destinationAddress, uint16 destinationPort,
        ChainBuffer *buffer)
@@ -264,6 +273,12 @@ UDPService::UDPService(IPService *ipService)
 
 UDPService::~UDPService()
 {
+       int count = fSockets.Count();
+       for (int i = 0; i < count; i++) {
+               UDPSocket *socket = fSockets.ElementAt(i);
+               socket->Detach();
+       }
+
        if (fIPService != NULL)
                fIPService->UnregisterIPSubService(this);
 }

############################################################################

Commit:      2960780faa7e9c2e5e7a80cb8925be5ee59ae5ef
URL:         http://cgit.haiku-os.org/haiku/commit/?id=2960780faa7e
Author:      Andreas Faerber <andreas.faerber@xxxxxx>
Date:        Sun Jun 13 15:00:45 2010 UTC
Committer:   Augustin Cavalier <waddlesplash@xxxxxxxxx>
Commit-Date: Mon Nov 13 15:48:26 2017 UTC

Wire up net_stack_cleanup()

The NetStack.h header is currently not usable from C code. So while
net_stack_init() is called from platform code, we cannot call
net_stack_cleanup() from OpenFirmware's platform_start_kernel().
Thus call it directly from main()'s cleanup TODO, having assured
that the function is a no-op when no network stack was initialized.

Signed-off-by: Augustin Cavalier <waddlesplash@xxxxxxxxx>

----------------------------------------------------------------------------

diff --git a/src/system/boot/loader/main.cpp b/src/system/boot/loader/main.cpp
index bb7a063..c7ae998 100644
--- a/src/system/boot/loader/main.cpp
+++ b/src/system/boot/loader/main.cpp
@@ -14,6 +14,7 @@
 #include <boot/heap.h>
 #include <boot/PathBlacklist.h>
 #include <boot/stdio.h>
+#include <boot/net/NetStack.h>
 
 #include "file_systems/packagefs/packagefs.h"
 
@@ -145,6 +146,7 @@ main(stage2_args *args)
                        gKernelArgs.boot_volume = buffer;
                        gKernelArgs.boot_volume_size = 
gBootVolume.ContentSize();
 
+                       net_stack_cleanup();
                        // ToDo: cleanup, heap_release() etc.
                        heap_print_statistics();
                        platform_start_kernel();

############################################################################

Commit:      a4d1e649209ca6895608cf1b35a23bf14518959a
URL:         http://cgit.haiku-os.org/haiku/commit/?id=a4d1e649209c
Author:      Owen <owenca@xxxxxxxxxxxxxxxxxxxxxxxx>
Date:        Thu Aug  3 22:51:29 2017 UTC
Committer:   Augustin Cavalier <waddlesplash@xxxxxxxxx>
Commit-Date: Mon Nov 13 15:56:47 2017 UTC

Ticket:      https://dev.haiku-os.org/ticket/11979

Make Alt-Up and Alt-W keys work for file panels.

Fixes #11979

Signed-off-by: Augustin Cavalier <waddlesplash@xxxxxxxxx>

----------------------------------------------------------------------------

diff --git a/src/kits/tracker/FilePanelPriv.cpp 
b/src/kits/tracker/FilePanelPriv.cpp
index 56f4e062..91b2631 100644
--- a/src/kits/tracker/FilePanelPriv.cpp
+++ b/src/kits/tracker/FilePanelPriv.cpp
@@ -129,6 +129,17 @@ key_down_filter(BMessage* message, BHandler** handler, 
BMessageFilter* filter)
 
        int32 modifier = 0;
        message->FindInt32("modifiers", &modifier);
+
+       if (modifier & B_COMMAND_KEY && key == B_UP_ARROW) {
+               filter->Looper()->PostMessage(kOpenParentDir);
+               return B_SKIP_MESSAGE;
+       }
+
+       if (modifier & B_COMMAND_KEY && key == 'w') {
+               filter->Looper()->PostMessage(kCancelButton);
+               return B_SKIP_MESSAGE;
+       }
+
        if (!modifier && key == B_ESCAPE) {
                if (view->ActivePose())
                        view->CommitActivePose(false);

############################################################################

Revision:    hrev51542
Commit:      ec0a48e837ea566f3c52ff2ce957a990063d5da3
URL:         http://cgit.haiku-os.org/haiku/commit/?id=ec0a48e837ea
Author:      Augustin Cavalier <waddlesplash@xxxxxxxxx>
Date:        Mon Nov 13 16:19:05 2017 UTC

wlan/Jamfile: Update comments to properly reflect in-tree driver origin.

----------------------------------------------------------------------------

diff --git a/src/add-ons/kernel/drivers/network/wlan/Jamfile 
b/src/add-ons/kernel/drivers/network/wlan/Jamfile
index 2e92c2f..52864c0 100644
--- a/src/add-ons/kernel/drivers/network/wlan/Jamfile
+++ b/src/add-ons/kernel/drivers/network/wlan/Jamfile
@@ -1,17 +1,22 @@
 SubDir HAIKU_TOP src add-ons kernel drivers network wlan ;
 
+# Haiku-native drivers
 SubInclude HAIKU_TOP src add-ons kernel drivers network wlan ipw2100 ;
 
-#FreeBSD 8 WLAN drivers
+# FreeBSD 8 drivers
+SubInclude HAIKU_TOP src add-ons kernel drivers network wlan ralink2860 ;
+
+# FreeBSD 9.2 drivers
+SubInclude HAIKU_TOP src add-ons kernel drivers network wlan iprowifi2100 ;
+SubInclude HAIKU_TOP src add-ons kernel drivers network wlan marvell88w8335 ;
+
+# FreeBSD 9.3 drivers
 SubInclude HAIKU_TOP src add-ons kernel drivers network wlan aironetwifi ;
 SubInclude HAIKU_TOP src add-ons kernel drivers network wlan atheroswifi ;
 SubInclude HAIKU_TOP src add-ons kernel drivers network wlan broadcom43xx ;
-SubInclude HAIKU_TOP src add-ons kernel drivers network wlan iprowifi2100 ;
 SubInclude HAIKU_TOP src add-ons kernel drivers network wlan iprowifi2200 ;
 SubInclude HAIKU_TOP src add-ons kernel drivers network wlan iprowifi3945 ;
 SubInclude HAIKU_TOP src add-ons kernel drivers network wlan iprowifi4965 ;
 SubInclude HAIKU_TOP src add-ons kernel drivers network wlan marvell88w8363 ;
-SubInclude HAIKU_TOP src add-ons kernel drivers network wlan marvell88w8335 ;
-SubInclude HAIKU_TOP src add-ons kernel drivers network wlan ralink2860 ;
 SubInclude HAIKU_TOP src add-ons kernel drivers network wlan ralinkwifi ;
 SubInclude HAIKU_TOP src add-ons kernel drivers network wlan wavelanwifi ;


Other related posts:

  • » [haiku-commits] haiku: hrev51542 - in src: apps/charactermap system/boot/loader/net kits/tracker add-ons/kernel/drivers/network/wlan - waddlesplash