Browse Source

format message outside lock to reduce contention

git-svn-id: svn+ssh://jackaudio.org/trunk/jack@841 0c269be4-1314-0410-8aa9-9f06e86f4224
tags/0.109.0
joq 20 years ago
parent
commit
ec77020208
1 changed files with 12 additions and 10 deletions
  1. +12
    -10
      libjack/messagebuffer.c

+ 12
- 10
libjack/messagebuffer.c View File

@@ -114,7 +114,7 @@ jack_messagebuffer_exit ()
fprintf(stderr, "WARNING: %d message buffer overruns!\n",
mb_overruns);
else
fprintf(stderr, "No message buffer overruns.\n");
fprintf(stderr, "no message buffer overruns\n");

pthread_mutex_destroy(&mb_write_lock);
pthread_cond_destroy(&mb_ready_cond);
@@ -124,22 +124,24 @@ jack_messagebuffer_exit ()
void
jack_messagebuffer_add (const char *fmt, ...)
{
char msg[MB_BUFFERSIZE];
va_list ap;

/* format the message first, to reduce lock contention */
va_start(ap, fmt);
vsnprintf(msg, MB_BUFFERSIZE, fmt, ap);
va_end(ap);

if (!mb_initialized) {
/* Unable to print message with realtime safety. So,
* complain and print it anyway. */
fprintf(stderr, "ERROR: messagebuffer not initialized...\n");
va_start(ap, fmt);
vfprintf(stderr, fmt, ap);
va_end(ap);
/* Unable to print message with realtime safety.
* Complain and print it anyway. */
fprintf(stderr, "ERROR: messagebuffer not initialized: %s",
msg);
return;
}

if (pthread_mutex_trylock(&mb_write_lock) == 0) {
va_start(ap, fmt);
vsnprintf(mb_buffers[mb_inbuffer], MB_BUFFERSIZE, fmt, ap);
va_end(ap);
strncpy(mb_buffers[mb_inbuffer], msg, MB_BUFFERSIZE);
mb_inbuffer = MB_NEXT(mb_inbuffer);
pthread_cond_signal(&mb_ready_cond);
pthread_mutex_unlock(&mb_write_lock);


Loading…
Cancel
Save