Commit cbe7ae4ce656428b90ba8320869c95400ffa1b11

  • avatar
  • Patrick Stählin <pstaehlin @futu…lab.ch>
  • Tue Aug 24 23:20:52 CEST 2010
Let JS-GC free loggers
core/jshandler.cpp
(2 / 2)
  
297297 } // ctor
298298
299299 ScriptContext::~ScriptContext() {
300 scrubVector(m_AttachedObjects);
300 JS_GC(m_pContext);
301301 if(!m_AttachedObjects.empty()) {
302302 Logger::getInstance()->log("Still have some attached objects (" + intToString(m_AttachedObjects.size()) + "). Memory leak?", lsError);
303303 }
304// JS_GC(m_pContext);
304 scrubVector(m_AttachedObjects);
305305 JS_SetContextPrivate(m_pContext, NULL);
306306 JS_DestroyContext(m_pContext);
307307 m_pContext = NULL;
core/scripting/jslogger.cpp
(28 / 37)
  
11/*
22Copyright (c) 2010 digitalSTROM.org, Zurich, Switzerland
33
4Author: Sergey 'Jin' Bostandzhyan <jin@dev.digitalstrom.org>
4Authors: Sergey 'Jin' Bostandzhyan <jin@dev.digitalstrom.org>,
5 Patrick Staehlin <pstaehlin@futurelab.ch>
56
67This file is part of digitalSTROM Server.
78
3333#include <boost/bind.hpp>
3434
3535#define LOG_OBJECT_IDENTIFIER "logfile"
36
3637namespace dss {
38
3739 const std::string ScriptLoggerExtensionName = "scriptloggerextension";
3840
3941 const std::string LoggerObjectName = "ScriptLoggerContextWrapper";
40 class ScriptLoggerContextWrapper : public ScriptContextAttachedObject {
42 class ScriptLoggerContextWrapper {
4143 public:
42 ScriptLoggerContextWrapper(ScriptContext* _pContext, boost::shared_ptr<ScriptLogger> _logger)
43 : ScriptContextAttachedObject(_pContext, LoggerObjectName + _logger->getLogName()),
44 m_ScriptLogger(_logger)
44 ScriptLoggerContextWrapper(boost::shared_ptr<ScriptLogger> _logger)
45 : m_ScriptLogger(_logger)
4546 { }
4647
4748 boost::shared_ptr<ScriptLogger> getLogger() { return m_ScriptLogger; }
7474 return JS_TRUE;
7575 }
7676
77 jsval v;
78 if (JS_GetProperty(cx, obj, LOG_OBJECT_IDENTIFIER, &v) == JS_TRUE) {
79 if(v != JSVAL_VOID) {
80 JSString *logfile = JSVAL_TO_STRING(v);
81 std::string logfileStr = JS_GetStringBytes(logfile);
82 ScriptContextAttachedObject* attachedObj = ctx->getAttachedObjectByName(LoggerObjectName + logfileStr);
83 ScriptLoggerContextWrapper* wrapper =
84 dynamic_cast<ScriptLoggerContextWrapper*>(attachedObj);
85 if(wrapper != NULL) {
86 Logger::getInstance()->log(JS_GetStringBytes(str));
87 if(newline) {
88 wrapper->getLogger()->logln(JS_GetStringBytes(str));
89 } else {
90 wrapper->getLogger()->log(JS_GetStringBytes(str));
91 }
92 } else {
93 Logger::getInstance()->log("Could not find logger named: " + LoggerObjectName + logfileStr, lsWarning);
94 }
77 ScriptLoggerContextWrapper* wrapper = static_cast<ScriptLoggerContextWrapper*>(JS_GetPrivate(cx, obj));
78 if(wrapper != NULL) {
79 Logger::getInstance()->log(JS_GetStringBytes(str));
80 if(newline) {
81 wrapper->getLogger()->logln(JS_GetStringBytes(str));
82 } else {
83 wrapper->getLogger()->log(JS_GetStringBytes(str));
9584 }
85 } else {
86 Logger::getInstance()->log("ScriptLoggerExtension_log_common: wrapper is null!", lsFatal);
87 return JS_FALSE;
9688 }
9789 return JS_TRUE;
9890 }
118118 }
119119
120120 boost::shared_ptr<ScriptLogger> pLogger = ext->getLogger(JS_GetStringBytes(str));
121 ctx->attachObject(new ScriptLoggerContextWrapper(ctx, pLogger));
122 jsval v = STRING_TO_JSVAL(str);
123 JS_SetProperty(cx, obj, LOG_OBJECT_IDENTIFIER, &v);
124 JSBool foundp;
125 JS_SetPropertyAttributes(cx, obj, LOG_OBJECT_IDENTIFIER, JSPROP_READONLY, &foundp);
121 ScriptLoggerContextWrapper* wrapper = new ScriptLoggerContextWrapper(pLogger);
122 JS_SetPrivate(cx, obj, wrapper);
126123 return JS_TRUE;
127
128124 } catch(const ScriptException& e) {
129125 Logger::getInstance()->log(std::string("ScriptLogger: Caught script exception: ") + e.what());
130126 }
131131 return JS_FALSE;
132132 }
133133
134 void ScriptLogger_finalize(JSContext *cx, JSObject *obj) {
135 ScriptLoggerContextWrapper* pWrapper = static_cast<ScriptLoggerContextWrapper*>(JS_GetPrivate(cx, obj));
136 Logger::getInstance()->log("Finalizing ScriptLogger");
137 JS_SetPrivate(cx, obj, NULL);
138 delete pWrapper;
139 } // finalize_set
140
134141 static JSClass ScriptLogger_class = {
135142 "Logger", JSCLASS_HAS_PRIVATE,
136143 JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub,
137144 JS_EnumerateStandardClasses,
138145 JS_ResolveStub,
139 JS_ConvertStub, JS_FinalizeStub, JSCLASS_NO_OPTIONAL_MEMBERS
146 JS_ConvertStub, ScriptLogger_finalize, JSCLASS_NO_OPTIONAL_MEMBERS
140147 };
141148
142149 static JSFunctionSpec ScriptLogger_methods[] = {
152152 {NULL, NULL, 0, 0, 0},
153153 };
154154
155 static JSFunctionSpec ScriptLogger_static_methods[] = {
156 {"getChannel", ScriptLoggerExtension_log, 1, 0, 0},
157 {NULL, NULL, 0, 0, 0},
158 };
159
160
161155 ScriptLogger::ScriptLogger(const std::string& _filePath,
162156 const std::string& _filename,
163157 ScriptLoggerExtension* _pExtension) {
256256 JS_InitClass(_context.getJSContext(),
257257 _context.getRootObject().getJSObject(),
258258 NULL, &ScriptLogger_class, ScriptLogger_construct, 1, NULL,
259 ScriptLogger_methods, NULL, ScriptLogger_static_methods);
259 ScriptLogger_methods, NULL, NULL);
260260
261261 } // extendContext
262262