Not exactly because Equinox implementation is based on the ProSyst one.

I did the changes in the ProSyst implementation during the contribution to the Eclipse five years ago. Most of the changes was deoptimizations related to removing usage of ProSyst specific utilities like Objects and Thread pools, usage of an embedded database for configuration information etc. So the behavior Eclipse implementation is very similar to the ProSyst one, except usage of more temporary objects and memory. We still maintain separate implementation mainly because of requirement to support embedded environments.

-Pavlin Dobrev


On 9/24/2013 12:59 PM, David Bosschaert wrote:
According to http://en.wikipedia.org/wiki/OSGi_Specification_Implementations
there is actually a 4th implementation: the one from Prosyst.

Best regards,

David

On 24 September 2013 09:28, Peter Kriens <[email protected]> wrote:
I think it comes down to the same rule: measure ... There are only 3 impls I 
think: Knopflerfish, Apache Felix, and Equinox.

If you measure them, I think it would be great to have a blog about it ...

Kind regards,

         Peter Kriens

On 24 sep. 2013, at 10:03, Daniel McGreal wrote:

Incidentally, is it known which implementation is considered to use resources 
most conservatively?
Many thanks,
Dan.

On 24 Sep 2013, at 08:52, Peter Kriens wrote:

The problem is that solving the DS problem (managing your dependencies etc) is 
going to take space in your app code. So I can see it would be an overhead for 
1 bundle, but at a certain point you get a lot less classes/space. And if you 
have only one bundle, OSGi does not make a lot of sense :-)

As always in these cases, you have to measure it ...

Kind regards,

      Peter Kriens


On 21 sep. 2013, at 01:03, [email protected] wrote:

Indeed.
The server guys in my team make fun of me :(
Ignore them - they're just a bunch of quiche-eaters. ;-)

Peter, it's not just the size of the jar file which counts (75k for
knopflerfish SCR BTW), it's the memory usage at runtime - which is going
to be more than that[1], and RAM is usually even scarcer than filesystem
space.

[1] To the extent that classes are loaded from the jarfile, the
representation of these classes in memory will typically be somewhat
larger than the jar entry after the later is decompressed. And while
Daniel's "server guys" may quite often put some huge open-source library
on their classpath just to use one class, OSGi services tend to have a
high degree of cohesion so the chances are that pretty well all of the jar
file gets loaded ...

Which is not to deny that DS is mankind's coolest invention since OSGi
itself ...

Kind regards

Chris Gray

On 20 Sep 2013, at 16:37, Peter Kriens wrote:

On 19 sep. 2013, at 20:25, Daniel McGreal wrote:
Space constraints.
Wow! You must code in a tightly constrained embedded environment if 195k
is too much for something soooo valuable .... :-)

Kind regards,

   Peter Kriens



On 19 Sep 2013, at 18:55, Peter Kriens <[email protected]> wrote:

Why not use DS?


On 19 sep. 2013, at 18:02, Daniel McGreal wrote:

Hi OSGi-devs,

I have a question about utilising ServiceTracker to manage a class's
dependencies and blocking during the call, which I confess is
probably well trodden ground but for which I can't apparently find
the right Google terminology. Perhaps because I've been, until now,
coddled by higher-level service dynamism, like Blueprint.

I have a java.util.logging.Handler whose publish method needs a
couple of OSGi services to operate. Any LogRecords that are published
during a refresh of either of the dependencies should not be lost and
should be reattempted when services resume (which in practice might
be a long time, the device this application targets is incredibly
primitive).

Currently I have the Activator and Handler in the same implementation
(which seems like it might be bad practice, if it is, I'd love to
know why). Here's a trimmed down version, with just one dependency:

