Changeset 104 for cpp/gdk/sstring.cpp


Ignore:
Timestamp:
07/23/13 18:15:30 (11 years ago)
Author:
sz
Message:

introducing object de/serialization - see serialtest.cpp
the core GDK classes can be now used in multiple threads (ifdef MULTITHREADED)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • cpp/gdk/sstring.cpp

    r92 r104  
    77#include "nonstd_stl.h"
    88#include "extvalue.h"
     9
     10#ifdef MULTITHREADED
     11#include <pthread.h>
     12static pthread_mutex_t sstring_ref_lock;
     13#define REF_LOCK pthread_mutex_lock(&sstring_ref_lock);
     14#define REF_UNLOCK pthread_mutex_unlock(&sstring_ref_lock)
     15#else
     16#define REF_LOCK
     17#define REF_UNLOCK
     18#endif
    919
    1020static int guessMemSize(int request, int memhint)
     
    96106SString::~SString()
    97107{
     108REF_LOCK;
    98109detach();
     110REF_UNLOCK;
    99111}
    100112
     
    102114{
    103115buf=new SBuf(x);
     116memhint=-1;
    104117}
    105118
     
    113126SString::SString(const SString &from)
    114127{
    115 buf=from.buf;
    116 if (buf->size) buf->refcount++;
     128if (from.buf==&SBuf::empty())
     129        buf=&SBuf::empty();
     130else
     131        {
     132        REF_LOCK;
     133        buf=from.buf;
     134        if (buf->size)
     135                buf->refcount++;
     136        REF_UNLOCK;
     137        }
    117138memhint=-1;
    118139}
     
    163184{
    164185if (ensuresize<0) ensuresize=len();
     186REF_LOCK;
    165187detachCopy(ensuresize);
     188REF_UNLOCK;
    166189appending=buf->used;
    167190return buf->txt;
     
    176199char *SString::directAppend(int maxappend)
    177200{
     201REF_LOCK;
    178202detachCopy(buf->used+maxappend);
     203REF_UNLOCK;
    179204appending=buf->used;
    180205return buf->txt+appending;
     
    208233{
    209234if (!count) return;
     235REF_LOCK;
    210236detachCopy(buf->used+count);
     237REF_UNLOCK;
    211238buf->append(txt,count);
    212239}
     
    230257if (!ch) chlen=0;
    231258else if (chlen<0) chlen=strlen(ch);
     259REF_LOCK;
    232260detachEmpty(chlen);
     261REF_UNLOCK;
    233262memcpy(buf->txt,ch,chlen);
    234263buf->txt[chlen]=0; buf->used=chlen;
     
    243272{
    244273if (s.buf==buf) return;
     274REF_LOCK;
    245275detach();
    246276buf=s.buf;
    247277if (buf->size) buf->refcount++;
     278REF_UNLOCK;
    248279}
    249280///////////////////////////////////////
     
    306337}
    307338
    308 const SString& SString::valueOf(int i)
    309 {
    310 static SString t;
     339SString SString::valueOf(int i)
     340{
     341SString t;
    311342sprintf(t.directWrite(20),"%d",i); t.endWrite();
    312343return t;
    313344}
    314 const SString& SString::valueOf(long i)
    315 {
    316 static SString t;
     345SString SString::valueOf(long i)
     346{
     347SString t;
    317348sprintf(t.directWrite(20),"%d",i); t.endWrite();
    318349return t;
    319350}
    320 const SString& SString::valueOf(double d)
    321 {
    322 static SString t;
     351SString SString::valueOf(double d)
     352{
     353SString t;
    323354sprintf(t.directWrite(20),"%g",d); t.endWrite();
    324355return t;
    325356}
    326 const SString& SString::valueOf(const SString& s)
     357SString SString::valueOf(const SString& s)
    327358{
    328359return s;
Note: See TracChangeset for help on using the changeset viewer.