- /*
- * We have to make a copy here since it is possible that the
- * enabled event list is changed during an iteration on it.
- */
- List<String> tmpList = new ArrayList<String>(enabledEventList);
-
- LTTngSessiondCmd2_4.sessiond_enable_handler enableCmd = new
- LTTngSessiondCmd2_4.sessiond_enable_handler();
- for (String strEventName: tmpList) {
- enableCmd.name = strEventName;
- if (enableCmd.execute(handler) == null) {
- enabledEventList.remove(strEventName);
+ synchronized (enabledEventSet) {
+ LTTngSessiondCmd2_4.sessiond_enable_handler enableCmd = new
+ LTTngSessiondCmd2_4.sessiond_enable_handler();
+ /*
+ * Modifying events in a Set will raise a
+ * ConcurrentModificationException. Thus, we remove an event
+ * and add its modified version to modifiedEvents when a
+ * modification is necessary.
+ */
+ Set<LTTngEvent> modifiedEvents = new HashSet<LTTngEvent>();
+ Iterator<LTTngEvent> it = enabledEventSet.iterator();
+
+ while (it.hasNext()) {
+ int ret;
+ Logger logger;
+ LTTngEvent event = it.next();
+
+ /*
+ * Check if this Logger name has been enabled already. Note
+ * that in the case of "*", it's never added in that hash
+ * table thus the enable command does a lookup for each
+ * logger name in that hash table for the * case in order
+ * to make sure we don't enable twice the same logger
+ * because JUL apparently accepts that the *same*
+ * LogHandler can be added twice on a Logger object...
+ * don't ask...
+ */
+ logger = enabledLoggers.get(event.name);
+ if (logger != null) {
+ continue;
+ }
+
+ /*
+ * Set to one means that the enable all event has been seen
+ * thus event from that point on must use loglevel for all
+ * events. Else the object has its own loglevel.
+ */
+ if (handler.logLevelUseAll == 1) {
+ it.remove();
+ event.logLevel.level = handler.logLevelAll;
+ event.logLevel.type = handler.logLevelTypeAll;
+ modifiedEvents.add(event);
+ }
+
+ /*
+ * The all event is a special case since we have to iterate
+ * over every Logger to see which one was not enabled.
+ */
+ if (event.name.equals("*")) {
+ enableCmd.name = event.name;
+ enableCmd.lttngLogLevel = event.logLevel.level;
+ enableCmd.lttngLogLevelType = event.logLevel.type;
+ /*
+ * The return value is irrelevant since the * event is
+ * always kept in the set.
+ */
+ enableCmd.execute(handler, enabledLoggers);
+ continue;
+ }
+
+ ret = enableCmd.enableLogger(handler, event, enabledLoggers);
+ if (ret == 1) {
+ /* Enabled so remove the event from the set. */
+ if (!modifiedEvents.remove(event)) {
+ /*
+ * event can only be present in one of
+ * the sets.
+ */
+ it.remove();
+ }
+ }