static new ThreadLocal postSoftwareMadeWeb_disabled; static new BetterThreadLocal postSoftwareMadeWeb_websMadeInThread; static new ThreadLocal postSoftwareMadeWeb_maker; static new ThreadLocal postSoftwareMadeWeb_programID; static S postSoftwareMadeWeb_programID_allThreads; // L // function can also return false to stop triggerWebsChanged static L postSoftwareMadeWeb_onNewWeb = synchroList(); // L static L postSoftwareMadeWeb_onDisabledPost = synchroList(); static void postSoftwareMadeWeb(Web web, O... params) { lock aiLock(); web_intern(web); incIntThreadLocal(postSoftwareMadeWeb_websMadeInThread); S progID = postSoftwareMadeWeb_programID(); S maker = postSoftwareMadeWeb_maker!; if (maker != null) if (empty(web.source)) web.source = maker; else params = paramsPlus(params, 'maker, postSoftwareMadeWeb_maker!); if (isTrue(postSoftwareMadeWeb_disabled!)) { print(" Would post: " + webToStringShort(web) + " [" + web.source + "]"); pcallFAll(postSoftwareMadeWeb_onDisabledPost, web); } else { logStructure(postSoftwareMadeWeb_file(), nu(SoftwareMadeWeb, date := now(), computerID := computerID(), programID := progID, //structure := struct(web), +web, furtherInfo := empty(params) ? null : litorderedmap(params))); markWebsPosted_createMarker(progID); pcallFAll(postSoftwareMadeWeb_onNewWeb, web); } } static S postSoftwareMadeWeb_programID() { ret or2(postSoftwareMadeWeb_programID!, postSoftwareMadeWeb_programID_allThreads, programID()); } static File postSoftwareMadeWeb_file() { ret getProgramFile(postSoftwareMadeWeb_programID(), "webs-made.txt"); }