libsmbclient threadsafeness

Michael B Allen mba2000 at ioplex.com
Mon Oct 18 21:56:03 GMT 2004


David Wuertele said:
> I'm writing a massively-threaded application that makes calls into
> libsmbclient.  I have found that some of the commands are not
> threadsafe, so to be conservative I'm now wrapping every call into
> libsmbclient with pthread_mutex_lock().  For example:
>
>   pthread_mutex_lock (&libsmbclient_mutex); {
>     ip_list_ptr = name_query (socket_fd, star, 0, True, True,

I don't think anyone is going to be brave enough to tell you which
functions are or are not thread safe.

I would look at creating thread safe calls like this:

BOOL
ts_cli_nt_session_open(struct cli_state *cli, const int pipe_idx,
pthread_mutex_t *lock)
{
    BOOL ret;
    pthread_mutex_lock(lock);
    ret = cli_nt_session_open(cli, pipe_idx);
    pthread_mutex_unlock(lock);
    return ret;
}

This would be a relatively non-intrusive way to make the library
thread-safe and I think you can autogenerate these functions pretty
easily. For example, create a tab delimited text file of prototypes like:

  BOOL\tcli_nt_session_open\tstruct cli_state *cli, const int pipe_idx
  struct cli_state *\tcli_initialise\tstruct cli_state *cli
  ...

where \t is a tab and thing use the csvprint utility [1] to print the
functions like:

  $ ./csvprint smbcliprotos.csv "%1\n%2(%3, pthread_mutex_t
*lock)\n{\n\t%1 ret;\n\tpthread_mu...."

Then touch up the source a little if necessary (like functions that return
void).

Also bare in mind that when using a technique like this the network will
effectively be locked from the outside when you make a call. If all state
was in struct cli_state you would be in a position to make concurrent
calls but unforunately the library doesn't support that right now. So when
you say "massively threaded" I hope you realize that using more threads
isn't necessarily going to increase paralellism. In fact if you plan on
doing a lot of smbclient I/O I don't think running more than a handful of
threads would make any difference in performance.

This is actually something that jCIFS is very good at. But of course it's
Java so I don't think that helps.

Mike

[1] http://www.ioplex.com/~miallen/libmba/dl/examples/csvprint.c



More information about the samba-technical mailing list