Callbacks
What's a callback function?
If you are new to asynchronous programming, or have never used callback
functions before, just think of the SLP callback functions as a pieces
of code the you must write but never call directly. Yep, that's right,
you will probably never call your callback function directly, instead,
it will be called by the library when it is ready to report the status
or results of an operation. This allows your program to do other
things while data is being collected by the callback function. Callback
functions are required for all of the major SLP APIs for more information
see SLPReg(),
SLPDeReg(),
SLPDelAttrs(),
SLPFindSrvs(),
SLPFindAttrs(),
and SLPFindSrvTypes(),
Callback functions must accept the parameters that the caller (the SLP
library) expects to pass to them. This is why callback function types
are defined. See SLPRegReport(),
SLPSrvURLCallback(),
SLPAttrCallback().
What's different about SLP callback functions?
Callbacks are an integral part of the SLP API. Developers usually
associate callbacks with asynchronous APIs, but the SLP API uses callbacks
for both synchronous and asynchronous operations. Whether the callback
is called synchronously or asynchronously, depends on the isasync
parameter in the call to SLPOpen().
Remember the following rules and you should not have any problems with
your callback functions.
-
Callback functions are called in both synchronous and asynchronous cases.
The only difference is that in a synchronous case, the initiating function
(SLPReg(), SLPFindSrvs(), etc) will block until all results are reported
to the callback function.
-
The memory passed in to callback functions is owned by the library.
i.e. the callback must strdup() strings before using them permanently
because the memory passed in will be free()d by the library when
the callback returns.
-
This is especially important when a call is made with an async SLPHandle
because results are not collected or collated by the library before the
callback function is called. In other words, in async mode,
the library will call the callback each time a reply message is received
until the request times out.
-
If the errcode upon entry to the callback is set to anything but
SLP_OK,
the rest of the parameters may be invalid. Check the error code first.
-
Use the cookie parameter. It is the best way to get information
to and from your callback.
How does OpenSLP library handle asynchronous operation?
When an SLP library call is made with an SLPHandle that was opened in async
mode, the library does everything it can with out blocking. It then
creates a thread (hopefully a user level thread) and returns SLP_OK.
The newly created thread processes the request (possibly blocking to wait
for data to arrive from the network) and calls the callback function as
data is received.
An important thing to remember is that no collection or collation
of results is performed by the library when a call is initiated in async
mode. This means that the callback may be called multiple times with
the same result. This would happen for example if two SAs or DAs
maintained the same registration.
Currently all the code is in libslp to allow for asynchronous operation
except for the calls to pthread_create(). The reason for this is
mainly that no one has really needed asynchronous operation. If you
feel like you have a good reason to use asynchronous operation then please
send email to openslp-devel@lists.sourceforge.net.
How does OpenSLP library handle synchronous operation?
When an SLP library call is made with an SLPHandle that was opened in sync
mode, the library will not create a thread. Instead, the calling
thread will perform all processing (which may block) and report results
to the callback function. When in sync mode, all of the results are
collated to ensure no duplicates are returned. The API function call
will not return until all results are finished being reported through the
callback.
Why not just have separate synchronous and asynchronous APIs?
That would have been good choice, but for some reason, the SLP designers
thought their way would be better. OpenSLP API is just an implementation
of a standardized specification described in RFC 2614
Can I see some example code?
Yes, example code can be found in the documentation for the SLPReg(),
SLPFindSrv(),
SLPFindAttrs() and SLPFindSrvTypes()
functions.