Be Newsletter


Issue 38, August 28, 1996

Table of Contents


BE ENGINEERING INSIGHTS: Multiple Inheritance and the Be Application

By Rico Tudor

Inspecting the include files for Be application development reveals a uniform absence of multiple inheritance. I may be the only proponent of multiple inheritance at Be, but there are surely others in the developer community. This article encourages the use of this key C++ structuring mechanism, while identifying certain dangers which are particular to the Be world.

The sources of dangers which I discuss are threads, dynamic BObjects, and C++ itself. This three-headed Hydra incapacitates unwary programs without warning. I have prepared a code sample, preserved in alcohol, for your inspection.

Be threads, integral to BeOS, provide a powerful programming methodology. Common within operating systems for decades, multiple control-flow is finally emerging for use by application writers. Unfortunately, far greater care is required in this environment, and knowledge of concepts like synchronization is crucial. Furthermore, programs run nondeterministically, hindering the bug search.

Like any C++ object, a BObject encapsulates data. However, some exhibit dynamic behavior beyond the semantics of the language. A BWindow, for example, has effects on the screen, the operating system, and the state of the team. One notable effect is the asynchronous appearance of a new thread. BWindows also make a habit of deleting themselves.

Consider the skillful blending of the C language with a pit of vipers: the result could be likened to C++. Given the resulting performance, portability and industry support, C++ is a reasonable choice by Be. However, this presumes the application writer can develop immunity to the venom. The lack of garbage collection and the matter of object construction and destruction are an enduring pain.

Described superficially, multiple inheritance moves member objects into the list of base classes. In the following example, a BLocker and a BControl comprise a new class. Class X uses membership, but is unable to invoke the BControl (BControl::Invoke is a protected function). Class Y uses multiple inheritance, successfully. The code for Y is better structured, better protected, and looks cleaner.

  struct X {
    X( ): c( BRect( ), 0, 0, 0, 0, 0) {
      l.Lock( );
      c.Invoke( );    // illegal!
    }
    BControl c;
    BLocker l;
  };

  struct Y: BLocker, BControl {
    Y( ): BControl( BRect( ), 0, 0, 0, 0, 0) {
      Lock( );
      Invoke( );
    }
  };
Even if X were legal, the interaction of X with BControl and BLocker would be a mess. Pointers to all objects would have to be exchanged, and declarations of friendship thrown around like confetti. In C++,`friend' destroys the distinction between `protected' and `private'. With `friend' like this, who needs `enemy'?

The real dividends of multiple inheritance come from data sharing within a subset of a larger object. This is achieved with "virtual base classes". The complexity of BObjects, and their derivatives, makes such structuring highly desirable.

Two classes can cooperate with a virtual class, which contains shared data and linkage to functions for each other's use. The degree of sharing is determined mutually and the name spaces do not otherwise collide, as would happen if a hierarchy were imposed (one class derived from the other). Also, a hierarchy permits sharing in one direction only.

The other way to arrange sharing between "sibling" objects is through an object which is derived from both classes. This approach is inferior because shared data in the object will migrate toward the root, again causing name trouble. Function linkage will be clumsy since pure virtual functions cannot be employed from that direction.

As promised, here is our preserved code specimen, depicting the best in code structure, but also foolhardy regard for the Hydra. The code is necessarily small for this article, but runs nicely. Finding the same bugs in a large-scale program is no cakewalk, as you can imagine.

  #include      <Application.h>
  #include      <Window.h>
  #include      <stdio.h>

  class V {
    V( ): z( 1000) { }
    protected:
    virtual void fm( BPoint) {
      printf( "Oops!  V::fm called\n");
    }
    uint  z;
  };