public class RemoteLoggingHandler extends Handler implements
BundleActivator {
        private volatile Channel channel;

        private ServiceTracker<IAmqpChannelProvider, IAmqpChannelProvider>
channelProviderTracker;

        @Override public void start(BundleContext context) throws Exception
{
                channelProviderTracker = new 
ServiceTracker<IAmqpChannelProvider,
IAmqpChannelProvider>(context, IAmqpChannelProvider.class, null){
                        @Override public IAmqpChannelProvider
addingService(ServiceReference<IAmqpChannelProvider> reference) {
                                IAmqpChannelProvider channelProvider =
super.addingService(reference);
                                try {
                                        channel = 
channelProvider.createChannel();
                                        //Some initialisation, can happen once 
or multiple times, no
problem.
                                        
channel.exchangeDeclare(LoggingConstants.LOGGING_EXG_NAME,
"topic", true);
                                        notifyAll();
                                } catch (IOException e) {
                                        e.printStackTrace();
                                }
                                return channelProvider;
                        }

                        @Override public synchronized void
modifiedService(ServiceReference<IAmqpChannelProvider> reference,
IAmqpChannelProvider service) {
                                removedService(reference, service);
                                addingService(reference);
                        }

                        @Override public void
removedService(ServiceReference<IAmqpChannelProvider> reference,
IAmqpChannelProvider service) {
                                super.removedService(reference, service);
                                channel = null;
                        }
                };
                channelProviderTracker.open();

                LogManager.getLogManager().getLogger("").addHandler(this);
        }

        @Override public void stop(BundleContext context) throws Exception {
                LogManager.getLogManager().getLogger("").removeHandler(this);
        }

        @Override
        public void publish(LogRecord record) {
                try {
                        synchronized (channelProviderTracker) {
                                while(channel == null) 
channelProviderTracker.wait();

                                
channel.basicPublish(LoggingConstants.LOGGING_EXG_NAME,
record.getLoggerName(),
                                                null, 
record.getMessage().getBytes());
                        }
                } catch (Exception e) {
                    reportError(null, e, ErrorManager.WRITE_FAILURE);
                    return;
                }
        }

        //Some boilerplate....

        @Override public void flush() {} //Unnecessary.

        @Override
        public void close() throws SecurityException {
                flush();
                try {
                        channel.close();
                } catch (IOException e) {
                        reportError("Amqp channel could not be closed", e,
ErrorManager.CLOSE_FAILURE);
                }
        }

}

I don't feel that I've been successful. The channel member field can
still go to null while it's being used in publish, and probably many
other problems I've missed! Can anyone point out to me either the
standard procedure for this, or any comments on my above attempt?

Many thanks,
Dan.


_______________________________________________
OSGi Developer Mail List
[email protected]
https://mail.osgi.org/mailman/listinfo/osgi-dev
_______________________________________________
OSGi Developer Mail List
[email protected]
https://mail.osgi.org/mailman/listinfo/osgi-dev
_______________________________________________
OSGi Developer Mail List
[email protected]
https://mail.osgi.org/mailman/listinfo/osgi-dev
_______________________________________________
OSGi Developer Mail List
[email protected]
https://mail.osgi.org/mailman/listinfo/osgi-dev
_______________________________________________
OSGi Developer Mail List
[email protected]
https://mail.osgi.org/mailman/listinfo/osgi-dev

_______________________________________________
OSGi Developer Mail List
[email protected]
https://mail.osgi.org/mailman/listinfo/osgi-dev
_______________________________________________
OSGi Developer Mail List
[email protected]
https://mail.osgi.org/mailman/listinfo/osgi-dev
_______________________________________________
OSGi Developer Mail List
[email protected]
https://mail.osgi.org/mailman/listinfo/osgi-dev
_______________________________________________
OSGi Developer Mail List
[email protected]
https://mail.osgi.org/mailman/listinfo/osgi-dev
_______________________________________________
OSGi Developer Mail List
[email protected]
https://mail.osgi.org/mailman/listinfo/osgi-dev

_______________________________________________
OSGi Developer Mail List
[email protected]
https://mail.osgi.org/mailman/listinfo/osgi-dev

Reply via email to