Equipped libdax_msgs with reference counter. Completed its mutex protection.
This commit is contained in:
parent
f379a2c91a
commit
361a110274
@ -1 +1 @@
|
|||||||
#define Cdrskin_timestamP "2007.09.15.172141"
|
#define Cdrskin_timestamP "2007.09.15.204320"
|
||||||
|
@ -25,8 +25,6 @@
|
|||||||
#include "libdax_msgs.h"
|
#include "libdax_msgs.h"
|
||||||
struct libdax_msgs *libdax_messenger= NULL;
|
struct libdax_msgs *libdax_messenger= NULL;
|
||||||
|
|
||||||
static int libdax_messenger_is_own = 1;
|
|
||||||
|
|
||||||
|
|
||||||
int burn_running = 0;
|
int burn_running = 0;
|
||||||
|
|
||||||
@ -309,10 +307,12 @@ void burn_allow_untested_profiles(int yes)
|
|||||||
/* ts A70915 : API */
|
/* ts A70915 : API */
|
||||||
int burn_set_messenger(void *messenger)
|
int burn_set_messenger(void *messenger)
|
||||||
{
|
{
|
||||||
if (libdax_messenger_is_own)
|
struct libdax_msgs *pt;
|
||||||
|
|
||||||
|
if (libdax_msgs_refer(&pt, messenger, 0) <= 0)
|
||||||
|
return 0;
|
||||||
libdax_msgs_destroy(&libdax_messenger, 0);
|
libdax_msgs_destroy(&libdax_messenger, 0);
|
||||||
libdax_messenger = (struct libdax_msgs *) messenger;
|
libdax_messenger = (struct libdax_msgs *) pt;
|
||||||
libdax_messenger_is_own = 0;
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1877,9 +1877,8 @@ int burn_msgs_obtain(char *minimum_severity,
|
|||||||
|
|
||||||
/* ts A70915 */
|
/* ts A70915 */
|
||||||
/** Replace the messenger object handle of libburn by a compatible handle
|
/** Replace the messenger object handle of libburn by a compatible handle
|
||||||
obtained from a related library. The own message object gets destroyed,
|
obtained from a related library.
|
||||||
so it is IMPORTANT to shut down libburn BEFORE the library which provides
|
See also: libisofs, API function iso_get_messenger().
|
||||||
the messenger object. See also: libisofs, API function iso_get_messenger().
|
|
||||||
@param messenger The foreign but compatible message handle.
|
@param messenger The foreign but compatible message handle.
|
||||||
@return 1 : success, <=0 : failure
|
@return 1 : success, <=0 : failure
|
||||||
*/
|
*/
|
||||||
|
@ -138,6 +138,7 @@ int libdax_msgs_new(struct libdax_msgs **m, int flag)
|
|||||||
(*m)= o= (struct libdax_msgs *) malloc(sizeof(struct libdax_msgs));
|
(*m)= o= (struct libdax_msgs *) malloc(sizeof(struct libdax_msgs));
|
||||||
if(o==NULL)
|
if(o==NULL)
|
||||||
return(-1);
|
return(-1);
|
||||||
|
o->refcount= 1;
|
||||||
o->oldest= NULL;
|
o->oldest= NULL;
|
||||||
o->youngest= NULL;
|
o->youngest= NULL;
|
||||||
o->count= 0;
|
o->count= 0;
|
||||||
@ -153,43 +154,6 @@ int libdax_msgs_new(struct libdax_msgs **m, int flag)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int libdax_msgs_destroy(struct libdax_msgs **m, int flag)
|
|
||||||
{
|
|
||||||
struct libdax_msgs *o;
|
|
||||||
struct libdax_msgs_item *item, *next_item;
|
|
||||||
|
|
||||||
o= *m;
|
|
||||||
if(o==NULL)
|
|
||||||
return(0);
|
|
||||||
|
|
||||||
#ifndef LIBDAX_MSGS_SINGLE_THREADED
|
|
||||||
if(pthread_mutex_destroy(&(o->lock_mutex))!=0) {
|
|
||||||
pthread_mutex_unlock(&(o->lock_mutex));
|
|
||||||
pthread_mutex_destroy(&(o->lock_mutex));
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
for(item= o->oldest; item!=NULL; item= next_item) {
|
|
||||||
next_item= item->next;
|
|
||||||
libdax_msgs_item_destroy(&item,0);
|
|
||||||
}
|
|
||||||
free((char *) o);
|
|
||||||
*m= NULL;
|
|
||||||
return(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int libdax_msgs_set_severities(struct libdax_msgs *m, int queue_severity,
|
|
||||||
int print_severity, char *print_id, int flag)
|
|
||||||
{
|
|
||||||
m->queue_severity= queue_severity;
|
|
||||||
m->print_severity= print_severity;
|
|
||||||
strncpy(m->print_id,print_id,80);
|
|
||||||
m->print_id[80]= 0;
|
|
||||||
return(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static int libdax_msgs_lock(struct libdax_msgs *m, int flag)
|
static int libdax_msgs_lock(struct libdax_msgs *m, int flag)
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -220,6 +184,65 @@ static int libdax_msgs_unlock(struct libdax_msgs *m, int flag)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int libdax_msgs_destroy(struct libdax_msgs **m, int flag)
|
||||||
|
{
|
||||||
|
struct libdax_msgs *o;
|
||||||
|
struct libdax_msgs_item *item, *next_item;
|
||||||
|
|
||||||
|
o= *m;
|
||||||
|
if(o==NULL)
|
||||||
|
return(0);
|
||||||
|
if(o->refcount > 1) {
|
||||||
|
if(libdax_msgs_lock(*m,0)<=0)
|
||||||
|
return(-1);
|
||||||
|
o->refcount--;
|
||||||
|
libdax_msgs_unlock(*m,0);
|
||||||
|
*m= NULL;
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef LIBDAX_MSGS_SINGLE_THREADED
|
||||||
|
if(pthread_mutex_destroy(&(o->lock_mutex))!=0) {
|
||||||
|
pthread_mutex_unlock(&(o->lock_mutex));
|
||||||
|
pthread_mutex_destroy(&(o->lock_mutex));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
for(item= o->oldest; item!=NULL; item= next_item) {
|
||||||
|
next_item= item->next;
|
||||||
|
libdax_msgs_item_destroy(&item,0);
|
||||||
|
}
|
||||||
|
free((char *) o);
|
||||||
|
*m= NULL;
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int libdax_msgs_refer(struct libdax_msgs **pt, struct libdax_msgs *m, int flag)
|
||||||
|
{
|
||||||
|
if(libdax_msgs_lock(m,0)<=0)
|
||||||
|
return(0);
|
||||||
|
m->refcount++;
|
||||||
|
*pt= m;
|
||||||
|
libdax_msgs_unlock(m,0);
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int libdax_msgs_set_severities(struct libdax_msgs *m, int queue_severity,
|
||||||
|
int print_severity, char *print_id, int flag)
|
||||||
|
{
|
||||||
|
if(libdax_msgs_lock(m,0)<=0)
|
||||||
|
return(0);
|
||||||
|
m->queue_severity= queue_severity;
|
||||||
|
m->print_severity= print_severity;
|
||||||
|
strncpy(m->print_id,print_id,80);
|
||||||
|
m->print_id[80]= 0;
|
||||||
|
libdax_msgs_unlock(m,0);
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int libdax_msgs__text_to_sev(char *severity_name, int *severity,
|
int libdax_msgs__text_to_sev(char *severity_name, int *severity,
|
||||||
int flag)
|
int flag)
|
||||||
{
|
{
|
||||||
|
@ -43,6 +43,8 @@ struct libdax_msgs_item {
|
|||||||
|
|
||||||
struct libdax_msgs {
|
struct libdax_msgs {
|
||||||
|
|
||||||
|
int refcount;
|
||||||
|
|
||||||
struct libdax_msgs_item *oldest;
|
struct libdax_msgs_item *oldest;
|
||||||
struct libdax_msgs_item *youngest;
|
struct libdax_msgs_item *youngest;
|
||||||
int count;
|
int count;
|
||||||
@ -176,7 +178,8 @@ struct libdax_msgs_item;
|
|||||||
/* Calls initiated from inside the direct owner (e.g. from libburn) */
|
/* Calls initiated from inside the direct owner (e.g. from libburn) */
|
||||||
|
|
||||||
|
|
||||||
/** Create new empty message handling facility with queue.
|
/** Create new empty message handling facility with queue and issue a first
|
||||||
|
official reference to it.
|
||||||
@param flag Bitfield for control purposes (unused yet, submit 0)
|
@param flag Bitfield for control purposes (unused yet, submit 0)
|
||||||
@return >0 success, <=0 failure
|
@return >0 success, <=0 failure
|
||||||
*/
|
*/
|
||||||
@ -185,12 +188,28 @@ int libdax_msgs_new(struct libdax_msgs **m, int flag);
|
|||||||
|
|
||||||
/** Destroy a message handling facility and all its eventual messages.
|
/** Destroy a message handling facility and all its eventual messages.
|
||||||
The submitted pointer gets set to NULL.
|
The submitted pointer gets set to NULL.
|
||||||
|
Actually only the last destroy call of all offical references to the object
|
||||||
|
will really dispose it. All others just decrement the reference counter.
|
||||||
|
Call this function only with official reference pointers obtained by
|
||||||
|
libdax_msgs_new() or libdax_msgs_refer(), and only once per such pointer.
|
||||||
@param flag Bitfield for control purposes (unused yet, submit 0)
|
@param flag Bitfield for control purposes (unused yet, submit 0)
|
||||||
@return 1 for success, 0 for pointer to NULL
|
@return 1 for success, 0 for pointer to NULL, -1 for fatal error
|
||||||
*/
|
*/
|
||||||
int libdax_msgs_destroy(struct libdax_msgs **m, int flag);
|
int libdax_msgs_destroy(struct libdax_msgs **m, int flag);
|
||||||
|
|
||||||
|
|
||||||
|
/** Create an official reference to an existing libdax_msgs object. The
|
||||||
|
references keep the object alive at least until it is released by
|
||||||
|
a matching number of destroy calls. So each reference MUST be revoked
|
||||||
|
by exactly one call to libdax_msgs_destroy().
|
||||||
|
@param pt The pointer to be set and registered
|
||||||
|
@param m A pointer to the existing object
|
||||||
|
@param flag Bitfield for control purposes (unused yet, submit 0)
|
||||||
|
@return 1 for success, 0 for failure
|
||||||
|
*/
|
||||||
|
int libdax_msgs_refer(struct libdax_msgs **pt, struct libdax_msgs *o, int flag);
|
||||||
|
|
||||||
|
|
||||||
/** Submit a message to a message handling facility.
|
/** Submit a message to a message handling facility.
|
||||||
@param driveno program specific drive number. Use -1 if no number is known.
|
@param driveno program specific drive number. Use -1 if no number is known.
|
||||||
@param error_code Unique error code. Use only registered codes. See below.
|
@param error_code Unique error code. Use only registered codes. See below.
|
||||||
|
Loading…
Reference in New Issue
Block a user