class W: BWindow, virtual V {
    W( BRect r): BWindow( r, 0, B_TITLED_WINDOW, 0) {
      printf( "W::W called (thread=%d)\n", find_thread( 0));
      Show( );
      snooze( 10000000);
      u = 42;
      printf( "W::W done (thread=%d)\n", find_thread( 0));
    }
    void FrameMoved( BPoint p) {
      printf( "W::FrameMoved: thread=%d, u=%d, z=%d\n",
      find_thread( 0), u, z);
      fm( p);
    }
    uint u;
  };

  class H: BHandler, virtual V {
    H( ) { }
    void fm( BPoint p) {
      printf( "H::fm: z=%d, p=", z); p.PrintToStream( );

  };

  struct S: W, H {
    S( ): W( BRect( 20, 20, 90, 90)) { }
    ~S( ) {
      be_app->Quit( );
    }
  };

  struct A: BApplication {
    A( ): BApplication( 'xyzt') { }
    private:
    void ReadyToRun( ) {
      new S;
    }
    bool QuitRequested( ) {
      return (FALSE);
    }
  };
  main( )
  {
    A a;
    a.Run( );
    return (0);
  }

V represents the shared portion of a BWindow W and a BHandler H. W and H are bonded by the aggregate object S, which plays no role, except for startup and shutdown. Ideally, V::fm is pure; for our demo, it prints a warning.

On startup, the program immediately creates a window which you can move. For the next 10 seconds, moving the window illuminates three bugs.

Firstly, W::FrameMoved is being called, but the W constructor (W::W) has not completed. There are two separate threads running in W, without any provision for interlocks. Even with interlocks, this scenario would make little sense.

Secondly, W is being used before fully constructed. This is often acceptable, but the utmost care is required. The obvious case is the constructor itself. The order of object construction is well-defined in C++ (tediously so). In our example, that care is lacking: variable `u' is being used before set.

Thirdly, the function V::fm is being called before linkage to H::fm has been established. This seems unintuitive, since V has been constructed (observe the value of `z'). But construction of H::fm has not started, so C++ mandates no linkage. Do you feel faint? Do your limbs feel numb? That's the C++ venom coursing through your veins.

The `snooze' call freezes the program during an embarrassing phase of its initialization, for easy inspection. In a real Be app, this phase might be manifest on certain occasions only: the dreaded timing-sensitive bug.

When developing a Be app, it is critical to understand the dynamic nature of BObjects like BWindows and BViews. Firstly, they must be created with the `new' operator. Secondly, they `delete' themselves. Therefore, an aggregate like S must contain no more than one instance of such an object.

In conclusion, the complexity of large applications in the Be environment can be contained by multiple inheritance. The sceptics should note that single inheritance must confront almost all the issues of multiple inheritance, while enjoying far fewer benefits. Therefore, open your copies of the C++ ARM, and start hacking. And beware the Hydra!


BE DEVELOPER TALK: Laurent Domenech, Opalis

E-mail: laurent@opalis.com

Like most of the developers that have written in this column, we at Opalis loved the Be adventure from the first time we heard of it. Having worked on Windows NT, I immediately felt comfortable with the advanced features of the BeOS and decided that we should help and participate as much as possible, especially since there's a lot of French guys involved here...

Our speciality, networking and business systems, may not sound like the ideal Be target, but I'm sure the BeBox, with its high-level capabilities, can make a contribution in a "regular" company -- it's not just a video/audio editing machine. (I'm also sure that the Box has a place in the home. That's why we're studying IHS applications, but that's another story...)

The first program we're developing for the BeOS is an implementation of OpalisRobot, our event-driven scheduler. This is a general tool that includes something like an extended cron. A description (and, soon, the first version) is available at www.opalis.com/opr_beos.html. If your application needs to schedule some tasks or to detect special system events, you won't have to rewrite yet-another- scheduler, you'll be able to use OpalisRobot for BeOS, probably for free.

The second project -- a personal one -- is IPv6 over Ethernet and ATM. I spend all my free time on it, and if all goes well, we should have this in a year. I'll certainly release some parts before, such as ATM drivers. This is a big challenge for me, and also for the BeBox, since some ATM adapters and switches can go very fast. For example, Sun just released a 622 Mb/s adapter (of course, it does not fit on a PCI slot, unless you use a hammer).

Many thanks to the Be team for this exciting box. Please always stay on the wild side...

BeMall presentation

BeMall is an initiative from Opalis. While working on the BeBox as developers, we thought it was a good idea to set up something to promote the BeBox and help developers sell their BeOS applications.

BeMall offers several services:

  • A repository for developer information in the Web site. You will find helpful information and source code in the Developer Exchange and Help City sections. If you're developing for the BeBox, please consider sharing your knowledge and code with other developers.
  • A repository of BeOS freeware and shareware. This is mainly for people who don't have storage on the Internet and want to use the BeMall site as a primary location for their programs. It's not our intention to compete with ftp.be.com or with big repository sites, but to be an additional site for selected files.
  • A registration service for shareware authors. We can also help authors package and market their applications.
  • A mail order catalog (and, soon, an Internet e-shop) for commercial BeOS applications and selected hardware. Right now, BeMall features the first ever BeOS commercial application (Metrowerks CodeWarrior) at the most competitive price. You can freely subscribe to our mailing list on the Web site.
We have other projects such as periodic CD-ROM or a magazine, but we need your input! Please answer to our survey Web page at www.BeMall.com/survey.html.

See you soon on BeMall...
Contact: info@BeMall.com - www.BeMall.com


BE MARKETING MUTTERINGS

By Alex Osadzinski

This Sunday, I was paying my weekly visit to Fry's Electronics in Palo Alto. For those of you unfamiliar with this emporium, it's a cornucopia of items with but one common attribute: They all appeal to geeks, nerds, and technofreaks. Each of the Fry's stores has a theme; the Palo Alto outlet is decorated to resemble a Western saloon, complete with the heads of several farm animals stuck onto the wall. So, gentle reader, please imagine the setting: bright fluorescent lights, doleful cows surveying the scene from their vantage points on the wall, aisle upon aisle of electronics and, it being early on a Sunday, very few people trudging around.

I round a corner, in search of an elusive cable, and bump into a former colleague with whom I worked at a Major Workstation Company. It's nice to see him; we've not seen each other for about three years. We exchange pleasantries and I hand him my Be business card. He raises his eyebrows and asks me what Be does.

"We've created a brand-new operating system and a multiprocessor computer and are marketing it to digital content application developers," say I.

My friend backs away, his face showing a mixture of surprise, apprehension, and pity. He clearly believes that my tray table is not in the fully locked and upright position and, after a few more pleasantries, we separate, each in search of the little pieces of electronics that will satisfy us today.

It was only later that I pondered on this brief encounter. My Fry's friend was not the first person to imply, or even openly state, that what Be is doing is crazy, or at least eccentric. Several posters to comp.sys.be have asked fellow netizens for their arguments in favor of Be, because their friends have told them that we're crazy.

We can argue that a good proof of sanity is demonstrated success. Definitions of success vary, but Be's includes respect for our technology, broad acceptance of the BeOS and low-cost MP computers running the BeOS, satisfied and profitable developers and happy customers doing cool things. We could write this into a florid mission statement, but.....nah!

We've reached a stage of development at which the probabilities of success are leaning in our favor. If we consider the reasons why start-ups fail, some of the most common are lack of funds, uninteresting technology, no clearly-identified target market, overwhelming competition, or a poor team. Right now, through a welcome round of adequate financing (using the "just in time" principle), technology that excites people, a market space that's large enough to be interesting yet small enough to be well-defined, no direct competitor (yet), and the best team of engineers, marketers, and support people that I've had the privilege to work with -- things look quite positive.

We can also argue that however much a single company may appear to dominate, there's always at least 20% of the market that's inaccessible to the dominant player. That 20% comprises customers that are looking for something a little different, a little special, or a little more useful for their particularly unusual task. Our target market is that 20%: Unique people with unusual needs.

We could strongly debate using reductio ad absurdum: Does our protagonist believe that the current UNIX/Windows/MacOS trio of dominant operating systems will prevail for ever? Probably not. How about for 50 years? Seems a little too long. 20 years? Still too much. 10 years? Well... So, when WILL an alternative emerge? Could it be now? Could it be the BeOS?

There are other arguments, many of them founded upon the "look at the product and tell me if you see something special and useful" approach.

We could argue forever. Or we could get on with building the products.

Even so, people still think we're crazy.

And that makes it all the more fun.


The War Of Two Browsers...

By Jean-Louis Gassée

A few years ago, jaded observers said our industry had entered maturity, we were getting our AARP card in the mail. Without saying it in so many words, they meant that everything new had been invented already, life was going down an incrementally boring path, taking gross margins with it. But this was before (among other things) the phenomenal increase in processor power and, of course, the rise of the Internet from the Unix geek underground, thanks to Tim Berners-Lee's HTML.

As a result, instead of operating systems and processor wars, we now have the war of the two browsers. At stake is nothing less than the control of the huge streams of money about to be carried by Intranets and the Worldwide Web. For businesses, Intranets represent a new level of cost and flexibility in delivering client-server applications.

In many respects, the browser is a New Age incarnation of the Common User Access (CUA), the one client/one user interface to corporate IS resources that was promoted "Web aeons" ago by IBM. Netscape's genius -- I should say Jim Clark's genius -- has been to see this and go for it as only he, Silicon Valley money, and egos fueled by a strong dose of anti- Microsoft sentiment can. Said sentiment was not lost on its object, but Microsoft is used to it. They know how to harness the hostility and envy of others to their own business goals. More importantly, Microsoft understands that this is about control. Netscape and their allies want to take control of a huge portion of the computing business, one that is indeed Microsoft's next target after winning control of office productivity: enterprise computing.

The operating system is a commodity, said Netscape, the new platform is the browser, a cross-operating system platform at that. A new genre of computing is emerging on that platform, and Netscape is the drummer, not Microsoft.

The response was remarkable and reminds us of why Microsoft is Microsoft. From the Pearl Harbor anniversary speech last Fall, to the recent delivery of version 3.0 of Explorer, the strategy was courageous and insightful -- and the execution flawless. This might be viewed as unfortunate by the many who claim Microsoft's dominance is excessive already, but it is a fact, nonetheless.

The latest version of Microsoft's browser looks pretty good to me. I've downloaded both Navigator and Explorer 3.0 versions on my home Windows 95 system and I no longer feel Navigator to be markedly superior to Explorer. In many respects, I like Explorer's user interface a little better and I noted that it had obligingly imported my Navigator bookmarks for me. On the other hand, Explorer isn't available on my Mac or on other platforms yet. This is still a plus for Navigator.

Netscape's reaction is a mix of PR and legal maneuvering, with accusations of illegal conduct strenuously denied by Microsoft in a well-detailed response on their Web site. We'll see. In the meantime, the war of the two browsers continues and it might take a very logical turn in the next few months. Microsoft, on the one hand, wants to disable Netscape's platform story. The solution? Integrate the browser into the platform, instead of making it an application. Make it pervasive -- make it disappear. Explorer 4.0 might do just that, with a minuscule RAM footprint (at least compared to the 4 to 5 megabytes currently required); the rest of the code consists of DLLs inside the system.

More importantly, Explorer functions are instantiated as an API, allowing programmers to integrate these functions into their code. The story sounds good. Based on the progress thus far, the implementation ought to be convincing. Netscape had the right idea, and here is our implementation integrated in Windows 97. Netscape, on the other hand, has decided to get into the operating system business with a subsidiary called Navio. Reportedly, Navio will write an OS for televisions, telephones and other communicating appliances. This OS will run a much smaller version of Navigator. So now, Netscape is more or less trying to do what Microsoft failed to execute with Modular Windows and Windows at Work, two interesting stories for connoisseurs. We'll have to see what Microsoft's reply to that one will be. A version of Pegasus, their upcoming PDA OS, for appliances?

In the meantime, we happen to agree with Microsoft: the browser ought to be integrated in the system and presented to application programmers as an API, a class library. After all, several years ago, we didn't call our "user shell" a Finder or a File Manager, we called it a browser.

This is the process we're starting with DR8, available Real Soon Now.



Copyright ©1997 Be, Inc. Be is a registered trademark, and BeOS, BeBox, BeWare, GeekPort, the Be logo and the BeOS logo are trademarks of Be, Inc. All other trademarks mentioned are the property of their respective owners. Comments about this site? Please write us at webmaster@be.com.