Threadnr in TLS patch
Introduction
The last days or so, we discussed TLS on IRC (sorry, logger was down so no reference to the discussion). Basically, TLS (thread-local storage) allows us to associate data with a thread, in a way that the data is accessible to that thread only.
My initial idea was to store a pointer to the thread's context struct in TLS, so that we wouldn't have to pass along it to almost every function. An issue that was raised, however, is that functions then could modify data that is not among the function parameters. This is not a technical problem, but more a matter of coding style. It could possibly also degrade Motion performance, if it is more expensive to access TLS than to simply pass a function parameter. Don't know for sure about that.
This patch does not put the context struct in TLS, but only the thread number. The point of doing this is that functions that previously needed the context struct
only to call
motion_log
, now won't need it.
It is a problem if TLS through pthreads isn't available on all platforms. We have to check that!
Description of Patch
To avoid a patch that affects almost all source files (due to the fact that
motion_log
is called from everywhere), the patch is applied in three steps. Only the first step involves the patch file. See below for instructions.
Installation of Patch
Note: There are two patch files, one that contains step 1 only, and one that contains all three steps. Read on for instructions how to apply the patch in separate steps.
Step 1
Apply the attached patch file with
zcat motion-3.2.2_snap11-tls-step1.patch.gz | patch -p1
. This introduces TLS initialization/destruction, makes the motion and netcam threads store thread number in TLS, and changes
motion_log
to use TLS.
For threads for which there is no thread number in TLS,
motion_log
will print 0 as the thread number. This behaviour is the same as before, since those threads (only the control thread, I think) used to pass
cnt_list[0]
anyway.
Motion is fully functional after this step.
Step 2
Remove the first parameter of every call to
motion_log
, by issuing the following command (in the Motion source directory):
perl -pi.bak -e 's/motion_log *\(.*?, */motion_log\(/g' *.c *.h
Remove
.bak
(keep
-pi
) if you don't want backup files. Note that a bonus is that the above command also modifies the function prototype of
motion_log
(both in motion.c and motion.h).
Motion is fully functional after this step.
Step 3
Finally remove parameters/variables in functions that previously used the context struct only for calls to
motion_log
. According to
make
(complaining about unused variables), the relevant functions are
send_template_ini_client
,
send_template_ini_client_raw
and
send_template
, all in webhttpd.c.
Passing the struct context as user data to the above functions is of course no longer necessary.
Change History of Patch
Version history:
- Version 1 (10 Aug 2005 -- 15 Aug 2005):
- Puts thread number in TLS for
motion_log
to use.
- Modifies all source files to not pass the context struct to
motion_log
.
- Cleans up webhttpd.c where the context struct was passed only for logging purposes. (Big patch only.)
I have updated the patch to be against a clean 3.2.2 now. There are two patch files, one for step 1 and one for all steps (I cleaned up webhttpd.c in the same way as Angel did when he collapsed the three steps into one patch).
--
PerJonsson - 15 Aug 2005
Patch uploaded for motion-20050821-223339 (daily snap). It contains all changes, including those in webhttpd.c.
--
PerJonsson - 21 Aug 2005
Integrated in
http://www.lavrsen.dk/sources/motion-daily/motion-20050822-004947.tar.gz
Also cleaned up all warnings about unused cnt everywhere.
--
KennethLavrsen - 21 Aug 2005