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